From f83502e2a1ce0de1ec2a9523095eac0be137e6e6 Mon Sep 17 00:00:00 2001 From: Chad Nehemiah Date: Thu, 23 May 2024 11:52:53 -0500 Subject: [PATCH 1/6] chore: refactor for performance improvements (#2358) --- .changeset/great-penguins-compete.md | 6 ++++++ internal/fuel-core/lib/install.js | 6 +++--- internal/fuel-core/lib/shared.js | 15 ++++++++++----- packages/abi-coder/src/ResolvedAbiType.ts | 19 +++++++++++++++---- .../src/encoding/strategies/getCoderV1.ts | 1 + 5 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 .changeset/great-penguins-compete.md diff --git a/.changeset/great-penguins-compete.md b/.changeset/great-penguins-compete.md new file mode 100644 index 0000000000..f333e70e67 --- /dev/null +++ b/.changeset/great-penguins-compete.md @@ -0,0 +1,6 @@ +--- +"@internal/fuel-core": patch +"@fuel-ts/abi-coder": patch +--- + +chore: refactor for performance improvements diff --git a/internal/fuel-core/lib/install.js b/internal/fuel-core/lib/install.js index 9512e1c5da..7ded334f3a 100755 --- a/internal/fuel-core/lib/install.js +++ b/internal/fuel-core/lib/install.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -import { execSync } from 'child_process'; +import { spawnSync } from 'child_process'; import { error } from 'console'; import { existsSync, rmSync, writeFileSync, renameSync } from 'fs'; import fetch from 'node-fetch'; @@ -33,7 +33,7 @@ import { let versionMatches = false; if (existsSync(binPath)) { - const binRawVersion = execSync(`${binPath} --version`).toString().trim(); + const binRawVersion = spawnSync(binPath, ['--version'], { encoding: 'utf8' }).stdout.trim(); const binVersion = binRawVersion.match(/([.0-9]+)/)?.[0]; versionMatches = binVersion === fuelCoreVersion; @@ -67,7 +67,7 @@ import { writeFileSync(pkgPath, buf); // Extract - execSync(`tar xzf "${pkgPath}" -C "${rootDir}"`); + spawnSync('tar', ['xzf', pkgPath, '-C', rootDir]); // Take the contents of the directory containing the extracted // binaries and move them to the `fuel-core-binaries` directory diff --git a/internal/fuel-core/lib/shared.js b/internal/fuel-core/lib/shared.js index 71d206abd6..bbae78abf2 100644 --- a/internal/fuel-core/lib/shared.js +++ b/internal/fuel-core/lib/shared.js @@ -1,4 +1,4 @@ -import { execSync } from 'child_process'; +import { spawnSync } from 'child_process'; import { cpSync, mkdirSync, rmSync, readFileSync, writeFileSync, existsSync } from 'fs'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; @@ -55,11 +55,16 @@ export const buildFromGitBranch = (branchName) => { const stdioOpts = { stdio: 'inherit' }; if (existsSync(fuelCoreRepoDir)) { - execSync(`cd ${fuelCoreRepoDir} && git pull && git checkout ${branchName}`, stdioOpts); - execSync(`cd ${fuelCoreRepoDir} && cargo build`, stdioOpts); + spawnSync('git', ['pull'], { cwd: fuelCoreRepoDir, ...stdioOpts }); + spawnSync('git', ['checkout', branchName], { cwd: fuelCoreRepoDir, ...stdioOpts }); + spawnSync('cargo', ['build'], { cwd: fuelCoreRepoDir, ...stdioOpts }); } else { - execSync(`git clone --branch ${branchName} ${fuelCoreRepoUrl} ${fuelCoreRepoDir}`, stdioOpts); - execSync(`cd ${fuelCoreRepoDir} && cargo build`, stdioOpts); + spawnSync( + 'git', + ['clone', '--branch', branchName, fuelCoreRepoUrl, fuelCoreRepoDir], + stdioOpts + ); + spawnSync('cargo', ['build'], { cwd: fuelCoreRepoDir, ...stdioOpts }); } const [from, to] = [fuelCoreRepoDebugDir, fuelCoreBinDirPath]; diff --git a/packages/abi-coder/src/ResolvedAbiType.ts b/packages/abi-coder/src/ResolvedAbiType.ts index 602473657e..c97e077a67 100644 --- a/packages/abi-coder/src/ResolvedAbiType.ts +++ b/packages/abi-coder/src/ResolvedAbiType.ts @@ -1,3 +1,5 @@ +import { FuelError, ErrorCode } from '@fuel-ts/errors'; + import type { JsonAbi, JsonAbiArgument } from './types/JsonAbi'; import { arrayRegEx, enumRegEx, genericRegEx, stringRegEx, structRegEx } from './utils/constants'; import { findTypeById } from './utils/json-abi'; @@ -14,14 +16,23 @@ export class ResolvedAbiType { this.name = argument.name; - const type = findTypeById(abi, argument.type); - this.type = type.type; + const jsonABIType = findTypeById(abi, argument.type); + + if (jsonABIType.type.length > 256) { + throw new FuelError( + ErrorCode.INVALID_COMPONENT, + `The provided ABI type is too long: ${jsonABIType.type}.` + ); + } + + this.type = jsonABIType.type; this.originalTypeArguments = argument.typeArguments; this.components = ResolvedAbiType.getResolvedGenericComponents( abi, argument, - type.components, - type.typeParameters ?? ResolvedAbiType.getImplicitGenericTypeParameters(abi, type.components) + jsonABIType.components, + jsonABIType.typeParameters ?? + ResolvedAbiType.getImplicitGenericTypeParameters(abi, jsonABIType.components) ); } diff --git a/packages/abi-coder/src/encoding/strategies/getCoderV1.ts b/packages/abi-coder/src/encoding/strategies/getCoderV1.ts index 2b746061ab..6e89b95a2d 100644 --- a/packages/abi-coder/src/encoding/strategies/getCoderV1.ts +++ b/packages/abi-coder/src/encoding/strategies/getCoderV1.ts @@ -99,6 +99,7 @@ export const getCoder: GetCoderFn = ( const components = resolvedAbiType.components!; const arrayMatch = arrayRegEx.exec(resolvedAbiType.type)?.groups; + if (arrayMatch) { const length = parseInt(arrayMatch.length, 10); const arg = components[0]; From 4c3b4c86e6fae2f9f41d9a0ffbbf17e932056782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nedim=20Salki=C4=87?= Date: Fri, 24 May 2024 09:14:11 +0200 Subject: [PATCH 2/6] feat: support `forc build --json-abi-with-callpaths` flag (#2372) --- .changeset/tidy-horses-taste.md | 5 +++ packages/abi-typegen/package.json | 3 +- .../abi-typegen/src/abi/types/B512Type.ts | 2 +- .../abi-typegen/src/abi/types/BytesType.ts | 2 +- .../abi-typegen/src/abi/types/EnumType.ts | 8 +++-- .../src/abi/types/EvmAddressType.ts | 2 +- .../abi-typegen/src/abi/types/OptionType.ts | 2 +- .../abi-typegen/src/abi/types/ResultType.ts | 2 +- .../src/abi/types/StdStringType.ts | 2 +- .../abi-typegen/src/abi/types/StructType.ts | 4 +-- .../abi-typegen/src/abi/types/VectorType.ts | 4 +-- .../src/templates/contract/dts.test.ts | 7 ++-- .../src/templates/utils/formatEnums.ts | 3 +- .../src/templates/utils/formatStructs.ts | 3 +- .../src/utils/extractStructName.ts | 3 +- .../src/utils/shouldSkipAbiType.ts | 7 +++- .../src/utils/shouldSkipType.test.ts | 3 ++ .../test/fixtures/forc-projects/Forc.toml | 1 + .../fixtures/forc-projects/full/Forc.toml | 1 + .../fixtures/forc-projects/full/src/main.sw | 23 ++++++++++++- .../test/fixtures/forc-projects/index.ts | 7 ++-- .../forc-projects/libs-for-testing/Forc.toml | 7 ++++ .../forc-projects/libs-for-testing/src/lib.sw | 11 +++++++ .../test/fixtures/templates/contract/dts.hbs | 32 +++++++++++++++++-- 24 files changed, 119 insertions(+), 25 deletions(-) create mode 100644 .changeset/tidy-horses-taste.md create mode 100644 packages/abi-typegen/test/fixtures/forc-projects/libs-for-testing/Forc.toml create mode 100644 packages/abi-typegen/test/fixtures/forc-projects/libs-for-testing/src/lib.sw diff --git a/.changeset/tidy-horses-taste.md b/.changeset/tidy-horses-taste.md new file mode 100644 index 0000000000..5242299bde --- /dev/null +++ b/.changeset/tidy-horses-taste.md @@ -0,0 +1,5 @@ +--- +"@fuel-ts/abi-typegen": patch +--- + +feat: support `forc build --json-abi-with-callpaths` flag diff --git a/packages/abi-typegen/package.json b/packages/abi-typegen/package.json index 49af05d897..f4d81b93ba 100644 --- a/packages/abi-typegen/package.json +++ b/packages/abi-typegen/package.json @@ -43,9 +43,10 @@ "dist" ], "scripts": { - "pretest": "pnpm build:forc", + "pretest": "run-s build:forc-callpaths build:forc", "build": "tsup", "build:forc": "pnpm fuels-forc build -p test/fixtures/forc-projects --release", + "build:forc-callpaths": "pnpm fuels-forc build -p test/fixtures/forc-projects --json-abi-with-callpaths", "postbuild": "tsx ../../scripts/postbuild.ts" }, "license": "Apache-2.0", diff --git a/packages/abi-typegen/src/abi/types/B512Type.ts b/packages/abi-typegen/src/abi/types/B512Type.ts index e3fde6d699..fe1dca3376 100644 --- a/packages/abi-typegen/src/abi/types/B512Type.ts +++ b/packages/abi-typegen/src/abi/types/B512Type.ts @@ -5,7 +5,7 @@ export class B512Type extends B256Type { public name = 'b512'; - static MATCH_REGEX = /^struct B512$/m; + static MATCH_REGEX = /^struct (std::b512::)?B512$/m; static isSuitableFor(params: { type: string }) { return B512Type.MATCH_REGEX.test(params.type); diff --git a/packages/abi-typegen/src/abi/types/BytesType.ts b/packages/abi-typegen/src/abi/types/BytesType.ts index 92e22b219d..eb96dc3161 100644 --- a/packages/abi-typegen/src/abi/types/BytesType.ts +++ b/packages/abi-typegen/src/abi/types/BytesType.ts @@ -7,7 +7,7 @@ export class BytesType extends ArrayType { public name = 'bytes'; - static MATCH_REGEX: RegExp = /^struct Bytes/m; + static MATCH_REGEX: RegExp = /^struct (std::bytes::)?Bytes/m; static isSuitableFor(params: { type: string }) { return BytesType.MATCH_REGEX.test(params.type); diff --git a/packages/abi-typegen/src/abi/types/EnumType.ts b/packages/abi-typegen/src/abi/types/EnumType.ts index b0010de7ed..d679565573 100644 --- a/packages/abi-typegen/src/abi/types/EnumType.ts +++ b/packages/abi-typegen/src/abi/types/EnumType.ts @@ -7,18 +7,20 @@ import { parseTypeArguments } from '../../utils/parseTypeArguments'; import { AType } from './AType'; import { EmptyType } from './EmptyType'; +import { OptionType } from './OptionType'; +import { ResultType } from './ResultType'; export class EnumType extends AType implements IType { public static swayType = 'enum MyEnumName'; public name = 'enum'; - static MATCH_REGEX: RegExp = /^enum (.+)$/m; - static IGNORE_REGEX: RegExp = /^enum (Option|Result)$/m; + static MATCH_REGEX: RegExp = /^enum (.+::)?(.+)$/m; + static IGNORE_REGEXES: RegExp[] = [OptionType.MATCH_REGEX, ResultType.MATCH_REGEX]; static isSuitableFor(params: { type: string }) { const isAMatch = EnumType.MATCH_REGEX.test(params.type); - const shouldBeIgnored = EnumType.IGNORE_REGEX.test(params.type); + const shouldBeIgnored = EnumType.IGNORE_REGEXES.some((r) => r.test(params.type)); return isAMatch && !shouldBeIgnored; } diff --git a/packages/abi-typegen/src/abi/types/EvmAddressType.ts b/packages/abi-typegen/src/abi/types/EvmAddressType.ts index e1513d9440..1df4752fb5 100644 --- a/packages/abi-typegen/src/abi/types/EvmAddressType.ts +++ b/packages/abi-typegen/src/abi/types/EvmAddressType.ts @@ -7,7 +7,7 @@ export class EvmAddressType extends AType implements IType { public name = 'evmAddress'; - static MATCH_REGEX: RegExp = /^struct EvmAddress$/m; + static MATCH_REGEX: RegExp = /^struct (std::vm::evm::evm_address::)?EvmAddress$/m; static isSuitableFor(params: { type: string }) { return EvmAddressType.MATCH_REGEX.test(params.type); diff --git a/packages/abi-typegen/src/abi/types/OptionType.ts b/packages/abi-typegen/src/abi/types/OptionType.ts index 9a70c3f48d..a7dd844759 100644 --- a/packages/abi-typegen/src/abi/types/OptionType.ts +++ b/packages/abi-typegen/src/abi/types/OptionType.ts @@ -7,7 +7,7 @@ export class OptionType extends AType implements IType { public name = 'option'; - static MATCH_REGEX: RegExp = /^enum Option$/m; + static MATCH_REGEX: RegExp = /^enum (std::option::)?Option$/m; static isSuitableFor(params: { type: string }) { return OptionType.MATCH_REGEX.test(params.type); diff --git a/packages/abi-typegen/src/abi/types/ResultType.ts b/packages/abi-typegen/src/abi/types/ResultType.ts index 9f97a48fff..49f988501f 100644 --- a/packages/abi-typegen/src/abi/types/ResultType.ts +++ b/packages/abi-typegen/src/abi/types/ResultType.ts @@ -7,7 +7,7 @@ export class ResultType extends AType implements IType { public name = 'result'; - static MATCH_REGEX: RegExp = /^enum Result$/m; + static MATCH_REGEX: RegExp = /^enum (std::result::)?Result$/m; static isSuitableFor(params: { type: string }) { return ResultType.MATCH_REGEX.test(params.type); diff --git a/packages/abi-typegen/src/abi/types/StdStringType.ts b/packages/abi-typegen/src/abi/types/StdStringType.ts index 6272bc03fc..e8f14e6198 100644 --- a/packages/abi-typegen/src/abi/types/StdStringType.ts +++ b/packages/abi-typegen/src/abi/types/StdStringType.ts @@ -7,7 +7,7 @@ export class StdStringType extends AType implements IType { public name = 'stdString'; - static MATCH_REGEX: RegExp = /^struct String/m; + static MATCH_REGEX: RegExp = /^struct (std::string::)?String/m; static isSuitableFor(params: { type: string }) { return StdStringType.MATCH_REGEX.test(params.type); diff --git a/packages/abi-typegen/src/abi/types/StructType.ts b/packages/abi-typegen/src/abi/types/StructType.ts index 759e14f11f..a5d871e2fe 100644 --- a/packages/abi-typegen/src/abi/types/StructType.ts +++ b/packages/abi-typegen/src/abi/types/StructType.ts @@ -12,8 +12,8 @@ export class StructType extends AType implements IType { public name = 'struct'; - static MATCH_REGEX: RegExp = /^struct (.+)$/m; - static IGNORE_REGEX: RegExp = /^struct (Vec|RawVec|EvmAddress|Bytes|String)$/m; + static MATCH_REGEX: RegExp = /^struct (.+::)?(.+)$/m; + static IGNORE_REGEX: RegExp = /^struct (std::.*)?(Vec|RawVec|EvmAddress|Bytes|String|RawBytes)$/m; static isSuitableFor(params: { type: string }) { const isAMatch = StructType.MATCH_REGEX.test(params.type); diff --git a/packages/abi-typegen/src/abi/types/VectorType.ts b/packages/abi-typegen/src/abi/types/VectorType.ts index 6957833df2..ed20a59b8c 100644 --- a/packages/abi-typegen/src/abi/types/VectorType.ts +++ b/packages/abi-typegen/src/abi/types/VectorType.ts @@ -7,8 +7,8 @@ export class VectorType extends ArrayType { public name = 'vector'; - static MATCH_REGEX: RegExp = /^struct Vec/m; - static IGNORE_REGEX: RegExp = /^struct RawVec$/m; + static MATCH_REGEX: RegExp = /^struct (std::vec::)?Vec/m; + static IGNORE_REGEX: RegExp = /^struct (std::vec::)?RawVec$/m; static isSuitableFor(params: { type: string }) { const isAMatch = VectorType.MATCH_REGEX.test(params.type); diff --git a/packages/abi-typegen/src/templates/contract/dts.test.ts b/packages/abi-typegen/src/templates/contract/dts.test.ts index 15e6221b6a..3731197342 100644 --- a/packages/abi-typegen/src/templates/contract/dts.test.ts +++ b/packages/abi-typegen/src/templates/contract/dts.test.ts @@ -14,12 +14,15 @@ import { renderDtsTemplate } from './dts'; * @group node */ describe('templates/dts', () => { - test('should render dts template', () => { + test.each(['debug', 'release'])('should render dts template', (build) => { // mocking const { restore } = mockVersions(); // executing - const project = getTypegenForcProject(AbiTypegenProjectsEnum.FULL); + const project = getTypegenForcProject( + AbiTypegenProjectsEnum.FULL, + build as 'release' | 'debug' + ); const { abiContents: rawContents } = project; const abi = new Abi({ diff --git a/packages/abi-typegen/src/templates/utils/formatEnums.ts b/packages/abi-typegen/src/templates/utils/formatEnums.ts index 280594e7a2..9357bbefb5 100644 --- a/packages/abi-typegen/src/templates/utils/formatEnums.ts +++ b/packages/abi-typegen/src/templates/utils/formatEnums.ts @@ -25,7 +25,8 @@ export function formatEnums(params: { types: IType[] }) { outputNativeValues, typeAnnotations, }; - }); + }) + .sort((a, b) => (a.structName < b.structName ? -1 : 1)); return { enums }; } diff --git a/packages/abi-typegen/src/templates/utils/formatStructs.ts b/packages/abi-typegen/src/templates/utils/formatStructs.ts index 2f7486cc7c..a74eadf266 100644 --- a/packages/abi-typegen/src/templates/utils/formatStructs.ts +++ b/packages/abi-typegen/src/templates/utils/formatStructs.ts @@ -20,7 +20,8 @@ export function formatStructs(params: { types: IType[] }) { outputValues, recycleRef: inputValues === outputValues, // reduces duplication }; - }); + }) + .sort((a, b) => (a.structName < b.structName ? -1 : 1)); return { structs }; } diff --git a/packages/abi-typegen/src/utils/extractStructName.ts b/packages/abi-typegen/src/utils/extractStructName.ts index 16d2bfdd99..4e4dd813d1 100644 --- a/packages/abi-typegen/src/utils/extractStructName.ts +++ b/packages/abi-typegen/src/utils/extractStructName.ts @@ -5,7 +5,8 @@ import type { IRawAbiTypeRoot } from '../types/interfaces/IRawAbiType'; export function extractStructName(params: { rawAbiType: IRawAbiTypeRoot; regex: RegExp }) { const { rawAbiType, regex } = params; - const match = rawAbiType.type.match(params.regex)?.[1]; + const matches = rawAbiType.type.match(regex); + const match = matches?.[2] ?? matches?.[1]; if (!match) { let errorMessage = `Couldn't extract struct name with: '${regex}'.\n\n`; diff --git a/packages/abi-typegen/src/utils/shouldSkipAbiType.ts b/packages/abi-typegen/src/utils/shouldSkipAbiType.ts index 575fb98e26..90dce42cbf 100644 --- a/packages/abi-typegen/src/utils/shouldSkipAbiType.ts +++ b/packages/abi-typegen/src/utils/shouldSkipAbiType.ts @@ -1,5 +1,10 @@ export function shouldSkipAbiType(params: { type: string }) { - const ignoreList = ['struct RawVec']; + const ignoreList = [ + 'struct RawVec', + 'struct std::vec::RawVec', + 'struct RawBytes', + 'struct std::bytes::RawBytes', + ]; const shouldSkip = ignoreList.indexOf(params.type) >= 0; return shouldSkip; } diff --git a/packages/abi-typegen/src/utils/shouldSkipType.test.ts b/packages/abi-typegen/src/utils/shouldSkipType.test.ts index 68d1ce5800..404abb0380 100644 --- a/packages/abi-typegen/src/utils/shouldSkipType.test.ts +++ b/packages/abi-typegen/src/utils/shouldSkipType.test.ts @@ -7,6 +7,9 @@ import { supportedTypes } from './supportedTypes'; describe('types.ts', () => { test('should always skip these types', () => { expect(shouldSkipAbiType({ type: 'struct RawVec' })).toEqual(true); + expect(shouldSkipAbiType({ type: 'struct std::vec::RawVec' })).toEqual(true); + expect(shouldSkipAbiType({ type: 'struct RawBytes' })).toEqual(true); + expect(shouldSkipAbiType({ type: 'struct std::bytes::RawBytes' })).toEqual(true); }); test('should never skip known types', () => { diff --git a/packages/abi-typegen/test/fixtures/forc-projects/Forc.toml b/packages/abi-typegen/test/fixtures/forc-projects/Forc.toml index 64d660a227..4ba1130713 100644 --- a/packages/abi-typegen/test/fixtures/forc-projects/Forc.toml +++ b/packages/abi-typegen/test/fixtures/forc-projects/Forc.toml @@ -24,4 +24,5 @@ members = [ "./struct-with-array", "./tuple-simple", "./vector-simple", + "libs-for-testing", ] diff --git a/packages/abi-typegen/test/fixtures/forc-projects/full/Forc.toml b/packages/abi-typegen/test/fixtures/forc-projects/full/Forc.toml index 70be6d3356..f868cdb381 100644 --- a/packages/abi-typegen/test/fixtures/forc-projects/full/Forc.toml +++ b/packages/abi-typegen/test/fixtures/forc-projects/full/Forc.toml @@ -5,3 +5,4 @@ license = "Apache-2.0" name = "full" [dependencies] +libs-for-testing = { path = "../libs-for-testing" } diff --git a/packages/abi-typegen/test/fixtures/forc-projects/full/src/main.sw b/packages/abi-typegen/test/fixtures/forc-projects/full/src/main.sw index e28cfb5032..7fa07f1d81 100644 --- a/packages/abi-typegen/test/fixtures/forc-projects/full/src/main.sw +++ b/packages/abi-typegen/test/fixtures/forc-projects/full/src/main.sw @@ -1,5 +1,6 @@ contract; - +use libs_for_testing::ExternalStruct; +use libs_for_testing::ExternalEnum; use std::vm::evm::evm_address::EvmAddress; use std::b512::B512; use std::string::String; @@ -81,6 +82,11 @@ abi MyContract { fn types_raw_slice(x: raw_slice) -> raw_slice; fn types_std_string(x: String) -> String; fn types_result(x: Result) -> Result; + fn type_address(x: Address) -> Address; + fn type_contract_id(x: ContractId) -> ContractId; + fn type_identity(x: Identity) -> Identity; + fn type_external_struct(x: ExternalStruct) -> ExternalStruct; + fn type_external_enum(x: ExternalEnum) -> ExternalEnum; fn types_generic_enum(x: GenericEnum) -> GenericEnum; fn types_generic_struct(x: GenericStructWithEnum) -> GenericStructWithEnum; } @@ -183,6 +189,21 @@ impl MyContract for Contract { Err(MyContractError::DivisionByZero) => Err(__to_str_array("DivisError")), } } + fn type_address(x: Address) -> Address { + x + } + fn type_contract_id(x: ContractId) -> ContractId { + x + } + fn type_identity(x: Identity) -> Identity { + x + } + fn type_external_enum(x: ExternalEnum) -> ExternalEnum { + x + } + fn type_external_struct(x: ExternalStruct) -> ExternalStruct { + x + } fn types_generic_enum(x: GenericEnum) -> GenericEnum { x } diff --git a/packages/abi-typegen/test/fixtures/forc-projects/index.ts b/packages/abi-typegen/test/fixtures/forc-projects/index.ts index c25461c74b..bdf2506619 100644 --- a/packages/abi-typegen/test/fixtures/forc-projects/index.ts +++ b/packages/abi-typegen/test/fixtures/forc-projects/index.ts @@ -30,9 +30,12 @@ export enum AbiTypegenProjectsEnum { VECTOR_SIMPLE = 'vector-simple', } -export const getTypegenForcProject = (project: AbiTypegenProjectsEnum) => +export const getTypegenForcProject = ( + project: AbiTypegenProjectsEnum, + build: 'release' | 'debug' = 'release' +) => getForcProject({ projectDir: join(__dirname, project), projectName: project, - build: 'release', + build, }); diff --git a/packages/abi-typegen/test/fixtures/forc-projects/libs-for-testing/Forc.toml b/packages/abi-typegen/test/fixtures/forc-projects/libs-for-testing/Forc.toml new file mode 100644 index 0000000000..5815cbd0c9 --- /dev/null +++ b/packages/abi-typegen/test/fixtures/forc-projects/libs-for-testing/Forc.toml @@ -0,0 +1,7 @@ +[project] +authors = ["Fuel Labs "] +entry = "lib.sw" +license = "Apache-2.0" +name = "libs-for-testing" + +[dependencies] diff --git a/packages/abi-typegen/test/fixtures/forc-projects/libs-for-testing/src/lib.sw b/packages/abi-typegen/test/fixtures/forc-projects/libs-for-testing/src/lib.sw new file mode 100644 index 0000000000..dd28f6c547 --- /dev/null +++ b/packages/abi-typegen/test/fixtures/forc-projects/libs-for-testing/src/lib.sw @@ -0,0 +1,11 @@ +library; + +// anything `pub` here will be exported as a part of this library's API +pub struct ExternalStruct { + pub value: u64, +} + +pub enum ExternalEnum { + A: (), + B: (), +} diff --git a/packages/abi-typegen/test/fixtures/templates/contract/dts.hbs b/packages/abi-typegen/test/fixtures/templates/contract/dts.hbs index 8e01f9ac29..1fa4d62b5e 100644 --- a/packages/abi-typegen/test/fixtures/templates/contract/dts.hbs +++ b/packages/abi-typegen/test/fixtures/templates/contract/dts.hbs @@ -28,24 +28,37 @@ import type { Option, Enum, Vec, Result } from "./common"; export type EnumWithVectorInput = Enum<{ num: BigNumberish, vec: Vec }>; export type EnumWithVectorOutput = Enum<{ num: number, vec: Vec }>; +export enum ExternalEnumInput { A = 'A', B = 'B' }; +export enum ExternalEnumOutput { A = 'A', B = 'B' }; export type GenericEnumInput = Enum<{ a: T1, b: T2 }>; export type GenericEnumOutput = GenericEnumInput; +export type IdentityInput = Enum<{ Address: AddressInput, ContractId: ContractIdInput }>; +export type IdentityOutput = Enum<{ Address: AddressOutput, ContractId: ContractIdOutput }>; export enum MyEnumInput { Checked = 'Checked', Pending = 'Pending' }; export enum MyEnumOutput { Checked = 'Checked', Pending = 'Pending' }; +export type AddressInput = { bits: string }; +export type AddressOutput = AddressInput; export type AssetIdInput = { bits: string }; export type AssetIdOutput = AssetIdInput; +export type ContractIdInput = { bits: string }; +export type ContractIdOutput = ContractIdInput; +export type ExternalStructInput = { value: BigNumberish }; +export type ExternalStructOutput = { value: BN }; export type GenericStructWithEnumInput = { a: T1, b: GenericEnumInput }; export type GenericStructWithEnumOutput = { a: T1, b: GenericEnumOutput }; export type MyStructInput = { x: BigNumberish, y: BigNumberish, state: MyEnumInput }; export type MyStructOutput = { x: number, y: number, state: MyEnumOutput }; -export type RawBytesInput = { ptr: BigNumberish, cap: BigNumberish }; -export type RawBytesOutput = { ptr: BN, cap: BN }; export type StructWithMultiOptionInput = { multiple: [Option, Option, Option, Option, Option] }; export type StructWithMultiOptionOutput = { multiple: [Option, Option, Option, Option, Option] }; interface MyContractAbiInterface extends Interface { functions: { + type_address: FunctionFragment; + type_contract_id: FunctionFragment; + type_external_enum: FunctionFragment; + type_external_struct: FunctionFragment; + type_identity: FunctionFragment; types_array: FunctionFragment; types_asset_id: FunctionFragment; types_b256: FunctionFragment; @@ -79,6 +92,11 @@ interface MyContractAbiInterface extends Interface { types_vector_u8: FunctionFragment; }; + encodeFunctionData(functionFragment: 'type_address', values: [AddressInput]): Uint8Array; + encodeFunctionData(functionFragment: 'type_contract_id', values: [ContractIdInput]): Uint8Array; + encodeFunctionData(functionFragment: 'type_external_enum', values: [ExternalEnumInput]): Uint8Array; + encodeFunctionData(functionFragment: 'type_external_struct', values: [ExternalStructInput]): Uint8Array; + encodeFunctionData(functionFragment: 'type_identity', values: [IdentityInput]): Uint8Array; encodeFunctionData(functionFragment: 'types_array', values: [[BigNumberish, BigNumberish, BigNumberish]]): Uint8Array; encodeFunctionData(functionFragment: 'types_asset_id', values: [AssetIdInput]): Uint8Array; encodeFunctionData(functionFragment: 'types_b256', values: [string]): Uint8Array; @@ -111,6 +129,11 @@ interface MyContractAbiInterface extends Interface { encodeFunctionData(functionFragment: 'types_vector_option', values: [Vec]): Uint8Array; encodeFunctionData(functionFragment: 'types_vector_u8', values: [Vec]): Uint8Array; + decodeFunctionData(functionFragment: 'type_address', data: BytesLike): DecodedValue; + decodeFunctionData(functionFragment: 'type_contract_id', data: BytesLike): DecodedValue; + decodeFunctionData(functionFragment: 'type_external_enum', data: BytesLike): DecodedValue; + decodeFunctionData(functionFragment: 'type_external_struct', data: BytesLike): DecodedValue; + decodeFunctionData(functionFragment: 'type_identity', data: BytesLike): DecodedValue; decodeFunctionData(functionFragment: 'types_array', data: BytesLike): DecodedValue; decodeFunctionData(functionFragment: 'types_asset_id', data: BytesLike): DecodedValue; decodeFunctionData(functionFragment: 'types_b256', data: BytesLike): DecodedValue; @@ -147,6 +170,11 @@ interface MyContractAbiInterface extends Interface { export class MyContractAbi extends Contract { interface: MyContractAbiInterface; functions: { + type_address: InvokeFunction<[x: AddressInput], AddressOutput>; + type_contract_id: InvokeFunction<[x: ContractIdInput], ContractIdOutput>; + type_external_enum: InvokeFunction<[x: ExternalEnumInput], ExternalEnumOutput>; + type_external_struct: InvokeFunction<[x: ExternalStructInput], ExternalStructOutput>; + type_identity: InvokeFunction<[x: IdentityInput], IdentityOutput>; types_array: InvokeFunction<[x: [BigNumberish, BigNumberish, BigNumberish]], [number, number, number]>; types_asset_id: InvokeFunction<[x: AssetIdInput], AssetIdOutput>; types_b256: InvokeFunction<[x: string], string>; From ba0f3d0f7001cd1f261d658bec0a356a1a40a4ee Mon Sep 17 00:00:00 2001 From: Dhaiwat Date: Fri, 24 May 2024 01:41:13 -0700 Subject: [PATCH 3/6] feat: add new `node` command to `fuels` CLI (#2376) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add new `node` command to `fuels` CLI * add command to readme --------- Co-authored-by: Sérgio Torres <30977845+Torres-ssf@users.noreply.github.com> Co-authored-by: Chad Nehemiah --- .changeset/quiet-lobsters-design.md | 5 ++ README.md | 1 + apps/docs/src/guide/fuels-cli/commands.md | 8 ++ packages/fuels/src/cli.test.ts | 3 + packages/fuels/src/cli.ts | 6 ++ .../fuels/src/cli/commands/node/index.test.ts | 85 +++++++++++++++++++ packages/fuels/src/cli/commands/node/index.ts | 58 +++++++++++++ packages/fuels/src/cli/types.ts | 5 ++ 8 files changed, 171 insertions(+) create mode 100644 .changeset/quiet-lobsters-design.md create mode 100644 packages/fuels/src/cli/commands/node/index.test.ts create mode 100644 packages/fuels/src/cli/commands/node/index.ts diff --git a/.changeset/quiet-lobsters-design.md b/.changeset/quiet-lobsters-design.md new file mode 100644 index 0000000000..c509fa30f6 --- /dev/null +++ b/.changeset/quiet-lobsters-design.md @@ -0,0 +1,5 @@ +--- +"fuels": patch +--- + +feat: add new `node` command to `fuels` CLI diff --git a/README.md b/README.md index f32381757d..7e664aa454 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ Options: Commands: init [options] Create a sample `fuel.config.ts` file + node [options] Start a Fuel node dev [options] Start a Fuel node and run build + deploy on every file change build [options] Build Sway programs and generate Typescript for them deploy [options] Deploy contracts to the Fuel network diff --git a/apps/docs/src/guide/fuels-cli/commands.md b/apps/docs/src/guide/fuels-cli/commands.md index 71dd906709..0345867966 100644 --- a/apps/docs/src/guide/fuels-cli/commands.md +++ b/apps/docs/src/guide/fuels-cli/commands.md @@ -131,6 +131,14 @@ The `fuels dev` command does three things: > _In `dev` mode, every time you update a contract on your Forc `workspace`, we re-generate type definitions and factory classes for it, following your pre-configured [`output`](./config-file.md#output) directory. If it's part of another build system running in dev mode (i.e. `next dev`), you can expect it to re-build / auto-reload as well._ +## `fuels node` + +```console-vue +npx fuels@{{fuels}} node +``` + +The `fuels node` command starts a short-lived `fuel-core` node ([docs](./config-file.md#autostartfuelcore)). + ## `fuels typegen` Manually generates type definitions and factory classes from ABI JSON files. diff --git a/packages/fuels/src/cli.test.ts b/packages/fuels/src/cli.test.ts index 02c5a2e6fe..129769e12b 100644 --- a/packages/fuels/src/cli.test.ts +++ b/packages/fuels/src/cli.test.ts @@ -34,11 +34,13 @@ describe('cli.js', () => { const init = cmd(Commands.init); const dev = cmd(Commands.dev); + const node = cmd(Commands.node); const build = cmd(Commands.build); const deploy = cmd(Commands.deploy); expect(init).toBeTruthy(); expect(dev).toBeTruthy(); + expect(node).toBeTruthy(); expect(build).toBeTruthy(); expect(deploy).toBeTruthy(); @@ -47,6 +49,7 @@ describe('cli.js', () => { expect(init?.opts()).toEqual({ path }); expect(dev?.opts()).toEqual({ path }); + expect(node?.opts()).toEqual({ path }); expect(build?.opts()).toEqual({ path }); expect(deploy?.opts()).toEqual({ path }); }); diff --git a/packages/fuels/src/cli.ts b/packages/fuels/src/cli.ts index b32842805f..c02e7587a4 100644 --- a/packages/fuels/src/cli.ts +++ b/packages/fuels/src/cli.ts @@ -7,6 +7,7 @@ import { build } from './cli/commands/build'; import { deploy } from './cli/commands/deploy'; import { dev } from './cli/commands/dev'; import { init } from './cli/commands/init'; +import { node } from './cli/commands/node'; import { withBinaryPaths } from './cli/commands/withBinaryPaths'; import { withConfig } from './cli/commands/withConfig'; import { withProgram } from './cli/commands/withProgram'; @@ -66,6 +67,11 @@ export const configureCli = () => { .addOption(pathOption) .action(withConfig(command, Commands.dev, dev)); + (command = program.command(Commands.node)) + .description('Start a Fuel node') + .addOption(pathOption) + .action(withConfig(command, Commands.node, node)); + (command = program.command(Commands.build)) .description('Build Sway programs and generate Typescript for them') .addOption(pathOption) diff --git a/packages/fuels/src/cli/commands/node/index.test.ts b/packages/fuels/src/cli/commands/node/index.test.ts new file mode 100644 index 0000000000..1464f8eb46 --- /dev/null +++ b/packages/fuels/src/cli/commands/node/index.test.ts @@ -0,0 +1,85 @@ +import type { FSWatcher } from 'chokidar'; + +import { fuelsConfig } from '../../../../test/fixtures/fuels.config'; +import { mockStartFuelCore } from '../../../../test/utils/mockAutoStartFuelCore'; +import { mockLogger } from '../../../../test/utils/mockLogger'; +import * as loadConfigMod from '../../config/loadConfig'; +import type { FuelsConfig } from '../../types'; +import * as withConfigMod from '../withConfig'; + +import { closeAllFileHandlers, configFileChanged, getConfigFilepathsToWatch } from '.'; + +/** + * @group node + */ +describe('node', () => { + beforeEach(() => { + vi.restoreAllMocks(); + }); + + function mockAll() { + const { autoStartFuelCore, fuelCore, killChildProcess } = mockStartFuelCore(); + + const onFailure = vi.fn(); + + const withConfigErrorHandler = vi + .spyOn(withConfigMod, 'withConfigErrorHandler') + .mockReturnValue(Promise.resolve()); + + const loadConfig = vi + .spyOn(loadConfigMod, 'loadConfig') + .mockReturnValue(Promise.resolve(fuelsConfig)); + + return { + autoStartFuelCore, + fuelCore, + killChildProcess, + loadConfig, + onFailure, + withConfigErrorHandler, + }; + } + + test('should call `close` on all file handlers', () => { + const close = vi.fn(); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const handlers: any = [{ close }, { close }, { close }]; + + closeAllFileHandlers(handlers); + + expect(close).toHaveBeenCalledTimes(3); + }); + + test('should restart everything when config file changes', async () => { + const { log } = mockLogger(); + const { autoStartFuelCore, fuelCore, killChildProcess, loadConfig, withConfigErrorHandler } = + mockAll(); + + const config = structuredClone(fuelsConfig); + const close = vi.fn(); + const watchHandlers = [{ close }, { close }] as unknown as FSWatcher[]; + + await configFileChanged({ config, fuelCore, watchHandlers })('event', 'some/path'); + + // configFileChanged() internals + expect(log).toHaveBeenCalledTimes(1); + expect(close).toHaveBeenCalledTimes(2); + expect(killChildProcess).toHaveBeenCalledTimes(1); + expect(loadConfig).toHaveBeenCalledTimes(1); + + // node() internals + expect(autoStartFuelCore).toHaveBeenCalledTimes(1); + expect(withConfigErrorHandler).toHaveBeenCalledTimes(0); // never error + }); + + test('should collect only non-null config paths', () => { + const config: FuelsConfig = structuredClone(fuelsConfig); + + config.snapshotDir = undefined; + expect(getConfigFilepathsToWatch(config)).toHaveLength(1); + + config.snapshotDir = '/some/path/to/chainConfig.json'; + expect(getConfigFilepathsToWatch(config)).toHaveLength(2); + }); +}); diff --git a/packages/fuels/src/cli/commands/node/index.ts b/packages/fuels/src/cli/commands/node/index.ts new file mode 100644 index 0000000000..8391152bcc --- /dev/null +++ b/packages/fuels/src/cli/commands/node/index.ts @@ -0,0 +1,58 @@ +import { watch, type FSWatcher } from 'chokidar'; + +import { loadConfig } from '../../config/loadConfig'; +import type { FuelsConfig } from '../../types'; +import { error, log } from '../../utils/logger'; +import type { FuelCoreNode } from '../dev/autoStartFuelCore'; +import { autoStartFuelCore } from '../dev/autoStartFuelCore'; +import { withConfigErrorHandler } from '../withConfig'; + +export type NodeState = { + config: FuelsConfig; + watchHandlers: FSWatcher[]; + fuelCore?: FuelCoreNode; +}; + +export const getConfigFilepathsToWatch = (config: FuelsConfig) => { + const configFilePathsToWatch: string[] = [config.configPath]; + if (config.snapshotDir) { + configFilePathsToWatch.push(config.snapshotDir); + } + return configFilePathsToWatch; +}; + +export const closeAllFileHandlers = (handlers: FSWatcher[]) => { + handlers.forEach((h) => h.close()); +}; + +export const configFileChanged = (state: NodeState) => async (_event: string, path: string) => { + log(`\nFile changed: ${path}`); + + closeAllFileHandlers(state.watchHandlers); + state.fuelCore?.killChildProcess(); + + try { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + await node(await loadConfig(state.config.basePath)); + } catch (err: unknown) { + await withConfigErrorHandler(err, state.config); + } +}; + +export const node = async (config: FuelsConfig) => { + const fuelCore = await autoStartFuelCore(config); + + const configFilePaths = getConfigFilepathsToWatch(config); + + try { + const watchHandlers: FSWatcher[] = []; + const options = { persistent: true, ignoreInitial: true, ignored: '**/out/**' }; + const state = { config, watchHandlers, fuelCore }; + + // watch: fuels.config.ts and snapshotDir + watchHandlers.push(watch(configFilePaths, options).on('all', configFileChanged(state))); + } catch (err: unknown) { + error(err); + throw err; + } +}; diff --git a/packages/fuels/src/cli/types.ts b/packages/fuels/src/cli/types.ts index b4c8d007c9..1f4b7b41ef 100644 --- a/packages/fuels/src/cli/types.ts +++ b/packages/fuels/src/cli/types.ts @@ -6,6 +6,7 @@ export enum Commands { dev = 'dev', init = 'init', versions = 'versions', + node = 'node', } export type CommandEvent = @@ -28,6 +29,10 @@ export type CommandEvent = | { type: Commands.versions; data: unknown; + } + | { + type: Commands.node; + data: unknown; }; export type DeployedContract = { From 83bbb7fd57239d031db00fdcdacb17bf70c617e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Torres?= <30977845+Torres-ssf@users.noreply.github.com> Date: Fri, 24 May 2024 09:18:53 -0300 Subject: [PATCH 4/6] chore: use dev-net chain config for local node (#2334) --- .changeset/shiny-camels-know.md | 5 + .fuel-core/configs/chainConfig.json | 154 +++++++++--------- .fuel-core/configs/stateConfig.json | 34 ++-- .../src/guide/contracts/add-transfer.test.ts | 6 +- .../interacting-with-contracts.test.ts | 2 +- .../cookbook/deposit-and-withdraw.test.ts | 4 +- .../cookbook/signing-transactions.test.ts | 2 +- .../predicate-with-configurable.test.ts | 4 +- ...nd-and-spend-funds-from-predicates.test.ts | 8 +- .../src/guide/provider/provider.test.ts | 3 +- .../guide/provider/querying-the-chain.test.ts | 2 +- .../transactions/transaction-policies.test.ts | 5 +- .../src/guide/wallets/signing.test.ts | 4 +- .../src/guide/wallets/test-wallets.test.ts | 2 +- .../guide/wallets/wallet-transferring.test.ts | 4 +- apps/docs-snippets/src/utils.ts | 2 +- .../forc-projects/liquidity-pool/src/main.sw | 8 +- packages/account/src/account.test.ts | 24 +-- .../account/src/providers/provider.test.ts | 15 +- packages/account/test/fixtures/chain.ts | 2 +- .../fuel-gauge/src/advanced-logging.test.ts | 4 +- packages/fuel-gauge/src/contract.test.ts | 20 +-- packages/fuel-gauge/src/doc-examples.test.ts | 2 +- .../src/dry-run-multiple-txs.test.ts | 10 +- .../src/funding-transaction.test.ts | 27 ++- packages/fuel-gauge/src/min-gas.test.ts | 15 +- packages/fuel-gauge/src/policies.test.ts | 10 +- .../src/predicate-conditional-inputs.test.ts | 12 +- .../src/predicate/predicate-arguments.test.ts | 2 +- .../predicate/predicate-configurables.test.ts | 4 +- .../predicate/predicate-estimations.test.ts | 2 +- .../predicate/predicate-input-data.test.ts | 2 +- .../predicate-populate-witness.test.ts | 29 ++-- .../predicate/predicate-with-script.test.ts | 10 +- .../predicate/utils/predicate/setupWallets.ts | 2 +- .../src/reentrant-contract-calls.test.ts | 2 +- .../src/transaction-summary.test.ts | 14 +- packages/fuel-gauge/src/utils.ts | 4 +- .../utils/defaultSnapshots/chainConfig.json | 154 +++++++++--------- .../utils/defaultSnapshots/stateConfig.json | 34 ++-- 40 files changed, 317 insertions(+), 332 deletions(-) create mode 100644 .changeset/shiny-camels-know.md diff --git a/.changeset/shiny-camels-know.md b/.changeset/shiny-camels-know.md new file mode 100644 index 0000000000..1fd37d5d57 --- /dev/null +++ b/.changeset/shiny-camels-know.md @@ -0,0 +1,5 @@ +--- +"@fuel-ts/utils": patch +--- + +chore: use dev-net chain config for local node diff --git a/.fuel-core/configs/chainConfig.json b/.fuel-core/configs/chainConfig.json index 81083c0945..ff86d200f6 100644 --- a/.fuel-core/configs/chainConfig.json +++ b/.fuel-core/configs/chainConfig.json @@ -7,8 +7,8 @@ "max_inputs": 255, "max_outputs": 255, "max_witnesses": 255, - "max_gas_per_tx": 30000000, - "max_size": 112640, + "max_gas_per_tx": 100000000, + "max_size": 262144, "max_bytecode_subsections": 256 } }, @@ -17,7 +17,7 @@ "max_predicate_length": 102400, "max_predicate_data_length": 102400, "max_message_data_length": 102400, - "max_gas_per_predicate": 30000000 + "max_gas_per_predicate": 100000000 } }, "script_params": { @@ -28,7 +28,7 @@ }, "contract_params": { "V1": { - "contract_max_size": 102400, + "contract_max_size": 262144, "max_storage_slots": 1760 } }, @@ -43,53 +43,53 @@ "V1": { "add": 2, "addi": 2, - "aloc": 1, + "aloc": 2, "and": 2, "andi": 2, - "bal": 366, + "bal": 86, "bhei": 2, "bhsh": 2, - "burn": 33949, + "burn": 25770, "cb": 2, "cfei": 2, "cfsi": 2, "div": 2, "divi": 2, - "eck1": 3347, - "ecr1": 46165, - "ed19": 4210, + "eck1": 3114, + "ecr1": 42270, + "ed19": 2878, "eq": 2, "exp": 2, "expi": 2, "flag": 1, "gm": 2, "gt": 2, - "gtf": 16, + "gtf": 12, "ji": 2, "jmp": 2, "jne": 2, "jnei": 2, "jnzi": 2, - "jmpf": 2, - "jmpb": 2, - "jnzf": 2, - "jnzb": 2, - "jnef": 2, - "jneb": 2, + "jmpf": 1, + "jmpb": 1, + "jnzf": 1, + "jnzb": 1, + "jnef": 1, + "jneb": 1, "lb": 2, - "log": 754, + "log": 165, "lt": 2, "lw": 2, - "mint": 35718, + "mint": 29024, "mlog": 2, - "mod": 2, + "mod_op": 2, "modi": 2, - "move": 2, + "move_op": 2, "movi": 2, - "mroo": 5, + "mroo": 4, "mul": 2, "muli": 2, - "mldv": 4, + "mldv": 3, "noop": 1, "not": 2, "or": 2, @@ -98,168 +98,168 @@ "popl": 3, "pshh": 4, "pshl": 4, - "ret_contract": 733, - "rvrt_contract": 722, + "ret": 134, + "rvrt": 153, "sb": 2, "sll": 2, "slli": 2, "srl": 2, "srli": 2, - "srw": 253, + "srw": 209, "sub": 2, "subi": 2, "sw": 2, - "sww": 29053, - "time": 79, - "tr": 46242, - "tro": 33251, - "wdcm": 3, + "sww": 22501, + "time": 50, + "tr": 33912, + "tro": 24294, + "wdcm": 2, "wqcm": 3, "wdop": 3, "wqop": 3, "wdml": 3, "wqml": 4, "wddv": 5, - "wqdv": 7, - "wdmd": 11, - "wqmd": 18, + "wqdv": 6, + "wdmd": 10, + "wqmd": 17, "wdam": 9, - "wqam": 12, - "wdmm": 11, - "wqmm": 11, + "wqam": 11, + "wdmm": 10, + "wqmm": 10, "xor": 2, "xori": 2, "call": { "LightOperation": { - "base": 21687, - "units_per_gas": 4 + "base": 18190, + "units_per_gas": 5 } }, "ccp": { "LightOperation": { - "base": 59, - "units_per_gas": 20 + "base": 48, + "units_per_gas": 22 } }, "croo": { "LightOperation": { - "base": 1, - "units_per_gas": 1 + "base": 131, + "units_per_gas": 2 } }, "csiz": { "LightOperation": { - "base": 59, - "units_per_gas": 195 + "base": 45, + "units_per_gas": 237 } }, "k256": { "LightOperation": { - "base": 282, + "base": 37, "units_per_gas": 3 } }, "ldc": { "LightOperation": { - "base": 45, - "units_per_gas": 65 + "base": 39, + "units_per_gas": 68 } }, "logd": { "LightOperation": { - "base": 1134, + "base": 565, "units_per_gas": 2 } }, "mcl": { "LightOperation": { "base": 3, - "units_per_gas": 523 + "units_per_gas": 564 } }, "mcli": { "LightOperation": { "base": 3, - "units_per_gas": 526 + "units_per_gas": 560 } }, "mcp": { "LightOperation": { - "base": 3, - "units_per_gas": 448 + "base": 4, + "units_per_gas": 185 } }, "mcpi": { "LightOperation": { - "base": 7, - "units_per_gas": 585 + "base": 9, + "units_per_gas": 455 } }, "meq": { "LightOperation": { - "base": 11, - "units_per_gas": 1097 + "base": 3, + "units_per_gas": 766 } }, - "retd_contract": { + "retd": { "LightOperation": { - "base": 1086, - "units_per_gas": 2 + "base": 485, + "units_per_gas": 3 } }, "s256": { "LightOperation": { - "base": 45, + "base": 42, "units_per_gas": 3 } }, "scwq": { "HeavyOperation": { - "base": 30375, - "gas_per_unit": 28628 + "base": 21672, + "gas_per_unit": 22146 } }, "smo": { "LightOperation": { - "base": 64196, + "base": 44437, "units_per_gas": 1 } }, "srwq": { "HeavyOperation": { - "base": 262, - "gas_per_unit": 249 + "base": 239, + "gas_per_unit": 234 } }, "swwq": { "HeavyOperation": { - "base": 28484, - "gas_per_unit": 26613 + "base": 22724, + "gas_per_unit": 21231 } }, "contract_root": { "LightOperation": { - "base": 45, - "units_per_gas": 1 + "base": 42, + "units_per_gas": 2 } }, "state_root": { "HeavyOperation": { - "base": 350, - "gas_per_unit": 176 + "base": 323, + "gas_per_unit": 169 } }, "new_storage_per_byte": 63, "vm_initialization": { - "LightOperation": { - "base": 1645, - "units_per_gas": 14 + "HeavyOperation": { + "base": 5254820, + "gas_per_unit": 0 } } } }, - "base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000", - "block_gas_limit": 30000000, + "base_asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07", + "block_gas_limit": 100000000, "privileged_address": "0000000000000000000000000000000000000000000000000000000000000000" } }, diff --git a/.fuel-core/configs/stateConfig.json b/.fuel-core/configs/stateConfig.json index 647e563991..3decf7905a 100644 --- a/.fuel-core/configs/stateConfig.json +++ b/.fuel-core/configs/stateConfig.json @@ -7,7 +7,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x94ffcc53b892684acefaebc8a3d4a595e528a8cf664eeb3ef36f1020b0809d0d", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x2a757c2317236f7883ac9bbbf7d402f034e0b725c544ef1c8725b1d2bd960f8c690f", @@ -16,7 +16,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x09c0b2d1a486c439a87bcba6b46a7a1a23f3897cc83a94521a96da5c23bc58db", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x634ef6cda00bac63992bbde80c6d694d484d58025a5ca0c9c848f0d35a5a3eee74b2", @@ -43,7 +43,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x5d99ee966b42cd8fc7bdd1364b389153a9e78b42b7d4a691470674e817888d4e", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xc197cb09b1d89a7862b238e9500631bd43f291aadb7ff55c8129335349634e9fde3f", @@ -70,7 +70,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xbdaad6a89e073e177895b3e5a9ccd15806749eda134a6438dae32fc5b6601f3f", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x1b9bdaa290518373eb905e45ce7fcb89acedd24341ca7749ad47a938e4bf3ca9b7ce", @@ -97,7 +97,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x95a7aa6cc32743f8706c40ef49a7423b47da763bb4bbc055b1f07254dc729036", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xf8f00a234cf3fbab86befc3fd9346d7fd1ac085233c9cb58c7447f30c75cbf87ed38", @@ -124,7 +124,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xcee104acd38b940c8f1c62c6d7ea00a0ad2241d6dee0509a4bf27297508870d3", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xfeb4f2388fa22e6613ff85cf4e655f58acdfaa6299eba7f93b812cd1f0d7bbac48f0", @@ -151,7 +151,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x7e3626e306588eba79cafab73f0709e55ab8f4bdfe8c8b75034a430fc56ece89", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x28131b9acc90c2058ee14f4094a474146ba5b779cb9021867164b3d41abad3d047a7", @@ -178,7 +178,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x1c31df52b6df56407dd95f83082e8beb9cfc9532ac111d5bd8491651d95ba775", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x447a7c37aee972dcba72f05255c5145dd63125f0fc46ef98c216f775ee0421e23d2b", @@ -205,7 +205,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x09dd7a49174d6fcc9f4c6f7942c18060a935ddd03ee69b594189b8c3581276ea", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x0a6e3585881ef2edf3f7727762799089dc0b5923e8b3718b49044dd9ddcb33b68459", @@ -232,7 +232,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x86604282dc604481b809845be49667607c470644f6822fc01eb0d22f167e08cf", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xbf2305d284ea95227040df4cc727156cccc2ca6aa3b92ed86fea4db1c37e5905f926", @@ -259,7 +259,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xbca334a06d19db5041c78fe2f465b07be5bec828f38b7796b2877e7d1542c950", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x978d5b6be047ffbf1474dc376a6baa33264629b809e4a8210d11aaa805ec6451585d", @@ -286,7 +286,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xbd9a1dc8d3ec3521c43f6c2c01611b4d0204c7610204ff0178488c8738a30bd2", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xb353fbcd94abba347f3ba25e17744e98da26e608ebccbbbd2e9d004997644bdf993c", @@ -313,7 +313,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xb32197cf75efe05bf453c26178139f09b391582065549c1422bc92555ecffb64", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xa952c0487eefac5dda612011c4c82554c8660834461b9b815c6ae257b56b68005235", @@ -340,7 +340,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x3b24509ed4ab3c7959f5c9391c1445c59290cdb5f13d6f780922f376b7029f30", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x508871600ef68c4f1e021dd0db219c733107151338aa95de530bd10dc61f6a69c144", @@ -367,7 +367,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x77c6f40b7da70d885f68efaad7c661327482a63ea10dcb4271de819438254ae1", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x9ddea761afc31516307e1553647ac6cc26d4a82fed9a9e6a03b994cdbf2293b3e3b6", @@ -394,7 +394,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x6a2c4691c547c43924650dbd30620b184b5fe3fb6dbe5c4446110b08f6f405bf", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x708ee45d18f94ab06458712745c92c7b9b6049ba345219d6697eae5208ec0328aeaf", @@ -421,7 +421,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x49075a7538e2c88ebe1926ce4d898198a2a4e790d14512943a9864bc536b3c82", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xfa82dbdd72252d1e6c76ee818bbac0441c3a705aff447f041c8b9fc3cb03f9ccd7e2", diff --git a/apps/docs-snippets/src/guide/contracts/add-transfer.test.ts b/apps/docs-snippets/src/guide/contracts/add-transfer.test.ts index edbc77cba4..4959bf18da 100644 --- a/apps/docs-snippets/src/guide/contracts/add-transfer.test.ts +++ b/apps/docs-snippets/src/guide/contracts/add-transfer.test.ts @@ -19,9 +19,9 @@ describe(__filename, () => { provider = contract.provider; baseAssetId = provider.getBaseAssetId(); wallet = await getTestWallet([ - [5000, baseAssetId], - [5000, ASSET_A], - [5000, ASSET_B], + [500_000, baseAssetId], + [500_000, ASSET_A], + [500_000, ASSET_B], ]); contract.account = wallet; diff --git a/apps/docs-snippets/src/guide/contracts/interacting-with-contracts.test.ts b/apps/docs-snippets/src/guide/contracts/interacting-with-contracts.test.ts index d413cfe528..d76685a578 100644 --- a/apps/docs-snippets/src/guide/contracts/interacting-with-contracts.test.ts +++ b/apps/docs-snippets/src/guide/contracts/interacting-with-contracts.test.ts @@ -44,7 +44,7 @@ describe(__filename, () => { it('should successfully use "simulate" to validate if wallet can pay for transaction', async () => { const { id: contractId, interface: abi } = counterContract; - const fundedWallet = await getTestWallet([[10_000, baseAssetId]]); + const fundedWallet = await getTestWallet([[200_000, baseAssetId]]); // #region interacting-with-contracts-3 const contract = new Contract(contractId, abi, fundedWallet); diff --git a/apps/docs-snippets/src/guide/cookbook/deposit-and-withdraw.test.ts b/apps/docs-snippets/src/guide/cookbook/deposit-and-withdraw.test.ts index e84275bce6..43a8a4f956 100644 --- a/apps/docs-snippets/src/guide/cookbook/deposit-and-withdraw.test.ts +++ b/apps/docs-snippets/src/guide/cookbook/deposit-and-withdraw.test.ts @@ -25,7 +25,9 @@ describe(__filename, () => { provider = sender.provider; baseAssetId = provider.getBaseAssetId(); const factory = new ContractFactory(binHexlified, abiContents, sender); - liquidityPoolContract = await factory.deployContract(); + liquidityPoolContract = await factory.deployContract({ + configurableConstants: { TOKEN: { bits: baseAssetId } }, + }); }); it('deposit and withdraw cookbook guide', async () => { diff --git a/apps/docs-snippets/src/guide/cookbook/signing-transactions.test.ts b/apps/docs-snippets/src/guide/cookbook/signing-transactions.test.ts index 43ad68fbd8..6b3a7fb68f 100644 --- a/apps/docs-snippets/src/guide/cookbook/signing-transactions.test.ts +++ b/apps/docs-snippets/src/guide/cookbook/signing-transactions.test.ts @@ -80,7 +80,7 @@ describe('Signing transactions', () => { provider, inputData: [signer.address.toB256()], }); - const tx1 = await sender.transfer(predicate.address, 100_000, baseAssetId); + const tx1 = await sender.transfer(predicate.address, 200_000, baseAssetId); await tx1.waitForResult(); // Create the transaction request diff --git a/apps/docs-snippets/src/guide/predicates/predicate-with-configurable.test.ts b/apps/docs-snippets/src/guide/predicates/predicate-with-configurable.test.ts index 61a4844cba..2877984756 100644 --- a/apps/docs-snippets/src/guide/predicates/predicate-with-configurable.test.ts +++ b/apps/docs-snippets/src/guide/predicates/predicate-with-configurable.test.ts @@ -38,7 +38,7 @@ describe(__filename, () => { }); // transferring funds to the predicate - const tx1 = await wallet.transfer(predicate.address, 1000, baseAssetId, { + const tx1 = await wallet.transfer(predicate.address, 200_000, baseAssetId, { gasLimit: 1000, }); @@ -73,7 +73,7 @@ describe(__filename, () => { }); // transferring funds to the predicate - const tx1 = await wallet.transfer(predicate.address, 1000, baseAssetId, { + const tx1 = await wallet.transfer(predicate.address, 200_000, baseAssetId, { gasLimit: 1000, }); diff --git a/apps/docs-snippets/src/guide/predicates/send-and-spend-funds-from-predicates.test.ts b/apps/docs-snippets/src/guide/predicates/send-and-spend-funds-from-predicates.test.ts index 76f9a1eb17..bd0d26c7b0 100644 --- a/apps/docs-snippets/src/guide/predicates/send-and-spend-funds-from-predicates.test.ts +++ b/apps/docs-snippets/src/guide/predicates/send-and-spend-funds-from-predicates.test.ts @@ -30,7 +30,7 @@ describe(__filename, () => { inputData: [inputAddress], }); baseAssetId = provider.getBaseAssetId(); - await seedTestWallet(predicate, [[100_000, baseAssetId]]); + await seedTestWallet(predicate, [[500_000, baseAssetId]]); }); it('should successfully use predicate to spend assets', async () => { @@ -201,7 +201,7 @@ describe(__filename, () => { inputData: [inputAddress], }); - const amountToPredicate = 10_000; + const amountToPredicate = 300_000; const tx = await walletWithFunds.transfer(predicate.address, amountToPredicate, baseAssetId, { gasLimit: 1_000, @@ -213,11 +213,13 @@ describe(__filename, () => { provider, }); + const transferAmount = 1000; + // #region predicates-prestage-transaction // Prepare the transaction const preparedTx = await predicate.createTransfer( receiverWallet.address, - amountToPredicate, + transferAmount, baseAssetId ); diff --git a/apps/docs-snippets/src/guide/provider/provider.test.ts b/apps/docs-snippets/src/guide/provider/provider.test.ts index 6a083c3989..dcb7a9f9f5 100644 --- a/apps/docs-snippets/src/guide/provider/provider.test.ts +++ b/apps/docs-snippets/src/guide/provider/provider.test.ts @@ -2,7 +2,6 @@ import { FUEL_NETWORK_URL, Provider, ScriptTransactionRequest, - ZeroBytes32, sleep, WalletUnlocked, Address, @@ -125,7 +124,7 @@ describe('Provider', () => { transactionRequest.addCoinOutput(recipientAddress, 100, baseAssetId); // #endregion provider-getBaseAssetId - expect(baseAssetId).toBe(ZeroBytes32); + expect(baseAssetId).toBeDefined(); }); it('using operations', async () => { diff --git a/apps/docs-snippets/src/guide/provider/querying-the-chain.test.ts b/apps/docs-snippets/src/guide/provider/querying-the-chain.test.ts index dad14a9f7c..14839c794a 100644 --- a/apps/docs-snippets/src/guide/provider/querying-the-chain.test.ts +++ b/apps/docs-snippets/src/guide/provider/querying-the-chain.test.ts @@ -69,8 +69,8 @@ describe('querying the chain', () => { // #endregion wallet-get-balances expect(walletBalances).toEqual([ - { assetId: baseAssetId, amount: bn(42) }, { assetId: assetIdA, amount: bn(100) }, + { assetId: baseAssetId, amount: bn(42) }, ]); }); it('get spendable resources', async () => { diff --git a/apps/docs-snippets/src/guide/transactions/transaction-policies.test.ts b/apps/docs-snippets/src/guide/transactions/transaction-policies.test.ts index 12b24324bc..ae0b3fa190 100644 --- a/apps/docs-snippets/src/guide/transactions/transaction-policies.test.ts +++ b/apps/docs-snippets/src/guide/transactions/transaction-policies.test.ts @@ -12,7 +12,7 @@ import { getTestWallet } from '../../utils'; */ describe('Transaction Policies', () => { let wallet: WalletUnlocked; - const baseAssetId = '0x'; + let baseAssetId: string; const { abiContents: scriptAbi, binHexlified: scriptBytecode } = getDocsSnippetsForcProject( DocSnippetProjectsEnum.SUM_SCRIPT @@ -20,6 +20,7 @@ describe('Transaction Policies', () => { beforeAll(async () => { wallet = await getTestWallet(); + baseAssetId = wallet.provider.getBaseAssetId(); }); it('sets policies', () => { @@ -62,7 +63,7 @@ describe('Transaction Policies', () => { maturity: 2, tip: bn(3), witnessLimit: 900, - maxFee: bn(10_000), + maxFee: bn(60_000), }); // Set the script main function arguments diff --git a/apps/docs-snippets/src/guide/wallets/signing.test.ts b/apps/docs-snippets/src/guide/wallets/signing.test.ts index 05a4d332bb..41837094ea 100644 --- a/apps/docs-snippets/src/guide/wallets/signing.test.ts +++ b/apps/docs-snippets/src/guide/wallets/signing.test.ts @@ -45,7 +45,7 @@ describe(__filename, () => { it('should sign a transaction using wallet instance [DETAILED]', async () => { const wallet = WalletUnlocked.generate({ provider }); - await seedTestWallet(wallet, [[10_000, baseAssetId]]); + await seedTestWallet(wallet, [[100_000, baseAssetId]]); // #region signing-2 const request = new ScriptTransactionRequest({ @@ -77,7 +77,7 @@ describe(__filename, () => { it('should sign a transaction using wallet instance [SIMPLIFIED]', async () => { const wallet = WalletUnlocked.generate({ provider }); - await seedTestWallet(wallet, [[10_000, baseAssetId]]); + await seedTestWallet(wallet, [[100_000, baseAssetId]]); const request = new ScriptTransactionRequest({ gasLimit: 10000, diff --git a/apps/docs-snippets/src/guide/wallets/test-wallets.test.ts b/apps/docs-snippets/src/guide/wallets/test-wallets.test.ts index b3a83a345c..7a7e99cc8b 100644 --- a/apps/docs-snippets/src/guide/wallets/test-wallets.test.ts +++ b/apps/docs-snippets/src/guide/wallets/test-wallets.test.ts @@ -37,9 +37,9 @@ describe(__filename, () => { expect(walletABalances).toEqual([{ assetId: baseAssetId, amount: bn(42) }]); expect(walletBBalances).toEqual([ - { assetId: baseAssetId, amount: bn(30) }, { assetId: assetIdA, amount: bn(100) }, { assetId: assetIdB, amount: bn(200) }, + { assetId: baseAssetId, amount: bn(30) }, ]); expect(walletCBalances).toEqual([]); // #endregion wallet-setup diff --git a/apps/docs-snippets/src/guide/wallets/wallet-transferring.test.ts b/apps/docs-snippets/src/guide/wallets/wallet-transferring.test.ts index 7f4c838223..2c75bc97ff 100644 --- a/apps/docs-snippets/src/guide/wallets/wallet-transferring.test.ts +++ b/apps/docs-snippets/src/guide/wallets/wallet-transferring.test.ts @@ -19,8 +19,8 @@ describe(__filename, () => { provider = await Provider.create(FUEL_NETWORK_URL); baseAssetId = provider.getBaseAssetId(); const wallet = await generateTestWallet(provider, [ - [200_000, baseAssetId], - [200_000, ASSET_A], + [1_000_000, baseAssetId], + [1_000_000, ASSET_A], ]); contract = await createAndDeployContractFromProject(DocSnippetProjectsEnum.COUNTER); privateKey = wallet.privateKey; diff --git a/apps/docs-snippets/src/utils.ts b/apps/docs-snippets/src/utils.ts index e39a6c52bd..0ec3dec55c 100644 --- a/apps/docs-snippets/src/utils.ts +++ b/apps/docs-snippets/src/utils.ts @@ -29,7 +29,7 @@ export const getTestWallet = async (seedQuantities?: CoinQuantityLike[]) => { const request = new ScriptTransactionRequest(); // add the transaction outputs (coins to be sent to the test wallet) - (seedQuantities || [[1_000_000, baseAssetId]]) + (seedQuantities || [[100_000_000_000, baseAssetId]]) .map(coinQuantityfy) .forEach(({ amount, assetId }) => request.addCoinOutput(testWallet.address, amount, assetId)); diff --git a/apps/docs-snippets/test/fixtures/forc-projects/liquidity-pool/src/main.sw b/apps/docs-snippets/test/fixtures/forc-projects/liquidity-pool/src/main.sw index 2bb61b1f5c..497a0061b9 100644 --- a/apps/docs-snippets/test/fixtures/forc-projects/liquidity-pool/src/main.sw +++ b/apps/docs-snippets/test/fixtures/forc-projects/liquidity-pool/src/main.sw @@ -11,12 +11,14 @@ abi LiquidityPool { fn withdraw(recipient: Address); } -const BASE_TOKEN: AssetId = AssetId::from(0x0000000000000000000000000000000000000000000000000000000000000000); +configurable { + TOKEN: AssetId = AssetId::from(0x0000000000000000000000000000000000000000000000000000000000000000), +} impl LiquidityPool for Contract { #[payable] fn deposit(recipient: Address) { - assert(BASE_TOKEN == msg_asset_id()); + assert(TOKEN == msg_asset_id()); assert(0 < msg_amount()); // Mint two times the amount. @@ -34,7 +36,7 @@ impl LiquidityPool for Contract { let amount_to_transfer = msg_amount() / 2; // Transfer base token to recipient. - transfer(Identity::Address(recipient), BASE_TOKEN, amount_to_transfer); + transfer(Identity::Address(recipient), TOKEN, amount_to_transfer); } } // #endregion deposit-and-withdraw-cookbook-1 diff --git a/packages/account/src/account.test.ts b/packages/account/src/account.test.ts index 8b827b4edf..a77ca0db12 100644 --- a/packages/account/src/account.test.ts +++ b/packages/account/src/account.test.ts @@ -1,5 +1,4 @@ import { Address } from '@fuel-ts/address'; -import { ZeroBytes32 } from '@fuel-ts/address/configs'; import { ErrorCode, FuelError } from '@fuel-ts/errors'; import { expectToThrowFuelError } from '@fuel-ts/errors/test-utils'; import { bn } from '@fuel-ts/math'; @@ -20,13 +19,14 @@ import { Wallet } from './wallet'; */ describe('Account', () => { - const assets = [ASSET_A, ASSET_B, ZeroBytes32]; + const assets = [ASSET_A, ASSET_B]; let provider: Provider; let baseAssetId: string; beforeAll(async () => { provider = await Provider.create(FUEL_NETWORK_URL); baseAssetId = provider.getBaseAssetId(); + assets.push(baseAssetId); }); afterEach(() => { @@ -388,7 +388,7 @@ describe('Account', () => { const senderBalances = await sender.getBalances(); const receiverBalances = await receiver.getBalances(); - const expectedRemaining = 499118; + const expectedRemaining = 442069; expect(senderBalances).toEqual([{ assetId: baseAssetId, amount: bn(expectedRemaining) }]); expect(receiverBalances).toEqual([{ assetId: baseAssetId, amount: bn(1) }]); }); @@ -478,7 +478,7 @@ describe('Account', () => { const senderBalances = await sender.getBalances(); const receiverBalances = await receiver.getBalances(); - const expectedRemaining = 499118; + const expectedRemaining = 442069; expect(senderBalances).toEqual([{ assetId: baseAssetId, amount: bn(expectedRemaining) }]); expect(receiverBalances).toEqual([{ assetId: baseAssetId, amount: bn(1) }]); }); @@ -488,7 +488,7 @@ describe('Account', () => { const receiver = Address.fromRandom(); const gasLimit = 30_000; - const maxFee = 15_000; + const maxFee = 60_000; const request = await sender.createTransfer(receiver, 1, baseAssetId, { gasLimit, @@ -506,7 +506,7 @@ describe('Account', () => { }); it('can transfer with custom TX Params', async () => { - const sender = await generateTestWallet(provider, [[50_000, baseAssetId]]); + const sender = await generateTestWallet(provider, [[200_000, baseAssetId]]); const receiver = Wallet.generate({ provider }); const tx = await sender.transfer(receiver.address, 1, baseAssetId, { @@ -606,7 +606,7 @@ describe('Account', () => { expect(amount.toString()).toEqual(messageOutReceipt.amount.toString()); const senderBalances = await sender.getBalances(); - const expectedRemaining = 498433; + const expectedRemaining = 441598; expect(senderBalances).toEqual([{ assetId: baseAssetId, amount: bn(expectedRemaining) }]); }); @@ -679,7 +679,7 @@ describe('Account', () => { const senderBalances = await sender.getBalances(); - const expectedRemaining = 1498333; + const expectedRemaining = 1441498; expect(senderBalances).toEqual([{ assetId: baseAssetId, amount: bn(expectedRemaining) }]); }); @@ -694,7 +694,7 @@ describe('Account', () => { const amount = 110; const gasLimit = 100_000; - const maxFee = 50_000; + const maxFee = 80_000; const tx = await sender.withdrawToBaseLayer(recipient, amount, { gasLimit, maxFee }); const { transaction } = await tx.wait(); @@ -707,15 +707,15 @@ describe('Account', () => { }); it('should ensure gas price and gas limit are validated when transfering amounts', async () => { - const sender = await generateTestWallet(provider, [[1000, baseAssetId]]); + const sender = await generateTestWallet(provider, [[100_000, baseAssetId]]); const receiver = Wallet.generate({ provider }); await expect(async () => { const result = await sender.transfer(receiver.address, 1, baseAssetId, { - gasLimit: 1, + gasLimit: 0, }); await result.wait(); - }).rejects.toThrowError(/Gas limit '1' is lower than the required: ./); + }).rejects.toThrowError(/Gas limit '0' is lower than the required: ./); }); it('should ensure gas limit and price are validated when withdraw an amount of base asset', async () => { diff --git a/packages/account/src/providers/provider.test.ts b/packages/account/src/providers/provider.test.ts index f49cb9781a..f25f424076 100644 --- a/packages/account/src/providers/provider.test.ts +++ b/packages/account/src/providers/provider.test.ts @@ -76,14 +76,14 @@ describe('Provider', () => { owner: baseAssetId, assetId: baseAssetId, txPointer: '0x00000000000000000000000000000000', - amount: 1000, + amount: 500_000, witnessIndex: 0, }, ]; const transactionRequest = new ScriptTransactionRequest({ tip: 0, - gasLimit: 500, - maxFee: 1000, + gasLimit: 100_000, + maxFee: 120_000, script: /* Opcode::ADDI(0x10, REG_ZERO, 0xCA) @@ -97,11 +97,6 @@ describe('Provider', () => { witnesses: ['0x'], }); - const { maxFee, gasUsed } = await provider.getTransactionCost(transactionRequest); - - transactionRequest.maxFee = maxFee; - transactionRequest.gasLimit = gasUsed; - const callResult = await provider.call(transactionRequest); const expectedReceipts: Receipt[] = [ @@ -125,7 +120,7 @@ describe('Provider', () => { { type: ReceiptType.ScriptResult, result: bn(0), - gasUsed: bn(0x5d3), + gasUsed: bn(170), }, ]; @@ -229,7 +224,7 @@ describe('Provider', () => { const provider = await Provider.create(FUEL_NETWORK_URL); const baseAssetId = provider.getBaseAssetId(); - expect(baseAssetId).toBe('0x0000000000000000000000000000000000000000000000000000000000000000'); + expect(baseAssetId).toBeDefined(); }); it('can change the provider url of the current instance', async () => { diff --git a/packages/account/test/fixtures/chain.ts b/packages/account/test/fixtures/chain.ts index ad56724774..9eee0d862b 100644 --- a/packages/account/test/fixtures/chain.ts +++ b/packages/account/test/fixtures/chain.ts @@ -19,7 +19,7 @@ export const MOCK_CHAIN: GqlChainInfoFragment = { maxInputs: '255', maxOutputs: '255', maxWitnesses: '255', - maxGasPerTx: '500000000', + maxGasPerTx: '5000000000', maxSize: '17825792', maxBytecodeSubsections: '255', }, diff --git a/packages/fuel-gauge/src/advanced-logging.test.ts b/packages/fuel-gauge/src/advanced-logging.test.ts index 5982cd00e8..cab2a8490a 100644 --- a/packages/fuel-gauge/src/advanced-logging.test.ts +++ b/packages/fuel-gauge/src/advanced-logging.test.ts @@ -150,7 +150,7 @@ describe('Advanced Logging', () => { ]; beforeAll(async () => { - wallet = await generateTestWallet(provider, [[100_000, baseAssetId]]); + wallet = await generateTestWallet(provider, [[500_000, baseAssetId]]); }); it('when using InvacationScope', async () => { @@ -233,7 +233,7 @@ describe('Advanced Logging', () => { ]; beforeAll(async () => { - wallet = await generateTestWallet(provider, [[100_000, baseAssetId]]); + wallet = await generateTestWallet(provider, [[300_000, baseAssetId]]); }); it('when using InvocationScope', async () => { diff --git a/packages/fuel-gauge/src/contract.test.ts b/packages/fuel-gauge/src/contract.test.ts index 231c4fdf3e..d4dfc09da7 100644 --- a/packages/fuel-gauge/src/contract.test.ts +++ b/packages/fuel-gauge/src/contract.test.ts @@ -845,7 +845,7 @@ describe('Contract', () => { const amountToContract = 5_000; const gasLimit = 80_000; - const maxFee = 40_000; + const maxFee = 70_000; const tx = await wallet.transferToContract(contract.id, amountToContract, baseAssetId, { gasLimit, @@ -951,7 +951,7 @@ describe('Contract', () => { FuelGaugeProjectsEnum.CALL_TEST_CONTRACT ); - const wallet = await generateTestWallet(provider, [[100_000, baseAssetId]]); + const wallet = await generateTestWallet(provider, [[300_000, baseAssetId]]); const factory = new ContractFactory(binHexlified, abiContents, wallet); @@ -980,9 +980,9 @@ describe('Contract', () => { ); const wallet = await generateTestWallet(provider, [ - [50_000, baseAssetId], - [50_000, ASSET_A], - [50_000, ASSET_B], + [300_000, baseAssetId], + [300_000, ASSET_A], + [300_000, ASSET_B], ]); const factory = new ContractFactory(binHexlified, abiContents, wallet); @@ -1020,9 +1020,9 @@ describe('Contract', () => { ); const wallet = await generateTestWallet(provider, [ - [50_000, baseAssetId], - [50_000, ASSET_A], - [50_000, ASSET_B], + [300_000, baseAssetId], + [300_000, ASSET_A], + [300_000, ASSET_B], ]); const factory = new ContractFactory(binHexlified, abiContents, wallet); @@ -1151,7 +1151,7 @@ describe('Contract', () => { FuelGaugeProjectsEnum.STORAGE_TEST_CONTRACT ); - const wallet = await generateTestWallet(provider, [[50_000, baseAssetId]]); + const wallet = await generateTestWallet(provider, [[200_000, baseAssetId]]); const factory = new ContractFactory(binHexlified, abiContents, wallet); @@ -1181,7 +1181,7 @@ describe('Contract', () => { FuelGaugeProjectsEnum.STORAGE_TEST_CONTRACT ); - const wallet = await generateTestWallet(provider, [[150_000, baseAssetId]]); + const wallet = await generateTestWallet(provider, [[350_000, baseAssetId]]); const factory = new ContractFactory(binHexlified, abiContents, wallet); const storageContract = await factory.deployContract(); diff --git a/packages/fuel-gauge/src/doc-examples.test.ts b/packages/fuel-gauge/src/doc-examples.test.ts index 4c4fbbfc68..8349290309 100644 --- a/packages/fuel-gauge/src/doc-examples.test.ts +++ b/packages/fuel-gauge/src/doc-examples.test.ts @@ -231,9 +231,9 @@ describe('Doc Examples', () => { // validate balances expect(walletABalances).toEqual([{ assetId: baseAssetId, amount: bn(42) }]); expect(walletBBalances).toEqual([ - { assetId: baseAssetId, amount: bn(30) }, { assetId: assetIdA, amount: bn(100) }, { assetId: assetIdB, amount: bn(200) }, + { assetId: baseAssetId, amount: bn(30) }, ]); expect(walletCBalances).toEqual([]); }); diff --git a/packages/fuel-gauge/src/dry-run-multiple-txs.test.ts b/packages/fuel-gauge/src/dry-run-multiple-txs.test.ts index 977de15a5f..4a691576bf 100644 --- a/packages/fuel-gauge/src/dry-run-multiple-txs.test.ts +++ b/packages/fuel-gauge/src/dry-run-multiple-txs.test.ts @@ -48,24 +48,24 @@ describe('dry-run-multiple-txs', () => { const revertFactory = new ContractFactory(binRevert, abiRevert, wallet); const revertContract = await revertFactory.deployContract({ - maxFee: 15000, + maxFee: 70_000, }); const multiTokenFactory = new ContractFactory(binMultiToken, abiMultiToken, wallet); const multiTokenContract = await multiTokenFactory.deployContract({ - maxFee: 15000, + maxFee: 70_000, }); const logFactory = new ContractFactory(binLog, abiLog, wallet); const logContract = await logFactory.deployContract({ - maxFee: 15000, + maxFee: 70_000, }); const logOtherFactory = new ContractFactory(binLogOther, abiLogOther, wallet); const logOtherContract = await logOtherFactory.deployContract({ - maxFee: 15000, + maxFee: 70_000, }); return { revertContract, multiTokenContract, logContract, logOtherContract }; @@ -75,7 +75,7 @@ describe('dry-run-multiple-txs', () => { const revertFactory = new ContractFactory(binRevert, abiRevert, wallet); const revertContract = await revertFactory.deployContract({ - maxFee: 15000, + maxFee: 70_000, }); const resources = await wallet.getResourcesToSpend([[500_000, baseAssetId]]); diff --git a/packages/fuel-gauge/src/funding-transaction.test.ts b/packages/fuel-gauge/src/funding-transaction.test.ts index b920fe7937..d702b750df 100644 --- a/packages/fuel-gauge/src/funding-transaction.test.ts +++ b/packages/fuel-gauge/src/funding-transaction.test.ts @@ -19,7 +19,7 @@ describe(__filename, () => { provider = await Provider.create(FUEL_NETWORK_URL); baseAssetId = provider.getBaseAssetId(); mainWallet = Wallet.generate({ provider }); - await seedTestWallet(mainWallet, [[500_000, baseAssetId]]); + await seedTestWallet(mainWallet, [[200_000_000, baseAssetId]]); }); const fundingTxWithMultipleUTXOs = async ({ @@ -58,7 +58,7 @@ describe(__filename, () => { // 1500 splitted in 5 = 5 UTXOs of 300 each await fundingTxWithMultipleUTXOs({ account: sender, - totalAmount: 10_000, + totalAmount: 400_000, splitIn: 5, }); @@ -98,16 +98,16 @@ describe(__filename, () => { // 2000 splitted in 2 = 2 UTXOs of 1000 each await fundingTxWithMultipleUTXOs({ account: sender, - totalAmount: 2000, + totalAmount: 400_000, splitIn: 2, }); - // sender has 2 UTXOs for 1000 each, so it has enough resources to spend 1000 of baseAssetId + // sender has 2 UTXOs for 200_000 each, so it has enough resources to spend 1000 of baseAssetId const enoughtResources = await sender.getResourcesToSpend([[100, baseAssetId]]); // confirm we only fetched 1 UTXO from the expected amount expect(enoughtResources.length).toBe(1); - expect(enoughtResources[0].amount.toNumber()).toBe(1000); + expect(enoughtResources[0].amount.toNumber()).toBe(200_000); const request = new ScriptTransactionRequest({ gasLimit: 1_000, @@ -122,8 +122,8 @@ describe(__filename, () => { // TX request already carries enough resources, it does not need to be funded expect(request.inputs.length).toBe(1); - expect(bn((request.inputs[0]).amount).toNumber()).toBe(1000); - expect(txCost.maxFee.lt(1000)).toBeTruthy(); + expect(bn((request.inputs[0]).amount).toNumber()).toBe(200_000); + expect(txCost.maxFee.lt(200_000)).toBeTruthy(); const getResourcesToSpendSpy = vi.spyOn(sender, 'getResourcesToSpend'); @@ -148,10 +148,9 @@ describe(__filename, () => { const sender = Wallet.generate({ provider }); const receiver = Wallet.generate({ provider }); - // 5000 splitted in 10 = 10 UTXOs of 500 each await fundingTxWithMultipleUTXOs({ account: sender, - totalAmount: 10_000, + totalAmount: 200_000, splitIn: 1, }); @@ -243,8 +242,8 @@ describe(__filename, () => { const wallet2 = Wallet.generate({ provider }); // Define funding requirements and allocations - const totalInBaseAsset = 15_000; - const totalInAssetA = 20_000; + const totalInBaseAsset = 200_000; + const totalInAssetA = 50_000; const partiallyInAssetA = totalInAssetA / 2; /** @@ -314,9 +313,9 @@ describe(__filename, () => { // Funding the wallet with sufficient amounts for base and additional assets await seedTestWallet(fundedWallet, [ - [15_000, baseAssetId], - [15_000, assetA], - [15_000, assetB], + [300_000, baseAssetId], + [80_000, assetA], + [80_000, assetB], ]); let transactionRequest = new ScriptTransactionRequest(); diff --git a/packages/fuel-gauge/src/min-gas.test.ts b/packages/fuel-gauge/src/min-gas.test.ts index aaccb3bfc2..3896123799 100644 --- a/packages/fuel-gauge/src/min-gas.test.ts +++ b/packages/fuel-gauge/src/min-gas.test.ts @@ -29,10 +29,7 @@ describe(__filename, () => { }); it('sets gas requirements (contract)', async () => { - const wallet = Wallet.fromPrivateKey( - '0x0f44a619bf8c19f3eb903be38d1d26d36d08a10341e1a4282ffa87214da0cea8', - provider - ); + const wallet = Wallet.generate({ provider }); await seedTestWallet(wallet, [[500_000, baseAssetId]]); /** @@ -72,10 +69,7 @@ describe(__filename, () => { }); it('sets gas requirements (script)', async () => { - const sender = Wallet.fromPrivateKey( - '0x0f44a619bf8c19f3eb903be38d1d26d36d08a10341e1a4282ffa87214da0cea8', - provider - ); + const sender = Wallet.generate({ provider }); await seedTestWallet(sender, [[500_000, baseAssetId]]); /** @@ -160,10 +154,7 @@ describe(__filename, () => { /** * Setup account */ - const wallet = Wallet.fromPrivateKey( - '0x0f44a619bf8c19f3eb903be38d1d26d36d08a10341e1a4282ffa87214da0cea8', - provider - ); + const wallet = Wallet.generate({ provider }); await seedTestWallet(wallet, [[500_000, baseAssetId]]); /** diff --git a/packages/fuel-gauge/src/policies.test.ts b/packages/fuel-gauge/src/policies.test.ts index ceea2e6717..1bdf44bec1 100644 --- a/packages/fuel-gauge/src/policies.test.ts +++ b/packages/fuel-gauge/src/policies.test.ts @@ -171,7 +171,7 @@ describe('Policies', () => { tip: 11, witnessLimit: 2000, maturity: await randomMaturity(), - maxFee: 5000, + maxFee: 70_000, }; const { transactionRequest: txRequest } = factory.createTransactionRequest(txParams); @@ -207,7 +207,7 @@ describe('Policies', () => { tip: 5, maturity: await randomMaturity(), witnessLimit: randomNumber(800, 900), - maxFee: 3000, + maxFee: 70_000, }); const txRequest = await callScope.getTransactionRequest(); @@ -237,7 +237,7 @@ describe('Policies', () => { tip: 2, maturity: await randomMaturity(), witnessLimit: randomNumber(800, 900), - maxFee: 3000, + maxFee: 70_000, }); const txRequest = await callScope.getTransactionRequest(); @@ -259,7 +259,7 @@ describe('Policies', () => { tip: 4, maturity: await randomMaturity(), witnessLimit: randomNumber(800, 900), - maxFee: 3000, + maxFee: 70_000, }; const pendingTx = await wallet.transfer(receiver.address, 500, baseAssetId, txParams); @@ -287,7 +287,7 @@ describe('Policies', () => { tip: 1, maturity: await randomMaturity(), witnessLimit: randomNumber(800, 900), - maxFee: 3000, + maxFee: 70_000, }; const pendingTx = await wallet.transferToContract(contract.id, 500, baseAssetId, txParams); diff --git a/packages/fuel-gauge/src/predicate-conditional-inputs.test.ts b/packages/fuel-gauge/src/predicate-conditional-inputs.test.ts index 73b4fd108e..0ea0510b70 100644 --- a/packages/fuel-gauge/src/predicate-conditional-inputs.test.ts +++ b/packages/fuel-gauge/src/predicate-conditional-inputs.test.ts @@ -29,8 +29,8 @@ describe('PredicateConditionalInputs', () => { const amountToTransfer = 1000; const adminWallet = await generateTestWallet(provider, [ - [500_000, baseAssetId], - [500_000, ASSET_A], + [800_000, baseAssetId], + [800_000, ASSET_A], ]); const predicate = new Predicate({ @@ -41,12 +41,12 @@ describe('PredicateConditionalInputs', () => { }); // transfer asset A to predicate so it can transfer to alice - const tx1 = await adminWallet.transfer(predicate.address, 10_000, ASSET_A); + const tx1 = await adminWallet.transfer(predicate.address, 200_000, ASSET_A); await tx1.waitForResult(); // transfer base asset to Alice so she can pay the fees - const tx2 = await adminWallet.transfer(aliceWallet.address, 2105, baseAssetId); + const tx2 = await adminWallet.transfer(aliceWallet.address, 200_000, baseAssetId); await tx2.waitForResult(); @@ -119,12 +119,12 @@ describe('PredicateConditionalInputs', () => { }); // transfer asset A to predicate so it can transfer to alice - const tx1 = await adminWallet.transfer(predicate.address, 10_000, ASSET_A); + const tx1 = await adminWallet.transfer(predicate.address, 200_000, ASSET_A); await tx1.waitForResult(); // transfer base asset to predicate so it can pay the fees - const tx2 = await adminWallet.transfer(predicate.address, 10_000, baseAssetId); + const tx2 = await adminWallet.transfer(predicate.address, 200_000, baseAssetId); await tx2.waitForResult(); diff --git a/packages/fuel-gauge/src/predicate/predicate-arguments.test.ts b/packages/fuel-gauge/src/predicate/predicate-arguments.test.ts index fc37b8c602..b7dbf67154 100644 --- a/packages/fuel-gauge/src/predicate/predicate-arguments.test.ts +++ b/packages/fuel-gauge/src/predicate/predicate-arguments.test.ts @@ -31,7 +31,7 @@ describe('Predicate', () => { let provider: Provider; let baseAssetId: string; const amountToReceiver = 50; - const amountToPredicate = 4000; + const amountToPredicate = 300_000; beforeAll(async () => { provider = await Provider.create(FUEL_NETWORK_URL); diff --git a/packages/fuel-gauge/src/predicate/predicate-configurables.test.ts b/packages/fuel-gauge/src/predicate/predicate-configurables.test.ts index 9e0cfbeaa0..9b20a5fb78 100644 --- a/packages/fuel-gauge/src/predicate/predicate-configurables.test.ts +++ b/packages/fuel-gauge/src/predicate/predicate-configurables.test.ts @@ -18,7 +18,7 @@ describe('Predicate', () => { describe('Configurables', () => { let wallet: WalletUnlocked; - const amountToPredicate = 2000; + const amountToPredicate = 300_000; let baseAssetId: string; const defaultValues = { @@ -32,7 +32,7 @@ describe('Predicate', () => { const quantities: CoinQuantityLike[] = [ { - amount: 1_000_000, + amount: 100_000_000, assetId: baseAssetId, }, ]; diff --git a/packages/fuel-gauge/src/predicate/predicate-estimations.test.ts b/packages/fuel-gauge/src/predicate/predicate-estimations.test.ts index 759d9632a8..1198941607 100644 --- a/packages/fuel-gauge/src/predicate/predicate-estimations.test.ts +++ b/packages/fuel-gauge/src/predicate/predicate-estimations.test.ts @@ -173,7 +173,7 @@ describe('Predicate', () => { FuelGaugeProjectsEnum.PREDICATE_VALIDATE_TRANSFER ); - const amountToPredicate = 10_000; + const amountToPredicate = 200_000; const predicate = new Predicate<[BN]>({ bytecode: binHexlified, diff --git a/packages/fuel-gauge/src/predicate/predicate-input-data.test.ts b/packages/fuel-gauge/src/predicate/predicate-input-data.test.ts index 041539144f..13318c277a 100644 --- a/packages/fuel-gauge/src/predicate/predicate-input-data.test.ts +++ b/packages/fuel-gauge/src/predicate/predicate-input-data.test.ts @@ -27,7 +27,7 @@ describe('Predicate', () => { }); it('throws invalid transaction when input_predicate_data is required for predicate validation', async () => { - const amountToPredicate = 1000; + const amountToPredicate = 200_000; const amountToReceiver = 50; predicate = new Predicate({ bytecode: binHexlified, diff --git a/packages/fuel-gauge/src/predicate/predicate-populate-witness.test.ts b/packages/fuel-gauge/src/predicate/predicate-populate-witness.test.ts index 38695c2ff3..134f485199 100644 --- a/packages/fuel-gauge/src/predicate/predicate-populate-witness.test.ts +++ b/packages/fuel-gauge/src/predicate/predicate-populate-witness.test.ts @@ -77,13 +77,13 @@ describe('Predicate', () => { await seedTestWallet( [wallet1, wallet2, wallet3, predicate1, predicate2], - [[120_000, baseAssetId]], + [[500_000_000, baseAssetId]], UTXOS_AMOUNT ); }); it('should properly populate predicate data and remove placeholder witness [CASE 1]', async () => { - let transactionRequest = new ScriptTransactionRequest({ gasLimit: 2000, maxFee: bn(0) }); + let transactionRequest = new ScriptTransactionRequest(); transactionRequest.addCoinOutput(receiver.address, 100, baseAssetId); const predicate1WrongResources = await provider.getResourcesToSpend( @@ -103,10 +103,8 @@ describe('Predicate', () => { // The predicate resource witness placeholder was removed expect(transactionRequest.witnesses.length).toBe(0); - const { gasLimit, maxFee } = await provider.estimateTxGasAndFee({ transactionRequest }); - - transactionRequest.gasLimit = gasLimit; - transactionRequest.maxFee = maxFee; + transactionRequest.gasLimit = bn(100_000); + transactionRequest.maxFee = bn(120_000); const tx = await provider.sendTransaction(transactionRequest); @@ -137,11 +135,8 @@ describe('Predicate', () => { transactionRequest = predicate1.populateTransactionPredicateData(transactionRequest); transactionRequest = await provider.estimatePredicates(transactionRequest); - const { gasLimit, maxFee } = await provider.estimateTxGasAndFee({ transactionRequest }); - - transactionRequest.gasLimit = gasLimit; - transactionRequest.maxFee = maxFee; - + transactionRequest.gasLimit = bn(100_000); + transactionRequest.maxFee = bn(120_000); // The predicate resource witness placeholder was removed expect(transactionRequest.witnesses.length).toBe(1); @@ -185,10 +180,8 @@ describe('Predicate', () => { transactionRequest = predicate1.populateTransactionPredicateData(transactionRequest); transactionRequest = await provider.estimatePredicates(transactionRequest); - const { gasLimit, maxFee } = await provider.estimateTxGasAndFee({ transactionRequest }); - - transactionRequest.gasLimit = gasLimit; - transactionRequest.maxFee = maxFee; + transactionRequest.gasLimit = bn(160_000); + transactionRequest.maxFee = bn(180_000); // The predicate resource witness placeholder was removed expect(transactionRequest.witnesses.length).toBe(2); @@ -248,10 +241,8 @@ describe('Predicate', () => { transactionRequest = predicate2.populateTransactionPredicateData(transactionRequest); transactionRequest = await provider.estimatePredicates(transactionRequest); - const { gasLimit, maxFee } = await provider.estimateTxGasAndFee({ transactionRequest }); - - transactionRequest.gasLimit = gasLimit; - transactionRequest.maxFee = maxFee; + transactionRequest.gasLimit = bn(250_000); + transactionRequest.maxFee = bn(270_000); // The predicate resource witness placeholder was removed expect(transactionRequest.witnesses.length).toBe(3); diff --git a/packages/fuel-gauge/src/predicate/predicate-with-script.test.ts b/packages/fuel-gauge/src/predicate/predicate-with-script.test.ts index 0840fcc357..2038a63bc7 100644 --- a/packages/fuel-gauge/src/predicate/predicate-with-script.test.ts +++ b/packages/fuel-gauge/src/predicate/predicate-with-script.test.ts @@ -1,12 +1,10 @@ -import { generateTestWallet } from '@fuel-ts/account/test-utils'; +import { generateTestWallet, seedTestWallet } from '@fuel-ts/account/test-utils'; import type { BigNumberish, WalletUnlocked } from 'fuels'; import { toNumber, Script, Provider, Predicate, FUEL_NETWORK_URL } from 'fuels'; import { FuelGaugeProjectsEnum, getFuelGaugeForcProject } from '../../test/fixtures'; import type { Validation } from '../types/predicate'; -import { fundPredicate } from './utils/predicate'; - /** * @group node */ @@ -48,8 +46,8 @@ describe('Predicate', () => { ); // setup predicate - const amountToPredicate = 10_000; - const amountToReceiver = 2000; + const amountToPredicate = 900_000; + const amountToReceiver = 100_000; const predicate = new Predicate<[Validation]>({ bytecode: predicateBytesStruct, provider, @@ -62,7 +60,7 @@ describe('Predicate', () => { ], }); - await fundPredicate(wallet, predicate, amountToPredicate); + await seedTestWallet(predicate, [[amountToPredicate, baseAssetId]], 3); // executing predicate to transfer resources to receiver const tx = await predicate.transfer(receiver.address, amountToReceiver, baseAssetId, { diff --git a/packages/fuel-gauge/src/predicate/utils/predicate/setupWallets.ts b/packages/fuel-gauge/src/predicate/utils/predicate/setupWallets.ts index 6a1fd2098b..79961b7c77 100644 --- a/packages/fuel-gauge/src/predicate/utils/predicate/setupWallets.ts +++ b/packages/fuel-gauge/src/predicate/utils/predicate/setupWallets.ts @@ -5,7 +5,7 @@ import { Address, FUEL_NETWORK_URL, Provider } from 'fuels'; export const setupWallets = async () => { const provider = await Provider.create(FUEL_NETWORK_URL); const baseAssetId = provider.getBaseAssetId(); - const wallet = await generateTestWallet(provider, [[5_000_000, baseAssetId]]); + const wallet = await generateTestWallet(provider, [[100_000_000_000, baseAssetId]]); const receiver = Wallet.fromAddress(Address.fromRandom(), provider); return [wallet, receiver] as const; }; diff --git a/packages/fuel-gauge/src/reentrant-contract-calls.test.ts b/packages/fuel-gauge/src/reentrant-contract-calls.test.ts index afa6a277b0..9665fd8df1 100644 --- a/packages/fuel-gauge/src/reentrant-contract-calls.test.ts +++ b/packages/fuel-gauge/src/reentrant-contract-calls.test.ts @@ -20,7 +20,7 @@ describe('Reentrant Contract Calls', () => { beforeAll(async () => { const provider = await Provider.create(FUEL_NETWORK_URL); baseAssetId = provider.getBaseAssetId(); - wallet = await generateTestWallet(provider, [[200_000, baseAssetId]]); + wallet = await generateTestWallet(provider, [[500_000, baseAssetId]]); const factoryBar = new ContractFactory(bar.binHexlified, bar.abiContents, wallet); barContract = await factoryBar.deployContract(); diff --git a/packages/fuel-gauge/src/transaction-summary.test.ts b/packages/fuel-gauge/src/transaction-summary.test.ts index 1b0e4c2cf4..4ca4af7b3a 100644 --- a/packages/fuel-gauge/src/transaction-summary.test.ts +++ b/packages/fuel-gauge/src/transaction-summary.test.ts @@ -202,7 +202,7 @@ describe('TransactionSummary', () => { }; it('should ensure transfer operation is assembled (ACCOUNT TRANSFER)', async () => { - const wallet = await generateTestWallet(provider, [[50_000, baseAssetId]]); + const wallet = await generateTestWallet(provider, [[300_000, baseAssetId]]); const recipient = Wallet.generate({ provider }); @@ -227,7 +227,7 @@ describe('TransactionSummary', () => { it('should ensure transfer operation is assembled (ACCOUNT TRANSFER TO CONTRACT)', async () => { const wallet = await generateTestWallet(provider, [ - [50_000, baseAssetId], + [300_000, baseAssetId], [10_000, ASSET_A], ]); @@ -251,7 +251,7 @@ describe('TransactionSummary', () => { }); it('should ensure transfer operation is assembled (CONTRACT TRANSFER TO ACCOUNT)', async () => { - const wallet = await generateTestWallet(provider, [[50_000, baseAssetId]]); + const wallet = await generateTestWallet(provider, [[300_000, baseAssetId]]); const contract = await setupContract(); contract.account = wallet; @@ -282,7 +282,7 @@ describe('TransactionSummary', () => { it('should ensure transfer operations are assembled (CONTRACT TRANSFER TO ACCOUNTS)', async () => { const wallet = await generateTestWallet(provider, [ - [50_000, baseAssetId], + [300_000, baseAssetId], [50_000, ASSET_A], [50_000, ASSET_B], ]); @@ -342,7 +342,7 @@ describe('TransactionSummary', () => { }); it('should ensure transfer operation is assembled (CONTRACT TRANSFER TO CONTRACT)', async () => { - const wallet = await generateTestWallet(provider, [[50_000, baseAssetId]]); + const wallet = await generateTestWallet(provider, [[300_000, baseAssetId]]); const contractSender = await setupContract({ cache: false }); contractSender.account = wallet; @@ -376,7 +376,7 @@ describe('TransactionSummary', () => { it('should ensure transfer operations are assembled (CONTRACT TRANSFER TO CONTRACTS)', async () => { const wallet = await generateTestWallet(provider, [ - [60_000, baseAssetId], + [300_000, baseAssetId], [60_000, ASSET_A], [60_000, ASSET_B], ]); @@ -440,7 +440,7 @@ describe('TransactionSummary', () => { it('should ensure transfer operations are assembled (CUSTOM SCRIPT TRANSFER)', async () => { const wallet = await generateTestWallet(provider, [ - [50_000, baseAssetId], + [200_000, baseAssetId], [10_000, ASSET_A], [10_000, ASSET_B], ]); diff --git a/packages/fuel-gauge/src/utils.ts b/packages/fuel-gauge/src/utils.ts index 855cbaf6d4..ecf09da712 100644 --- a/packages/fuel-gauge/src/utils.ts +++ b/packages/fuel-gauge/src/utils.ts @@ -26,8 +26,8 @@ export const createWallet = async () => { const provider = await Provider.create(FUEL_NETWORK_URL); const baseAssetId = provider.getBaseAssetId(); walletInstance = await generateTestWallet(provider, [ - [5_000_000, baseAssetId], - [5_000_000, ASSET_A], + [500_000_000, baseAssetId], + [500_000_000, ASSET_A], ]); return walletInstance; }; diff --git a/packages/utils/src/utils/defaultSnapshots/chainConfig.json b/packages/utils/src/utils/defaultSnapshots/chainConfig.json index 81083c0945..ff86d200f6 100644 --- a/packages/utils/src/utils/defaultSnapshots/chainConfig.json +++ b/packages/utils/src/utils/defaultSnapshots/chainConfig.json @@ -7,8 +7,8 @@ "max_inputs": 255, "max_outputs": 255, "max_witnesses": 255, - "max_gas_per_tx": 30000000, - "max_size": 112640, + "max_gas_per_tx": 100000000, + "max_size": 262144, "max_bytecode_subsections": 256 } }, @@ -17,7 +17,7 @@ "max_predicate_length": 102400, "max_predicate_data_length": 102400, "max_message_data_length": 102400, - "max_gas_per_predicate": 30000000 + "max_gas_per_predicate": 100000000 } }, "script_params": { @@ -28,7 +28,7 @@ }, "contract_params": { "V1": { - "contract_max_size": 102400, + "contract_max_size": 262144, "max_storage_slots": 1760 } }, @@ -43,53 +43,53 @@ "V1": { "add": 2, "addi": 2, - "aloc": 1, + "aloc": 2, "and": 2, "andi": 2, - "bal": 366, + "bal": 86, "bhei": 2, "bhsh": 2, - "burn": 33949, + "burn": 25770, "cb": 2, "cfei": 2, "cfsi": 2, "div": 2, "divi": 2, - "eck1": 3347, - "ecr1": 46165, - "ed19": 4210, + "eck1": 3114, + "ecr1": 42270, + "ed19": 2878, "eq": 2, "exp": 2, "expi": 2, "flag": 1, "gm": 2, "gt": 2, - "gtf": 16, + "gtf": 12, "ji": 2, "jmp": 2, "jne": 2, "jnei": 2, "jnzi": 2, - "jmpf": 2, - "jmpb": 2, - "jnzf": 2, - "jnzb": 2, - "jnef": 2, - "jneb": 2, + "jmpf": 1, + "jmpb": 1, + "jnzf": 1, + "jnzb": 1, + "jnef": 1, + "jneb": 1, "lb": 2, - "log": 754, + "log": 165, "lt": 2, "lw": 2, - "mint": 35718, + "mint": 29024, "mlog": 2, - "mod": 2, + "mod_op": 2, "modi": 2, - "move": 2, + "move_op": 2, "movi": 2, - "mroo": 5, + "mroo": 4, "mul": 2, "muli": 2, - "mldv": 4, + "mldv": 3, "noop": 1, "not": 2, "or": 2, @@ -98,168 +98,168 @@ "popl": 3, "pshh": 4, "pshl": 4, - "ret_contract": 733, - "rvrt_contract": 722, + "ret": 134, + "rvrt": 153, "sb": 2, "sll": 2, "slli": 2, "srl": 2, "srli": 2, - "srw": 253, + "srw": 209, "sub": 2, "subi": 2, "sw": 2, - "sww": 29053, - "time": 79, - "tr": 46242, - "tro": 33251, - "wdcm": 3, + "sww": 22501, + "time": 50, + "tr": 33912, + "tro": 24294, + "wdcm": 2, "wqcm": 3, "wdop": 3, "wqop": 3, "wdml": 3, "wqml": 4, "wddv": 5, - "wqdv": 7, - "wdmd": 11, - "wqmd": 18, + "wqdv": 6, + "wdmd": 10, + "wqmd": 17, "wdam": 9, - "wqam": 12, - "wdmm": 11, - "wqmm": 11, + "wqam": 11, + "wdmm": 10, + "wqmm": 10, "xor": 2, "xori": 2, "call": { "LightOperation": { - "base": 21687, - "units_per_gas": 4 + "base": 18190, + "units_per_gas": 5 } }, "ccp": { "LightOperation": { - "base": 59, - "units_per_gas": 20 + "base": 48, + "units_per_gas": 22 } }, "croo": { "LightOperation": { - "base": 1, - "units_per_gas": 1 + "base": 131, + "units_per_gas": 2 } }, "csiz": { "LightOperation": { - "base": 59, - "units_per_gas": 195 + "base": 45, + "units_per_gas": 237 } }, "k256": { "LightOperation": { - "base": 282, + "base": 37, "units_per_gas": 3 } }, "ldc": { "LightOperation": { - "base": 45, - "units_per_gas": 65 + "base": 39, + "units_per_gas": 68 } }, "logd": { "LightOperation": { - "base": 1134, + "base": 565, "units_per_gas": 2 } }, "mcl": { "LightOperation": { "base": 3, - "units_per_gas": 523 + "units_per_gas": 564 } }, "mcli": { "LightOperation": { "base": 3, - "units_per_gas": 526 + "units_per_gas": 560 } }, "mcp": { "LightOperation": { - "base": 3, - "units_per_gas": 448 + "base": 4, + "units_per_gas": 185 } }, "mcpi": { "LightOperation": { - "base": 7, - "units_per_gas": 585 + "base": 9, + "units_per_gas": 455 } }, "meq": { "LightOperation": { - "base": 11, - "units_per_gas": 1097 + "base": 3, + "units_per_gas": 766 } }, - "retd_contract": { + "retd": { "LightOperation": { - "base": 1086, - "units_per_gas": 2 + "base": 485, + "units_per_gas": 3 } }, "s256": { "LightOperation": { - "base": 45, + "base": 42, "units_per_gas": 3 } }, "scwq": { "HeavyOperation": { - "base": 30375, - "gas_per_unit": 28628 + "base": 21672, + "gas_per_unit": 22146 } }, "smo": { "LightOperation": { - "base": 64196, + "base": 44437, "units_per_gas": 1 } }, "srwq": { "HeavyOperation": { - "base": 262, - "gas_per_unit": 249 + "base": 239, + "gas_per_unit": 234 } }, "swwq": { "HeavyOperation": { - "base": 28484, - "gas_per_unit": 26613 + "base": 22724, + "gas_per_unit": 21231 } }, "contract_root": { "LightOperation": { - "base": 45, - "units_per_gas": 1 + "base": 42, + "units_per_gas": 2 } }, "state_root": { "HeavyOperation": { - "base": 350, - "gas_per_unit": 176 + "base": 323, + "gas_per_unit": 169 } }, "new_storage_per_byte": 63, "vm_initialization": { - "LightOperation": { - "base": 1645, - "units_per_gas": 14 + "HeavyOperation": { + "base": 5254820, + "gas_per_unit": 0 } } } }, - "base_asset_id": "0000000000000000000000000000000000000000000000000000000000000000", - "block_gas_limit": 30000000, + "base_asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07", + "block_gas_limit": 100000000, "privileged_address": "0000000000000000000000000000000000000000000000000000000000000000" } }, diff --git a/packages/utils/src/utils/defaultSnapshots/stateConfig.json b/packages/utils/src/utils/defaultSnapshots/stateConfig.json index 647e563991..3decf7905a 100644 --- a/packages/utils/src/utils/defaultSnapshots/stateConfig.json +++ b/packages/utils/src/utils/defaultSnapshots/stateConfig.json @@ -7,7 +7,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x94ffcc53b892684acefaebc8a3d4a595e528a8cf664eeb3ef36f1020b0809d0d", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x2a757c2317236f7883ac9bbbf7d402f034e0b725c544ef1c8725b1d2bd960f8c690f", @@ -16,7 +16,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x09c0b2d1a486c439a87bcba6b46a7a1a23f3897cc83a94521a96da5c23bc58db", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x634ef6cda00bac63992bbde80c6d694d484d58025a5ca0c9c848f0d35a5a3eee74b2", @@ -43,7 +43,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x5d99ee966b42cd8fc7bdd1364b389153a9e78b42b7d4a691470674e817888d4e", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xc197cb09b1d89a7862b238e9500631bd43f291aadb7ff55c8129335349634e9fde3f", @@ -70,7 +70,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xbdaad6a89e073e177895b3e5a9ccd15806749eda134a6438dae32fc5b6601f3f", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x1b9bdaa290518373eb905e45ce7fcb89acedd24341ca7749ad47a938e4bf3ca9b7ce", @@ -97,7 +97,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x95a7aa6cc32743f8706c40ef49a7423b47da763bb4bbc055b1f07254dc729036", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xf8f00a234cf3fbab86befc3fd9346d7fd1ac085233c9cb58c7447f30c75cbf87ed38", @@ -124,7 +124,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xcee104acd38b940c8f1c62c6d7ea00a0ad2241d6dee0509a4bf27297508870d3", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xfeb4f2388fa22e6613ff85cf4e655f58acdfaa6299eba7f93b812cd1f0d7bbac48f0", @@ -151,7 +151,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x7e3626e306588eba79cafab73f0709e55ab8f4bdfe8c8b75034a430fc56ece89", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x28131b9acc90c2058ee14f4094a474146ba5b779cb9021867164b3d41abad3d047a7", @@ -178,7 +178,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x1c31df52b6df56407dd95f83082e8beb9cfc9532ac111d5bd8491651d95ba775", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x447a7c37aee972dcba72f05255c5145dd63125f0fc46ef98c216f775ee0421e23d2b", @@ -205,7 +205,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x09dd7a49174d6fcc9f4c6f7942c18060a935ddd03ee69b594189b8c3581276ea", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x0a6e3585881ef2edf3f7727762799089dc0b5923e8b3718b49044dd9ddcb33b68459", @@ -232,7 +232,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x86604282dc604481b809845be49667607c470644f6822fc01eb0d22f167e08cf", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xbf2305d284ea95227040df4cc727156cccc2ca6aa3b92ed86fea4db1c37e5905f926", @@ -259,7 +259,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xbca334a06d19db5041c78fe2f465b07be5bec828f38b7796b2877e7d1542c950", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x978d5b6be047ffbf1474dc376a6baa33264629b809e4a8210d11aaa805ec6451585d", @@ -286,7 +286,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xbd9a1dc8d3ec3521c43f6c2c01611b4d0204c7610204ff0178488c8738a30bd2", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xb353fbcd94abba347f3ba25e17744e98da26e608ebccbbbd2e9d004997644bdf993c", @@ -313,7 +313,7 @@ "tx_pointer_tx_idx": 0, "owner": "0xb32197cf75efe05bf453c26178139f09b391582065549c1422bc92555ecffb64", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xa952c0487eefac5dda612011c4c82554c8660834461b9b815c6ae257b56b68005235", @@ -340,7 +340,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x3b24509ed4ab3c7959f5c9391c1445c59290cdb5f13d6f780922f376b7029f30", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x508871600ef68c4f1e021dd0db219c733107151338aa95de530bd10dc61f6a69c144", @@ -367,7 +367,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x77c6f40b7da70d885f68efaad7c661327482a63ea10dcb4271de819438254ae1", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x9ddea761afc31516307e1553647ac6cc26d4a82fed9a9e6a03b994cdbf2293b3e3b6", @@ -394,7 +394,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x6a2c4691c547c43924650dbd30620b184b5fe3fb6dbe5c4446110b08f6f405bf", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0x708ee45d18f94ab06458712745c92c7b9b6049ba345219d6697eae5208ec0328aeaf", @@ -421,7 +421,7 @@ "tx_pointer_tx_idx": 0, "owner": "0x49075a7538e2c88ebe1926ce4d898198a2a4e790d14512943a9864bc536b3c82", "amount": 18446744073709551615, - "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + "asset_id": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07" }, { "tx_id": "0xfa82dbdd72252d1e6c76ee818bbac0441c3a705aff447f041c8b9fc3cb03f9ccd7e2", From 66a1375e9773b24897fcbe162bf810e990c922b7 Mon Sep 17 00:00:00 2001 From: Peter Smith Date: Fri, 24 May 2024 14:16:37 +0100 Subject: [PATCH 5/6] ci: added missing coverage for browser tests (#2374) * ci: added missing coverage for browser tests * chore: changeset * chore: rebuild * ci: use correct action version --------- Co-authored-by: Daniel Bate --- .changeset/young-rockets-count.md | 2 ++ .github/workflows/test.yaml | 6 ++++++ 2 files changed, 8 insertions(+) create mode 100644 .changeset/young-rockets-count.md diff --git a/.changeset/young-rockets-count.md b/.changeset/young-rockets-count.md new file mode 100644 index 0000000000..a845151cc8 --- /dev/null +++ b/.changeset/young-rockets-count.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 742b47ea8b..db26ad596c 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -92,6 +92,12 @@ jobs: name: node path: coverage/environments + - name: Download Coverage Artifact for Browser Tests + uses: actions/download-artifact@v4 + with: + name: browser + path: coverage/environments + - name: Generate Coverage run: pnpm test:coverage-merge From 3b27bac26463b39b8201db96147ec4ef091d3de0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Torres?= <30977845+Torres-ssf@users.noreply.github.com> Date: Fri, 24 May 2024 14:41:39 -0300 Subject: [PATCH 6/6] fix: add `predicateData` to predicate resources and inputs (#2380) --- .changeset/giant-jobs-buy.md | 5 ++ packages/account/src/predicate/predicate.ts | 1 + .../transaction-request.ts | 38 ++++++------- .../src/predicate/predicate-arguments.test.ts | 25 ++++----- .../predicate/predicate-estimations.test.ts | 54 ++++++++++++++++++- 5 files changed, 88 insertions(+), 35 deletions(-) create mode 100644 .changeset/giant-jobs-buy.md diff --git a/.changeset/giant-jobs-buy.md b/.changeset/giant-jobs-buy.md new file mode 100644 index 0000000000..59825139fb --- /dev/null +++ b/.changeset/giant-jobs-buy.md @@ -0,0 +1,5 @@ +--- +"@fuel-ts/account": patch +--- + +fix: add `predicateData` to predicate resources and inputs diff --git a/packages/account/src/predicate/predicate.ts b/packages/account/src/predicate/predicate.ts index c16d07f3f9..d367e6bde4 100644 --- a/packages/account/src/predicate/predicate.ts +++ b/packages/account/src/predicate/predicate.ts @@ -192,6 +192,7 @@ export class Predicate extends Account { return resources.map((resource) => ({ ...resource, predicate: hexlify(this.bytes), + predicateData: hexlify(this.getPredicateData()), })); } diff --git a/packages/account/src/providers/transaction-request/transaction-request.ts b/packages/account/src/providers/transaction-request/transaction-request.ts index 135c6db764..b3a894f7ef 100644 --- a/packages/account/src/providers/transaction-request/transaction-request.ts +++ b/packages/account/src/providers/transaction-request/transaction-request.ts @@ -27,7 +27,11 @@ import { normalizeJSON } from '../utils'; import { getMaxGas, getMinGas } from '../utils/gas'; import { NoWitnessAtIndexError } from './errors'; -import { isRequestInputResource } from './helpers'; +import { + getRequestInputResourceOwner, + isRequestInputResource, + isRequestInputResourceFromOwner, +} from './helpers'; import type { TransactionRequestInput, CoinTransactionRequestInput, @@ -348,7 +352,7 @@ export abstract class BaseTransactionRequest implements BaseTransactionRequestLi * @param coin - Coin resource. */ addCoinInput(coin: Coin) { - const { assetId, owner, amount, id, predicate } = coin; + const { assetId, owner, amount, id, predicate, predicateData } = coin; let witnessIndex; @@ -372,6 +376,7 @@ export abstract class BaseTransactionRequest implements BaseTransactionRequestLi txPointer: '0x00000000000000000000000000000000', witnessIndex, predicate, + predicateData, }; // Insert the Input @@ -388,7 +393,7 @@ export abstract class BaseTransactionRequest implements BaseTransactionRequestLi * @param message - Message resource. */ addMessageInput(message: MessageCoin) { - const { recipient, sender, amount, predicate, nonce, assetId } = message; + const { recipient, sender, amount, predicate, nonce, assetId, predicateData } = message; let witnessIndex; @@ -411,6 +416,7 @@ export abstract class BaseTransactionRequest implements BaseTransactionRequestLi amount, witnessIndex, predicate, + predicateData, }; // Insert the Input @@ -660,29 +666,19 @@ export abstract class BaseTransactionRequest implements BaseTransactionRequestLi } updatePredicateGasUsed(inputs: TransactionRequestInput[]) { - this.inputs.forEach((i) => { - let correspondingInput: TransactionRequestInput | undefined; - switch (i.type) { - case InputType.Coin: - correspondingInput = inputs.find((x) => x.type === InputType.Coin && x.owner === i.owner); - break; - case InputType.Message: - correspondingInput = inputs.find( - (x) => x.type === InputType.Message && x.sender === i.sender - ); - break; - default: - return; - } + const inputsToExtractGasUsed = inputs.filter(isRequestInputResource); + + this.inputs.filter(isRequestInputResource).forEach((i) => { + const owner = getRequestInputResourceOwner(i); + const correspondingInput = inputsToExtractGasUsed.find((x) => + isRequestInputResourceFromOwner(x, Address.fromString(String(owner))) + ); + if ( correspondingInput && 'predicateGasUsed' in correspondingInput && bn(correspondingInput.predicateGasUsed).gt(0) ) { - // eslint-disable-next-line no-param-reassign - i.predicate = correspondingInput.predicate; - // eslint-disable-next-line no-param-reassign - i.predicateData = correspondingInput.predicateData; // eslint-disable-next-line no-param-reassign i.predicateGasUsed = correspondingInput.predicateGasUsed; } diff --git a/packages/fuel-gauge/src/predicate/predicate-arguments.test.ts b/packages/fuel-gauge/src/predicate/predicate-arguments.test.ts index b7dbf67154..e56df365c6 100644 --- a/packages/fuel-gauge/src/predicate/predicate-arguments.test.ts +++ b/packages/fuel-gauge/src/predicate/predicate-arguments.test.ts @@ -1,10 +1,11 @@ +import { seedTestWallet } from '@fuel-ts/account/test-utils'; import type { WalletLocked, WalletUnlocked, BigNumberish } from 'fuels'; import { Provider, FUEL_NETWORK_URL, toHex, Predicate } from 'fuels'; import { FuelGaugeProjectsEnum, getFuelGaugeForcProject } from '../../test/fixtures'; import type { Validation } from '../types/predicate'; -import { setupWallets, assertBalances, fundPredicate } from './utils/predicate'; +import { setupWallets, assertBalances } from './utils/predicate'; /** * @group node @@ -31,7 +32,7 @@ describe('Predicate', () => { let provider: Provider; let baseAssetId: string; const amountToReceiver = 50; - const amountToPredicate = 300_000; + const amountToPredicate = 900_000; beforeAll(async () => { provider = await Provider.create(FUEL_NETWORK_URL); @@ -51,7 +52,7 @@ describe('Predicate', () => { inputData: ['0xef86afa9696cf0dc6385e2c407a6e159a1103cefb7e2ae0636fb33d3cb2a9e4a'], }); - await fundPredicate(wallet, predicate, amountToPredicate); + await seedTestWallet(predicate, [[amountToPredicate, baseAssetId]], 3); const initialReceiverBalance = await receiver.getBalance(); const tx = await predicate.transfer(receiver.address, amountToReceiver, baseAssetId, { @@ -70,7 +71,7 @@ describe('Predicate', () => { provider, inputData: ['0xbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbada'], }); - await fundPredicate(wallet, predicate, amountToPredicate); + await seedTestWallet(predicate, [[amountToPredicate, baseAssetId]], 3); const initialReceiverBalance = await receiver.getBalance(); expect(initialReceiverBalance.toHex()).toEqual(toHex(0)); @@ -88,7 +89,7 @@ describe('Predicate', () => { inputData: [1078], }); - await fundPredicate(wallet, predicate, amountToPredicate); + await seedTestWallet(predicate, [[amountToPredicate, baseAssetId]], 3); const initialReceiverBalance = await receiver.getBalance(); const tx = await predicate.transfer(receiver.address, amountToReceiver, baseAssetId, { @@ -108,7 +109,7 @@ describe('Predicate', () => { inputData: [100], }); - await fundPredicate(wallet, predicate, amountToPredicate); + await seedTestWallet(predicate, [[amountToPredicate, baseAssetId]], 3); const initialReceiverBalance = await receiver.getBalance(); expect(initialReceiverBalance.toHex()).toEqual(toHex(0)); @@ -127,7 +128,7 @@ describe('Predicate', () => { provider, inputData: [{ has_account: true, total_complete: 100 }], }); - await fundPredicate(wallet, predicateInstanceForBalance, amountToPredicate); + await seedTestWallet(predicateInstanceForBalance, [[amountToPredicate, baseAssetId]], 3); const initialReceiverBalance = await receiver.getBalance(); // #region predicate-struct-arg @@ -160,7 +161,7 @@ describe('Predicate', () => { ], }); - await fundPredicate(wallet, predicate, amountToPredicate); + await seedTestWallet(predicate, [[amountToPredicate, baseAssetId]], 3); await expect( predicate.transfer(receiver.address, 50, baseAssetId, { gasLimit: 1000 }) @@ -175,7 +176,7 @@ describe('Predicate', () => { inputData: [[42]], }); - await fundPredicate(wallet, predicate, amountToPredicate); + await seedTestWallet(predicate, [[amountToPredicate, baseAssetId]], 3); const initialReceiverBalance = await receiver.getBalance(); const tx = await predicate.transfer(receiver.address, amountToReceiver, baseAssetId, { @@ -195,7 +196,7 @@ describe('Predicate', () => { inputData: [20, 30], }); - await fundPredicate(wallet, predicateForBalance, amountToPredicate); + await seedTestWallet(predicateForBalance, [[amountToPredicate, baseAssetId]], 3); const initialReceiverBalance = await receiver.getBalance(); // #region predicate-multi-args @@ -223,7 +224,7 @@ describe('Predicate', () => { inputData: [20, 30], }); - await fundPredicate(wallet, predicate, amountToPredicate); + await seedTestWallet(predicate, [[amountToPredicate, baseAssetId]], 3); const initialReceiverBalance = await receiver.getBalance(); const tx = await predicate.transfer(receiver.address, amountToReceiver, baseAssetId, { @@ -243,7 +244,7 @@ describe('Predicate', () => { inputData: [20, 20], }); - await fundPredicate(wallet, predicate, amountToPredicate); + await seedTestWallet(predicate, [[amountToPredicate, baseAssetId]], 3); await expect( predicate.transfer(receiver.address, 50, baseAssetId, { gasLimit: 1000 }) diff --git a/packages/fuel-gauge/src/predicate/predicate-estimations.test.ts b/packages/fuel-gauge/src/predicate/predicate-estimations.test.ts index 1198941607..a98dbad006 100644 --- a/packages/fuel-gauge/src/predicate/predicate-estimations.test.ts +++ b/packages/fuel-gauge/src/predicate/predicate-estimations.test.ts @@ -14,6 +14,7 @@ import { FUEL_NETWORK_URL, getRandomB256, WalletUnlocked, + isRequestInputResource, } from 'fuels'; import { FuelGaugeProjectsEnum, getFuelGaugeForcProject } from '../../test/fixtures'; @@ -35,8 +36,9 @@ describe('Predicate', () => { let predicateTrue: Predicate<[]>; let predicateStruct: Predicate<[Validation]>; let baseAssetId: string; + const fundingAmount = 10_000; - beforeEach(async () => { + beforeAll(async () => { provider = await Provider.create(FUEL_NETWORK_URL); baseAssetId = provider.getBaseAssetId(); predicateTrue = new Predicate({ @@ -48,10 +50,13 @@ describe('Predicate', () => { abi: predicateAbiMainArgsStruct, provider, }); + }); + + beforeEach(async () => { await seedTestWallet(predicateStruct, [ { assetId: baseAssetId, - amount: bn(10_000), + amount: bn(fundingAmount), }, ]); }); @@ -204,5 +209,50 @@ describe('Predicate', () => { expect(estimatePredicatesSpy).toHaveBeenCalledTimes(1); expect(dryRunSpy).toHaveBeenCalledOnce(); }); + + describe('predicate resource fetching and predicateData population', () => { + test('getting predicate resources via the predicate automatically populates predicateData', async () => { + const transactionRequest = new ScriptTransactionRequest(); + + const resources = await predicateStruct.getResourcesToSpend([[fundingAmount, baseAssetId]]); + resources.forEach((resource) => { + expect(resource.predicateData).toBeDefined(); + }); + + transactionRequest.addResources(resources); + const inputs = transactionRequest.inputs.filter(isRequestInputResource); + + expect(inputs.length).toBeGreaterThan(0); + inputs.forEach((resource) => { + expect(resource.predicateData).toBeDefined(); + }); + }); + + test('getting predicate resources via the provider requires manual predicateData population', async () => { + const transactionRequest = new ScriptTransactionRequest(); + + const resources = await provider.getResourcesToSpend(predicateStruct.address, [ + [fundingAmount, baseAssetId], + ]); + + resources.forEach((resource) => { + expect(resource.predicateData).toBeUndefined(); + }); + + transactionRequest.addResources(resources); + const inputs = transactionRequest.inputs.filter(isRequestInputResource); + + expect(inputs.length).toBeGreaterThan(0); + inputs.forEach((resource) => { + expect(resource.predicateData).toBeUndefined(); + }); + + predicateStruct.populateTransactionPredicateData(transactionRequest); + + inputs.forEach((resource) => { + expect(resource.predicateData).toBeDefined(); + }); + }); + }); }); });