{"record":{"id":"4c3b177a21fe863c","repo":"FuelLabs/fuels-ts","slug":"configurable-not-found","errorCode":"CONFIGURABLE_NOT_FOUND","errorMessage":"A configurable with the '${name}' was not found in the ABI.","messagePattern":"A configurable with the '(.+?)' was not found in the ABI\\.","errorType":"error_code","errorClass":"FuelError","httpStatus":null,"severity":"error","filePath":"packages/abi-coder/src/Interface.ts","lineNumber":80,"sourceCode":"\n  decodeLog(data: BytesLike, logId: string): any {\n    const loggedType = this.jsonAbiOld.loggedTypes.find((type) => type.logId === logId);\n    if (!loggedType) {\n      throw new FuelError(\n        ErrorCode.LOG_TYPE_NOT_FOUND,\n        `Log type with logId '${logId}' doesn't exist in the ABI.`\n      );\n    }\n\n    return AbiCoder.decode(this.jsonAbiOld, loggedType.loggedType, arrayify(data), 0, {\n      encoding: this.encoding,\n    });\n  }\n\n  encodeConfigurable(name: string, value: InputValue) {\n    const configurable = this.jsonAbiOld.configurables.find((c) => c.name === name);\n    if (!configurable) {\n      throw new FuelError(\n        ErrorCode.CONFIGURABLE_NOT_FOUND,\n        `A configurable with the '${name}' was not found in the ABI.`\n      );\n    }\n\n    return AbiCoder.encode(this.jsonAbiOld, configurable.configurableType, value, {\n      encoding: this.encoding,\n    });\n  }\n\n  encodeType(concreteTypeId: string, value: InputValue): Uint8Array {\n    const typeArg = parseConcreteType(\n      this.jsonAbi,\n      this.jsonAbiOld.types,\n      concreteTypeId,\n      ''\n    ) as JsonAbiArgument;\n    return AbiCoder.encode(this.jsonAbiOld, typeArg, value, {","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/FuelLabs/fuels-ts/blob/b3f37c91aca4aa9d5e4c0d3967f66237190826ea/packages/abi-coder/src/Interface.ts#L62-L98","documentation":"Thrown by `Interface.encodeConfigurable` (code `CONFIGURABLE_NOT_FOUND`) when the ABI's `configurables` array has no entry with the requested `name`. Configurables are Sway contract constants whose value can be set at deploy time; the encoder needs the declared type to encode the supplied value.","triggerScenarios":"Calling `contract.setConfigurable('wrongName', value)`; accessing a configurable that was renamed or removed in a newer Sway contract; typo in the configurable name.","commonSituations":"Regenerated ABI after a configurable rename and call sites not updated; deploying a different contract version than the one the client code targets; case/format mismatch in the name string.","solutions":["Enumerate valid names with `interface.jsonAbiOld.configurables.map(c => c.name)` and use an exact match.","Regenerate types and use the generated configurable accessor instead of a string name.","Confirm the contract source (`configurables.rs` / `Configurable` block) actually declares the configurable you reference."],"exampleFix":"// before\ncontract.setConfigurable('MinAmount', 100);\n// after — match the Sway configurable name exactly\ncontract.setConfigurable('MIN_AMOUNT', 100);","handlingStrategy":"validation","validationCode":"const known = iface.jsonAbiOld.configurables.some((c) => c.name === name);\nif (!known) throw new Error(`Unknown configurable: ${name}`);","typeGuard":"function hasConfigurable(iface, name) {\n  return iface.jsonAbiOld.configurables.some((c) => c.name === name);\n}","tryCatchPattern":"try {\n  contract.setConfigurable(name, value);\n} catch (e) {\n  if (e.code === 'CONFIGURABLE_NOT_FOUND') {\n    console.error('Valid configurables:', iface.jsonAbiOld.configurables.map(c => c.name));\n  }\n  throw e;\n}","preventionTips":["Use generated configurable accessors instead of raw string names.","Regenerate bindings after renames in the Sway `Configurable` block.","Match the case of the Sway-declared configurable name exactly."],"tags":["abi-coder","configurables","abi-mismatch","deployment"],"backgroundTag":null,"analyzedSha":"b3f37c91aca4aa9d5e4c0d3967f66237190826ea","analyzedAt":"2026-08-12T20:30:56.448Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}