diff --git a/.changeset/poor-years-hang.md b/.changeset/poor-years-hang.md
new file mode 100644
index 00000000000..e1335f22087
--- /dev/null
+++ b/.changeset/poor-years-hang.md
@@ -0,0 +1,6 @@
+---
+"@fuel-ts/abi": minor
+"fuels": minor
+---
+
+feat!: ABI Gen
diff --git a/.github/actions/test-setup/action.yaml b/.github/actions/test-setup/action.yaml
index 8d7c3d6cf0c..0c649356d13 100644
--- a/.github/actions/test-setup/action.yaml
+++ b/.github/actions/test-setup/action.yaml
@@ -39,6 +39,12 @@ runs:
with:
bun-version: ${{ inputs.bun-version }}
+ - name: Set forc and fuel-core paths
+ shell: bash
+ run: |
+ echo "$GITHUB_WORKSPACE/internal/forc/forc-binaries" >> $GITHUB_PATH
+ echo "$GITHUB_WORKSPACE/internal/fuel-core/fuel-core-binaries" >> $GITHUB_PATH
+
- name: Build
run: pnpm build
shell: bash
diff --git a/apps/demo-typegen/package.json b/apps/demo-typegen/package.json
index 9ce2943d96a..0e296e8f500 100644
--- a/apps/demo-typegen/package.json
+++ b/apps/demo-typegen/package.json
@@ -11,8 +11,8 @@
"forc:predicate": "pnpm fuels-forc build -p demo-predicate --release",
"build:types": "run-p types:*",
"types:contract": "pnpm fuels typegen -i demo-contract/out/release/demo-contract-abi.json -o src/contract-types",
- "types:script": "pnpm fuels typegen -i demo-script/out/release/demo-script-abi.json -o src/script-types --script",
- "types:predicate": "pnpm fuels typegen -i demo-predicate/out/release/demo-predicate-abi.json -o src/predicate-types --predicate"
+ "types:script": "pnpm fuels typegen -i demo-script/out/release/demo-script-abi.json -o src/script-types",
+ "types:predicate": "pnpm fuels typegen -i demo-predicate/out/release/demo-predicate-abi.json -o src/predicate-types"
},
"license": "Apache-2.0",
"dependencies": {
diff --git a/apps/demo-typegen/src/demo.test.ts b/apps/demo-typegen/src/demo.test.ts
index f9b0c654d44..b9c10c12e19 100644
--- a/apps/demo-typegen/src/demo.test.ts
+++ b/apps/demo-typegen/src/demo.test.ts
@@ -2,11 +2,9 @@
import { toHex, Address, Wallet, FuelError, ErrorCode } from 'fuels';
import { expectToThrowFuelError, launchTestNode } from 'fuels/test-utils';
-import storageSlots from '../demo-contract/out/release/demo-contract-storage_slots.json';
-
import { DemoContract, DemoContractFactory } from './contract-types';
import { DemoPredicate } from './predicate-types';
-import type { DemoPredicateInputs } from './predicate-types/DemoPredicate';
+import type { DemoPredicateInputs } from './predicate-types/predicates/DemoPredicate';
import { DemoScript } from './script-types';
/**
@@ -25,7 +23,7 @@ describe('ExampleContract', () => {
// #context import { DemoContractFactory } from './sway-programs-api';
const { waitForResult } = await DemoContractFactory.deploy(wallet, {
- storageSlots,
+ storageSlots: DemoContractFactory.storageSlots,
});
const { contract } = await waitForResult();
diff --git a/apps/docs/src/guide/contracts/snippets/proxy-contracts.ts b/apps/docs/src/guide/contracts/snippets/proxy-contracts.ts
index ef1b0385778..543a0aaf2b4 100644
--- a/apps/docs/src/guide/contracts/snippets/proxy-contracts.ts
+++ b/apps/docs/src/guide/contracts/snippets/proxy-contracts.ts
@@ -1,10 +1,5 @@
// #region proxy-2
-import {
- Provider,
- Wallet,
- Src14OwnedProxy,
- Src14OwnedProxyFactory,
-} from 'fuels';
+import { Provider, Wallet, Src14OwnedProxyFactory } from 'fuels';
import { LOCAL_NETWORK_URL, WALLET_PVT_KEY } from '../../../env';
import {
@@ -28,7 +23,7 @@ const { contract: counterContract } = await deploy.waitForResult();
* initialize the storage slots.
*/
const storageSlots = counterContractFactory.storageSlots.concat(
- Src14OwnedProxy.storageSlots
+ Src14OwnedProxyFactory.storageSlots
);
/**
* These configurables are specific to our recommended SRC14 compliant
diff --git a/apps/docs/src/guide/contracts/snippets/storage-slots/override-storage-slots.ts b/apps/docs/src/guide/contracts/snippets/storage-slots/override-storage-slots.ts
index 0bb07720123..a4666980897 100644
--- a/apps/docs/src/guide/contracts/snippets/storage-slots/override-storage-slots.ts
+++ b/apps/docs/src/guide/contracts/snippets/storage-slots/override-storage-slots.ts
@@ -2,16 +2,13 @@
import { Provider, Wallet } from 'fuels';
import { LOCAL_NETWORK_URL, WALLET_PVT_KEY } from '../../../../env';
-import {
- StorageTestContract,
- StorageTestContractFactory,
-} from '../../../../typegend';
+import { StorageTestContractFactory } from '../../../../typegend';
const provider = await Provider.create(LOCAL_NETWORK_URL);
const deployer = Wallet.fromPrivateKey(WALLET_PVT_KEY, provider);
const deploymentTx = await StorageTestContractFactory.deploy(deployer, {
- storageSlots: StorageTestContract.storageSlots,
+ storageSlots: StorageTestContractFactory.storageSlots,
});
await deploymentTx.waitForResult();
diff --git a/apps/docs/src/guide/fuels-cli/commands.md b/apps/docs/src/guide/fuels-cli/commands.md
index d67a4d96ec0..290c602d642 100644
--- a/apps/docs/src/guide/fuels-cli/commands.md
+++ b/apps/docs/src/guide/fuels-cli/commands.md
@@ -73,7 +73,7 @@ npx fuels@{{fuels}} build
```
1. Build all Sway programs under your `workspace` using `forc` [1](https://docs.fuel.network/docs/forc/commands/forc_build/)
-1. Generate types for them using `fuels-typegen` [2](#fuels-typegen)
+1. Generate types for them using `fuels typegen` [2](#fuels-typegen)
```console-vue
npx fuels@{{fuels}} build --deploy
@@ -157,9 +157,6 @@ npx fuels@{{fuels}} help typegen
Options:
-i, --inputs Input paths/globals to your Abi JSON files
-o, --output Directory path for generated files
- -c, --contract Generate types for Contracts [default]
- -s, --script Generate types for Scripts
- -p, --predicate Generate types for Predicates
-S, --silent Omit output messages
```
diff --git a/apps/docs/src/guide/fuels-cli/generating-types.md b/apps/docs/src/guide/fuels-cli/generating-types.md
index 6a42b1b530d..57523586e26 100644
--- a/apps/docs/src/guide/fuels-cli/generating-types.md
+++ b/apps/docs/src/guide/fuels-cli/generating-types.md
@@ -27,18 +27,15 @@ Generate Typescript from Sway ABI JSON files
Options:
-i, --inputs Input paths/globals to your ABI JSON files
-o, --output Directory path for generated files
- -c, --contract Generate types for Contracts [default]
- -s, --script Generate types for Scripts
- -p, --predicate Generate types for Predicates
-S, --silent Omit output messages
-h, --help Display help
```
-## Generating Types for Contracts
+## Generating Types
-You can generate types for a Sway contract using the command below:
+You can generate types for a Sway program using the command below:
-
+
```console
@@ -50,30 +47,15 @@ pnpm fuels typegen -i ./abis/*-abi.json -o ./types
-The path after the input flag `-i` should point to the file ending in `-abi.json` produced when the contract was built.
+The path after the input flag `-i` should point to the file ending in `-abi.json` produced when the Sway program was built.
-The path after the output flag `-o` will be the output directory for the generated types.
+- For scripts and predicates, you'll need the bytecode of the program to be in the same folder for the command to work.
+- For contracts, the command will work without the bytecode but the corresponding `ContractFactory` file won't be generated as factories need the bytecode to operate.
-You can omit the `--contract` option here since it's the default.
+The path after the output flag `-o` will be the output directory for the generated types.
-## Generating Types for Scripts
-
-To generate types for a Sway script, use the `--script` flag:
-
-```console
-pnpm fuels typegen -i ./abis/*-abi.json -o ./types --script
-```
-
-## Generating Types for Predicates
-
-To generate types for a Sway predicate, use the `--predicate` flag:
-
-```console
-pnpm fuels typegen -i ./abis/*-abi.json -o ./types --predicate
-```
-
---
See also:
diff --git a/apps/docs/src/guide/fuels-cli/using-generated-types.md b/apps/docs/src/guide/fuels-cli/using-generated-types.md
index 4702c2e0394..7e38ecf61c3 100644
--- a/apps/docs/src/guide/fuels-cli/using-generated-types.md
+++ b/apps/docs/src/guide/fuels-cli/using-generated-types.md
@@ -29,7 +29,7 @@ Typegen tries to resolve, auto-load, and embed the [Storage Slots](../contracts/
After generating types via:
```console
-pnpm fuels typegen -i ./abis/*-abi.json -o ./types --script
+pnpm fuels typegen -i ./abis/*-abi.json -o ./types
```
We can use these files like so:
@@ -41,7 +41,7 @@ We can use these files like so:
After generating types via:
```console
-pnpm fuels typegen -i ./abis/*-abi.json -o ./types --predicate
+pnpm fuels typegen -i ./abis/*-abi.json -o ./types
```
We can use these files like so:
diff --git a/apps/docs/src/guide/types/snippets/enums/using-enums-of-enums-1.ts b/apps/docs/src/guide/types/snippets/enums/using-enums-of-enums-1.ts
index 06a256f7ec5..d437e1c5dbb 100644
--- a/apps/docs/src/guide/types/snippets/enums/using-enums-of-enums-1.ts
+++ b/apps/docs/src/guide/types/snippets/enums/using-enums-of-enums-1.ts
@@ -2,7 +2,7 @@ import { Provider, Wallet } from 'fuels';
import { LOCAL_NETWORK_URL, WALLET_PVT_KEY } from '../../../../env';
import { EchoEnumFactory } from '../../../../typegend';
-import { UserErrorInput } from '../../../../typegend/contracts/EchoEnum';
+import { UserError } from '../../../../typegend/contracts/EchoEnum';
const provider = await Provider.create(LOCAL_NETWORK_URL);
const wallet = Wallet.fromPrivateKey(WALLET_PVT_KEY, provider);
@@ -10,7 +10,7 @@ const deploy = await EchoEnumFactory.deploy(wallet);
const { contract } = await deploy.waitForResult();
// #region snippet-1
-const enumParam = { UserError: UserErrorInput.InsufficientPermissions };
+const enumParam = { UserError: UserError.InsufficientPermissions };
const { value } = await contract.functions.echo_error_enum(enumParam).get();
diff --git a/apps/docs/src/guide/types/snippets/enums/using-enums-of-enums-2.ts b/apps/docs/src/guide/types/snippets/enums/using-enums-of-enums-2.ts
index cf9faa6cc0d..e76a4e7fc77 100644
--- a/apps/docs/src/guide/types/snippets/enums/using-enums-of-enums-2.ts
+++ b/apps/docs/src/guide/types/snippets/enums/using-enums-of-enums-2.ts
@@ -2,7 +2,7 @@ import { Provider, Wallet } from 'fuels';
import { LOCAL_NETWORK_URL, WALLET_PVT_KEY } from '../../../../env';
import { EchoEnumFactory } from '../../../../typegend';
-import { StateErrorInput } from '../../../../typegend/contracts/EchoEnum';
+import { StateError } from '../../../../typegend/contracts/EchoEnum';
const provider = await Provider.create(LOCAL_NETWORK_URL);
const wallet = Wallet.fromPrivateKey(WALLET_PVT_KEY, provider);
@@ -10,7 +10,7 @@ const deploy = await EchoEnumFactory.deploy(wallet);
const { contract } = await deploy.waitForResult();
// #region snippet-1
-const enumParam = { StateError: StateErrorInput.Completed };
+const enumParam = { StateError: StateError.Completed };
const { value } = await contract.functions.echo_error_enum(enumParam).get();
diff --git a/apps/docs/src/guide/types/snippets/enums/using-sway-enums.ts b/apps/docs/src/guide/types/snippets/enums/using-sway-enums.ts
index 64e796e9ef8..0cb6181662a 100644
--- a/apps/docs/src/guide/types/snippets/enums/using-sway-enums.ts
+++ b/apps/docs/src/guide/types/snippets/enums/using-sway-enums.ts
@@ -3,14 +3,14 @@ import { Provider, Wallet } from 'fuels';
import { LOCAL_NETWORK_URL, WALLET_PVT_KEY } from '../../../../env';
import { EchoEnumFactory } from '../../../../typegend';
-import { StateErrorInput } from '../../../../typegend/contracts/EchoEnum';
+import { StateError } from '../../../../typegend/contracts/EchoEnum';
const provider = await Provider.create(LOCAL_NETWORK_URL);
const wallet = Wallet.fromPrivateKey(WALLET_PVT_KEY, provider);
const deploy = await EchoEnumFactory.deploy(wallet);
const { contract } = await deploy.waitForResult();
-const enumParam = StateErrorInput.Completed;
+const enumParam = StateError.Completed;
const { value } = await contract.functions
.echo_state_error_enum(enumParam)
diff --git a/packages/abi-typegen/package.json b/packages/abi-typegen/package.json
index 1f093876522..a04f23e465b 100644
--- a/packages/abi-typegen/package.json
+++ b/packages/abi-typegen/package.json
@@ -3,9 +3,6 @@
"version": "0.97.2",
"description": "Generates Typescript definitions from Sway ABI Json files",
"author": "Fuel Labs (https://fuel.network/)",
- "bin": {
- "fuels-typegen": "typegen.js"
- },
"main": "dist/index.js",
"module": "dist/index.mjs",
"types": "dist/index.d.ts",
diff --git a/packages/abi/package.json b/packages/abi/package.json
index 0fd951ba435..cd672d9abfe 100644
--- a/packages/abi/package.json
+++ b/packages/abi/package.json
@@ -11,11 +11,26 @@
"engines": {
"node": "^18.20.3 || ^20.0.0 || ^22.0.0"
},
+ "bin": {
+ "fuels-typegen": "typegen.js"
+ },
"exports": {
".": {
"require": "./dist/index.js",
"import": "./dist/index.mjs",
"types": "./dist/index.d.ts"
+ },
+ "./cli": {
+ "types": "./dist/cli.d.ts",
+ "require": "./dist/cli.js",
+ "import": "./dist/cli.mjs"
+ }
+ },
+ "typesVersions": {
+ "*": {
+ "cli": [
+ "./dist/cli.d.ts"
+ ]
}
},
"files": [
@@ -27,7 +42,11 @@
},
"dependencies": {
"@fuel-ts/errors": "workspace:*",
- "@fuel-ts/utils": "workspace:*"
+ "@fuel-ts/utils": "workspace:*",
+ "@fuel-ts/versions": "workspace:*",
+ "handlebars": "^4.7.8",
+ "commander": "12.1.0",
+ "glob": "^10.4.5"
},
"devDependencies": {}
}
diff --git a/packages/abi/src/bin.ts b/packages/abi/src/bin.ts
new file mode 100755
index 00000000000..4d4c3bed880
--- /dev/null
+++ b/packages/abi/src/bin.ts
@@ -0,0 +1,15 @@
+import { getBinaryVersions } from '@fuel-ts/versions/cli';
+import { Command } from 'commander';
+
+import { configureTypegenCliOptions } from './cli';
+
+const program = new Command();
+
+program.name('fuels-typegen');
+program.version(getBinaryVersions().FUELS);
+program.usage(`-i ../out/*-abi.json -o ./generated/`);
+program.option('-S, --silent', 'Omit output messages', false);
+
+configureTypegenCliOptions(program);
+
+program.parse(process.argv);
diff --git a/packages/abi/src/cli.ts b/packages/abi/src/cli.ts
new file mode 100644
index 00000000000..c37108bd746
--- /dev/null
+++ b/packages/abi/src/cli.ts
@@ -0,0 +1 @@
+export * from './gen/cli';
diff --git a/packages/abi/src/gen/abi-gen-types.ts b/packages/abi/src/gen/abi-gen-types.ts
index 10051c76805..032c27a243f 100644
--- a/packages/abi/src/gen/abi-gen-types.ts
+++ b/packages/abi/src/gen/abi-gen-types.ts
@@ -1 +1,55 @@
-// Placeholder
+import type { BinaryVersions } from '@fuel-ts/versions';
+
+import type { Abi } from '../parser';
+
+export interface AbiGenInput {
+ /**
+ * The details of the program to generate the files for.
+ */
+ programDetails: ProgramDetails[];
+ /**
+ * The versions of the binaries used to generate the files.
+ */
+ versions: BinaryVersions;
+ /**
+ * The mode to generate the files in.
+ * Defaults to 'ts' which generates typescript files.
+ */
+ mode?: 'ts';
+}
+
+export interface AbiGenResult {
+ /**
+ * The filename of the generated file.
+ */
+ filename: string;
+ /**
+ * The content of the generated file.
+ */
+ content: string;
+}
+
+export interface ProgramDetails {
+ /**
+ * The name of the program to generate files for.
+ * This will be used to name the generated files,
+ * as well as throughout the generated code.
+ */
+ name: string;
+ /**
+ * The compressed bytecode of the program in base64 format.
+ */
+ binCompressed?: string;
+ /**
+ * The abi of the program in the format returned via `AbiParser`.
+ */
+ abi: Abi;
+ /**
+ * The original abi contents in string format.
+ */
+ abiContents: string;
+ /**
+ * The storage slots, if working with a contract.
+ */
+ storageSlots?: string;
+}
diff --git a/packages/abi/src/gen/abi-gen.ts b/packages/abi/src/gen/abi-gen.ts
index e0ad4905d2f..db6b2d9f46a 100644
--- a/packages/abi/src/gen/abi-gen.ts
+++ b/packages/abi/src/gen/abi-gen.ts
@@ -1 +1,19 @@
-export class AbiGen {}
+import type { AbiGenInput, AbiGenResult } from './abi-gen-types';
+import { getRenderer } from './renderers/getRenderer';
+
+/**
+ * The main class to generate files for given sway programs.
+ * These contents of these generated files make it easier to interact
+ * with the sway programs, because type definitions are added,
+ * as well as some automatic loading is done for the user.
+ */
+export class AbiGen {
+ /**
+ * @returns an array of generated files for the given program details.
+ * They can be saved to disk as-is or further processed.
+ */
+ public static generate({ programDetails, mode, versions }: AbiGenInput): AbiGenResult[] {
+ const render = getRenderer(mode);
+ return render(programDetails, versions);
+ }
+}
diff --git a/packages/abi/src/gen/cli/index.ts b/packages/abi/src/gen/cli/index.ts
new file mode 100644
index 00000000000..939508c0f1b
--- /dev/null
+++ b/packages/abi/src/gen/cli/index.ts
@@ -0,0 +1 @@
+export { configureTypegenCliOptions, runTypegen } from './run';
diff --git a/packages/abi/src/gen/cli/run.ts b/packages/abi/src/gen/cli/run.ts
new file mode 100644
index 00000000000..ab87e9c61d4
--- /dev/null
+++ b/packages/abi/src/gen/cli/run.ts
@@ -0,0 +1,52 @@
+import { getBinaryVersions } from '@fuel-ts/versions/cli';
+import type { Command } from 'commander';
+import { mkdirSync, writeFileSync } from 'fs';
+import { join } from 'path';
+
+import { AbiGen } from '../abi-gen';
+
+import { getProgramDetails, loggingConfig } from './utils';
+
+export interface RunTypegenOptions {
+ inputs: string[];
+ output: string;
+ silent?: boolean;
+}
+
+export function runTypegen(options: RunTypegenOptions) {
+ const { inputs, output, silent } = options;
+
+ loggingConfig.silent = !!silent;
+
+ const programDetails = getProgramDetails(inputs);
+
+ const results = AbiGen.generate({ programDetails, versions: getBinaryVersions() });
+
+ mkdirSync(output, { recursive: true });
+
+ const subDirectories = new Set();
+
+ results.forEach((r) => {
+ const dir = r.filename.split('/').slice(0, -1).join('/');
+ if (dir !== '') {
+ subDirectories.add(dir);
+ }
+ });
+
+ subDirectories.forEach((dir) => {
+ mkdirSync(join(output, dir), { recursive: true });
+ });
+
+ results.forEach((r) => {
+ const outputPath = join(output, r.filename);
+ writeFileSync(outputPath, r.content);
+ });
+}
+
+export function configureTypegenCliOptions(program: Command) {
+ return program
+ .description(`Generate Typescript from forc build outputs`)
+ .requiredOption('-i, --inputs ', 'Input paths/globals to your ABI JSON files')
+ .requiredOption('-o, --output ', 'Directory path for generated files')
+ .action(runTypegen);
+}
diff --git a/packages/abi/src/gen/cli/utils.test.ts b/packages/abi/src/gen/cli/utils.test.ts
new file mode 100644
index 00000000000..394b52180f9
--- /dev/null
+++ b/packages/abi/src/gen/cli/utils.test.ts
@@ -0,0 +1,38 @@
+import { ErrorCode, FuelError } from '@fuel-ts/errors';
+import { expectToThrowFuelError } from '@fuel-ts/errors/test-utils';
+
+import { normalizeProjectName } from './utils';
+
+/**
+ * @group node
+ */
+describe('normalizeProjectName', () => {
+ test('should normalize project name', () => {
+ expect(normalizeProjectName('DsToken')).toEqual('DsToken');
+ expect(normalizeProjectName('test')).toEqual('Test');
+ expect(normalizeProjectName('ds-token')).toEqual('DsToken');
+ expect(normalizeProjectName('ds_token')).toEqual('DsToken');
+ expect(normalizeProjectName('Aaa_bbb_CCDD-EEE')).toEqual('AaaBbbCCDDEEE');
+ expect(normalizeProjectName('ds token')).toEqual('DsToken');
+ expect(normalizeProjectName('name.abi')).toEqual('NameAbi');
+ expect(normalizeProjectName('1234name.abi')).toEqual('NameAbi');
+ expect(normalizeProjectName('ERC20.abi')).toEqual('ERC20Abi');
+ expect(normalizeProjectName('my-contract')).toEqual('MyContract');
+ expect(normalizeProjectName('my contract')).toEqual('MyContract');
+ expect(normalizeProjectName('my.contract')).toEqual('MyContract');
+ expect(normalizeProjectName('still-my.contract')).toEqual('StillMyContract');
+ expect(normalizeProjectName('also my.contract')).toEqual('AlsoMyContract');
+ });
+
+ test('throws if name cannot be normalized', async () => {
+ await expectToThrowFuelError(
+ () => normalizeProjectName(''),
+ new FuelError(
+ ErrorCode.PARSE_FAILED,
+ `The provided string '' results in an empty output after`.concat(
+ ` normalization, therefore, it can't normalize string.`
+ )
+ )
+ );
+ });
+});
diff --git a/packages/abi/src/gen/cli/utils.ts b/packages/abi/src/gen/cli/utils.ts
new file mode 100644
index 00000000000..dd2f987b3cc
--- /dev/null
+++ b/packages/abi/src/gen/cli/utils.ts
@@ -0,0 +1,109 @@
+import { ErrorCode, FuelError } from '@fuel-ts/errors';
+import { assertUnreachable, compressBytecode, hexlify } from '@fuel-ts/utils';
+import { readFileSync } from 'fs';
+import { globSync } from 'glob';
+
+import type { AbiSpecification } from '../../parser';
+import { AbiParser } from '../../parser';
+import type { ProgramDetails } from '../abi-gen-types';
+
+export const loggingConfig = {
+ silent: false,
+};
+
+export function log(...args: Parameters) {
+ if (!loggingConfig.silent) {
+ // eslint-disable-next-line no-console
+ console.log(...args);
+ }
+}
+
+/**
+ * Converts `some.string-value` into `SomeStringValue`.
+ *
+ * Examples:
+ * my-simple.test —— MySimpleTest
+ * myFile.ts —— MyFileTs
+ * my-abi.json —— MyAbiJson
+ */
+export function normalizeProjectName(str: string): string {
+ const transformations: ((s: string) => string)[] = [
+ (s) => s.replace(/\s+/g, '-'), // spaces to -
+ (s) => s.replace(/\./g, '-'), // dots to -
+ (s) => s.replace(/_/g, '-'), // underscore to -
+ (s) => s.replace(/-[a-z]/g, (match) => match.slice(-1).toUpperCase()), // delete '-' and capitalize the letter after them
+ (s) => s.replace(/-/g, ''), // delete any '-' left
+ (s) => s.replace(/^\d+/, ''), // removes leading digits
+ ];
+
+ const output = transformations.reduce((s, t) => t(s), str);
+
+ if (output === '') {
+ const errMsg = `The provided string '${str}' results in an empty output after`.concat(
+ ` normalization, therefore, it can't normalize string.`
+ );
+ throw new FuelError(ErrorCode.PARSE_FAILED, errMsg);
+ }
+
+ return output[0].toUpperCase() + output.slice(1); // capitalize first letter
+}
+
+function handleMissingBinary(path: string, abi: AbiSpecification) {
+ const programType = abi.programType as 'predicate' | 'script' | 'contract' | 'library';
+ switch (programType) {
+ case 'predicate':
+ throw new FuelError(
+ ErrorCode.BIN_FILE_NOT_FOUND,
+ `For predicates, the bytecode is required. No bytecode found for predicate at ${path}.`
+ );
+ case 'script':
+ throw new FuelError(
+ ErrorCode.BIN_FILE_NOT_FOUND,
+ `For scripts, the bytecode is required. No bytecode found for script at ${path}.`
+ );
+ case 'contract':
+ log(`No bytecode found for contract at ${path}, will not generate ContractFactory for it.`);
+ break;
+ case 'library':
+ // ignore;
+ break;
+ default:
+ assertUnreachable(programType);
+ }
+}
+
+export function getProgramDetails(paths: string[]) {
+ const details: ProgramDetails[] = [];
+ paths.forEach((path) => {
+ const abiPath = path.match(/.+-abi\.json/) ? path : globSync(`${path}/*-abi.json`)[0];
+ if (abiPath === undefined) {
+ log(`No abi file found in ${path}, skipping this path.`);
+ return;
+ }
+
+ const dir = abiPath.match(/.*\//)?.[0] as string;
+ const projectName = abiPath.match(/([^/])+(?=-abi\.json)/)?.[0] as string;
+ const abiContentsStr = readFileSync(abiPath).toString();
+ const abi = JSON.parse(abiContentsStr) as AbiSpecification;
+
+ const [storageSlotsPath] = globSync(`${dir}/*-storage_slots.json`);
+ const storageSlots = storageSlotsPath ? readFileSync(storageSlotsPath).toString() : undefined;
+
+ const [binPath] = globSync(`${dir}/*.bin`);
+ if (binPath === undefined) {
+ handleMissingBinary(path, abi);
+ }
+
+ const binCompressed = binPath && compressBytecode(hexlify(readFileSync(binPath)));
+
+ details.push({
+ name: normalizeProjectName(projectName),
+ abi: AbiParser.parse(JSON.parse(abiContentsStr) as AbiSpecification),
+ binCompressed,
+ abiContents: abiContentsStr,
+ storageSlots,
+ });
+ });
+
+ return details;
+}
diff --git a/packages/abi/src/gen/hbs.d.ts b/packages/abi/src/gen/hbs.d.ts
new file mode 100644
index 00000000000..cefe640967a
--- /dev/null
+++ b/packages/abi/src/gen/hbs.d.ts
@@ -0,0 +1,5 @@
+// informs TS about Handlebar `.hbs` templates extension
+declare module '*.hbs' {
+ const value: string;
+ export default value;
+}
diff --git a/packages/abi/src/gen/index.ts b/packages/abi/src/gen/index.ts
index 11641ac45c6..29b42ee4313 100644
--- a/packages/abi/src/gen/index.ts
+++ b/packages/abi/src/gen/index.ts
@@ -1 +1,2 @@
export { AbiGen } from './abi-gen';
+export * from './abi-gen-types';
diff --git a/packages/abi/src/gen/renderers/getRenderer.ts b/packages/abi/src/gen/renderers/getRenderer.ts
new file mode 100644
index 00000000000..bf43bb5d832
--- /dev/null
+++ b/packages/abi/src/gen/renderers/getRenderer.ts
@@ -0,0 +1,16 @@
+import { assertUnreachable } from '@fuel-ts/utils';
+
+import type { AbiGenInput } from '../abi-gen-types';
+
+import { renderTs } from './ts/render-ts';
+import type { Renderer } from './types';
+
+export function getRenderer(mode: AbiGenInput['mode']): Renderer {
+ switch (mode) {
+ case 'ts':
+ case undefined:
+ return renderTs;
+ default:
+ return assertUnreachable(mode);
+ }
+}
diff --git a/packages/abi/src/gen/renderers/ts/render-ts.ts b/packages/abi/src/gen/renderers/ts/render-ts.ts
new file mode 100644
index 00000000000..6654b4c6902
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/render-ts.ts
@@ -0,0 +1,17 @@
+import type { AbiGenResult, ProgramDetails } from '../../abi-gen-types';
+import type { Renderer } from '../types';
+
+import { renderPrograms } from './renderers/render-programs';
+import { templateRenderer } from './renderers/template-renderer';
+import commonTemplate from './templates/common.hbs';
+
+export const renderTs: Renderer = (details: ProgramDetails[], versions): AbiGenResult[] => {
+ const results = renderPrograms(details, versions);
+
+ results.push({
+ filename: 'common.ts',
+ content: templateRenderer({ template: commonTemplate, versions }),
+ });
+
+ return results;
+};
diff --git a/packages/abi/src/gen/renderers/ts/renderers/get-parent-dir-wrapper.ts b/packages/abi/src/gen/renderers/ts/renderers/get-parent-dir-wrapper.ts
new file mode 100644
index 00000000000..a8239ef814e
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/renderers/get-parent-dir-wrapper.ts
@@ -0,0 +1,32 @@
+import { assertUnreachable } from '@fuel-ts/utils';
+
+import type { Abi } from '../../../../parser';
+
+export function getParentDirWrapper(programType: Abi['programType']): {
+ parentDir: string;
+ withParentDir: (file: string) => string;
+ removeParentDir: (file: string) => string;
+} {
+ let parentDir: string = '';
+ switch (programType) {
+ case 'contract':
+ parentDir = 'contracts';
+ break;
+ case 'predicate':
+ parentDir = 'predicates';
+ break;
+ case 'script':
+ parentDir = 'scripts';
+ break;
+ case 'library':
+ break;
+ default:
+ assertUnreachable(programType);
+ }
+
+ return {
+ parentDir,
+ withParentDir: (file) => `${parentDir}/${file}`,
+ removeParentDir: (file) => file.split(`${parentDir}/`)[1],
+ };
+}
diff --git a/packages/abi/src/gen/renderers/ts/renderers/render-index-files.ts b/packages/abi/src/gen/renderers/ts/renderers/render-index-files.ts
new file mode 100644
index 00000000000..12c9c479871
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/renderers/render-index-files.ts
@@ -0,0 +1,73 @@
+import type { BinaryVersions } from '@fuel-ts/versions';
+
+import type { Abi } from '../../../../parser';
+import type { AbiGenResult } from '../../../abi-gen-types';
+import indexTemplate from '../templates/index.hbs';
+
+import { getParentDirWrapper } from './get-parent-dir-wrapper';
+import { templateRenderer } from './template-renderer';
+
+export type IndexContents = Map<
+ Abi['programType'],
+ { filename: string; exportedContent: string[] }[]
+>;
+/**
+ * @returns an array of index files
+ * that includes the root index.ts and the index.ts for each provided program type.
+ */
+export function renderIndexFiles(
+ indexContents: IndexContents,
+ versions: BinaryVersions
+): AbiGenResult[] {
+ const results: AbiGenResult[] = [];
+
+ indexContents.forEach((files, programType) => {
+ const { withParentDir, removeParentDir } = getParentDirWrapper(programType);
+
+ // from index.ts to e.g. contracts/index.ts
+ const indexFilename = withParentDir('index.ts');
+
+ const exports = files.map(({ filename, exportedContent }) => {
+ // from e.g. contracts/AbiContract.ts to AbiContract.ts
+ const relativePathToFile = removeParentDir(filename);
+ // remove .ts extension
+ return {
+ path: relativePathToFile.split('.')[0],
+ exportedContent: `{ ${exportedContent.join(', ')} }`,
+ };
+ });
+
+ const content = templateRenderer({
+ versions,
+ template: indexTemplate,
+ data: {
+ exports,
+ },
+ });
+
+ results.push({
+ filename: indexFilename,
+ content,
+ });
+ });
+
+ const mainIndexFileExports = [...indexContents.keys()]
+ .sort()
+ .map((programType) => getParentDirWrapper(programType).parentDir)
+ .map((path) => ({ path, exportedContent: '*' }));
+
+ const mainIndexFile: AbiGenResult = {
+ filename: 'index.ts',
+ content: templateRenderer({
+ versions,
+ template: indexTemplate,
+ data: {
+ exports: mainIndexFileExports,
+ },
+ }),
+ };
+
+ results.push(mainIndexFile);
+
+ return results;
+}
diff --git a/packages/abi/src/gen/renderers/ts/renderers/render-program.ts b/packages/abi/src/gen/renderers/ts/renderers/render-program.ts
new file mode 100644
index 00000000000..7bcb0c6a017
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/renderers/render-program.ts
@@ -0,0 +1,113 @@
+import { assertUnreachable } from '@fuel-ts/utils';
+import type { BinaryVersions } from '@fuel-ts/versions';
+
+import type { ProgramDetails } from '../../../abi-gen-types';
+import type { TsAbiGenResult } from '../../types';
+import abiTemplate from '../templates/abi.hbs';
+import bytecodeTemplate from '../templates/bytecode.hbs';
+import contractFactoryTemplate from '../templates/contract-factory.hbs';
+import contractTemplate from '../templates/contract.hbs';
+import predicateTemplate from '../templates/predicate.hbs';
+import scriptTemplate from '../templates/script.hbs';
+import storageSlotsTemplate from '../templates/storage-slots.hbs';
+
+import { getParentDirWrapper } from './get-parent-dir-wrapper';
+import { renderTypes } from './render-types';
+import { templateRenderer } from './template-renderer';
+
+/**
+ * Renders program-related files based on the program type.
+ * @returns An array of results containing filenames and their corresponding content.
+ * The files returned are all related to the program except the types.
+ * This includes the abi, bytecode, and the program-related classes.
+ */
+export function renderProgram(details: ProgramDetails, versions: BinaryVersions): TsAbiGenResult[] {
+ const { abi, binCompressed, name, abiContents, storageSlots } = details;
+
+ const results: TsAbiGenResult[] = [
+ {
+ filename: `${name}Types.ts`,
+ content: renderTypes(details, versions),
+ },
+ {
+ filename: `${name}-abi.ts`,
+ content: templateRenderer({ template: abiTemplate, versions, data: { abiContents } }),
+ },
+ ];
+
+ if (binCompressed) {
+ results.push({
+ filename: `${name}-bytecode.ts`,
+ content: templateRenderer({ template: bytecodeTemplate, versions, data: { binCompressed } }),
+ });
+ }
+
+ switch (abi.programType) {
+ case 'contract':
+ results.push(
+ {
+ filename: `${name}.ts`,
+ content: templateRenderer({
+ template: contractTemplate,
+ versions,
+ data: { name },
+ }),
+ exportInIndexFile: [name],
+ },
+
+ {
+ filename: `${name}-storage-slots.ts`,
+ content: templateRenderer({
+ template: storageSlotsTemplate,
+ versions,
+ data: { storageSlots },
+ }),
+ }
+ );
+
+ if (binCompressed) {
+ results.push({
+ filename: `${name}Factory.ts`,
+ content: templateRenderer({
+ template: contractFactoryTemplate,
+ versions,
+ data: { name },
+ }),
+ exportInIndexFile: [`${name}Factory`],
+ });
+ }
+ break;
+ case 'predicate':
+ results.push({
+ filename: `${name}.ts`,
+ content: templateRenderer({
+ template: predicateTemplate,
+ versions,
+ data: { name },
+ }),
+ exportInIndexFile: [name],
+ });
+ break;
+ case 'script':
+ results.push({
+ filename: `${name}.ts`,
+ content: templateRenderer({
+ template: scriptTemplate,
+ versions,
+ data: { name },
+ }),
+ exportInIndexFile: [name],
+ });
+ break;
+ case 'library':
+ // we do nothing for library
+ break;
+ default:
+ assertUnreachable(abi.programType);
+ break;
+ }
+
+ const { withParentDir } = getParentDirWrapper(abi.programType);
+
+ return results.map((r) => ({ ...r, filename: withParentDir(r.filename) }));
+}
diff --git a/packages/abi/src/gen/renderers/ts/renderers/render-programs.ts b/packages/abi/src/gen/renderers/ts/renderers/render-programs.ts
new file mode 100644
index 00000000000..269e90f8676
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/renderers/render-programs.ts
@@ -0,0 +1,37 @@
+import type { BinaryVersions } from '@fuel-ts/versions';
+
+import type { AbiGenResult, ProgramDetails } from '../../../abi-gen-types';
+
+import type { IndexContents } from './render-index-files';
+import { renderIndexFiles } from './render-index-files';
+import { renderProgram } from './render-program';
+
+/**
+ * For the given program details, render all program-related files.
+ * That includes the abi, bytecode, program-related classes,
+ * type files and the index files.
+ */
+export function renderPrograms(details: ProgramDetails[], versions: BinaryVersions) {
+ const results: AbiGenResult[] = [];
+ const indexContents: IndexContents = new Map();
+
+ for (const d of details) {
+ const files = renderProgram(d, versions);
+
+ results.push(...files);
+
+ files.forEach((file) => {
+ if (!file.exportInIndexFile?.length) {
+ return;
+ }
+
+ const contents = indexContents.get(d.abi.programType) ?? [];
+ contents.push({ filename: file.filename, exportedContent: file.exportInIndexFile });
+ indexContents.set(d.abi.programType, contents);
+ });
+ }
+
+ results.push(...renderIndexFiles(indexContents, versions));
+
+ return results;
+}
diff --git a/packages/abi/src/gen/renderers/ts/renderers/render-types.ts b/packages/abi/src/gen/renderers/ts/renderers/render-types.ts
new file mode 100644
index 00000000000..d8a88e2a362
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/renderers/render-types.ts
@@ -0,0 +1,120 @@
+import type { BinaryVersions } from '@fuel-ts/versions';
+
+import { createMatcher } from '../../../../matchers/sway-type-matchers';
+import type { Abi } from '../../../../parser';
+import { evaluateFunctionInputsOptionality } from '../../../../utils/evaluate-function-inputs-optionality';
+import type { ProgramDetails } from '../../../abi-gen-types';
+import typesTemplate from '../templates/types.hbs';
+import { generateTsType } from '../typers/generate-ts-type';
+import { flattenImports } from '../typers/helpers';
+import type { TyperReturn } from '../typers/types';
+
+import { templateRenderer } from './template-renderer';
+
+const metadataTypeFilter = createMatcher({
+ enum: true,
+ struct: true,
+ assetId: true,
+ string: false,
+ void: false,
+ bool: false,
+ u8: false,
+ u16: false,
+ u32: false,
+ u64: false,
+ u256: false,
+ b256: false,
+ generic: false,
+ stdString: false,
+ option: false,
+ result: false,
+ str: false,
+ b512: false,
+ bytes: false,
+ vector: false,
+ tuple: false,
+ array: false,
+ evmAddress: false,
+ rawUntypedSlice: false,
+});
+
+export function sortAlphabetically(a: TyperReturn, b: TyperReturn) {
+ if (a.input < b.input) {
+ return -1;
+ }
+ if (a.input > b.input) {
+ return 1;
+ }
+ return 0;
+}
+
+function mergeTypeImports(mTypes: TyperReturn[], cTypesMap: Record) {
+ const cTypes = Object.values(cTypesMap);
+
+ const imports = flattenImports(mTypes.concat(cTypes));
+
+ const fuelsTypeImports = [...new Set(imports.fuelsTypeImports)].sort().join(', ');
+
+ const commonTypeImports = [...new Set(imports.commonTypeImports)].sort().join(', ');
+
+ return { fuelsTypeImports, commonTypeImports };
+}
+
+function mapFunctions(abi: Abi, cTypes: Record) {
+ return abi.functions.map((fn) => {
+ const inputs = evaluateFunctionInputsOptionality(fn);
+
+ return {
+ name: fn.name,
+ inputs: `[${inputs.map((i) => `${i.name}${i.isOptional ? '?' : ''}: ${cTypes[i.type.concreteTypeId].input}`).join(', ')}]`,
+ output: cTypes[fn.output.concreteTypeId].output,
+ };
+ });
+}
+
+function mapConfigurables(abi: Abi, cTypes: Record) {
+ return abi.configurables.length > 0
+ ? abi.configurables.map(({ name, type }) => ({
+ name,
+ input: cTypes[type.concreteTypeId].input,
+ }))
+ : undefined;
+}
+
+/**
+ * Renders the types file for a program.
+ * @returns An object containing the filename and the content of the types file.
+ * The type rendering logic is the same for all program types.
+ */
+export function renderTypes(
+ { name: programName, abi }: ProgramDetails,
+ versions: BinaryVersions
+): string {
+ const mTypes = abi.metadataTypes
+ .filter(metadataTypeFilter)
+ .map((abiType) => generateTsType({ abiType }));
+
+ const cTypes = abi.concreteTypes.reduce>((res, abiType) => {
+ res[abiType.concreteTypeId] = generateTsType({ abiType, asReference: true });
+ return res;
+ }, {});
+
+ const { fuelsTypeImports, commonTypeImports } = mergeTypeImports(mTypes, cTypes);
+
+ const content = templateRenderer({
+ template: typesTemplate,
+ versions,
+ data: {
+ isContract: abi.programType === 'contract',
+ name: programName,
+ fuelsTypeImports,
+ commonTypeImports,
+ enums: mTypes.filter(({ tsType }) => tsType === 'enum').sort(sortAlphabetically),
+ types: mTypes.filter(({ tsType }) => tsType === 'type').sort(sortAlphabetically),
+ functions: mapFunctions(abi, cTypes),
+ configurables: mapConfigurables(abi, cTypes),
+ },
+ });
+
+ return content;
+}
diff --git a/packages/abi/src/gen/renderers/ts/renderers/template-renderer.ts b/packages/abi/src/gen/renderers/ts/renderers/template-renderer.ts
new file mode 100644
index 00000000000..f1a4ceaf7ea
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/renderers/template-renderer.ts
@@ -0,0 +1,29 @@
+import type { BinaryVersions } from '@fuel-ts/versions';
+import Handlebars from 'handlebars';
+
+import headerTemplate from '../templates/header.hbs';
+
+/*
+ Renders the given template w/ the given data, while injecting common
+ header for disabling lint rules and annotating Fuel component's versions.
+*/
+export function templateRenderer(params: {
+ template: string;
+ data?: Record;
+ versions: BinaryVersions;
+}) {
+ const { data, template, versions } = params;
+
+ const options = {
+ strict: true,
+ noEscape: true,
+ };
+
+ const renderHeaderTemplate = Handlebars.compile(headerTemplate, options);
+ const renderTemplate = Handlebars.compile(template, options);
+
+ return renderTemplate({
+ header: renderHeaderTemplate(versions),
+ ...(data ?? {}),
+ });
+}
diff --git a/packages/abi/src/gen/renderers/ts/templates/abi.hbs b/packages/abi/src/gen/renderers/ts/templates/abi.hbs
new file mode 100644
index 00000000000..0516073cc70
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/abi.hbs
@@ -0,0 +1,3 @@
+{{header}}
+
+export const abi = {{abiContents}};
\ No newline at end of file
diff --git a/packages/abi/src/gen/renderers/ts/templates/bytecode.hbs b/packages/abi/src/gen/renderers/ts/templates/bytecode.hbs
new file mode 100644
index 00000000000..5d859be0dd2
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/bytecode.hbs
@@ -0,0 +1,5 @@
+{{header}}
+
+import { decompressBytecode } from "fuels";
+
+export const bytecode = decompressBytecode("{{binCompressed}}");
\ No newline at end of file
diff --git a/packages/abi/src/gen/renderers/ts/templates/common.hbs b/packages/abi/src/gen/renderers/ts/templates/common.hbs
new file mode 100644
index 00000000000..c6bb8343a05
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/common.hbs
@@ -0,0 +1,44 @@
+{{header}}
+
+import type { FunctionFragment, InvokeFunction } from 'fuels';
+
+/**
+ * Mimics Sway Enum.
+ * Requires one and only one Key-Value pair and raises error if more are provided.
+ */
+export type Enum = {
+ [K in keyof T]: Pick & { [P in Exclude]?: never };
+}[keyof T];
+
+/**
+ * Mimics Sway Option type.
+ */
+export type Option = T | undefined;
+
+/**
+ * Mimics Sway Result enum type.
+ * Ok represents the success case, while Err represents the error case.
+ */
+export type Result = Enum<{ Ok: T; Err: E }>;
+
+/**
+ * Mimics Sway array type. For example, [u64; 10] is converted to ArrayOfLength.
+ */
+export type ArrayOfLength<
+ T,
+ Length extends number,
+ Arr extends unknown[] = [],
+> = Arr['length'] extends Length ? Arr : ArrayOfLength;
+
+interface Types {
+ functions: Record;
+ configurables: Partial>;
+}
+
+export type ProgramFunctionMapper = {
+ [K in keyof T]: InvokeFunction;
+};
+
+export type InterfaceFunctionMapper = {
+ [K in keyof T]: FunctionFragment;
+};
\ No newline at end of file
diff --git a/packages/abi/src/gen/renderers/ts/templates/contract-factory.hbs b/packages/abi/src/gen/renderers/ts/templates/contract-factory.hbs
new file mode 100644
index 00000000000..b57f0ea8e33
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/contract-factory.hbs
@@ -0,0 +1,26 @@
+{{header}}
+
+import { ContractFactory } from 'fuels';
+import type { Account, Provider, DeployContractOptions } from 'fuels';
+import { {{name}} } from './{{name}}';
+import { bytecode } from './{{name}}-bytecode';
+import { abi } from './{{name}}-abi';
+import { storageSlots } from './{{name}}-storage-slots';
+
+export class {{name}}Factory extends ContractFactory<{{name}}> {
+
+ static readonly bytecode = bytecode;
+ static readonly storageSlots = storageSlots;
+
+ constructor(accountOrProvider: Account | Provider) {
+ super(bytecode, abi, accountOrProvider, {{name}}Factory.storageSlots);
+ }
+
+ static deploy (
+ wallet: Account,
+ options: DeployContractOptions = {}
+ ) {
+ const factory = new {{name}}Factory(wallet);
+ return factory.deploy(options);
+ }
+}
diff --git a/packages/abi/src/gen/renderers/ts/templates/contract.hbs b/packages/abi/src/gen/renderers/ts/templates/contract.hbs
new file mode 100644
index 00000000000..78e3049b9fc
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/contract.hbs
@@ -0,0 +1,33 @@
+{{header}}
+
+import { Contract, Interface } from "fuels";
+import type { AbstractAddress, Account, Provider } from 'fuels';
+import type { {{name}}Types as Types } from './{{name}}Types';
+import type { InterfaceFunctionMapper, ProgramFunctionMapper } from '../common';
+import { abi } from './{{name}}-abi';
+
+export * from './{{name}}Types';
+
+export type {{name}}Configurables = Types['configurables'];
+
+export class {{name}}Interface extends Interface {
+ declare functions: InterfaceFunctionMapper;
+
+ constructor() {
+ super(abi);
+ }
+}
+
+export class {{name}} extends Contract {
+ declare interface: {{name}}Interface;
+ declare functions: ProgramFunctionMapper;
+
+ public static readonly abi = abi;
+
+ constructor(
+ id: string | AbstractAddress,
+ accountOrProvider: Account | Provider,
+ ) {
+ super(id, abi, accountOrProvider);
+ }
+}
\ No newline at end of file
diff --git a/packages/abi/src/gen/renderers/ts/templates/header.hbs b/packages/abi/src/gen/renderers/ts/templates/header.hbs
new file mode 100644
index 00000000000..a8ec5578f8b
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/header.hbs
@@ -0,0 +1,9 @@
+/* Autogenerated file. Do not edit manually. */
+
+/* eslint-disable eslint-comments/no-unlimited-disable */
+/* eslint-disable */
+
+/*
+ Fuels version: {{FUELS}}
+ Forc version: {{FORC}}
+*/
diff --git a/packages/abi/src/gen/renderers/ts/templates/index.hbs b/packages/abi/src/gen/renderers/ts/templates/index.hbs
new file mode 100644
index 00000000000..f323c7973da
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/index.hbs
@@ -0,0 +1,5 @@
+{{header}}
+
+{{#each exports}}
+export {{exportedContent}} from './{{path}}';
+{{/each}}
\ No newline at end of file
diff --git a/packages/abi/src/gen/renderers/ts/templates/predicate.hbs b/packages/abi/src/gen/renderers/ts/templates/predicate.hbs
new file mode 100644
index 00000000000..2925628d4e5
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/predicate.hbs
@@ -0,0 +1,33 @@
+{{header}}
+
+import { Predicate } from 'fuels';
+import type { PredicateParams } from 'fuels';
+import { abi } from './{{name}}-abi';
+import { bytecode } from './{{name}}-bytecode';
+import type { {{name}}Types as Types } from './{{name}}Types';
+
+export * from './{{name}}Types';
+
+export type {{name}}Inputs = Types['inputs'];
+export type {{name}}Output = Types['output'];
+export type {{name}}Configurables = Types['configurables'];
+
+export type {{name}}Parameters = Omit<
+ PredicateParams<
+ Types['inputs'],
+ Types['configurables']
+ >,
+ 'abi' | 'bytecode'
+>;
+
+export class {{name}} extends Predicate<
+ Types['inputs'],
+ Types['configurables']
+> {
+ public static readonly abi = abi;
+ public static readonly bytecode = bytecode;
+
+ constructor(params: {{name}}Parameters) {
+ super({ abi, bytecode, ...params });
+ }
+}
\ No newline at end of file
diff --git a/packages/abi/src/gen/renderers/ts/templates/script.hbs b/packages/abi/src/gen/renderers/ts/templates/script.hbs
new file mode 100644
index 00000000000..b304d851616
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/script.hbs
@@ -0,0 +1,25 @@
+{{header}}
+
+import { Script } from 'fuels';
+import type { Account } from 'fuels';
+import { abi } from './{{name}}-abi';
+import { bytecode } from './{{name}}-bytecode';
+import type { {{name}}Types as Types } from './{{name}}Types';
+
+export * from './{{name}}Types';
+
+export type {{name}}Inputs = Types['inputs'];
+export type {{name}}Output = Types['output'];
+export type {{name}}Configurables = Types['configurables'];
+
+export class {{name}} extends Script<
+ Types['inputs'],
+ Types['output']
+> {
+ public static readonly abi = abi;
+ public static readonly bytecode = bytecode;
+
+ constructor(wallet: Account) {
+ super(bytecode, abi, wallet);
+ }
+}
\ No newline at end of file
diff --git a/packages/abi/src/gen/renderers/ts/templates/storage-slots.hbs b/packages/abi/src/gen/renderers/ts/templates/storage-slots.hbs
new file mode 100644
index 00000000000..a877acccda5
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/storage-slots.hbs
@@ -0,0 +1,5 @@
+{{header}}
+
+import type { StorageSlot } from 'fuels';
+
+export const storageSlots: StorageSlot[] = {{storageSlots}};
\ No newline at end of file
diff --git a/packages/abi/src/gen/renderers/ts/templates/types.hbs b/packages/abi/src/gen/renderers/ts/templates/types.hbs
new file mode 100644
index 00000000000..8624ec21820
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/templates/types.hbs
@@ -0,0 +1,36 @@
+{{header}}
+
+import type { {{fuelsTypeImports}} } from 'fuels';
+import type { {{commonTypeImports}} } from '../common';
+
+{{#each enums}}
+export enum {{input}};
+{{/each}}
+
+{{#each types}}
+export type {{input}};
+export type {{output}};
+{{/each}}
+
+export interface {{name}}Types {
+ {{#if isContract}}
+ functions: {
+ {{#each functions}}
+ {{name}}: {
+ inputs: {{inputs}};
+ output: {{output}};
+ };
+ {{/each}}
+ };
+ {{else}}
+ {{#each functions}}
+ inputs: {{inputs}};
+ output: {{output}};
+ {{/each}}
+ {{/if}}
+ configurables: {{#if configurables}}Partial<{
+ {{#each configurables}}
+ {{name}}: {{input}};
+ {{/each}}
+ }>{{else}}undefined{{/if}};
+}
\ No newline at end of file
diff --git a/packages/abi/src/gen/renderers/ts/typers/enums.ts b/packages/abi/src/gen/renderers/ts/typers/enums.ts
new file mode 100644
index 00000000000..31e81835330
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/typers/enums.ts
@@ -0,0 +1,68 @@
+import { swayTypeMatchers, ENUM_REGEX } from '../../../../matchers/sway-type-matchers';
+
+import { structTyper } from './struct';
+import type { Typer, TyperAbiType } from './types';
+
+function isNativeEnum(abiType: TyperAbiType) {
+ return abiType.components?.every((t) => swayTypeMatchers.void(t.type.swayType)) === true;
+}
+
+export const enumTyper: Typer = (params, typer) => {
+ const { abiType } = params;
+ if (isNativeEnum(abiType)) {
+ const typeName = ENUM_REGEX.exec(abiType.swayType)?.[2] as string;
+
+ if (params.asReference) {
+ return { input: typeName, output: typeName };
+ }
+
+ const enumFields = abiType.components?.map((c) => `${c.name} = '${c.name}'`).join(', ');
+ const input = `${typeName} { ${enumFields} }`;
+ return {
+ input,
+ output: input,
+ tsType: 'enum',
+ };
+ }
+
+ return structTyper(params, typer);
+};
+
+export const optionTyper: Typer = ({ abiType }, typer) => {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ const { type } = abiType.components![1]!;
+ const some = typer({ abiType: type, asReference: true });
+ const input = `Option<${some.input}>`;
+ const output = `Option<${some.output}>`;
+ return {
+ input,
+ output,
+ commonTypeImports: ['Option'],
+ };
+};
+
+export const resultTyper: Typer = ({ abiType }, typer) => {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ const [{ type: ok }, { type: err }] = abiType.components!;
+ const mappedOk = typer({ abiType: ok, asReference: true });
+ const mappedErr = typer({ abiType: err, asReference: true });
+
+ const input = `Result<${mappedOk.input}, ${mappedErr.input}>`;
+ const output = `Result<${mappedOk.output}, ${mappedErr.output}>`;
+
+ const fuelsTypeImports = [
+ mappedOk.fuelsTypeImports ?? [],
+ mappedErr.fuelsTypeImports ?? [],
+ ].flat();
+ const commonTypeImports = [
+ mappedOk.commonTypeImports ?? [],
+ mappedErr.commonTypeImports ?? [],
+ ['Result'],
+ ].flat();
+ return {
+ input,
+ output,
+ fuelsTypeImports,
+ commonTypeImports,
+ };
+};
diff --git a/packages/abi/src/gen/renderers/ts/typers/generate-ts-type.ts b/packages/abi/src/gen/renderers/ts/typers/generate-ts-type.ts
new file mode 100644
index 00000000000..09ce1a1aa55
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/typers/generate-ts-type.ts
@@ -0,0 +1,6 @@
+import { typerMatcher } from './typer-matcher';
+import type { TyperParams, TyperReturn } from './types';
+
+export function generateTsType(params: TyperParams): TyperReturn {
+ return typerMatcher(params.abiType)(params, generateTsType);
+}
diff --git a/packages/abi/src/gen/renderers/ts/typers/helpers.ts b/packages/abi/src/gen/renderers/ts/typers/helpers.ts
new file mode 100644
index 00000000000..892c6e1b62f
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/typers/helpers.ts
@@ -0,0 +1,10 @@
+import type { TyperReturn } from './types';
+
+export function flattenImports(mapped: TyperReturn[]) {
+ const fuelsTypeImports = mapped.flatMap((m) => m.fuelsTypeImports).filter((x) => x !== undefined);
+ const commonTypeImports = mapped
+ .flatMap((m) => m.commonTypeImports)
+ .filter((x) => x !== undefined);
+
+ return { fuelsTypeImports, commonTypeImports };
+}
diff --git a/packages/abi/src/gen/renderers/ts/typers/iterators.ts b/packages/abi/src/gen/renderers/ts/typers/iterators.ts
new file mode 100644
index 00000000000..3ed4f99743d
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/typers/iterators.ts
@@ -0,0 +1,37 @@
+import { ARRAY_REGEX } from '../../../../matchers/sway-type-matchers';
+import type { AbiTypeComponent } from '../../../../parser';
+
+import type { Typer } from './types';
+import { mapComponents } from './utils';
+
+export const tupleTyper: Typer = ({ abiType }, typer) =>
+ mapComponents({ parent: abiType, includeComponentNames: false, typer });
+
+export const arrayTyper: Typer = ({ abiType }, typer) => {
+ const length = ARRAY_REGEX.exec(abiType.swayType)?.[2];
+
+ const { type } = abiType.components?.[0] as AbiTypeComponent;
+ const mapped = typer({ abiType: type, asReference: true });
+
+ const input = `ArrayOfLength<${mapped.input}, ${length}>`;
+ const output = `ArrayOfLength<${mapped.output}, ${length}>`;
+
+ return {
+ input,
+ output,
+ fuelsTypeImports: mapped.fuelsTypeImports,
+ commonTypeImports: ['ArrayOfLength', ...(mapped.commonTypeImports ?? [])],
+ };
+};
+
+export const vectorTyper: Typer = ({ abiType }, typer) => {
+ const { type } = abiType.components?.[0] as AbiTypeComponent;
+ const mapped = typer({ abiType: type, asReference: true });
+ const input = `${mapped.input}[]`;
+ const output = `${mapped.output}[]`;
+ return {
+ ...mapped,
+ input,
+ output,
+ };
+};
diff --git a/packages/abi/src/gen/renderers/ts/typers/simple.ts b/packages/abi/src/gen/renderers/ts/typers/simple.ts
new file mode 100644
index 00000000000..9440f5aec51
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/typers/simple.ts
@@ -0,0 +1,82 @@
+import { GENERIC_REGEX } from '../../../../matchers/sway-type-matchers';
+
+import type { TyperReturn, Typer } from './types';
+
+const numberTyperReturn: TyperReturn = {
+ input: 'BigNumberish',
+ output: 'number',
+ fuelsTypeImports: ['BigNumberish'],
+};
+
+export const u8Typer: Typer = () => numberTyperReturn;
+export const u16Typer = u8Typer;
+export const u32Typer = u8Typer;
+
+const u64TyperReturn: TyperReturn = {
+ input: 'BigNumberish',
+ output: 'BN',
+ fuelsTypeImports: ['BigNumberish', 'BN'],
+};
+export const u64Typer: Typer = () => u64TyperReturn;
+export const u256Typer: Typer = u64Typer;
+
+const boolTyperReturn = {
+ input: 'boolean',
+ output: 'boolean',
+};
+export const boolTyper: Typer = () => boolTyperReturn;
+
+const stringTyperReturn: TyperReturn = {
+ input: 'string',
+ output: 'string',
+};
+export const stringTyper: Typer = () => stringTyperReturn;
+export const b256Typer: Typer = stringTyper;
+export const b512Typer: Typer = stringTyper;
+
+const evmAddressTyperReturn: TyperReturn = {
+ input: 'EvmAddress',
+ output: 'EvmAddress',
+ fuelsTypeImports: ['EvmAddress'],
+};
+export const evmAddressTyper: Typer = () => evmAddressTyperReturn;
+
+const bytesTyperReturn: TyperReturn = {
+ input: 'Bytes',
+ output: 'Bytes',
+ fuelsTypeImports: ['Bytes'],
+};
+export const bytesTyper: Typer = () => bytesTyperReturn;
+
+const strTyperReturn: TyperReturn = {
+ input: 'StrSlice',
+ output: 'StrSlice',
+ fuelsTypeImports: ['StrSlice'],
+};
+export const strTyper: Typer = () => strTyperReturn;
+
+const rawSliceTyperReturn: TyperReturn = {
+ input: 'RawSlice',
+ output: 'RawSlice',
+ fuelsTypeImports: ['RawSlice'],
+};
+export const rawSliceTyper = () => rawSliceTyperReturn;
+
+const stdStringTyperReturn: TyperReturn = {
+ input: 'StdString',
+ output: 'StdString',
+ fuelsTypeImports: ['StdString'],
+};
+export const stdStringTyper: Typer = () => stdStringTyperReturn;
+
+const voidTyperReturn: TyperReturn = { input: 'undefined', output: 'void' };
+export const voidTyper: Typer = () => voidTyperReturn;
+
+export const genericTyper: Typer = ({ abiType }) => {
+ // extracts the `T` part from `generic T`
+ const typeName = GENERIC_REGEX.exec(abiType.swayType)?.[1] as string;
+ return {
+ input: typeName,
+ output: typeName,
+ };
+};
diff --git a/packages/abi/src/gen/renderers/ts/typers/struct.ts b/packages/abi/src/gen/renderers/ts/typers/struct.ts
new file mode 100644
index 00000000000..fbbcc5942fa
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/typers/struct.ts
@@ -0,0 +1,88 @@
+import { ENUM_REGEX, STRUCT_REGEX } from '../../../../matchers/sway-type-matchers';
+import type { AbiMetadataType, AbiTypeArgument } from '../../../../parser';
+
+import { flattenImports } from './helpers';
+import type { TyperReturn, Typer, GlobalTyper, TyperAbiType } from './types';
+import { mapComponents } from './utils';
+
+function mapGenericTypeParameters(
+ typeArgs: AbiTypeArgument[] | AbiMetadataType['typeParameters'],
+ typer: GlobalTyper
+): TyperReturn {
+ if (!typeArgs) {
+ return {
+ input: '',
+ output: '',
+ };
+ }
+ const mapped = typeArgs.map((ta) => typer({ abiType: ta, asReference: true }));
+ const { fuelsTypeImports, commonTypeImports } = flattenImports(mapped);
+
+ const input = mapped.map((r) => r.input).join(', ');
+ const output = mapped.map((r) => r.output).join(', ');
+ return {
+ fuelsTypeImports,
+ commonTypeImports,
+ input: `<${input}>`,
+ output: `<${output}>`,
+ };
+}
+
+function getTypeNames(abiType: TyperAbiType) {
+ const typeName =
+ STRUCT_REGEX.exec(abiType.swayType)?.[2] ?? ENUM_REGEX.exec(abiType.swayType)?.[2];
+ return {
+ inputName: `${typeName}Input`,
+ outputName: `${typeName}Output`,
+ };
+}
+
+function mapStructAsReference(abiType: TyperAbiType, typer: GlobalTyper): TyperReturn {
+ const { inputName, outputName } = getTypeNames(abiType);
+
+ const typeArgs = mapGenericTypeParameters(
+ 'metadata' in abiType
+ ? abiType.metadata?.typeArguments
+ : (abiType as AbiMetadataType).typeParameters,
+ typer
+ );
+
+ return {
+ ...typeArgs,
+ input: `${inputName}${typeArgs.input}`,
+ output: `${outputName}${typeArgs.output}`,
+ };
+}
+
+export const structTyper: Typer = ({ abiType, asReference }, typer) => {
+ if ('metadata' in abiType || asReference) {
+ return mapStructAsReference(abiType, typer);
+ }
+
+ const { inputName, outputName } = getTypeNames(abiType);
+
+ const typeParameters = mapGenericTypeParameters(
+ (abiType as AbiMetadataType).typeParameters,
+ typer
+ );
+ const content = mapComponents({ parent: abiType, includeComponentNames: true, typer });
+
+ const inputType = `${inputName}${typeParameters.input}`;
+ const outputType = `${outputName}${typeParameters.output}`;
+
+ const input = `${inputType} = ${content.input}`;
+ let output = '';
+ if (content.input === content.output) {
+ output = `${outputType} = ${inputType}`;
+ } else {
+ output = `${outputType} = ${content.output}`;
+ }
+
+ return {
+ input,
+ output,
+ commonTypeImports: content.commonTypeImports,
+ fuelsTypeImports: content.fuelsTypeImports,
+ tsType: 'type',
+ };
+};
diff --git a/packages/abi/src/gen/renderers/ts/typers/typer-matcher.ts b/packages/abi/src/gen/renderers/ts/typers/typer-matcher.ts
new file mode 100644
index 00000000000..03da529b250
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/typers/typer-matcher.ts
@@ -0,0 +1,51 @@
+import { createMatcher } from '../../../../matchers/sway-type-matchers';
+
+import { optionTyper, enumTyper, resultTyper } from './enums';
+import { tupleTyper, arrayTyper, vectorTyper } from './iterators';
+import {
+ boolTyper,
+ u8Typer,
+ u16Typer,
+ u32Typer,
+ u64Typer,
+ u256Typer,
+ b256Typer,
+ stringTyper,
+ evmAddressTyper,
+ genericTyper,
+ b512Typer,
+ bytesTyper,
+ rawSliceTyper,
+ stdStringTyper,
+ strTyper,
+ voidTyper,
+} from './simple';
+import { structTyper } from './struct';
+import type { Typer } from './types';
+
+export const typerMatcher = createMatcher({
+ bool: boolTyper,
+ u8: u8Typer,
+ u16: u16Typer,
+ u32: u32Typer,
+ u64: u64Typer,
+ u256: u256Typer,
+ b256: b256Typer,
+ b512: b512Typer,
+ tuple: tupleTyper,
+ array: arrayTyper,
+ struct: structTyper,
+ generic: genericTyper,
+ string: stringTyper,
+ vector: vectorTyper,
+ option: optionTyper,
+ bytes: bytesTyper,
+ str: strTyper,
+ rawUntypedSlice: rawSliceTyper,
+ stdString: stdStringTyper,
+ enum: enumTyper,
+ result: resultTyper,
+ void: voidTyper,
+ assetId: structTyper,
+ evmAddress: evmAddressTyper,
+});
diff --git a/packages/abi/src/gen/renderers/ts/typers/types.ts b/packages/abi/src/gen/renderers/ts/typers/types.ts
new file mode 100644
index 00000000000..e31a4c8f5e9
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/typers/types.ts
@@ -0,0 +1,20 @@
+import type { AbiConcreteType, AbiTypeComponent, AbiMetadataType } from '../../../../parser';
+
+export interface TyperReturn {
+ input: string;
+ output: string;
+ fuelsTypeImports?: string[];
+ commonTypeImports?: string[];
+ tsType?: 'enum' | 'type';
+}
+
+export type TyperAbiType = AbiConcreteType | AbiMetadataType | AbiTypeComponent['type'];
+
+export type TyperParams = {
+ abiType: TyperAbiType;
+ asReference?: boolean;
+};
+
+export type GlobalTyper = (p: TyperParams) => TyperReturn;
+
+export type Typer = (params: TyperParams, typer: GlobalTyper) => TyperReturn;
diff --git a/packages/abi/src/gen/renderers/ts/typers/utils.ts b/packages/abi/src/gen/renderers/ts/typers/utils.ts
new file mode 100644
index 00000000000..9305850eb43
--- /dev/null
+++ b/packages/abi/src/gen/renderers/ts/typers/utils.ts
@@ -0,0 +1,81 @@
+import { assertUnreachable } from '@fuel-ts/utils';
+
+import { ENUM_REGEX, TUPLE_REGEX } from '../../../../matchers/sway-type-matchers';
+import type { AbiTypeComponent } from '../../../../parser';
+
+import { flattenImports } from './helpers';
+import type { TyperAbiType, GlobalTyper, TyperReturn } from './types';
+
+function componentMapper(
+ c: AbiTypeComponent,
+ includeName: boolean,
+ generateTsType: GlobalTyper
+): TyperReturn {
+ const mapped = generateTsType({ abiType: c.type, asReference: true });
+
+ if (!includeName) {
+ return mapped;
+ }
+
+ return {
+ ...mapped,
+ input: `${c.name}: ${mapped.input}`,
+ output: `${c.name}: ${mapped.output}`,
+ };
+}
+
+function wrapStructContent(text: string, wrap: '{}' | '[]' | 'Enum'): string {
+ switch (wrap) {
+ case '{}':
+ return `{ ${text} }`;
+ case '[]':
+ return `[${text}]`;
+ case 'Enum': {
+ const wrappedAsObj = wrapStructContent(text, '{}');
+ return `Enum<${wrappedAsObj}>`;
+ }
+ default:
+ return assertUnreachable(wrap);
+ }
+}
+
+/**
+ * This function maps components for a given parent type
+ * which can be a tuple or struct (and enum).
+ */
+export function mapComponents(params: {
+ parent: TyperAbiType;
+ /**
+ * Component names are included for structs and enums,
+ * but they're not included for tuples (we ignore the `__tuple_element` name).
+ */
+ includeComponentNames: boolean;
+ typer: GlobalTyper;
+}) {
+ const { parent, includeComponentNames, typer } = params;
+ const components = parent.components as AbiTypeComponent[];
+ const mapped = components.map((c) => componentMapper(c, includeComponentNames, typer));
+
+ // eslint-disable-next-line no-nested-ternary
+ const wrap = ENUM_REGEX.test(parent.swayType)
+ ? 'Enum'
+ : TUPLE_REGEX.test(parent.swayType)
+ ? '[]'
+ : '{}';
+
+ const input = wrapStructContent(mapped.map((m) => m.input).join(', '), wrap);
+ const output = wrapStructContent(mapped.map((m) => m.output).join(', '), wrap);
+
+ const { fuelsTypeImports, commonTypeImports } = flattenImports(mapped);
+
+ if (wrap === 'Enum') {
+ commonTypeImports.push('Enum');
+ }
+
+ return {
+ input,
+ output,
+ fuelsTypeImports,
+ commonTypeImports,
+ };
+}
diff --git a/packages/abi/src/gen/renderers/types.ts b/packages/abi/src/gen/renderers/types.ts
new file mode 100644
index 00000000000..5d18ccaa6e9
--- /dev/null
+++ b/packages/abi/src/gen/renderers/types.ts
@@ -0,0 +1,9 @@
+import type { BinaryVersions } from '@fuel-ts/versions';
+
+import type { AbiGenResult, ProgramDetails } from '../abi-gen-types';
+
+export type Renderer = (details: ProgramDetails[], versions: BinaryVersions) => AbiGenResult[];
+
+export type TsAbiGenResult = AbiGenResult & {
+ exportInIndexFile?: string[];
+};
diff --git a/packages/abi/src/utils/evaluate-function-inputs-optionality.ts b/packages/abi/src/utils/evaluate-function-inputs-optionality.ts
new file mode 100644
index 00000000000..280e64c917a
--- /dev/null
+++ b/packages/abi/src/utils/evaluate-function-inputs-optionality.ts
@@ -0,0 +1,15 @@
+import { swayTypeMatchers } from '../matchers/sway-type-matchers';
+import type { AbiFunction, AbiFunctionInput } from '../parser';
+
+export function evaluateFunctionInputsOptionality(
+ fn: AbiFunction
+): (AbiFunctionInput & { isOptional: boolean })[] {
+ let isMandatory = false;
+ return fn.inputs.reduceRight<(AbiFunctionInput & { isOptional: boolean })[]>((result, input) => {
+ const isTypeMandatory =
+ !swayTypeMatchers.void(input.type.swayType) && !swayTypeMatchers.option(input.type.swayType);
+
+ isMandatory = isMandatory || isTypeMandatory;
+ return [{ ...input, isOptional: !isMandatory }, ...result];
+ }, []);
+}
diff --git a/packages/abi/tsup.config.ts b/packages/abi/tsup.config.ts
index 4c7f2f0354f..48e24be8656 100644
--- a/packages/abi/tsup.config.ts
+++ b/packages/abi/tsup.config.ts
@@ -1,3 +1,11 @@
-import { index } from '@internal/tsup';
+import { indexBinAndCliConfig } from '@internal/tsup';
+import type { Options } from 'tsup';
-export default index;
+const configs: Options = {
+ ...indexBinAndCliConfig,
+ loader: {
+ '.hbs': 'text',
+ },
+};
+
+export default configs;
diff --git a/packages/abi/typegen.js b/packages/abi/typegen.js
new file mode 100755
index 00000000000..ae13c3e8f43
--- /dev/null
+++ b/packages/abi/typegen.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('./dist/bin.js');
diff --git a/packages/fuel-gauge/package.json b/packages/fuel-gauge/package.json
index 740c95be9a7..251f047e660 100644
--- a/packages/fuel-gauge/package.json
+++ b/packages/fuel-gauge/package.json
@@ -15,6 +15,7 @@
"fuels": "workspace:*"
},
"devDependencies": {
+ "@fuel-ts/abi": "workspace:*",
"@fuel-ts/account": "workspace:*",
"@fuel-ts/errors": "workspace:*",
"@fuel-ts/merkle": "workspace:*",
diff --git a/packages/fuel-gauge/src/abi/abi-coder.test.ts b/packages/fuel-gauge/src/abi/abi-coder.test.ts
index 5f7fe677b1a..08f6456d859 100644
--- a/packages/fuel-gauge/src/abi/abi-coder.test.ts
+++ b/packages/fuel-gauge/src/abi/abi-coder.test.ts
@@ -4,11 +4,8 @@ import { expectToThrowFuelError, launchTestNode } from 'fuels/test-utils';
import { AbiContractFactory } from '../../test/typegen';
import type { AbiContract } from '../../test/typegen';
-import {
- EnumWithNativeInput,
- EnumWithNativeOutput,
- ExternalEnumInput,
-} from '../../test/typegen/contracts/AbiContract';
+import type { Option, Result } from '../../test/typegen/common';
+import { EnumWithNative, ExternalEnum } from '../../test/typegen/contracts/AbiContractTypes';
import type {
EnumWithBuiltinTypeInput,
EnumWithBuiltinTypeOutput,
@@ -32,8 +29,7 @@ import type {
StructWithEnumArrayOutput,
StructWithSingleOptionOutput,
StructWithSingleOptionInput,
-} from '../../test/typegen/contracts/AbiContract';
-import type { Option, Result, Vec } from '../../test/typegen/contracts/common';
+} from '../../test/typegen/contracts/AbiContractTypes';
import {
U16_MAX,
@@ -793,7 +789,7 @@ describe('AbiCoder', () => {
describe('types_array_with_vector', () => {
it('should encode/decode just fine', async () => {
- const input = [[1, 2, 3]] as [Vec];
+ const input = [[1, 2, 3]] as [BigNumberish[]];
const expected = [[3, 2, 1]];
const { waitForResult } = await contract.functions.types_array_with_vector(input).call();
@@ -1091,14 +1087,10 @@ describe('AbiCoder', () => {
describe('types_struct_with_array_of_enums', () => {
it.todo('should encode/decode just fine', async () => {
const input: StructWithEnumArrayInput = {
- a: [EnumWithNativeInput.Checked, EnumWithNativeInput.Checked, EnumWithNativeInput.Checked],
+ a: [EnumWithNative.Checked, EnumWithNative.Checked, EnumWithNative.Checked],
};
const expected: StructWithEnumArrayOutput = {
- a: [
- EnumWithNativeOutput.Pending,
- EnumWithNativeOutput.Pending,
- EnumWithNativeOutput.Pending,
- ],
+ a: [EnumWithNative.Pending, EnumWithNative.Pending, EnumWithNative.Pending],
};
const { waitForResult } = await contract.functions
@@ -1470,8 +1462,8 @@ describe('AbiCoder', () => {
*/
describe('types_enum', () => {
it('should encode/decode just fine', async () => {
- const input = EnumWithNativeInput.Checked;
- const expected = EnumWithNativeInput.Pending;
+ const input = EnumWithNative.Checked;
+ const expected = EnumWithNative.Pending;
const { waitForResult } = await contract.functions.types_enum(input).call();
@@ -1579,8 +1571,8 @@ describe('AbiCoder', () => {
describe('types_enum_external', () => {
it('should encode/decode just fine', async () => {
- const input = ExternalEnumInput.A;
- const expected = ExternalEnumInput.B;
+ const input = ExternalEnum.A;
+ const expected = ExternalEnum.B;
const { waitForResult } = await contract.functions.types_enum_external(input).call();
@@ -1607,7 +1599,7 @@ describe('AbiCoder', () => {
describe('types_enum_with_structs', () => {
it('should encode/decode just fine', async () => {
- const input = { a: EnumWithNativeInput.Checked };
+ const input = { a: EnumWithNative.Checked };
const expected = { b: { a: true, b: 10 } };
const { waitForResult } = await contract.functions.types_enum_with_structs(input).call();
@@ -1759,8 +1751,8 @@ describe('AbiCoder', () => {
describe('types_vector_option', () => {
it('should encode/decode just fine', async () => {
- const input: Vec = [{ a: [1, 2, 3, 4, 5] }];
- const expected: Vec = [{ a: [5, 4, 3, 2, 1] }];
+ const input: StructWithMultiOptionInput[] = [{ a: [1, 2, 3, 4, 5] }];
+ const expected: StructWithMultiOptionOutput[] = [{ a: [5, 4, 3, 2, 1] }];
const { waitForResult } = await contract.functions.types_vector_option(input).call();
diff --git a/packages/fuel-gauge/src/abi/abi-gen.test.ts b/packages/fuel-gauge/src/abi/abi-gen.test.ts
index e3a2b44922a..e71c595953d 100644
--- a/packages/fuel-gauge/src/abi/abi-gen.test.ts
+++ b/packages/fuel-gauge/src/abi/abi-gen.test.ts
@@ -1,23 +1,165 @@
-import { log } from 'console';
+import { runTypegen } from '@fuel-ts/abi/cli';
+import { randomUUID } from 'crypto';
+import { cpSync, mkdirSync, readdirSync, readFileSync, rmdirSync, rmSync } from 'fs';
+import { FuelError } from 'fuels';
+import { expectToThrowFuelError } from 'fuels/test-utils';
+import { tmpdir } from 'os';
+import { join } from 'path';
import { AbiProjectsEnum, getAbiForcProject } from './utils';
+function generateTmpDir(fromDir?: string) {
+ const dir = join(tmpdir(), 'fuels', randomUUID());
+
+ mkdirSync(dir, { recursive: true });
+
+ if (fromDir) {
+ cpSync(fromDir, dir, { recursive: true });
+ }
+
+ return { path: dir, [Symbol.dispose]: () => rmdirSync(dir, { recursive: true }) };
+}
+
/**
* @group node
*/
describe('AbiGen', () => {
- test('contract', () => {
- const { abiContents } = getAbiForcProject(AbiProjectsEnum.ABI_CONTRACT);
- log(abiContents);
+ test('Generates all files correctly', () => {
+ const fixtureResultMap = new Map([
+ ['index', 'index.ts'],
+ ['common', 'common.ts'],
+
+ ['contracts/contract-index', 'contracts/index.ts'],
+ ['contracts/contract', 'contracts/AbiContract.ts'],
+ ['contracts/contract-types', 'contracts/AbiContractTypes.ts'],
+ ['contracts/contract-factory', 'contracts/AbiContractFactory.ts'],
+ ['contracts/contract-bytecode', 'contracts/AbiContract-bytecode.ts'],
+ ['contracts/contract-abi', 'contracts/AbiContract-abi.ts'],
+ ['contracts/contract-storage-slots', 'contracts/AbiContract-storage-slots.ts'],
+
+ ['predicates/predicate-index', 'predicates/index.ts'],
+ ['predicates/predicate', 'predicates/AbiPredicate.ts'],
+ ['predicates/predicate-types', 'predicates/AbiPredicateTypes.ts'],
+ ['predicates/predicate-abi', 'predicates/AbiPredicate-abi.ts'],
+
+ ['scripts/script-index', 'scripts/index.ts'],
+ ['scripts/script', 'scripts/AbiScript.ts'],
+ ['scripts/script-types', 'scripts/AbiScriptTypes.ts'],
+ ['scripts/script-abi', 'scripts/AbiScript-abi.ts'],
+ ]);
+
+ const { buildDir: contractDir } = getAbiForcProject(AbiProjectsEnum.ABI_CONTRACT);
+ const { buildDir: predicateDir } = getAbiForcProject(AbiProjectsEnum.ABI_PREDICATE);
+ const { abiPath: scriptAbiPath } = getAbiForcProject(AbiProjectsEnum.ABI_SCRIPT);
+
+ using output = generateTmpDir();
+
+ runTypegen({
+ inputs: [contractDir, predicateDir, scriptAbiPath],
+ output: output.path,
+ });
+
+ fixtureResultMap.forEach((filename, fixture) => {
+ const fixtureFile = join(
+ process.cwd(),
+ `packages/fuel-gauge/src/abi/fixtures/${fixture}.txt`
+ );
+ const expected = readFileSync(fixtureFile).toString();
+ const generated = readFileSync(join(output.path, filename)).toString();
+
+ expect(generated).toEqual(expected);
+ });
});
- test('script', () => {
- const { abiContents } = getAbiForcProject(AbiProjectsEnum.ABI_SCRIPT);
- log(abiContents);
+ test('logs if no abi json file found and skips path', () => {
+ const logSpy = vi.spyOn(console, 'log').mockImplementationOnce(() => {});
+ const { buildDir: scriptBuildDir, name: scriptName } = getAbiForcProject(
+ AbiProjectsEnum.ABI_SCRIPT
+ );
+ const { buildDir: predicateBuildDir } = getAbiForcProject(AbiProjectsEnum.ABI_PREDICATE);
+ using scriptDir = generateTmpDir(scriptBuildDir);
+
+ rmSync(join(scriptDir.path, `${scriptName}-abi.json`));
+
+ using predicateDir = generateTmpDir(predicateBuildDir);
+
+ runTypegen({
+ inputs: [scriptDir.path, predicateDir.path],
+ output: scriptDir.path,
+ });
+
+ expect(logSpy).toHaveBeenCalledWith(
+ `No abi file found in ${scriptDir.path}, skipping this path.`
+ );
+ const outputDirContents = readdirSync(scriptDir.path);
+
+ expect(outputDirContents).not.toContain('scripts');
+ expect(outputDirContents).toContain('predicates');
});
- test('predicate', () => {
- const { abiContents } = getAbiForcProject(AbiProjectsEnum.ABI_PREDICATE);
- log(abiContents);
+ test('skips contract factory and bytecode generation when bytecode is missing and logs it', () => {
+ const { buildDir, name } = getAbiForcProject(AbiProjectsEnum.ABI_CONTRACT);
+ using tmpDir = generateTmpDir(buildDir);
+
+ rmSync(join(tmpDir.path, `${name}.bin`));
+
+ const spy = vi.spyOn(console, 'log').mockImplementationOnce(() => {});
+
+ runTypegen({
+ inputs: [tmpDir.path],
+ output: tmpDir.path,
+ });
+
+ expect(spy).toHaveBeenCalledWith(
+ `No bytecode found for contract at ${tmpDir.path}, will not generate ContractFactory for it.`
+ );
+
+ const contractsOutputs = readdirSync(join(tmpDir.path, 'contracts'));
+
+ expect(contractsOutputs).toContain('index.ts');
+ expect(contractsOutputs).toContain('AbiContract.ts');
+ expect(contractsOutputs).toContain('AbiContractTypes.ts');
+ expect(contractsOutputs).toContain('AbiContract-abi.ts');
+ expect(contractsOutputs).toContain('AbiContract-storage-slots.ts');
+ expect(contractsOutputs).not.toContain('AbiContractFactory.ts');
+ expect(contractsOutputs).not.toContain('AbiContract-bytecode.ts');
+ });
+
+ test('throws when missing bytecode for script', async () => {
+ const { buildDir, name } = getAbiForcProject(AbiProjectsEnum.ABI_SCRIPT);
+ using tmpDir = generateTmpDir(buildDir);
+
+ rmSync(join(tmpDir.path, `${name}.bin`));
+
+ await expectToThrowFuelError(
+ () =>
+ runTypegen({
+ inputs: [tmpDir.path],
+ output: tmpDir.path,
+ }),
+ new FuelError(
+ FuelError.CODES.BIN_FILE_NOT_FOUND,
+ `For scripts, the bytecode is required. No bytecode found for script at ${tmpDir.path}.`
+ )
+ );
+ });
+
+ test('throws when missing bytecode for predicate', async () => {
+ const { buildDir, name } = getAbiForcProject(AbiProjectsEnum.ABI_PREDICATE);
+ using tmpDir = generateTmpDir(buildDir);
+
+ rmSync(join(tmpDir.path, `${name}.bin`));
+
+ await expectToThrowFuelError(
+ () =>
+ runTypegen({
+ inputs: [tmpDir.path],
+ output: tmpDir.path,
+ }),
+ new FuelError(
+ FuelError.CODES.BIN_FILE_NOT_FOUND,
+ `For predicates, the bytecode is required. No bytecode found for predicate at ${tmpDir.path}.`
+ )
+ );
});
});
diff --git a/packages/fuel-gauge/src/abi/fixtures/common.txt b/packages/fuel-gauge/src/abi/fixtures/common.txt
new file mode 100644
index 00000000000..68069dcde69
--- /dev/null
+++ b/packages/fuel-gauge/src/abi/fixtures/common.txt
@@ -0,0 +1,53 @@
+/* Autogenerated file. Do not edit manually. */
+
+/* eslint-disable eslint-comments/no-unlimited-disable */
+/* eslint-disable */
+
+/*
+ Fuels version: 0.97.2
+ Forc version: 0.66.5
+*/
+
+
+import type { FunctionFragment, InvokeFunction } from 'fuels';
+
+/**
+ * Mimics Sway Enum.
+ * Requires one and only one Key-Value pair and raises error if more are provided.
+ */
+export type Enum = {
+ [K in keyof T]: Pick & { [P in Exclude]?: never };
+}[keyof T];
+
+/**
+ * Mimics Sway Option type.
+ */
+export type Option = T | undefined;
+
+/**
+ * Mimics Sway Result enum type.
+ * Ok represents the success case, while Err represents the error case.
+ */
+export type Result = Enum<{ Ok: T; Err: E }>;
+
+/**
+ * Mimics Sway array type. For example, [u64; 10] is converted to ArrayOfLength.
+ */
+export type ArrayOfLength<
+ T,
+ Length extends number,
+ Arr extends unknown[] = [],
+> = Arr['length'] extends Length ? Arr : ArrayOfLength;
+
+interface Types {
+ functions: Record;
+ configurables: Partial>;
+}
+
+export type ProgramFunctionMapper = {
+ [K in keyof T]: InvokeFunction;
+};
+
+export type InterfaceFunctionMapper = {
+ [K in keyof T]: FunctionFragment;
+};
\ No newline at end of file
diff --git a/packages/fuel-gauge/src/abi/fixtures/contracts/contract-abi.txt b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-abi.txt
new file mode 100644
index 00000000000..22d82bef5e6
--- /dev/null
+++ b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-abi.txt
@@ -0,0 +1,2808 @@
+/* Autogenerated file. Do not edit manually. */
+
+/* eslint-disable eslint-comments/no-unlimited-disable */
+/* eslint-disable */
+
+/*
+ Fuels version: 0.97.2
+ Forc version: 0.66.5
+*/
+
+
+export const abi = {
+ "programType": "contract",
+ "specVersion": "1",
+ "encodingVersion": "1",
+ "concreteTypes": [
+ {
+ "type": "()",
+ "concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ },
+ {
+ "type": "(b256, bool)",
+ "concreteTypeId": "d5f6ab61fc224aae1bf15a89ab88840ed54e312a76a9735d1f60d4d0d1fae640",
+ "metadataTypeId": 0
+ },
+ {
+ "type": "(bool, u64)",
+ "concreteTypeId": "c998ca9a5f221fe7b5c66ae70c8a9562b86d964408b00d17f883c906bc1fe4be",
+ "metadataTypeId": 8
+ },
+ {
+ "type": "(str[5], bool)",
+ "concreteTypeId": "a1e229302ed2f092752a6bc4fbe66bb9305e0802b1b01ecc5e1d59356702e956",
+ "metadataTypeId": 1
+ },
+ {
+ "type": "(str[5], str[5])",
+ "concreteTypeId": "30022fd7ad3fda4035d30e4d86b705d4870924d4b4fe054624d2561fa12bb33e",
+ "metadataTypeId": 2
+ },
+ {
+ "type": "(struct data_structures::StructDoubleGeneric<[b256; 3],u8>, [struct data_structures::StructDoubleGeneric; 4], (str[5], bool), struct data_structures::StructSimple)",
+ "concreteTypeId": "343f07ddcd75b9385bc193e0419f2e89c75fad67cbf4ad1b36a01a136620817e",
+ "metadataTypeId": 13
+ },
+ {
+ "type": "(struct data_structures::StructSimple, struct std::vec::Vec)",
+ "concreteTypeId": "5ebb7c8cdd38d1f676f9c7089a2da12b27114ee3771c2047f3295d4d30f8fd2c",
+ "metadataTypeId": 3
+ },
+ {
+ "type": "(struct std::asset_id::AssetId, struct std::asset_id::AssetId, bool)",
+ "concreteTypeId": "a95e1fcceb1451b8a76471f593f66c4a52ca04bde3c227c746ad7aaf988de5c6",
+ "metadataTypeId": 10
+ },
+ {
+ "type": "(struct std::vec::Vec, b256)",
+ "concreteTypeId": "52e2726988c7da304606fbe4ed696efac04beb29e9a22e15778f8a0539c9cb94",
+ "metadataTypeId": 5
+ },
+ {
+ "type": "(struct std::vec::Vec, struct std::vec::Vec)",
+ "concreteTypeId": "87a4626758542d7b6a03099839e440a052a4d5a00e3abfdf22bcc564ca19a4fd",
+ "metadataTypeId": 6
+ },
+ {
+ "type": "(u32, struct std::vec::Vec, struct std::vec::Vec)",
+ "concreteTypeId": "18034e13b18b71de3c7e12f8f10a7bd48a23870e0dbb46eaf10faeb26d70f000",
+ "metadataTypeId": 9
+ },
+ {
+ "type": "(u64, struct data_structures::StructSimple)",
+ "concreteTypeId": "0088c28967dbcdaa34626c7e915e44b2afe72f12415f0e31edc0b5ce70e7c6dc",
+ "metadataTypeId": 4
+ },
+ {
+ "type": "(u8, struct data_structures::StructSingleGeneric>, str[3])",
+ "concreteTypeId": "6f875be99a39d9920569678a34ffce676a6c3e14b958910db250b9cb4957157f",
+ "metadataTypeId": 11
+ },
+ {
+ "type": "(u8, u8, u8)",
+ "concreteTypeId": "79239b6d6f2383e2cfbaf4da7fdf7ee7fb59b7bf517acfff2d9433e9e76e8fc4",
+ "metadataTypeId": 12
+ },
+ {
+ "type": "[b256; 3]",
+ "concreteTypeId": "81342782c917fcfd178741cb2b3a12ea1ebeaa57253fc4ee6700b4d7d6ab32d3",
+ "metadataTypeId": 17
+ },
+ {
+ "type": "[struct data_structures::StructDoubleGeneric,str[1]>; 2]",
+ "concreteTypeId": "b8164e36cce9d14142824b5cc55aebc1272036775b966af82c49c78aff114006",
+ "metadataTypeId": 15
+ },
+ {
+ "type": "[struct data_structures::StructDoubleGeneric; 4]",
+ "concreteTypeId": "b22807669faa58263e636f6e2d194df8ddbc6686bb4ea14ee28005fa30adbe85",
+ "metadataTypeId": 22
+ },
+ {
+ "type": "[struct data_structures::StructSimple; 3]",
+ "concreteTypeId": "38f2594527b516dab2c81b31356901226242d7c32554877e36797c6b23969237",
+ "metadataTypeId": 18
+ },
+ {
+ "type": "[struct std::vec::Vec; 1]",
+ "concreteTypeId": "593b39347cc381516d8ed1f8e5e628a8d455bd3f833bd9dfdd5165ba16f9f980",
+ "metadataTypeId": 14
+ },
+ {
+ "type": "[u8; 4]",
+ "concreteTypeId": "f28afa065fc5de602456160c4155d4de7d9a61e85a995d209a14eab0b34bd6b4",
+ "metadataTypeId": 23
+ },
+ {
+ "type": "b256",
+ "concreteTypeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ },
+ {
+ "type": "bool",
+ "concreteTypeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ },
+ {
+ "type": "enum abi-library::ExternalEnum",
+ "concreteTypeId": "9a24373d8ce7688609717fd5a9b75360cd8a6bdb224ae095f0c05cc891cadd42",
+ "metadataTypeId": 25
+ },
+ {
+ "type": "enum data_structures::EnumDoubleGeneric",
+ "concreteTypeId": "d0ed93cd57cc3dfb1c119b22bf63f5d215122402536127bf17087ca6d8186307",
+ "metadataTypeId": 26,
+ "typeArguments": [
+ "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b",
+ "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef"
+ ]
+ },
+ {
+ "type": "enum data_structures::EnumWithBuiltinType",
+ "concreteTypeId": "2136f16aedeec1ab7f1d912c57cc0566e86c36f20a2cb313e3d679cead6a0e61",
+ "metadataTypeId": 27
+ },
+ {
+ "type": "enum data_structures::EnumWithNative",
+ "concreteTypeId": "58ae0e9c51da476db1149dd48b1cda83a12187df4c049f8df5021f0b1696fb93",
+ "metadataTypeId": 28
+ },
+ {
+ "type": "enum data_structures::EnumWithStructs",
+ "concreteTypeId": "9ed6dede3ae1e66e0f951e860e863f77fb9b9499f4666a1123bf244c4a201669",
+ "metadataTypeId": 29
+ },
+ {
+ "type": "enum data_structures::EnumWithVector",
+ "concreteTypeId": "0272d5aecccd33822994b7be1494b72ec9ad860e4cb51f043deda7ac1e2cae26",
+ "metadataTypeId": 30
+ },
+ {
+ "type": "enum std::identity::Identity",
+ "concreteTypeId": "ab7cd04e05be58e3fc15d424c2c4a57f824a2a2d97d67252440a3925ebdc1335",
+ "metadataTypeId": 31
+ },
+ {
+ "type": "enum std::option::Option",
+ "concreteTypeId": "25616ce23be3ca41fd26f8c546c053ec256f8fb5593036f60c9c417e86dcc92e",
+ "metadataTypeId": 32,
+ "typeArguments": [
+ "ef937135956e37401e0bc90406ca8becda92d1b4e387fe938ddef8d27ee192a1"
+ ]
+ },
+ {
+ "type": "enum std::option::Option",
+ "concreteTypeId": "2da102c46c7263beeed95818cd7bee801716ba8303dddafdcd0f6c9efda4a0f1",
+ "metadataTypeId": 32,
+ "typeArguments": [
+ "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ ]
+ },
+ {
+ "type": "enum std::result::Result",
+ "concreteTypeId": "9891b1ee451eed790368ea3969e3c8f550efa87de489b5d7b933e2290800791b",
+ "metadataTypeId": 33,
+ "typeArguments": [
+ "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0",
+ "338a25cb65b9251663dcce6362b744fe10aa849758299590f4efed5dd299bf50"
+ ]
+ },
+ {
+ "type": "enum std::result::Result",
+ "concreteTypeId": "b3131b4c08c16cfa55b3150d587c3afa3e4cdebe0399f3f599fa160baaa64e0c",
+ "metadataTypeId": 33,
+ "typeArguments": [
+ "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0",
+ "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ ]
+ },
+ {
+ "type": "raw untyped slice",
+ "concreteTypeId": "1e1c7c52c1c7a9901681337f8669555f62aac58911332c9ff6b4ea8e73786570"
+ },
+ {
+ "type": "str",
+ "concreteTypeId": "8c25cb3686462e9a86d2883c5688a22fe738b0bbc85f458d2d2b5f3f667c6d5a"
+ },
+ {
+ "type": "str[10]",
+ "concreteTypeId": "338a25cb65b9251663dcce6362b744fe10aa849758299590f4efed5dd299bf50"
+ },
+ {
+ "type": "str[5]",
+ "concreteTypeId": "84877f6e98274b9e4721db68b4c0bdb9e52b8e9572c5bd7811c07a41ced882c7"
+ },
+ {
+ "type": "struct abi-library::ExternalStruct",
+ "concreteTypeId": "c3a770db33c4e755ad3ba4586b9c10520511fb80b767feb57dd41da1a88f6978",
+ "metadataTypeId": 45
+ },
+ {
+ "type": "struct data_structures::Configurables",
+ "concreteTypeId": "69d4f1cc5ce793681d98a55ab013f42ab56260131d39af6c1e71a5f3531557bc",
+ "metadataTypeId": 46
+ },
+ {
+ "type": "struct data_structures::StructA",
+ "concreteTypeId": "db8b04f624965fbfd7eb7dc3fc3c6a54a71d0019b37d4011a9350d1870136c9d",
+ "metadataTypeId": 47
+ },
+ {
+ "type": "struct data_structures::StructB",
+ "concreteTypeId": "9f074fde9cb9194b90bd208c8c95e709bfb1a5c736b063302e5639ce4daad5aa",
+ "metadataTypeId": 48
+ },
+ {
+ "type": "struct data_structures::StructC",
+ "concreteTypeId": "f219acbc9e3b812457419966b5454d10d51594afecacb87fb7745c9311b90012",
+ "metadataTypeId": 49
+ },
+ {
+ "type": "struct data_structures::StructD>>",
+ "concreteTypeId": "d0494e36b8daeafdf02dfbd1f65f82c66df872fb235c7fd2707fcd4147c6c292",
+ "metadataTypeId": 50,
+ "typeArguments": [
+ "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc",
+ "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc",
+ "722eb56989dc44c372c470eb3a6ddb2f91e3924c1c4a0806d21e414046599d35"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructDoubleGeneric<[b256; 3],u8>",
+ "concreteTypeId": "7bdc2c1e9c4b8576fdf5be24c5c6569cba3a8feaba3755ed2b95d646a33c73e2",
+ "metadataTypeId": 51,
+ "typeArguments": [
+ "81342782c917fcfd178741cb2b3a12ea1ebeaa57253fc4ee6700b4d7d6ab32d3",
+ "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructDoubleGeneric,u32>",
+ "concreteTypeId": "08dbec793087c5686c1a493513b158a999bb653126ee51151dfa85fa683edce5",
+ "metadataTypeId": 51,
+ "typeArguments": [
+ "4946973fc1adce1f6b23e80f9fad29b44e6a4ab25f2b45f3fab95114cfcd33a0",
+ "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructDoubleGeneric",
+ "concreteTypeId": "4946973fc1adce1f6b23e80f9fad29b44e6a4ab25f2b45f3fab95114cfcd33a0",
+ "metadataTypeId": 51,
+ "typeArguments": [
+ "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b",
+ "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructF>",
+ "concreteTypeId": "722eb56989dc44c372c470eb3a6ddb2f91e3924c1c4a0806d21e414046599d35",
+ "metadataTypeId": 53,
+ "typeArguments": [
+ "49f761c61dce644e212b8182e30557d35b6b4ad46693140be677eee0d6ef2733"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructG",
+ "concreteTypeId": "dfd8875bb49716b14dd336285ba667f953ed9aec4e918c0d7a2eb19ff644d60e",
+ "metadataTypeId": 54
+ },
+ {
+ "type": "struct data_structures::StructGenericWithEnum",
+ "concreteTypeId": "8986b78b19c146ced98454ffbe32d17f1e9e468128ba8dcb2a32f16aaf208db2",
+ "metadataTypeId": 55,
+ "typeArguments": [
+ "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b",
+ "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructSimple",
+ "concreteTypeId": "ef937135956e37401e0bc90406ca8becda92d1b4e387fe938ddef8d27ee192a1",
+ "metadataTypeId": 56
+ },
+ {
+ "type": "struct data_structures::StructSingleGeneric<(bool, u64)>",
+ "concreteTypeId": "fc0793960700fbabd2722134cff2a546743fc832b98d89aac1ec30fc669fd698",
+ "metadataTypeId": 57,
+ "typeArguments": [
+ "c998ca9a5f221fe7b5c66ae70c8a9562b86d964408b00d17f883c906bc1fe4be"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructSingleGeneric",
+ "concreteTypeId": "7cbc352969caf2e9caa716d89c3be65e707447e2a197c779cc4ef382d0602de6",
+ "metadataTypeId": 57,
+ "typeArguments": [
+ "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithEnumArray",
+ "concreteTypeId": "d5266ee32061dbfec8c96f2ba8a054243875e4e6a586104d6366b11e3bc86f2e",
+ "metadataTypeId": 58
+ },
+ {
+ "type": "struct data_structures::StructWithGenericArray",
+ "concreteTypeId": "29843de0bbb48b2d3c601b61823f2e106cfa5833e18b482571f1fa58b507a7ad",
+ "metadataTypeId": 59,
+ "typeArguments": [
+ "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithImplicitGenerics",
+ "concreteTypeId": "549c0f0c43c9e33f7e958e0473d84e78eca4737f9f159c64614ca5dff2d91b60",
+ "metadataTypeId": 60,
+ "typeArguments": [
+ "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b",
+ "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithMultiOption",
+ "concreteTypeId": "aa87500bb34c8bb09ffd60ab55cb1725898c366c58d3ff3aaaf8c9b532934fd1",
+ "metadataTypeId": 61
+ },
+ {
+ "type": "struct data_structures::StructWithNestedArray",
+ "concreteTypeId": "e7807205e98b513a8beeb5bcf446f0b2d684d0dce6bfeff0f324fa31df1b8948",
+ "metadataTypeId": 62
+ },
+ {
+ "type": "struct data_structures::StructWithNestedStruct",
+ "concreteTypeId": "8651356d9584265a78cb58de01c22d405dfc7006ea2f5f74fddcbe3f047f109a",
+ "metadataTypeId": 63
+ },
+ {
+ "type": "struct data_structures::StructWithNestedTuple",
+ "concreteTypeId": "d042dca573565aa653542415397934b3e95452917664e04d27c32a22091aa9a5",
+ "metadataTypeId": 64
+ },
+ {
+ "type": "struct data_structures::StructWithSingleOption",
+ "concreteTypeId": "089f2c4466ef415255917812d05776ebcb386be53e5f94bdad1ca8095f02845c",
+ "metadataTypeId": 65
+ },
+ {
+ "type": "struct data_structures::StructWithVector",
+ "concreteTypeId": "eac45984af86a06e11e1c5ff744bc1242e004db8404308cb7e574b4c2afaf621",
+ "metadataTypeId": 66
+ },
+ {
+ "type": "struct std::address::Address",
+ "concreteTypeId": "f597b637c3b0f588fb8d7086c6f4735caa3122b85f0423b82e489f9bb58e2308",
+ "metadataTypeId": 67
+ },
+ {
+ "type": "struct std::asset_id::AssetId",
+ "concreteTypeId": "c0710b6731b1dd59799cf6bef33eee3b3b04a2e40e80a0724090215bbf2ca974",
+ "metadataTypeId": 68
+ },
+ {
+ "type": "struct std::b512::B512",
+ "concreteTypeId": "745e252e80bec590efc3999ae943f07ccea4d5b45b00bb6575499b64abdd3322",
+ "metadataTypeId": 69
+ },
+ {
+ "type": "struct std::bytes::Bytes",
+ "concreteTypeId": "cdd87b7d12fe505416570c294c884bca819364863efe3bf539245fa18515fbbb",
+ "metadataTypeId": 70
+ },
+ {
+ "type": "struct std::contract_id::ContractId",
+ "concreteTypeId": "29c10735d33b5159f0c71ee1dbd17b36a3e69e41f00fab0d42e1bd9f428d8a54",
+ "metadataTypeId": 72
+ },
+ {
+ "type": "struct std::string::String",
+ "concreteTypeId": "9a7f1d3e963c10e0a4ea70a8e20a4813d1dc5682e28f74cb102ae50d32f7f98c",
+ "metadataTypeId": 73
+ },
+ {
+ "type": "struct std::vec::Vec",
+ "concreteTypeId": "6b97d5d738359413c9fac402aced252c23902c28382469ffe27f07381e9f6f31",
+ "metadataTypeId": 75,
+ "typeArguments": [
+ "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ ]
+ },
+ {
+ "type": "struct std::vec::Vec",
+ "concreteTypeId": "49f761c61dce644e212b8182e30557d35b6b4ad46693140be677eee0d6ef2733",
+ "metadataTypeId": 75,
+ "typeArguments": [
+ "dfd8875bb49716b14dd336285ba667f953ed9aec4e918c0d7a2eb19ff644d60e"
+ ]
+ },
+ {
+ "type": "struct std::vec::Vec",
+ "concreteTypeId": "9168b00268bbefd158090041178f058b032504f76c4b9644157d5d6b5b183468",
+ "metadataTypeId": 75,
+ "typeArguments": [
+ "ef937135956e37401e0bc90406ca8becda92d1b4e387fe938ddef8d27ee192a1"
+ ]
+ },
+ {
+ "type": "struct std::vec::Vec",
+ "concreteTypeId": "c0de252b9f65a31c6d03071b4b18a935c88c5bb0b2401a447fd30d342fd5a04d",
+ "metadataTypeId": 75,
+ "typeArguments": [
+ "aa87500bb34c8bb09ffd60ab55cb1725898c366c58d3ff3aaaf8c9b532934fd1"
+ ]
+ },
+ {
+ "type": "struct std::vec::Vec>",
+ "concreteTypeId": "e06c82714c52b8afd2293d5d37d05783d09d71c956311c6050ac012cab06364e",
+ "metadataTypeId": 75,
+ "typeArguments": [
+ "13c38f4111bad6468fad4f8ea82fd744546b63be49db9439fb3d94e14ae2bb3a"
+ ]
+ },
+ {
+ "type": "struct std::vec::Vec",
+ "concreteTypeId": "13c38f4111bad6468fad4f8ea82fd744546b63be49db9439fb3d94e14ae2bb3a",
+ "metadataTypeId": 75,
+ "typeArguments": [
+ "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ ]
+ },
+ {
+ "type": "struct std::vec::Vec",
+ "concreteTypeId": "d5bfe1d4e1ace20166c9b50cadd47e862020561bde24f5189cfc2723f5ed76f4",
+ "metadataTypeId": 75,
+ "typeArguments": [
+ "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ ]
+ },
+ {
+ "type": "struct std::vec::Vec",
+ "concreteTypeId": "27a0fb3d3a821e04e7a3f17ab6a617f0eb10f11e6eeb0f2c0ff9e6237207319e",
+ "metadataTypeId": 75,
+ "typeArguments": [
+ "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ ]
+ },
+ {
+ "type": "struct std::vm::evm::evm_address::EvmAddress",
+ "concreteTypeId": "05a44d8c3e00faf7ed545823b7a2b32723545d8715d87a0ab3cf65904948e8d2",
+ "metadataTypeId": 76
+ },
+ {
+ "type": "u16",
+ "concreteTypeId": "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef"
+ },
+ {
+ "type": "u256",
+ "concreteTypeId": "1b5759d94094368cfd443019e7ca5ec4074300e544e5ea993a979f5da627261e"
+ },
+ {
+ "type": "u32",
+ "concreteTypeId": "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ },
+ {
+ "type": "u64",
+ "concreteTypeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ },
+ {
+ "type": "u8",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ],
+ "metadataTypes": [
+ {
+ "type": "(_, _)",
+ "metadataTypeId": 0,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ }
+ ]
+ },
+ {
+ "type": "(_, _)",
+ "metadataTypeId": 1,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": "84877f6e98274b9e4721db68b4c0bdb9e52b8e9572c5bd7811c07a41ced882c7"
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ }
+ ]
+ },
+ {
+ "type": "(_, _)",
+ "metadataTypeId": 2,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": "84877f6e98274b9e4721db68b4c0bdb9e52b8e9572c5bd7811c07a41ced882c7"
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": "84877f6e98274b9e4721db68b4c0bdb9e52b8e9572c5bd7811c07a41ced882c7"
+ }
+ ]
+ },
+ {
+ "type": "(_, _)",
+ "metadataTypeId": 3,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": 56
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "(_, _)",
+ "metadataTypeId": 4,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 56
+ }
+ ]
+ },
+ {
+ "type": "(_, _)",
+ "metadataTypeId": 5,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ }
+ ]
+ },
+ {
+ "type": "(_, _)",
+ "metadataTypeId": 6,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "(_, _)",
+ "metadataTypeId": 7,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": 34
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 35
+ }
+ ]
+ },
+ {
+ "type": "(_, _)",
+ "metadataTypeId": 8,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ]
+ },
+ {
+ "type": "(_, _, _)",
+ "metadataTypeId": 9,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ]
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "(_, _, _)",
+ "metadataTypeId": 10,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": 68
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 68
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ }
+ ]
+ },
+ {
+ "type": "(_, _, _)",
+ "metadataTypeId": 11,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 57,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 57,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 44
+ }
+ ]
+ },
+ {
+ "type": "(_, _, _)",
+ "metadataTypeId": 12,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ },
+ {
+ "type": "(_, _, _, _)",
+ "metadataTypeId": 13,
+ "components": [
+ {
+ "name": "__tuple_element",
+ "typeId": 51,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 17
+ },
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 22
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 1
+ },
+ {
+ "name": "__tuple_element",
+ "typeId": 56
+ }
+ ]
+ },
+ {
+ "type": "[_; 1]",
+ "metadataTypeId": 14,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "[_; 2]",
+ "metadataTypeId": 15,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": 51,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 57,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ]
+ },
+ {
+ "name": "",
+ "typeId": 43
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "[_; 2]",
+ "metadataTypeId": 16,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ }
+ ]
+ },
+ {
+ "type": "[_; 3]",
+ "metadataTypeId": 17,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ }
+ ]
+ },
+ {
+ "type": "[_; 3]",
+ "metadataTypeId": 18,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": 56
+ }
+ ]
+ },
+ {
+ "type": "[_; 3]",
+ "metadataTypeId": 19,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": 51,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 36
+ },
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "[_; 3]",
+ "metadataTypeId": 20,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": 28
+ }
+ ]
+ },
+ {
+ "type": "[_; 3]",
+ "metadataTypeId": 21,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": 34
+ }
+ ]
+ },
+ {
+ "type": "[_; 4]",
+ "metadataTypeId": 22,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": 51,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ },
+ {
+ "name": "",
+ "typeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "[_; 4]",
+ "metadataTypeId": 23,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ },
+ {
+ "type": "[_; 5]",
+ "metadataTypeId": 24,
+ "components": [
+ {
+ "name": "__array_element",
+ "typeId": 32,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "enum abi-library::ExternalEnum",
+ "metadataTypeId": 25,
+ "components": [
+ {
+ "name": "A",
+ "typeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ },
+ {
+ "name": "B",
+ "typeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ }
+ ]
+ },
+ {
+ "type": "enum data_structures::EnumDoubleGeneric",
+ "metadataTypeId": 26,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 38
+ },
+ {
+ "name": "b",
+ "typeId": 39
+ }
+ ],
+ "typeParameters": [
+ 38,
+ 39
+ ]
+ },
+ {
+ "type": "enum data_structures::EnumWithBuiltinType",
+ "metadataTypeId": 27,
+ "components": [
+ {
+ "name": "a",
+ "typeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ },
+ {
+ "name": "b",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ]
+ },
+ {
+ "type": "enum data_structures::EnumWithNative",
+ "metadataTypeId": 28,
+ "components": [
+ {
+ "name": "Checked",
+ "typeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ },
+ {
+ "name": "Pending",
+ "typeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ }
+ ]
+ },
+ {
+ "type": "enum data_structures::EnumWithStructs",
+ "metadataTypeId": 29,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 28
+ },
+ {
+ "name": "b",
+ "typeId": 56
+ },
+ {
+ "name": "c",
+ "typeId": 51,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ },
+ {
+ "name": "",
+ "typeId": 56
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "enum data_structures::EnumWithVector",
+ "metadataTypeId": 30,
+ "components": [
+ {
+ "name": "a",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "b",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "enum std::identity::Identity",
+ "metadataTypeId": 31,
+ "components": [
+ {
+ "name": "Address",
+ "typeId": 67
+ },
+ {
+ "name": "ContractId",
+ "typeId": 72
+ }
+ ]
+ },
+ {
+ "type": "enum std::option::Option",
+ "metadataTypeId": 32,
+ "components": [
+ {
+ "name": "None",
+ "typeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ },
+ {
+ "name": "Some",
+ "typeId": 37
+ }
+ ],
+ "typeParameters": [
+ 37
+ ]
+ },
+ {
+ "type": "enum std::result::Result",
+ "metadataTypeId": 33,
+ "components": [
+ {
+ "name": "Ok",
+ "typeId": 37
+ },
+ {
+ "name": "Err",
+ "typeId": 34
+ }
+ ],
+ "typeParameters": [
+ 37,
+ 34
+ ]
+ },
+ {
+ "type": "generic E",
+ "metadataTypeId": 34
+ },
+ {
+ "type": "generic F",
+ "metadataTypeId": 35
+ },
+ {
+ "type": "generic K",
+ "metadataTypeId": 36
+ },
+ {
+ "type": "generic T",
+ "metadataTypeId": 37
+ },
+ {
+ "type": "generic T1",
+ "metadataTypeId": 38
+ },
+ {
+ "type": "generic T2",
+ "metadataTypeId": 39
+ },
+ {
+ "type": "generic U",
+ "metadataTypeId": 40
+ },
+ {
+ "type": "generic V",
+ "metadataTypeId": 41
+ },
+ {
+ "type": "raw untyped ptr",
+ "metadataTypeId": 42
+ },
+ {
+ "type": "str[1]",
+ "metadataTypeId": 43
+ },
+ {
+ "type": "str[3]",
+ "metadataTypeId": 44
+ },
+ {
+ "type": "struct abi-library::ExternalStruct",
+ "metadataTypeId": 45,
+ "components": [
+ {
+ "name": "value",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::Configurables",
+ "metadataTypeId": 46,
+ "components": [
+ {
+ "name": "U8_VALUE",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "BOOL_VALUE",
+ "typeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ },
+ {
+ "name": "B256_VALUE",
+ "typeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ },
+ {
+ "name": "OPTION_U8_VALUE",
+ "typeId": 32,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ },
+ {
+ "name": "GENERIC_STRUCT_VALUE",
+ "typeId": 51,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 51,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "",
+ "typeId": "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef"
+ }
+ ]
+ },
+ {
+ "name": "",
+ "typeId": "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructA",
+ "metadataTypeId": 47,
+ "components": [
+ {
+ "name": "propA1",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructB",
+ "metadataTypeId": 48,
+ "components": [
+ {
+ "name": "propB1",
+ "typeId": 47
+ },
+ {
+ "name": "propB2",
+ "typeId": "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef"
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructC",
+ "metadataTypeId": 49,
+ "components": [
+ {
+ "name": "propC1",
+ "typeId": 47
+ },
+ {
+ "name": "propC2",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 48
+ }
+ ]
+ },
+ {
+ "name": "propC3",
+ "typeId": 50,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "",
+ "typeId": 53,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 43
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructD",
+ "metadataTypeId": 50,
+ "components": [
+ {
+ "name": "propD1",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 52,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 37
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "propD2",
+ "typeId": 40
+ },
+ {
+ "name": "propD3",
+ "typeId": 41
+ }
+ ],
+ "typeParameters": [
+ 37,
+ 40,
+ 41
+ ]
+ },
+ {
+ "type": "struct data_structures::StructDoubleGeneric",
+ "metadataTypeId": 51,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 38
+ },
+ {
+ "name": "b",
+ "typeId": 39
+ }
+ ],
+ "typeParameters": [
+ 38,
+ 39
+ ]
+ },
+ {
+ "type": "struct data_structures::StructE",
+ "metadataTypeId": 52,
+ "components": [
+ {
+ "name": "propE1",
+ "typeId": 47
+ },
+ {
+ "name": "propE2",
+ "typeId": 48
+ },
+ {
+ "name": "propE3",
+ "typeId": 37
+ }
+ ],
+ "typeParameters": [
+ 37
+ ]
+ },
+ {
+ "type": "struct data_structures::StructF",
+ "metadataTypeId": 53,
+ "components": [
+ {
+ "name": "propF1",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ },
+ {
+ "name": "propF2",
+ "typeId": 37
+ }
+ ],
+ "typeParameters": [
+ 37
+ ]
+ },
+ {
+ "type": "struct data_structures::StructG",
+ "metadataTypeId": 54,
+ "components": [
+ {
+ "name": "propG1",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructGenericWithEnum",
+ "metadataTypeId": 55,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 38
+ },
+ {
+ "name": "b",
+ "typeId": 26,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 38
+ },
+ {
+ "name": "",
+ "typeId": 39
+ }
+ ]
+ }
+ ],
+ "typeParameters": [
+ 38,
+ 39
+ ]
+ },
+ {
+ "type": "struct data_structures::StructSimple",
+ "metadataTypeId": 56,
+ "components": [
+ {
+ "name": "a",
+ "typeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ },
+ {
+ "name": "b",
+ "typeId": "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructSingleGeneric",
+ "metadataTypeId": 57,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 37
+ }
+ ],
+ "typeParameters": [
+ 37
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithEnumArray",
+ "metadataTypeId": 58,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 20
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithGenericArray",
+ "metadataTypeId": 59,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 19
+ }
+ ],
+ "typeParameters": [
+ 36
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithImplicitGenerics",
+ "metadataTypeId": 60,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 21
+ },
+ {
+ "name": "b",
+ "typeId": 7
+ }
+ ],
+ "typeParameters": [
+ 34,
+ 35
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithMultiOption",
+ "metadataTypeId": 61,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 24
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithNestedArray",
+ "metadataTypeId": 62,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 15
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithNestedStruct",
+ "metadataTypeId": 63,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 51,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 57,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ },
+ {
+ "name": "",
+ "typeId": "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithNestedTuple",
+ "metadataTypeId": 64,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 11
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithSingleOption",
+ "metadataTypeId": 65,
+ "components": [
+ {
+ "name": "a",
+ "typeId": 32,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 61
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "struct data_structures::StructWithVector",
+ "metadataTypeId": 66,
+ "components": [
+ {
+ "name": "a",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "b",
+ "typeId": 75,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "struct std::address::Address",
+ "metadataTypeId": 67,
+ "components": [
+ {
+ "name": "bits",
+ "typeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ }
+ ]
+ },
+ {
+ "type": "struct std::asset_id::AssetId",
+ "metadataTypeId": 68,
+ "components": [
+ {
+ "name": "bits",
+ "typeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ }
+ ]
+ },
+ {
+ "type": "struct std::b512::B512",
+ "metadataTypeId": 69,
+ "components": [
+ {
+ "name": "bits",
+ "typeId": 16
+ }
+ ]
+ },
+ {
+ "type": "struct std::bytes::Bytes",
+ "metadataTypeId": 70,
+ "components": [
+ {
+ "name": "buf",
+ "typeId": 71
+ },
+ {
+ "name": "len",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ]
+ },
+ {
+ "type": "struct std::bytes::RawBytes",
+ "metadataTypeId": 71,
+ "components": [
+ {
+ "name": "ptr",
+ "typeId": 42
+ },
+ {
+ "name": "cap",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ]
+ },
+ {
+ "type": "struct std::contract_id::ContractId",
+ "metadataTypeId": 72,
+ "components": [
+ {
+ "name": "bits",
+ "typeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ }
+ ]
+ },
+ {
+ "type": "struct std::string::String",
+ "metadataTypeId": 73,
+ "components": [
+ {
+ "name": "bytes",
+ "typeId": 70
+ }
+ ]
+ },
+ {
+ "type": "struct std::vec::RawVec",
+ "metadataTypeId": 74,
+ "components": [
+ {
+ "name": "ptr",
+ "typeId": 42
+ },
+ {
+ "name": "cap",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ],
+ "typeParameters": [
+ 37
+ ]
+ },
+ {
+ "type": "struct std::vec::Vec",
+ "metadataTypeId": 75,
+ "components": [
+ {
+ "name": "buf",
+ "typeId": 74,
+ "typeArguments": [
+ {
+ "name": "",
+ "typeId": 37
+ }
+ ]
+ },
+ {
+ "name": "len",
+ "typeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ],
+ "typeParameters": [
+ 37
+ ]
+ },
+ {
+ "type": "struct std::vm::evm::evm_address::EvmAddress",
+ "metadataTypeId": 76,
+ "components": [
+ {
+ "name": "bits",
+ "typeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ }
+ ]
+ }
+ ],
+ "functions": [
+ {
+ "inputs": [],
+ "name": "configurables",
+ "output": "69d4f1cc5ce793681d98a55ab013f42ab56260131d39af6c1e71a5f3531557bc",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ }
+ ],
+ "name": "multi_arg_b256_bool",
+ "output": "d5f6ab61fc224aae1bf15a89ab88840ed54e312a76a9735d1f60d4d0d1fae640",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "7bdc2c1e9c4b8576fdf5be24c5c6569cba3a8feaba3755ed2b95d646a33c73e2"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "b22807669faa58263e636f6e2d194df8ddbc6686bb4ea14ee28005fa30adbe85"
+ },
+ {
+ "name": "z",
+ "concreteTypeId": "a1e229302ed2f092752a6bc4fbe66bb9305e0802b1b01ecc5e1d59356702e956"
+ },
+ {
+ "name": "a",
+ "concreteTypeId": "ef937135956e37401e0bc90406ca8becda92d1b4e387fe938ddef8d27ee192a1"
+ }
+ ],
+ "name": "multi_arg_complex",
+ "output": "343f07ddcd75b9385bc193e0419f2e89c75fad67cbf4ad1b36a01a136620817e",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "84877f6e98274b9e4721db68b4c0bdb9e52b8e9572c5bd7811c07a41ced882c7"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "84877f6e98274b9e4721db68b4c0bdb9e52b8e9572c5bd7811c07a41ced882c7"
+ }
+ ],
+ "name": "multi_arg_str_str",
+ "output": "30022fd7ad3fda4035d30e4d86b705d4870924d4b4fe054624d2561fa12bb33e",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "ef937135956e37401e0bc90406ca8becda92d1b4e387fe938ddef8d27ee192a1"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "27a0fb3d3a821e04e7a3f17ab6a617f0eb10f11e6eeb0f2c0ff9e6237207319e"
+ }
+ ],
+ "name": "multi_arg_struct_vector",
+ "output": "5ebb7c8cdd38d1f676f9c7089a2da12b27114ee3771c2047f3295d4d30f8fd2c",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "d5bfe1d4e1ace20166c9b50cadd47e862020561bde24f5189cfc2723f5ed76f4"
+ },
+ {
+ "name": "z",
+ "concreteTypeId": "d5bfe1d4e1ace20166c9b50cadd47e862020561bde24f5189cfc2723f5ed76f4"
+ }
+ ],
+ "name": "multi_arg_u32_vector_vector",
+ "output": "18034e13b18b71de3c7e12f8f10a7bd48a23870e0dbb46eaf10faeb26d70f000",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "ef937135956e37401e0bc90406ca8becda92d1b4e387fe938ddef8d27ee192a1"
+ }
+ ],
+ "name": "multi_arg_u64_struct",
+ "output": "0088c28967dbcdaa34626c7e915e44b2afe72f12415f0e31edc0b5ce70e7c6dc",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ],
+ "name": "multi_arg_u64_u64",
+ "output": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "27a0fb3d3a821e04e7a3f17ab6a617f0eb10f11e6eeb0f2c0ff9e6237207319e"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ }
+ ],
+ "name": "multi_arg_vector_b256",
+ "output": "52e2726988c7da304606fbe4ed696efac04beb29e9a22e15778f8a0539c9cb94",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "27a0fb3d3a821e04e7a3f17ab6a617f0eb10f11e6eeb0f2c0ff9e6237207319e"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "27a0fb3d3a821e04e7a3f17ab6a617f0eb10f11e6eeb0f2c0ff9e6237207319e"
+ }
+ ],
+ "name": "multi_arg_vector_vector",
+ "output": "87a4626758542d7b6a03099839e440a052a4d5a00e3abfdf22bcc564ca19a4fd",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "f597b637c3b0f588fb8d7086c6f4735caa3122b85f0423b82e489f9bb58e2308"
+ }
+ ],
+ "name": "types_address",
+ "output": "f597b637c3b0f588fb8d7086c6f4735caa3122b85f0423b82e489f9bb58e2308",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "a95e1fcceb1451b8a76471f593f66c4a52ca04bde3c227c746ad7aaf988de5c6"
+ }
+ ],
+ "name": "types_alias_tuple_with_native_types",
+ "output": "a95e1fcceb1451b8a76471f593f66c4a52ca04bde3c227c746ad7aaf988de5c6",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "f28afa065fc5de602456160c4155d4de7d9a61e85a995d209a14eab0b34bd6b4"
+ }
+ ],
+ "name": "types_array",
+ "output": "f28afa065fc5de602456160c4155d4de7d9a61e85a995d209a14eab0b34bd6b4",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "38f2594527b516dab2c81b31356901226242d7c32554877e36797c6b23969237"
+ }
+ ],
+ "name": "types_array_struct",
+ "output": "38f2594527b516dab2c81b31356901226242d7c32554877e36797c6b23969237",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "b8164e36cce9d14142824b5cc55aebc1272036775b966af82c49c78aff114006"
+ }
+ ],
+ "name": "types_array_with_generic_struct",
+ "output": "b8164e36cce9d14142824b5cc55aebc1272036775b966af82c49c78aff114006",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "593b39347cc381516d8ed1f8e5e628a8d455bd3f833bd9dfdd5165ba16f9f980"
+ }
+ ],
+ "name": "types_array_with_vector",
+ "output": "593b39347cc381516d8ed1f8e5e628a8d455bd3f833bd9dfdd5165ba16f9f980",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "c0710b6731b1dd59799cf6bef33eee3b3b04a2e40e80a0724090215bbf2ca974"
+ }
+ ],
+ "name": "types_asset_id",
+ "output": "c0710b6731b1dd59799cf6bef33eee3b3b04a2e40e80a0724090215bbf2ca974",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ }
+ ],
+ "name": "types_b256",
+ "output": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "745e252e80bec590efc3999ae943f07ccea4d5b45b00bb6575499b64abdd3322"
+ }
+ ],
+ "name": "types_b512",
+ "output": "745e252e80bec590efc3999ae943f07ccea4d5b45b00bb6575499b64abdd3322",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ }
+ ],
+ "name": "types_bool",
+ "output": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "cdd87b7d12fe505416570c294c884bca819364863efe3bf539245fa18515fbbb"
+ }
+ ],
+ "name": "types_bytes",
+ "output": "cdd87b7d12fe505416570c294c884bca819364863efe3bf539245fa18515fbbb",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "29c10735d33b5159f0c71ee1dbd17b36a3e69e41f00fab0d42e1bd9f428d8a54"
+ }
+ ],
+ "name": "types_contract_id",
+ "output": "29c10735d33b5159f0c71ee1dbd17b36a3e69e41f00fab0d42e1bd9f428d8a54",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "58ae0e9c51da476db1149dd48b1cda83a12187df4c049f8df5021f0b1696fb93"
+ }
+ ],
+ "name": "types_enum",
+ "output": "58ae0e9c51da476db1149dd48b1cda83a12187df4c049f8df5021f0b1696fb93",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "9a24373d8ce7688609717fd5a9b75360cd8a6bdb224ae095f0c05cc891cadd42"
+ }
+ ],
+ "name": "types_enum_external",
+ "output": "9a24373d8ce7688609717fd5a9b75360cd8a6bdb224ae095f0c05cc891cadd42",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "2136f16aedeec1ab7f1d912c57cc0566e86c36f20a2cb313e3d679cead6a0e61"
+ }
+ ],
+ "name": "types_enum_with_builtin_type",
+ "output": "2136f16aedeec1ab7f1d912c57cc0566e86c36f20a2cb313e3d679cead6a0e61",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "9ed6dede3ae1e66e0f951e860e863f77fb9b9499f4666a1123bf244c4a201669"
+ }
+ ],
+ "name": "types_enum_with_structs",
+ "output": "9ed6dede3ae1e66e0f951e860e863f77fb9b9499f4666a1123bf244c4a201669",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "0272d5aecccd33822994b7be1494b72ec9ad860e4cb51f043deda7ac1e2cae26"
+ }
+ ],
+ "name": "types_enum_with_vector",
+ "output": "0272d5aecccd33822994b7be1494b72ec9ad860e4cb51f043deda7ac1e2cae26",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "05a44d8c3e00faf7ed545823b7a2b32723545d8715d87a0ab3cf65904948e8d2"
+ }
+ ],
+ "name": "types_evm_address",
+ "output": "05a44d8c3e00faf7ed545823b7a2b32723545d8715d87a0ab3cf65904948e8d2",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "d0ed93cd57cc3dfb1c119b22bf63f5d215122402536127bf17087ca6d8186307"
+ }
+ ],
+ "name": "types_generic_enum",
+ "output": "d0ed93cd57cc3dfb1c119b22bf63f5d215122402536127bf17087ca6d8186307",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "ab7cd04e05be58e3fc15d424c2c4a57f824a2a2d97d67252440a3925ebdc1335"
+ }
+ ],
+ "name": "types_identity_address",
+ "output": "ab7cd04e05be58e3fc15d424c2c4a57f824a2a2d97d67252440a3925ebdc1335",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "ab7cd04e05be58e3fc15d424c2c4a57f824a2a2d97d67252440a3925ebdc1335"
+ }
+ ],
+ "name": "types_identity_contract_id",
+ "output": "ab7cd04e05be58e3fc15d424c2c4a57f824a2a2d97d67252440a3925ebdc1335",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "2da102c46c7263beeed95818cd7bee801716ba8303dddafdcd0f6c9efda4a0f1"
+ }
+ ],
+ "name": "types_option",
+ "output": "2da102c46c7263beeed95818cd7bee801716ba8303dddafdcd0f6c9efda4a0f1",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "25616ce23be3ca41fd26f8c546c053ec256f8fb5593036f60c9c417e86dcc92e"
+ }
+ ],
+ "name": "types_option_struct",
+ "output": "25616ce23be3ca41fd26f8c546c053ec256f8fb5593036f60c9c417e86dcc92e",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "1e1c7c52c1c7a9901681337f8669555f62aac58911332c9ff6b4ea8e73786570"
+ }
+ ],
+ "name": "types_raw_slice",
+ "output": "1e1c7c52c1c7a9901681337f8669555f62aac58911332c9ff6b4ea8e73786570",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "b3131b4c08c16cfa55b3150d587c3afa3e4cdebe0399f3f599fa160baaa64e0c"
+ }
+ ],
+ "name": "types_result",
+ "output": "9891b1ee451eed790368ea3969e3c8f550efa87de489b5d7b933e2290800791b",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "9a7f1d3e963c10e0a4ea70a8e20a4813d1dc5682e28f74cb102ae50d32f7f98c"
+ }
+ ],
+ "name": "types_std_string",
+ "output": "9a7f1d3e963c10e0a4ea70a8e20a4813d1dc5682e28f74cb102ae50d32f7f98c",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "84877f6e98274b9e4721db68b4c0bdb9e52b8e9572c5bd7811c07a41ced882c7"
+ }
+ ],
+ "name": "types_str",
+ "output": "84877f6e98274b9e4721db68b4c0bdb9e52b8e9572c5bd7811c07a41ced882c7",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "8c25cb3686462e9a86d2883c5688a22fe738b0bbc85f458d2d2b5f3f667c6d5a"
+ }
+ ],
+ "name": "types_str_slice",
+ "output": "8c25cb3686462e9a86d2883c5688a22fe738b0bbc85f458d2d2b5f3f667c6d5a",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "8986b78b19c146ced98454ffbe32d17f1e9e468128ba8dcb2a32f16aaf208db2"
+ }
+ ],
+ "name": "types_struct_double_generic",
+ "output": "8986b78b19c146ced98454ffbe32d17f1e9e468128ba8dcb2a32f16aaf208db2",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "c3a770db33c4e755ad3ba4586b9c10520511fb80b767feb57dd41da1a88f6978"
+ }
+ ],
+ "name": "types_struct_external",
+ "output": "c3a770db33c4e755ad3ba4586b9c10520511fb80b767feb57dd41da1a88f6978",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "7cbc352969caf2e9caa716d89c3be65e707447e2a197c779cc4ef382d0602de6"
+ }
+ ],
+ "name": "types_struct_generic",
+ "output": "7cbc352969caf2e9caa716d89c3be65e707447e2a197c779cc4ef382d0602de6",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "ef937135956e37401e0bc90406ca8becda92d1b4e387fe938ddef8d27ee192a1"
+ }
+ ],
+ "name": "types_struct_simple",
+ "output": "ef937135956e37401e0bc90406ca8becda92d1b4e387fe938ddef8d27ee192a1",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "29843de0bbb48b2d3c601b61823f2e106cfa5833e18b482571f1fa58b507a7ad"
+ }
+ ],
+ "name": "types_struct_with_array",
+ "output": "29843de0bbb48b2d3c601b61823f2e106cfa5833e18b482571f1fa58b507a7ad",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "d5266ee32061dbfec8c96f2ba8a054243875e4e6a586104d6366b11e3bc86f2e"
+ }
+ ],
+ "name": "types_struct_with_array_of_enums",
+ "output": "d5266ee32061dbfec8c96f2ba8a054243875e4e6a586104d6366b11e3bc86f2e",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "d0494e36b8daeafdf02dfbd1f65f82c66df872fb235c7fd2707fcd4147c6c292"
+ }
+ ],
+ "name": "types_struct_with_complex_nested_struct",
+ "output": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "549c0f0c43c9e33f7e958e0473d84e78eca4737f9f159c64614ca5dff2d91b60"
+ }
+ ],
+ "name": "types_struct_with_implicit_generics",
+ "output": "549c0f0c43c9e33f7e958e0473d84e78eca4737f9f159c64614ca5dff2d91b60",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "db8b04f624965fbfd7eb7dc3fc3c6a54a71d0019b37d4011a9350d1870136c9d"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "9f074fde9cb9194b90bd208c8c95e709bfb1a5c736b063302e5639ce4daad5aa"
+ },
+ {
+ "name": "z",
+ "concreteTypeId": "f219acbc9e3b812457419966b5454d10d51594afecacb87fb7745c9311b90012"
+ }
+ ],
+ "name": "types_struct_with_multiple_struct_params",
+ "output": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "e7807205e98b513a8beeb5bcf446f0b2d684d0dce6bfeff0f324fa31df1b8948"
+ }
+ ],
+ "name": "types_struct_with_nested_array",
+ "output": "e7807205e98b513a8beeb5bcf446f0b2d684d0dce6bfeff0f324fa31df1b8948",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "8651356d9584265a78cb58de01c22d405dfc7006ea2f5f74fddcbe3f047f109a"
+ }
+ ],
+ "name": "types_struct_with_nested_struct",
+ "output": "8651356d9584265a78cb58de01c22d405dfc7006ea2f5f74fddcbe3f047f109a",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "d042dca573565aa653542415397934b3e95452917664e04d27c32a22091aa9a5"
+ }
+ ],
+ "name": "types_struct_with_nested_tuple",
+ "output": "d042dca573565aa653542415397934b3e95452917664e04d27c32a22091aa9a5",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "089f2c4466ef415255917812d05776ebcb386be53e5f94bdad1ca8095f02845c"
+ }
+ ],
+ "name": "types_struct_with_single_option",
+ "output": "089f2c4466ef415255917812d05776ebcb386be53e5f94bdad1ca8095f02845c",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "fc0793960700fbabd2722134cff2a546743fc832b98d89aac1ec30fc669fd698"
+ }
+ ],
+ "name": "types_struct_with_tuple",
+ "output": "fc0793960700fbabd2722134cff2a546743fc832b98d89aac1ec30fc669fd698",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "eac45984af86a06e11e1c5ff744bc1242e004db8404308cb7e574b4c2afaf621"
+ }
+ ],
+ "name": "types_struct_with_vector",
+ "output": "eac45984af86a06e11e1c5ff744bc1242e004db8404308cb7e574b4c2afaf621",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "79239b6d6f2383e2cfbaf4da7fdf7ee7fb59b7bf517acfff2d9433e9e76e8fc4"
+ }
+ ],
+ "name": "types_tuple",
+ "output": "79239b6d6f2383e2cfbaf4da7fdf7ee7fb59b7bf517acfff2d9433e9e76e8fc4",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "6f875be99a39d9920569678a34ffce676a6c3e14b958910db250b9cb4957157f"
+ }
+ ],
+ "name": "types_tuple_complex",
+ "output": "6f875be99a39d9920569678a34ffce676a6c3e14b958910db250b9cb4957157f",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "a95e1fcceb1451b8a76471f593f66c4a52ca04bde3c227c746ad7aaf988de5c6"
+ }
+ ],
+ "name": "types_tuple_with_native_types",
+ "output": "a95e1fcceb1451b8a76471f593f66c4a52ca04bde3c227c746ad7aaf988de5c6",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef"
+ }
+ ],
+ "name": "types_u16",
+ "output": "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "1b5759d94094368cfd443019e7ca5ec4074300e544e5ea993a979f5da627261e"
+ }
+ ],
+ "name": "types_u256",
+ "output": "1b5759d94094368cfd443019e7ca5ec4074300e544e5ea993a979f5da627261e",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ }
+ ],
+ "name": "types_u32",
+ "output": "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ }
+ ],
+ "name": "types_u64",
+ "output": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ],
+ "name": "types_u8",
+ "output": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "z",
+ "concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ },
+ {
+ "name": "a",
+ "concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ }
+ ],
+ "name": "types_value_then_value_then_void_then_void",
+ "output": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ }
+ ],
+ "name": "types_value_then_void",
+ "output": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ },
+ {
+ "name": "z",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ],
+ "name": "types_value_then_void_then_value",
+ "output": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "6b97d5d738359413c9fac402aced252c23902c28382469ffe27f07381e9f6f31"
+ }
+ ],
+ "name": "types_vector_boolean",
+ "output": "6b97d5d738359413c9fac402aced252c23902c28382469ffe27f07381e9f6f31",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "e06c82714c52b8afd2293d5d37d05783d09d71c956311c6050ac012cab06364e"
+ }
+ ],
+ "name": "types_vector_inside_vector",
+ "output": "e06c82714c52b8afd2293d5d37d05783d09d71c956311c6050ac012cab06364e",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "c0de252b9f65a31c6d03071b4b18a935c88c5bb0b2401a447fd30d342fd5a04d"
+ }
+ ],
+ "name": "types_vector_option",
+ "output": "c0de252b9f65a31c6d03071b4b18a935c88c5bb0b2401a447fd30d342fd5a04d",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "27a0fb3d3a821e04e7a3f17ab6a617f0eb10f11e6eeb0f2c0ff9e6237207319e"
+ }
+ ],
+ "name": "types_vector_u8",
+ "output": "27a0fb3d3a821e04e7a3f17ab6a617f0eb10f11e6eeb0f2c0ff9e6237207319e",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "9168b00268bbefd158090041178f058b032504f76c4b9644157d5d6b5b183468"
+ }
+ ],
+ "name": "types_vector_with_struct",
+ "output": "9168b00268bbefd158090041178f058b032504f76c4b9644157d5d6b5b183468",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ }
+ ],
+ "name": "types_void",
+ "output": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d",
+ "attributes": null
+ },
+ {
+ "inputs": [
+ {
+ "name": "x",
+ "concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ },
+ {
+ "name": "y",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ }
+ ],
+ "name": "types_void_then_value",
+ "output": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d",
+ "attributes": null
+ }
+ ],
+ "loggedTypes": [
+ {
+ "logId": "8961848586872524460",
+ "concreteTypeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b"
+ },
+ {
+ "logId": "13213829929622723620",
+ "concreteTypeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903"
+ },
+ {
+ "logId": "15417698811679754926",
+ "concreteTypeId": "d5f6ab61fc224aae1bf15a89ab88840ed54e312a76a9735d1f60d4d0d1fae640"
+ },
+ {
+ "logId": "3764736462721235256",
+ "concreteTypeId": "343f07ddcd75b9385bc193e0419f2e89c75fad67cbf4ad1b36a01a136620817e"
+ },
+ {
+ "logId": "10098701174489624218",
+ "concreteTypeId": "8c25cb3686462e9a86d2883c5688a22fe738b0bbc85f458d2d2b5f3f667c6d5a"
+ },
+ {
+ "logId": "3459380067145079360",
+ "concreteTypeId": "30022fd7ad3fda4035d30e4d86b705d4870924d4b4fe054624d2561fa12bb33e"
+ },
+ {
+ "logId": "6826186604658872822",
+ "concreteTypeId": "5ebb7c8cdd38d1f676f9c7089a2da12b27114ee3771c2047f3295d4d30f8fd2c"
+ },
+ {
+ "logId": "1730312528330453470",
+ "concreteTypeId": "18034e13b18b71de3c7e12f8f10a7bd48a23870e0dbb46eaf10faeb26d70f000"
+ },
+ {
+ "logId": "38494492241415594",
+ "concreteTypeId": "0088c28967dbcdaa34626c7e915e44b2afe72f12415f0e31edc0b5ce70e7c6dc"
+ },
+ {
+ "logId": "1515152261580153489",
+ "concreteTypeId": "1506e6f44c1d6291cdf46395a8e573276a4fa79e8ace3fc891e092ef32d1b0a0"
+ },
+ {
+ "logId": "5972461853438630448",
+ "concreteTypeId": "52e2726988c7da304606fbe4ed696efac04beb29e9a22e15778f8a0539c9cb94"
+ },
+ {
+ "logId": "9774045287303884155",
+ "concreteTypeId": "87a4626758542d7b6a03099839e440a052a4d5a00e3abfdf22bcc564ca19a4fd"
+ },
+ {
+ "logId": "17696813611398264200",
+ "concreteTypeId": "f597b637c3b0f588fb8d7086c6f4735caa3122b85f0423b82e489f9bb58e2308"
+ },
+ {
+ "logId": "12204227005198389688",
+ "concreteTypeId": "a95e1fcceb1451b8a76471f593f66c4a52ca04bde3c227c746ad7aaf988de5c6"
+ },
+ {
+ "logId": "17477056209248181856",
+ "concreteTypeId": "f28afa065fc5de602456160c4155d4de7d9a61e85a995d209a14eab0b34bd6b4"
+ },
+ {
+ "logId": "4103440364041737946",
+ "concreteTypeId": "38f2594527b516dab2c81b31356901226242d7c32554877e36797c6b23969237"
+ },
+ {
+ "logId": "13264875749739450689",
+ "concreteTypeId": "b8164e36cce9d14142824b5cc55aebc1272036775b966af82c49c78aff114006"
+ },
+ {
+ "logId": "6429795790595785041",
+ "concreteTypeId": "593b39347cc381516d8ed1f8e5e628a8d455bd3f833bd9dfdd5165ba16f9f980"
+ },
+ {
+ "logId": "13866877265493744985",
+ "concreteTypeId": "c0710b6731b1dd59799cf6bef33eee3b3b04a2e40e80a0724090215bbf2ca974"
+ },
+ {
+ "logId": "8385180437869151632",
+ "concreteTypeId": "745e252e80bec590efc3999ae943f07ccea4d5b45b00bb6575499b64abdd3322"
+ },
+ {
+ "logId": "14832741149864513620",
+ "concreteTypeId": "cdd87b7d12fe505416570c294c884bca819364863efe3bf539245fa18515fbbb"
+ },
+ {
+ "logId": "3008693953818743129",
+ "concreteTypeId": "29c10735d33b5159f0c71ee1dbd17b36a3e69e41f00fab0d42e1bd9f428d8a54"
+ },
+ {
+ "logId": "6390060985836259181",
+ "concreteTypeId": "58ae0e9c51da476db1149dd48b1cda83a12187df4c049f8df5021f0b1696fb93"
+ },
+ {
+ "logId": "11107063318498994310",
+ "concreteTypeId": "9a24373d8ce7688609717fd5a9b75360cd8a6bdb224ae095f0c05cc891cadd42"
+ },
+ {
+ "logId": "2393365693554672043",
+ "concreteTypeId": "2136f16aedeec1ab7f1d912c57cc0566e86c36f20a2cb313e3d679cead6a0e61"
+ },
+ {
+ "logId": "11445580549060683374",
+ "concreteTypeId": "9ed6dede3ae1e66e0f951e860e863f77fb9b9499f4666a1123bf244c4a201669"
+ },
+ {
+ "logId": "176438282157896578",
+ "concreteTypeId": "0272d5aecccd33822994b7be1494b72ec9ad860e4cb51f043deda7ac1e2cae26"
+ },
+ {
+ "logId": "406535131101199095",
+ "concreteTypeId": "05a44d8c3e00faf7ed545823b7a2b32723545d8715d87a0ab3cf65904948e8d2"
+ },
+ {
+ "logId": "15054851639520017915",
+ "concreteTypeId": "d0ed93cd57cc3dfb1c119b22bf63f5d215122402536127bf17087ca6d8186307"
+ },
+ {
+ "logId": "12356980511120185571",
+ "concreteTypeId": "ab7cd04e05be58e3fc15d424c2c4a57f824a2a2d97d67252440a3925ebdc1335"
+ },
+ {
+ "logId": "3287912245613454270",
+ "concreteTypeId": "2da102c46c7263beeed95818cd7bee801716ba8303dddafdcd0f6c9efda4a0f1"
+ },
+ {
+ "logId": "2693553771067460161",
+ "concreteTypeId": "25616ce23be3ca41fd26f8c546c053ec256f8fb5593036f60c9c417e86dcc92e"
+ },
+ {
+ "logId": "2169745815365986704",
+ "concreteTypeId": "1e1c7c52c1c7a9901681337f8669555f62aac58911332c9ff6b4ea8e73786570"
+ },
+ {
+ "logId": "11132648958528852192",
+ "concreteTypeId": "9a7f1d3e963c10e0a4ea70a8e20a4813d1dc5682e28f74cb102ae50d32f7f98c"
+ },
+ {
+ "logId": "9549741647838268318",
+ "concreteTypeId": "84877f6e98274b9e4721db68b4c0bdb9e52b8e9572c5bd7811c07a41ced882c7"
+ },
+ {
+ "logId": "9909809838135789262",
+ "concreteTypeId": "8986b78b19c146ced98454ffbe32d17f1e9e468128ba8dcb2a32f16aaf208db2"
+ },
+ {
+ "logId": "14098361245275318101",
+ "concreteTypeId": "c3a770db33c4e755ad3ba4586b9c10520511fb80b767feb57dd41da1a88f6978"
+ },
+ {
+ "logId": "8988117408309506793",
+ "concreteTypeId": "7cbc352969caf2e9caa716d89c3be65e707447e2a197c779cc4ef382d0602de6"
+ },
+ {
+ "logId": "17263266271595476800",
+ "concreteTypeId": "ef937135956e37401e0bc90406ca8becda92d1b4e387fe938ddef8d27ee192a1"
+ },
+ {
+ "logId": "2991584087911992109",
+ "concreteTypeId": "29843de0bbb48b2d3c601b61823f2e106cfa5833e18b482571f1fa58b507a7ad"
+ },
+ {
+ "logId": "15359085500973571070",
+ "concreteTypeId": "d5266ee32061dbfec8c96f2ba8a054243875e4e6a586104d6366b11e3bc86f2e"
+ },
+ {
+ "logId": "6096764540904137535",
+ "concreteTypeId": "549c0f0c43c9e33f7e958e0473d84e78eca4737f9f159c64614ca5dff2d91b60"
+ },
+ {
+ "logId": "16681458389498941754",
+ "concreteTypeId": "e7807205e98b513a8beeb5bcf446f0b2d684d0dce6bfeff0f324fa31df1b8948"
+ },
+ {
+ "logId": "9678575818972079706",
+ "concreteTypeId": "8651356d9584265a78cb58de01c22d405dfc7006ea2f5f74fddcbe3f047f109a"
+ },
+ {
+ "logId": "15006799511514667686",
+ "concreteTypeId": "d042dca573565aa653542415397934b3e95452917664e04d27c32a22091aa9a5"
+ },
+ {
+ "logId": "621263945896771922",
+ "concreteTypeId": "089f2c4466ef415255917812d05776ebcb386be53e5f94bdad1ca8095f02845c"
+ },
+ {
+ "logId": "18160646294966696875",
+ "concreteTypeId": "fc0793960700fbabd2722134cff2a546743fc832b98d89aac1ec30fc669fd698"
+ },
+ {
+ "logId": "16916744526725816430",
+ "concreteTypeId": "eac45984af86a06e11e1c5ff744bc1242e004db8404308cb7e574b4c2afaf621"
+ },
+ {
+ "logId": "8728991397092492258",
+ "concreteTypeId": "79239b6d6f2383e2cfbaf4da7fdf7ee7fb59b7bf517acfff2d9433e9e76e8fc4"
+ },
+ {
+ "logId": "8036493118938929554",
+ "concreteTypeId": "6f875be99a39d9920569678a34ffce676a6c3e14b958910db250b9cb4957157f"
+ },
+ {
+ "logId": "2992671284987479467",
+ "concreteTypeId": "29881aad8730c5ab11d275376323d8e4ff4179aae8ccb6c13fe4902137e162ef"
+ },
+ {
+ "logId": "1970142151624111756",
+ "concreteTypeId": "1b5759d94094368cfd443019e7ca5ec4074300e544e5ea993a979f5da627261e"
+ },
+ {
+ "logId": "15520703124961489725",
+ "concreteTypeId": "d7649d428b9ff33d188ecbf38a7e4d8fd167fa01b2e10fe9a8f9308e52f1d7cc"
+ },
+ {
+ "logId": "14454674236531057292",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b"
+ },
+ {
+ "logId": "7752900403879318547",
+ "concreteTypeId": "6b97d5d738359413c9fac402aced252c23902c28382469ffe27f07381e9f6f31"
+ },
+ {
+ "logId": "16171443785104013487",
+ "concreteTypeId": "e06c82714c52b8afd2293d5d37d05783d09d71c956311c6050ac012cab06364e"
+ },
+ {
+ "logId": "13897586369399989020",
+ "concreteTypeId": "c0de252b9f65a31c6d03071b4b18a935c88c5bb0b2401a447fd30d342fd5a04d"
+ },
+ {
+ "logId": "2855558404146077188",
+ "concreteTypeId": "27a0fb3d3a821e04e7a3f17ab6a617f0eb10f11e6eeb0f2c0ff9e6237207319e"
+ },
+ {
+ "logId": "10477818057471029201",
+ "concreteTypeId": "9168b00268bbefd158090041178f058b032504f76c4b9644157d5d6b5b183468"
+ },
+ {
+ "logId": "3330666440490685604",
+ "concreteTypeId": "2e38e77b22c314a449e91fafed92a43826ac6aa403ae6a8acb6cf58239fbaf5d"
+ }
+ ],
+ "messagesTypes": [],
+ "configurables": [
+ {
+ "name": "U8_VALUE",
+ "concreteTypeId": "c89951a24c6ca28c13fd1cfdc646b2b656d69e61a92b91023be7eb58eb914b6b",
+ "offset": 119320
+ },
+ {
+ "name": "BOOL_VALUE",
+ "concreteTypeId": "b760f44fa5965c2474a3b471467a22c43185152129295af588b022ae50b50903",
+ "offset": 119288
+ },
+ {
+ "name": "B256_VALUE",
+ "concreteTypeId": "7c5ee1cecf5f8eacd1284feb5f0bf2bdea533a51e2f0c9aabe9236d335989f3b",
+ "offset": 119256
+ },
+ {
+ "name": "OPTION_U8_VALUE",
+ "concreteTypeId": "2da102c46c7263beeed95818cd7bee801716ba8303dddafdcd0f6c9efda4a0f1",
+ "offset": 119304
+ },
+ {
+ "name": "GENERIC_STRUCT_VALUE",
+ "concreteTypeId": "08dbec793087c5686c1a493513b158a999bb653126ee51151dfa85fa683edce5",
+ "offset": 119296
+ }
+ ]
+};
\ No newline at end of file
diff --git a/packages/fuel-gauge/src/abi/fixtures/contracts/contract-bytecode.txt b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-bytecode.txt
new file mode 100644
index 00000000000..49c458789d2
--- /dev/null
+++ b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-bytecode.txt
@@ -0,0 +1,14 @@
+/* Autogenerated file. Do not edit manually. */
+
+/* eslint-disable eslint-comments/no-unlimited-disable */
+/* eslint-disable */
+
+/*
+ Fuels version: 0.97.2
+ Forc version: 0.66.5
+*/
+
+
+import { decompressBytecode } from "fuels";
+
+export const bytecode = decompressBytecode("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");
\ No newline at end of file
diff --git a/packages/fuel-gauge/src/abi/fixtures/contracts/contract-factory.txt b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-factory.txt
new file mode 100644
index 00000000000..14f428d70cf
--- /dev/null
+++ b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-factory.txt
@@ -0,0 +1,35 @@
+/* Autogenerated file. Do not edit manually. */
+
+/* eslint-disable eslint-comments/no-unlimited-disable */
+/* eslint-disable */
+
+/*
+ Fuels version: 0.97.2
+ Forc version: 0.66.5
+*/
+
+
+import { ContractFactory } from 'fuels';
+import type { Account, Provider, DeployContractOptions } from 'fuels';
+import { AbiContract } from './AbiContract';
+import { bytecode } from './AbiContract-bytecode';
+import { abi } from './AbiContract-abi';
+import { storageSlots } from './AbiContract-storage-slots';
+
+export class AbiContractFactory extends ContractFactory {
+
+ static readonly bytecode = bytecode;
+ static readonly storageSlots = storageSlots;
+
+ constructor(accountOrProvider: Account | Provider) {
+ super(bytecode, abi, accountOrProvider, AbiContractFactory.storageSlots);
+ }
+
+ static deploy (
+ wallet: Account,
+ options: DeployContractOptions = {}
+ ) {
+ const factory = new AbiContractFactory(wallet);
+ return factory.deploy(options);
+ }
+}
diff --git a/packages/fuel-gauge/src/abi/fixtures/contracts/contract-index.txt b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-index.txt
new file mode 100644
index 00000000000..5e648294442
--- /dev/null
+++ b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-index.txt
@@ -0,0 +1,13 @@
+/* Autogenerated file. Do not edit manually. */
+
+/* eslint-disable eslint-comments/no-unlimited-disable */
+/* eslint-disable */
+
+/*
+ Fuels version: 0.97.2
+ Forc version: 0.66.5
+*/
+
+
+export { AbiContract } from './AbiContract';
+export { AbiContractFactory } from './AbiContractFactory';
diff --git a/packages/fuel-gauge/src/abi/fixtures/contracts/contract-storage-slots.txt b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-storage-slots.txt
new file mode 100644
index 00000000000..3fc62c7120e
--- /dev/null
+++ b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-storage-slots.txt
@@ -0,0 +1,14 @@
+/* Autogenerated file. Do not edit manually. */
+
+/* eslint-disable eslint-comments/no-unlimited-disable */
+/* eslint-disable */
+
+/*
+ Fuels version: 0.97.2
+ Forc version: 0.66.5
+*/
+
+
+import type { StorageSlot } from 'fuels';
+
+export const storageSlots: StorageSlot[] = [];
\ No newline at end of file
diff --git a/packages/fuel-gauge/src/abi/fixtures/contracts/contract-types.txt b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-types.txt
new file mode 100644
index 00000000000..2d061293f5b
--- /dev/null
+++ b/packages/fuel-gauge/src/abi/fixtures/contracts/contract-types.txt
@@ -0,0 +1,373 @@
+/* Autogenerated file. Do not edit manually. */
+
+/* eslint-disable eslint-comments/no-unlimited-disable */
+/* eslint-disable */
+
+/*
+ Fuels version: 0.97.2
+ Forc version: 0.66.5
+*/
+
+
+import type { BN, BigNumberish, Bytes, EvmAddress, RawSlice, StdString, StrSlice } from 'fuels';
+import type { ArrayOfLength, Enum, Option, Result } from '../common';
+
+export enum EnumWithNative { Checked = 'Checked', Pending = 'Pending' };
+export enum ExternalEnum { A = 'A', B = 'B' };
+
+export type AddressInput = { bits: string };
+export type AddressOutput = AddressInput;
+export type AssetIdInput = { bits: string };
+export type AssetIdOutput = AssetIdInput;
+export type ConfigurablesInput = { U8_VALUE: BigNumberish, BOOL_VALUE: boolean, B256_VALUE: string, OPTION_U8_VALUE: Option, GENERIC_STRUCT_VALUE: StructDoubleGenericInput, BigNumberish> };
+export type ConfigurablesOutput = { U8_VALUE: number, BOOL_VALUE: boolean, B256_VALUE: string, OPTION_U8_VALUE: Option, GENERIC_STRUCT_VALUE: StructDoubleGenericOutput, number> };
+export type ContractIdInput = { bits: string };
+export type ContractIdOutput = ContractIdInput;
+export type EnumDoubleGenericInput = Enum<{ a: T1, b: T2 }>;
+export type EnumDoubleGenericOutput = EnumDoubleGenericInput;
+export type EnumWithBuiltinTypeInput = Enum<{ a: boolean, b: BigNumberish }>;
+export type EnumWithBuiltinTypeOutput = Enum<{ a: boolean, b: BN }>;
+export type EnumWithStructsInput = Enum<{ a: EnumWithNative, b: StructSimpleInput, c: StructDoubleGenericInput }>;
+export type EnumWithStructsOutput = Enum<{ a: EnumWithNative, b: StructSimpleOutput, c: StructDoubleGenericOutput }>;
+export type EnumWithVectorInput = Enum<{ a: BigNumberish, b: BigNumberish[] }>;
+export type EnumWithVectorOutput = Enum<{ a: number, b: number[] }>;
+export type ExternalStructInput = { value: BigNumberish };
+export type ExternalStructOutput = { value: BN };
+export type IdentityInput = Enum<{ Address: AddressInput, ContractId: ContractIdInput }>;
+export type IdentityOutput = Enum<{ Address: AddressOutput, ContractId: ContractIdOutput }>;
+export type StructAInput = { propA1: BigNumberish };
+export type StructAOutput = { propA1: number };
+export type StructBInput = { propB1: StructAInput, propB2: BigNumberish };
+export type StructBOutput = { propB1: StructAOutput, propB2: number };
+export type StructCInput = { propC1: StructAInput, propC2: StructBInput[], propC3: StructDInput> };
+export type StructCOutput = { propC1: StructAOutput, propC2: StructBOutput[], propC3: StructDOutput> };
+export type StructDInput = { propD1: StructEInput[], propD2: U, propD3: V };
+export type StructDOutput = { propD1: StructEOutput[], propD2: U, propD3: V };
+export type StructDoubleGenericInput = { a: T1, b: T2 };
+export type StructDoubleGenericOutput = StructDoubleGenericInput;
+export type StructEInput = { propE1: StructAInput, propE2: StructBInput, propE3: T };
+export type StructEOutput = { propE1: StructAOutput, propE2: StructBOutput, propE3: T };
+export type StructFInput = { propF1: BigNumberish, propF2: T };
+export type StructFOutput = { propF1: BN, propF2: T };
+export type StructGInput = { propG1: BigNumberish };
+export type StructGOutput = { propG1: number };
+export type StructGenericWithEnumInput = { a: T1, b: EnumDoubleGenericInput };
+export type StructGenericWithEnumOutput = { a: T1, b: EnumDoubleGenericOutput };
+export type StructSimpleInput = { a: boolean, b: BigNumberish };
+export type StructSimpleOutput = { a: boolean, b: number };
+export type StructSingleGenericInput = { a: T };
+export type StructSingleGenericOutput = StructSingleGenericInput;
+export type StructWithEnumArrayInput = { a: ArrayOfLength };
+export type StructWithEnumArrayOutput = StructWithEnumArrayInput;
+export type StructWithGenericArrayInput = { a: ArrayOfLength, 3> };
+export type StructWithGenericArrayOutput = { a: ArrayOfLength, 3> };
+export type StructWithImplicitGenericsInput = { a: ArrayOfLength, b: [E, F] };
+export type StructWithImplicitGenericsOutput = StructWithImplicitGenericsInput;
+export type StructWithMultiOptionInput = { a: ArrayOfLength