{"version":3,"sources":["../src/calldata/evm.ts","../src/calldata/index.ts","../src/protocol/latticeConstants.ts","../src/constants.ts","../src/api/state.ts","../src/api/utilities.ts","../src/util.ts","../src/shared/validators.ts","../src/shared/functions.ts","../src/bitcoin.ts","../src/ethereum.ts","../src/types/sign.ts","../src/genericSigning.ts","../src/schemas/transaction.ts","../src/shared/errors.ts","../src/shared/utilities.ts","../src/shared/predicates.ts","../src/protocol/secureMessages.ts","../src/functions/addKvRecords.ts","../src/functions/connect.ts","../src/functions/fetchEncData.ts","../src/functions/fetchActiveWallet.ts","../src/functions/getAddresses.ts","../src/functions/getKvRecords.ts","../src/functions/pair.ts","../src/functions/removeKvRecords.ts","../src/functions/sign.ts","../src/client.ts","../src/api/addresses.ts","../src/api/addressTags.ts","../src/api/signing.ts","../src/functions/fetchDecoder.ts","../src/api/wallets.ts","../src/api/setup.ts"],"sourcesContent":["import { Hash } from 'ox';\nimport { decodeAbiParameters, parseAbiParameters } from 'viem';\n/**\n * Look through an ABI definition to see if there is a function that matches the signature provided.\n * @param sig    a 0x-prefixed hex string containing 4 bytes of info\n * @param abi    a Solidity JSON ABI structure ([external link](https://docs.ethers.io/v5/api/utils/abi/formats/#abi-formats--solidity))\n * @returns      Buffer containing RLP-serialized array of calldata info to pass to signing request\n * @public\n */\nexport const parseSolidityJSONABI = function (\n  sig: string,\n  abi: any[],\n): { def: EVMDef } {\n  sig = coerceSig(sig);\n  // Find the first match in the ABI\n  const match = abi\n    .filter((item) => item.type === 'function')\n    .find((item) => {\n      const def = parseDef(item);\n      const funcSig = getFuncSig(def.canonicalName);\n      return funcSig === sig;\n    });\n  if (match) {\n    const def = parseDef(match).def;\n    return { def };\n  }\n  throw new Error('Unable to find matching function in ABI');\n};\n\n/**\n * Convert a canonical name into an ABI definition that can be included with calldata to a general\n * \"2\", \"2.1\", \"3\")\n * @param sig    a 0x-prefixed hex string containing 4 bytes of info\n * @param name   canonical name of the function\n * @returns      Buffer containing RLP-serialized array of calldata info to pass to signing request\n * @public\n */\nexport const parseCanonicalName = function (sig: string, name: string) {\n  sig = coerceSig(sig);\n  if (sig !== getFuncSig(name)) {\n    throw new Error('Name does not match provided sig.');\n  }\n  const def = [];\n  // Get the function name\n  const paramStart = name.indexOf('(');\n  if (paramStart < 0) {\n    throw new Error(BAD_CANONICAL_ERR);\n  }\n  def.push(name.slice(0, paramStart));\n  name = name.slice(paramStart + 1);\n  let paramDef = [];\n  while (name.length > 1) {\n    // scan until the terminating ')'\n    const typeStr = popTypeStrFromCanonical(name);\n    paramDef = paramDef.concat(parseTypeStr(typeStr));\n    name = name.slice(typeStr.length + 1);\n  }\n  const parsedParamDef = parseParamDef(paramDef);\n  return def.concat(parsedParamDef);\n};\n\n/**\n * Pull out nested calldata which may correspond to nested ABI definitions.\n * This is relevant for e.g. `multicall` patterns.\n * A def may be nested if the underlying type is `bytes` or `bytes[]` and\n * the calldata parm is of size (4 + 32*n).\n * @param def - calldata decoder data for a def\n * @param calldata - Buffer containing full calldata payload\n * @return -  Array of calldata params, or null values. If the return\n *            item has data (0x-prefixed hex string), it should be\n *            checked as a possible nested def\n */\nexport const getNestedCalldata = function (def, calldata) {\n  const possibleNestedDefs = [];\n  // Skip past first item, which is the function name\n  const defParams = def.slice(1);\n  const strParams = getParamStrNames(defParams);\n  const hexStr = ('0x' + calldata.slice(4).toString('hex')) as `0x${string}`;\n  // Convert strParams to viem's format\n  const viemParams = strParams.map((type) => {\n    // Convert tuple format from 'tuple(uint256,uint128)' to '(uint256,uint128)'\n    if (type.startsWith('tuple(')) {\n      return type.replace('tuple', '');\n    }\n    return type;\n  });\n\n  const abiParams = parseAbiParameters(viemParams.join(','));\n  const decoded = decodeAbiParameters(abiParams, hexStr);\n\n  function couldBeNestedDef(x) {\n    return (x.length - 4) % 32 === 0;\n  }\n  decoded.forEach((paramData, i) => {\n    if (isBytesType(defParams[i])) {\n      let nestedDefIsPossible = true;\n      if (isBytesArrItem(defParams[i])) {\n        // `bytes[]` type. Decode all underlying `bytes` items and\n        // do size checks on those.\n        // NOTE: We only do this for `bytes[]` but could, in the future,\n        // extend to more complex array structures if we see nested defs\n        // in this pattern. However, we have only ever seen `bytes[]`, which\n        // is typically used in `multicall` patterns\n        // Ensure paramData is an array for bytes[] type\n        if (Array.isArray(paramData)) {\n          paramData.forEach((nestedParamDatum) => {\n            // Ensure nestedParamDatum is a hex string\n            if (\n              typeof nestedParamDatum !== 'string' ||\n              !nestedParamDatum.startsWith('0x')\n            ) {\n              nestedDefIsPossible = false;\n              return;\n            }\n            const nestedParamDatumBuf = Buffer.from(\n              nestedParamDatum.slice(2),\n              'hex',\n            );\n            if (!couldBeNestedDef(nestedParamDatumBuf)) {\n              nestedDefIsPossible = false;\n            }\n          });\n        } else {\n          nestedDefIsPossible = false;\n        }\n      } else if (isBytesItem(defParams[i])) {\n        // Regular `bytes` type - perform size check\n        if (\n          typeof paramData !== 'string' ||\n          !(paramData as string).startsWith('0x')\n        ) {\n          nestedDefIsPossible = false;\n        } else {\n          const data = paramData as string;\n          const paramDataBuf = Buffer.from(data.slice(2), 'hex');\n          nestedDefIsPossible = couldBeNestedDef(paramDataBuf);\n        }\n      } else {\n        // Unknown `bytes` item type\n        nestedDefIsPossible = false;\n      }\n      // If the data could contain a nested def (determined based on\n      // data size of the item), add the paramData to the return array.\n      possibleNestedDefs.push(nestedDefIsPossible ? paramData : null);\n    } else {\n      // No nested defs for non-bytes types\n      possibleNestedDefs.push(null);\n    }\n  });\n  return possibleNestedDefs;\n};\n\n/**\n * If applicable, update decoder data to represent nested\n * definitions, which are used in e.g. multicall patterns.\n * This will update `def` in place and return it with any\n * additional info necessary.\n * @param def - Decoder data for a specific calldata function (def)\n * @param nestedDefs - Array containing a possible set of nested\n *                     defs which must be added to `def`\n * @return - Possibly modified version of `def`\n */\nexport const replaceNestedDefs = function (def, nestedDefs) {\n  for (let i = 0; i < nestedDefs.length; i++) {\n    const isArrItem = isBytesArrItem(def[1 + i]);\n    const isItem = isBytesItem(def[1 + i]);\n    if (nestedDefs[i] !== null && (isArrItem || isItem)) {\n      // Update the def item type to indicate it will hold\n      // one or more nested definitions\n      def[1 + i][1] = EVM_TYPES.indexOf('nestedDef');\n      // Add nested def(s) in in an array. If this is an array\n      // item it means the nestedDefs should already be in an\n      // array. Otherwise we need to wrap the single nested\n      // def in an array to keep the data type consistent.\n      const defs = isArrItem ? nestedDefs[i] : [nestedDefs[i]];\n      def[1 + i] = def[1 + i].concat([defs]);\n    }\n  }\n  return def;\n};\n\n/**\n * Convert a canonical name to a function selector (a.k.a. \"sig\")\n * @internal\n */\nfunction getFuncSig(canonicalName: string): string {\n  return `0x${Buffer.from(Hash.keccak256(Buffer.from(canonicalName)))\n    .toString('hex')\n    .slice(0, 8)}`;\n}\n\n/**\n * Ensure the sig is properly formatted\n */\nfunction coerceSig(sig: string): string {\n  if (typeof sig !== 'string' || (sig.length !== 10 && sig.length !== 8)) {\n    throw new Error('`sig` must be a hex string with 4 bytes of data.');\n  }\n  if (sig.length === 8) {\n    sig = `0x${sig}`;\n  }\n  return sig;\n}\n\n/**\n * Convert calldata param definitions into an array of their\n * canonical string names.\n * Returns an array of string names that are consumable by\n * the @ethersproject/abi AbiCoder decoder instance.\n * @param defParams - Array of def params\n * @internal\n */\nfunction getParamStrNames(defParams) {\n  const strNames = [];\n  for (let i = 0; i < defParams.length; i++) {\n    const param = defParams[i];\n    let s = EVM_TYPES[param[1]];\n    if (param[2]) {\n      s = `${s}${param[2] * 8}`;\n    }\n    if (param[3].length > 0) {\n      param[3].forEach((d) => {\n        if (param[3][d] === 0) {\n          s = `${s}[]`;\n        } else {\n          s = `${s}[${param[3][d]}]`;\n        }\n      });\n    }\n    if (param[4]) {\n      // Tuple - get nested type names\n      const nested = getParamStrNames(param[4]);\n      s = `${s}(${nested.join(',')})`;\n    }\n    strNames.push(s);\n  }\n  return strNames;\n}\n\n/**\n * Take the next type from a canonical definition string. Note that the string can be that of a\n * tuple. NOTE: The string should start at the index after the leading '('\n * @internal\n */\nfunction popTypeStrFromCanonical(subName: string): string {\n  if (isTuple(subName)) {\n    return getTupleName(subName);\n  } else if (subName.indexOf(',') > -1) {\n    // Normal non-tuple param\n    return subName.slice(0, subName.indexOf(','));\n  } else if (subName.indexOf(')') > -1) {\n    // Last non-tuple param in the name\n    return subName.slice(0, subName.indexOf(')'));\n  }\n  throw new Error(BAD_CANONICAL_ERR);\n}\n\n/**\n * Parse a type string, e.g. 'uint256'. Converts the string to an array of EVMParamInfo, which may\n * have nested structure if there are tuples.\n * @internal\n */\nfunction parseTypeStr(typeStr: string): any[] {\n  // Non-tuples can be decoded without worrying about recursion\n  if (!isTuple(typeStr)) {\n    return [parseBasicTypeStr(typeStr)];\n  }\n  // Tuples may require recursion\n  const param: EVMParamInfo = {\n    szBytes: 0,\n    typeIdx: EVM_TYPES.indexOf('tuple'),\n    arraySzs: [],\n  };\n  // Get the full tuple param name and separate out the array stuff\n  let typeStrLessArr = getTupleName(typeStr, false);\n  const typeStrArr = typeStr.slice(typeStrLessArr.length);\n  param.arraySzs = getArraySzs(typeStrArr);\n  // Slice off the leading paren\n  typeStrLessArr = typeStrLessArr.slice(1);\n  // Parse each nested param\n  let paramArr = [];\n  while (typeStrLessArr.length > 0) {\n    const subType = popTypeStrFromCanonical(typeStrLessArr);\n    typeStrLessArr = typeStrLessArr.slice(subType.length + 1);\n    paramArr = paramArr.concat(parseTypeStr(subType));\n  }\n  // There must be at least one sub-param in the tuple\n  if (!paramArr.length) {\n    throw new Error(BAD_CANONICAL_ERR);\n  }\n  return [param, paramArr];\n}\n\n/**\n * Convert a basic type (e.g. 'uint256') from a string to EVMParamInfo type.\n * @internal\n */\nfunction parseBasicTypeStr(typeStr: string): EVMParamInfo {\n  const param: EVMParamInfo = {\n    szBytes: 0,\n    typeIdx: 0,\n    arraySzs: [],\n  };\n  let found = false;\n  EVM_TYPES.forEach((t, i) => {\n    if (typeStr.indexOf(t) > -1 && !found) {\n      param.typeIdx = i;\n      param.arraySzs = getArraySzs(typeStr);\n      const arrStart =\n        param.arraySzs.length > 0 ? typeStr.indexOf('[') : typeStr.length;\n      const typeStrNum = typeStr.slice(t.length, arrStart);\n      if (parseInt(typeStrNum)) {\n        param.szBytes = parseInt(typeStrNum) / 8;\n        if (param.szBytes > 32) {\n          throw new Error(BAD_CANONICAL_ERR);\n        }\n      }\n      found = true;\n    }\n  });\n  if (!found) {\n    throw new Error(BAD_CANONICAL_ERR);\n  }\n  return param;\n}\n\n/**\n * Parse an Etherscan definition into a calldata structure that the Lattice EVM decoder can handle\n * (EVMDef). This function may recurse if there are tuple types.\n * @internal\n */\nfunction parseDef(\n  item,\n  canonicalName = '',\n  def = [],\n  recursed = false,\n): EVMDef {\n  // Function name. Can be an empty string.\n  if (!recursed) {\n    const nameStr = item.name || '';\n    def.push(nameStr);\n    canonicalName += nameStr;\n  }\n  // Loop through params\n  if (item.inputs) {\n    canonicalName += '(';\n    item.inputs.forEach((input) => {\n      // Convert the input to a flat param that we can serialize\n      const flatParam = getFlatParam(input);\n      if (input.type.indexOf('tuple') > -1 && input.components) {\n        // For tuples we need to recurse\n        const recursed = parseDef(\n          { inputs: input.components },\n          canonicalName,\n          [],\n          true,\n        );\n        canonicalName = recursed.canonicalName;\n        // Add brackets if this is a tuple array and also add a comma\n        canonicalName += `${input.type.slice(5)},`;\n        flatParam.push(recursed.def);\n      } else {\n        canonicalName += input.type;\n        canonicalName += ',';\n      }\n      def.push(flatParam);\n    });\n    // Take off the last comma. Note that we do not want to slice if the last param was a tuple,\n    // since we want to keep that `)`\n    if (canonicalName[canonicalName.length - 1] === ',') {\n      canonicalName = canonicalName.slice(0, canonicalName.length - 1);\n    }\n    // Add the closing parens\n    canonicalName += ')';\n  }\n  return { def, canonicalName };\n}\n\n/**\n * Convert a set of EVMParamInfo objects into an array that can be serialized into decoder info that\n * can be passed with the signing request. NOTE: We do not know parameter names, so we just number\n * them\n * @internal\n */\nfunction parseParamDef(def: any[], prefix = ''): any[] {\n  const parsedDef = [];\n  let numTuples = 0;\n  def.forEach((param, i) => {\n    if (Array.isArray(param)) {\n      // Arrays indicate nested params inside a tuple and always come after the initial tuple type\n      // info. Recurse to parse nested tuple params and append them to the most recent.\n      parsedDef[parsedDef.length - 1].push(parseParamDef(param, `${i}-`));\n    } else {\n      // If this is not tuple info, add the flat param info to the def\n      parsedDef.push([\n        `#${prefix}${i + 1 - numTuples}`,\n        param.typeIdx,\n        param.szBytes,\n        param.arraySzs,\n      ]);\n    }\n    // Tuple\n    if (param.typeIdx === EVM_TYPES.indexOf('tuple')) {\n      numTuples += 1;\n    }\n  });\n  return parsedDef;\n}\n\n/**\n * Convert a param into an EVMParamInfo object before flattening its data into an array.\n * @internal\n */\nfunction getFlatParam(input): any[] {\n  if (!input.type) {\n    throw new Error('No type in input');\n  }\n  const param = [input.name];\n  const { typeIdx, szBytes, arraySzs } = getParamTypeInfo(input.type);\n  param.push(typeIdx);\n  param.push(szBytes);\n  param.push(arraySzs);\n  return param;\n}\n\n/**\n * Convert a param type string into an EVMParamInfo object with attributes:\n * 1. paramName -     name of the parameter. This piece of data is unverified, so it will display\n *                    differently if the user has the function saved in secure storage.\n * 2. paramType -     basic type of param. Firmware has an enum with 7 values.\n * 3. paramSzBytes -  number of bytes representing this param. Only certain types can have nonzero\n *                    value for this. For example, a `uint` with a 4 in this slot would be uint32\n *                    (8*4 = 32). Maximum number of bytes is always 32 because these types can only\n *                    be used in single 32 byte words.\n * @internal\n */\nfunction getParamTypeInfo(type: string): EVMParamInfo {\n  const param: EVMParamInfo = {\n    szBytes: 0,\n    typeIdx: 0,\n    arraySzs: [],\n  };\n  let baseType;\n  EVM_TYPES.forEach((t, i) => {\n    if (type.indexOf(t) > -1 && !baseType) {\n      baseType = t;\n      param.typeIdx = i;\n    }\n  });\n  // Get the array size, if any\n  param.arraySzs = getArraySzs(type);\n  // Determine where to search for expanded size\n  const szIdx = param.arraySzs.length > 0 ? type.indexOf('[') : type.length;\n  if (['uint', 'int', 'bytes'].indexOf(baseType) > -1) {\n    // If this can have a fixed size, capture that\n    const szBits = parseInt(type.slice(baseType.length, szIdx)) || 0;\n    if (szBits > 256) {\n      throw new Error('Invalid param size');\n    }\n    param.szBytes = szBits / 8;\n  } else {\n    // No fixed size in the type\n    param.szBytes = 0;\n  }\n  return param;\n}\n\n/**\n * Determine the dimensions of an array type. These dimensions can be either fixed or variable size.\n * Returns an array of sizes. Ex: uint256[][] -> [0, 0], uint256[1][3] -> [1, 3], uint256 -> []\n * @internal\n */\nfunction getArraySzs(type: string): number[] {\n  if (typeof type !== 'string') {\n    throw new Error('Invalid type');\n  }\n  const szs = [];\n  let t1 = type;\n  while (t1.length > 0) {\n    const openIdx = t1.indexOf('[');\n    if (openIdx < 0) {\n      return szs;\n    }\n    const t2 = t1.slice(openIdx);\n    const closeIdx = t2.indexOf(']');\n    if (closeIdx < 0) {\n      throw new Error('Bad param type');\n    }\n    const t3 = t2.slice(1, closeIdx);\n    if (t3.length === 0) {\n      // Variable size\n      szs.push(0);\n    } else {\n      // Fixed size\n      szs.push(parseInt(t3));\n    }\n    t1 = t2.slice(closeIdx + 1);\n  }\n  return szs;\n}\n\n/** @internal */\nfunction getTupleName(name, withArr = true) {\n  let brackets = 0,\n    addedFirstBracket = false;\n  for (let i = 0; i < name.length; i++) {\n    if (name[i] === '(') {\n      brackets += 1;\n      addedFirstBracket = true;\n    } else if (name[i] === ')') {\n      brackets -= 1;\n    }\n    let canBreak =\n      name[i + 1] === ',' || name[i + 1] === ')' || i === name.length - 1;\n    if (!withArr && name[i + 1] === '[') {\n      canBreak = true;\n    }\n    if (!brackets && addedFirstBracket && canBreak) {\n      return name.slice(0, i + 1);\n    }\n  }\n  throw new Error(BAD_CANONICAL_ERR);\n}\n\n/** @internal */\nfunction isTuple(type: string): boolean {\n  return type[0] === '(';\n}\n\n/** @internal */\nfunction isBytesType(param) {\n  return EVM_TYPES[param[1]] === 'bytes';\n}\nfunction isBytesItem(param) {\n  return isBytesType(param) && param[3].length === 0;\n}\nfunction isBytesArrItem(param) {\n  return isBytesType(param) && param[3].length === 1 && param[3][0] === 0;\n}\n\nconst BAD_CANONICAL_ERR = 'Could not parse canonical function name.';\nconst EVM_TYPES = [\n  null,\n  'address',\n  'bool',\n  'uint',\n  'int',\n  'bytes',\n  'string',\n  'tuple',\n  'nestedDef',\n];\n\ntype EVMParamInfo = {\n  szBytes: number;\n  typeIdx: number;\n  arraySzs: number[];\n};\n\ntype EVMDef = {\n  canonicalName: string;\n  def: any;\n};\n","/**\n * Exports containing utils that allow inclusion of calldata decoder info in signing requests. If\n * calldata decoder info is packed into the request, it is used to decode the calldata in the\n * request. It is optional.\n */\nimport {\n  getNestedCalldata,\n  parseCanonicalName,\n  parseSolidityJSONABI,\n  replaceNestedDefs,\n} from './evm';\n\nexport const CALLDATA = {\n  EVM: {\n    type: 1,\n    parsers: {\n      parseSolidityJSONABI,\n      parseCanonicalName,\n    },\n    processors: {\n      getNestedCalldata,\n      replaceNestedDefs,\n    },\n  },\n};\n","export enum LatticeResponseCode {\n  success = 0x00,\n  invalidMsg = 0x80,\n  unsupportedVersion = 0x81,\n  deviceBusy = 0x82,\n  userTimeout = 0x83,\n  userDeclined = 0x84,\n  pairFailed = 0x85,\n  pairDisabled = 0x86,\n  permissionDisabled = 0x87,\n  internalError = 0x88,\n  gceTimeout = 0x89,\n  wrongWallet = 0x8a,\n  deviceLocked = 0x8b,\n  disabled = 0x8c,\n  already = 0x8d,\n  invalidEphemId = 0x8e,\n}\n\nexport enum LatticeSecureMsgType {\n  connect = 0x01,\n  encrypted = 0x02,\n}\n\nexport enum LatticeProtocolVersion {\n  v1 = 0x01,\n}\n\nexport enum LatticeMsgType {\n  response = 0x00,\n  secure = 0x02,\n}\n\nexport enum LatticeSecureEncryptedRequestType {\n  finalizePairing = 0,\n  getAddresses = 1,\n  sign = 3,\n  getWallets = 4,\n  getKvRecords = 7,\n  addKvRecords = 8,\n  removeKvRecords = 9,\n  fetchEncryptedData = 12,\n  test = 13,\n}\n\nexport enum LatticeGetAddressesFlag {\n  none = 0, // For formatted addresses\n  secp256k1Pubkey = 3,\n  ed25519Pubkey = 4,\n  bls12_381Pubkey = 5,\n  secp256k1Xpub = 6, // For Bitcoin XPUB\n}\n\nexport enum LatticeSignSchema {\n  bitcoin = 0,\n  ethereum = 1, // Deprecated\n  ethereumMsg = 3,\n  extraData = 4,\n  generic = 5,\n}\n\nexport enum LatticeSignHash {\n  none = 0,\n  keccak256 = 1,\n  sha256 = 2,\n}\n\nexport enum LatticeSignCurve {\n  secp256k1 = 0,\n  ed25519 = 1,\n  bls12_381 = 2,\n}\n\nexport enum LatticeSignEncoding {\n  none = 1,\n  solana = 2,\n  evm = 4,\n  eth_deposit = 5,\n  eip7702_auth = 6,\n  eip7702_auth_list = 7,\n}\n\nexport enum LatticeSignBlsDst {\n  NUL = 1,\n  POP = 2,\n}\n\nexport enum LatticeEncDataSchema {\n  eip2335 = 0,\n}\n\nexport const ProtocolConstants = {\n  // Lattice firmware uses a static initialization vector for\n  // message encryption/decryption. This is generally considered\n  // fine because each encryption/decryption uses a unique encryption\n  // secret (derived from the per-message ephemeral key pair).\n  aesIv: [\n    0x6d, 0x79, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x70, 0x61, 0x73, 0x73,\n    0x77, 0x6f, 0x72, 0x64,\n  ],\n  // Constant size of address buffers from the Lattice.\n  // Note that this size also captures public keys returned\n  // by the Lattice (addresses = strings, pubkeys = buffers)\n  addrStrLen: 129,\n  // Status of the client's pairing with the target Lattice\n  pairingStatus: {\n    notPaired: 0x00,\n    paired: 0x01,\n  },\n  // Response types, codes, and error messages\n  responseMsg: {\n    [LatticeResponseCode.success]: '',\n    [LatticeResponseCode.invalidMsg]: 'Invalid Request',\n    [LatticeResponseCode.unsupportedVersion]: 'Unsupported Version',\n    [LatticeResponseCode.deviceBusy]: 'Device Busy',\n    [LatticeResponseCode.userTimeout]: 'Timeout waiting for user',\n    [LatticeResponseCode.userDeclined]: 'Request declined by user',\n    [LatticeResponseCode.pairFailed]: 'Pairing failed',\n    [LatticeResponseCode.pairDisabled]: 'Pairing is currently disabled',\n    [LatticeResponseCode.permissionDisabled]:\n      'Automated signing is currently disabled',\n    [LatticeResponseCode.internalError]: 'Device Error',\n    [LatticeResponseCode.gceTimeout]: 'Device Timeout',\n    [LatticeResponseCode.wrongWallet]: 'Active wallet does not match request',\n    [LatticeResponseCode.deviceLocked]: 'Device Locked',\n    [LatticeResponseCode.disabled]: 'Feature Disabled',\n    [LatticeResponseCode.already]: 'Record already exists on device',\n    [LatticeResponseCode.invalidEphemId]: 'Request failed - needs resync',\n  },\n  msgSizes: {\n    // General message header size. Valid for all Lattice messages\n    header: 8,\n    // Checksum must be appended to each message\n    checksum: 4,\n    // Lattice secure message constants. All requests from this SDK\n    // are secure messages.\n    secure: {\n      // Sizes of full payloads for secure messages\n      payload: {\n        request: {\n          // [ requestType (1 byte) | pubkey (65 bytes) ]\n          connect: 66,\n          // [ requestType (1 byte) | ephemeralId (4 bytes) | encryptedData (1728 bytes) ]\n          encrypted: 1733,\n        },\n        // Note that the response payload always has status code as the\n        // first byte. This byte is removed as part of `request`, inside\n        // `parseLattice1Response`. These constants include the status\n        // code byte.\n        response: {\n          connect: 215,\n          // Encrypted responses are as follows:\n          // encryptedData (1728) | empty (1728)\n          // The latter half is empty due to an invalid type definition\n          // in Lattice firmware. (Someone made a C `struct` instead of\n          // a `union`, oops).\n          encrypted: 3457,\n        },\n      },\n      // Sizes for data inside secure message payloads\n      data: {\n        // All requests also have a `requestCode`, which is omitted\n        // from these constants.\n        request: {\n          connect: 65,\n          encrypted: {\n            // All encrypted requests are encrypted into a 1728 byte buffer\n            encryptedData: 1728,\n            // Individual request types have different data sizes.\n            [LatticeSecureEncryptedRequestType.finalizePairing]: 99,\n            [LatticeSecureEncryptedRequestType.getAddresses]: 54,\n            [LatticeSecureEncryptedRequestType.sign]: 1680,\n            [LatticeSecureEncryptedRequestType.getWallets]: 0,\n            [LatticeSecureEncryptedRequestType.getKvRecords]: 9,\n            [LatticeSecureEncryptedRequestType.addKvRecords]: 1391,\n            [LatticeSecureEncryptedRequestType.removeKvRecords]: 405,\n            [LatticeSecureEncryptedRequestType.fetchEncryptedData]: 1025,\n            [LatticeSecureEncryptedRequestType.test]: 506,\n          },\n        },\n        // All responses also have a `responseCode`, which is omitted\n        // from these constants.\n        response: {\n          encrypted: {\n            encryptedData: 1728,\n            // Once decrypted, the data size of the response\n            // payload will be determined by the request type.\n            // NOTE: All requests also have ephemeralPublicKey (65 bytes) and\n            // checksum (4 bytes), which are excluded from these sizes.\n            [LatticeSecureEncryptedRequestType.finalizePairing]: 0,\n            [LatticeSecureEncryptedRequestType.getAddresses]: 1290,\n            [LatticeSecureEncryptedRequestType.sign]: 1090,\n            [LatticeSecureEncryptedRequestType.getWallets]: 142,\n            [LatticeSecureEncryptedRequestType.getKvRecords]: 1395,\n            [LatticeSecureEncryptedRequestType.addKvRecords]: 0,\n            [LatticeSecureEncryptedRequestType.removeKvRecords]: 0,\n            [LatticeSecureEncryptedRequestType.fetchEncryptedData]: 1608,\n            [LatticeSecureEncryptedRequestType.test]: 1646,\n          },\n        },\n      },\n    },\n  },\n} as const;\n","import {\n  LatticeEncDataSchema,\n  LatticeGetAddressesFlag,\n  LatticeSignBlsDst,\n  LatticeSignCurve,\n  LatticeSignEncoding,\n  LatticeSignHash,\n} from './protocol/latticeConstants';\nimport {\n  FirmwareConstants,\n  FirmwareArr,\n  ActiveWallets,\n  WalletPath,\n} from './types/index.js';\n\n/**\n * Externally exported constants used for building requests\n * @public\n */\nexport const EXTERNAL = {\n  // Optional flags for `getAddresses`\n  GET_ADDR_FLAGS: {\n    SECP256K1_PUB: LatticeGetAddressesFlag.secp256k1Pubkey,\n    ED25519_PUB: LatticeGetAddressesFlag.ed25519Pubkey,\n    BLS12_381_G1_PUB: LatticeGetAddressesFlag.bls12_381Pubkey,\n    SECP256K1_XPUB: LatticeGetAddressesFlag.secp256k1Xpub,\n  },\n  // Options for building general signing requests\n  SIGNING: {\n    HASHES: {\n      NONE: LatticeSignHash.none,\n      KECCAK256: LatticeSignHash.keccak256,\n      SHA256: LatticeSignHash.sha256,\n    },\n    CURVES: {\n      SECP256K1: LatticeSignCurve.secp256k1,\n      ED25519: LatticeSignCurve.ed25519,\n      BLS12_381_G2: LatticeSignCurve.bls12_381,\n    },\n    ENCODINGS: {\n      NONE: LatticeSignEncoding.none,\n      SOLANA: LatticeSignEncoding.solana,\n      EVM: LatticeSignEncoding.evm,\n      ETH_DEPOSIT: LatticeSignEncoding.eth_deposit,\n      EIP7702_AUTH: LatticeSignEncoding.eip7702_auth,\n      EIP7702_AUTH_LIST: LatticeSignEncoding.eip7702_auth_list,\n    },\n    BLS_DST: {\n      BLS_DST_NUL: LatticeSignBlsDst.NUL,\n      BLS_DST_POP: LatticeSignBlsDst.POP,\n    },\n  },\n  // Options for exporting encrypted data\n  ENC_DATA: {\n    SCHEMAS: {\n      BLS_KEYSTORE_EIP2335_PBKDF_V4: LatticeEncDataSchema.eip2335,\n    },\n  },\n  ETH_CONSENSUS_SPEC: {\n    NETWORKS: {\n      MAINNET_GENESIS: {\n        networkName: 'mainnet',\n        forkVersion: Buffer.alloc(4),\n        // Empty root because there were no validators at genesis\n        validatorsRoot: Buffer.alloc(32),\n      },\n    },\n    DOMAINS: {\n      DEPOSIT: Buffer.from('03000000', 'hex'),\n      VOLUNTARY_EXIT: Buffer.from('04000000', 'hex'),\n    },\n  },\n} as const;\n\n//===============================\n// INTERNAL CONSTANTS\n//===============================\n/** @internal */\nconst addressSizes = {\n  BTC: 20, // 20 byte pubkeyhash\n  ETH: 20, // 20 byte address not including 0x prefix\n} as const;\n\n/** @internal */\nconst CURRENCIES = {\n  ETH: 'ETH',\n  BTC: 'BTC',\n  ETH_MSG: 'ETH_MSG',\n} as const;\n\n/** @internal */\n// THIS NEEDS TO BE A PROTOCOL CONSTANT TOO\nconst signingSchema = {\n  BTC_TRANSFER: 0,\n  ETH_TRANSFER: 1,\n  ERC20_TRANSFER: 2,\n  ETH_MSG: 3,\n  EXTRA_DATA: 4,\n  GENERAL_SIGNING: 5,\n} as const;\n\n/** @internal */\nconst HARDENED_OFFSET = 0x80000000; // Hardened offset\n\n/** @internal */\nconst BIP_CONSTANTS = {\n  PURPOSES: {\n    ETH: HARDENED_OFFSET + 44,\n    BTC_LEGACY: HARDENED_OFFSET + 44,\n    BTC_WRAPPED_SEGWIT: HARDENED_OFFSET + 49,\n    BTC_SEGWIT: HARDENED_OFFSET + 84,\n  },\n  COINS: {\n    ETH: HARDENED_OFFSET + 60,\n    BTC: HARDENED_OFFSET,\n    BTC_TESTNET: HARDENED_OFFSET + 1,\n  },\n} as const;\n\n/** @internal For all HSM-bound requests */\nconst REQUEST_TYPE_BYTE = 0x02;\n\n/** @internal */\nconst VERSION_BYTE = 1;\n\n/** @internal ChainId value to signify larger chainID is in data buffer */\nconst HANDLE_LARGER_CHAIN_ID = 255;\n\n/** @internal Max number of bytes to contain larger chainID in data buffer */\nconst MAX_CHAIN_ID_BYTES = 8;\n\n/** @internal */\nconst BASE_URL = 'https://signing.gridpl.us';\n\n/** @internal */\nconst EIP712_ABI_LATTICE_FW_TYPE_MAP = {\n  address: 1,\n  bool: 2,\n  uint8: 3,\n  uint16: 4,\n  uint24: 5,\n  uint32: 6,\n  uint40: 7,\n  uint48: 8,\n  uint56: 9,\n  uint64: 10,\n  uint72: 11,\n  uint80: 12,\n  uint88: 13,\n  uint96: 14,\n  uint104: 15,\n  uint112: 16,\n  uint120: 17,\n  uint128: 18,\n  uint136: 19,\n  uint144: 20,\n  uint152: 21,\n  uint160: 22,\n  uint168: 23,\n  uint176: 24,\n  uint184: 25,\n  uint192: 26,\n  uint200: 27,\n  uint208: 28,\n  uint216: 29,\n  uint224: 30,\n  uint232: 31,\n  uint240: 32,\n  uint248: 33,\n  uint256: 34,\n  int8: 35,\n  int16: 36,\n  int24: 37,\n  int32: 38,\n  int40: 39,\n  int48: 40,\n  int56: 41,\n  int64: 42,\n  int72: 43,\n  int80: 44,\n  int88: 45,\n  int96: 46,\n  int104: 47,\n  int112: 48,\n  int120: 49,\n  int128: 50,\n  int136: 51,\n  int144: 52,\n  int152: 53,\n  int160: 54,\n  int168: 55,\n  int176: 56,\n  int184: 57,\n  int192: 58,\n  int200: 59,\n  int208: 60,\n  int216: 61,\n  int224: 62,\n  int232: 63,\n  int240: 64,\n  int248: 65,\n  int256: 66,\n  uint: 67,\n  bytes1: 69,\n  bytes2: 70,\n  bytes3: 71,\n  bytes4: 72,\n  bytes5: 73,\n  bytes6: 74,\n  bytes7: 75,\n  bytes8: 76,\n  bytes9: 77,\n  bytes10: 78,\n  bytes11: 79,\n  bytes12: 80,\n  bytes13: 81,\n  bytes14: 82,\n  bytes15: 83,\n  bytes16: 84,\n  bytes17: 85,\n  bytes18: 86,\n  bytes19: 87,\n  bytes20: 88,\n  bytes21: 89,\n  bytes22: 90,\n  bytes23: 91,\n  bytes24: 92,\n  bytes25: 93,\n  bytes26: 94,\n  bytes27: 95,\n  bytes28: 96,\n  bytes29: 97,\n  bytes30: 98,\n  bytes31: 99,\n  bytes32: 100,\n  bytes: 101,\n  string: 102,\n};\n\n/** @internal */\nconst ETH_ABI_LATTICE_FW_TYPE_MAP = {\n  ...EIP712_ABI_LATTICE_FW_TYPE_MAP,\n  tuple1: 103,\n  tuple2: 104,\n  tuple3: 105,\n  tuple4: 106,\n  tuple5: 107,\n  tuple6: 108,\n  tuple7: 109,\n  tuple8: 110,\n  tuple9: 111,\n  tuple10: 112,\n  tuple11: 113,\n  tuple12: 114,\n  tuple13: 115,\n  tuple14: 116,\n  tuple15: 117,\n  tuple16: 118,\n  tuple17: 119, // Firmware currently cannot support tuples larger than this\n};\n\n/** @internal */\nconst ethMsgProtocol = {\n  SIGN_PERSONAL: {\n    str: 'signPersonal',\n    enumIdx: 0, // Enum index of this protocol in Lattice firmware\n  },\n  TYPED_DATA: {\n    str: 'typedData',\n    enumIdx: 1,\n    rawDataMaxLen: 1629, // Max size of raw data payload in bytes\n    typeCodes: EIP712_ABI_LATTICE_FW_TYPE_MAP, // Enum indices of data types in Lattice firmware\n  },\n};\n\n/** @internal */\nfunction getFwVersionConst(v: Buffer): FirmwareConstants {\n  const c: any = {\n    extraDataFrameSz: 0,\n    extraDataMaxFrames: 0,\n    genericSigning: {} as any,\n  };\n  function gte(v: Buffer, exp: FirmwareArr): boolean {\n    // Note that `v` fields come in as [fix|minor|major]\n    return (\n      v[2] > exp[0] ||\n      (v[2] === exp[0] && v[1] > exp[1]) ||\n      (v[2] === exp[0] && v[1] === exp[1] && v[0] > exp[2]) ||\n      (v[2] === exp[0] && v[1] === exp[1] && v[0] === exp[2])\n    );\n  }\n  // Very old legacy versions do not give a version number\n  const legacy = v.length === 0;\n\n  // BASE FIELDS\n  //--------------------------------------\n\n  // Various size constants have changed on the firmware side over time and\n  // are captured here\n  if (!legacy && gte(v, [0, 10, 4])) {\n    // >=0.10.3\n    c.reqMaxDataSz = 1678;\n    c.ethMaxGasPrice = 20000000000000; // 20000 gwei\n    c.addrFlagsAllowed = true;\n  } else if (!legacy && gte(v, [0, 10, 0])) {\n    // >=0.10.0\n    c.reqMaxDataSz = 1678;\n    c.ethMaxGasPrice = 20000000000000; // 20000 gwei\n    c.addrFlagsAllowed = true;\n  } else {\n    // Legacy or <0.10.0\n    c.reqMaxDataSz = 1152;\n    c.ethMaxGasPrice = 500000000000; // 500 gwei\n    c.addrFlagsAllowed = false;\n  }\n  // These transformations apply to all versions. The subtraction\n  // of 128 bytes accounts for metadata and is for legacy reasons.\n  // For all modern versions, these are 1550 bytes.\n  // NOTE: Non-legacy ETH txs (e.g. EIP1559) will shrink\n  // this number.\n  // See `ETH_BASE_TX_MAX_DATA_SZ` and `ETH_MAX_BASE_MSG_SZ` in firmware\n  c.ethMaxDataSz = c.reqMaxDataSz - 128;\n  c.ethMaxMsgSz = c.ethMaxDataSz;\n  // Max number of params in an EIP712 type. This was added to firmware\n  // to avoid blowing stack size.\n  c.eip712MaxTypeParams = 18;\n\n  // -----\n  // EXTRA FIELDS ADDED IN LATER FIRMWARE VERSIONS\n  // -----\n\n  // --- V0.10.X ---\n  // V0.10.4 introduced the ability to send signing requests over multiple\n  // data frames (i.e. in multiple requests)\n  if (!legacy && gte(v, [0, 10, 4])) {\n    c.extraDataFrameSz = 1500; // 1500 bytes per frame of extraData allowed\n    c.extraDataMaxFrames = 1; // 1 frame of extraData allowed\n  }\n  // V0.10.5 added the ability to use flexible address path sizes, which\n  // changes the `getAddress` API. It also added support for EIP712\n  if (!legacy && gte(v, [0, 10, 5])) {\n    c.varAddrPathSzAllowed = true;\n    c.eip712Supported = true;\n  }\n  // V0.10.8 allows a user to sign a prehashed transaction if the payload\n  // is too big\n  if (!legacy && gte(v, [0, 10, 8])) {\n    c.prehashAllowed = true;\n  }\n  // V0.10.10 allows a user to sign a prehashed ETH message if payload too big\n  if (!legacy && gte(v, [0, 10, 10])) {\n    c.ethMsgPreHashAllowed = true;\n  }\n\n  // --- 0.11.X ---\n  // V0.11.0 allows new ETH transaction types\n  if (!legacy && gte(v, [0, 11, 0])) {\n    c.allowedEthTxTypes = [\n      1, // eip2930\n      2, // eip1559\n    ];\n    // This version added extra data fields to the ETH tx\n    c.ethMaxDataSz -= 10;\n    c.ethMaxMsgSz = c.ethMaxDataSz;\n  }\n  // V0.11.2 changed how messages are displayed. For personal_sign messages\n  // we now write the header (`Signer: <path>`) into the main body of the screen.\n  // This means personal sign message max size is slightly smaller than for\n  // EIP712 messages because in the latter case there is no header\n  // Note that `<path>` has max size of 62 bytes (`m/X/X/...`)\n  if (!legacy && gte(v, [0, 11, 2])) {\n    c.personalSignHeaderSz = 72;\n  }\n\n  // --- V0.12.X ---\n  // V0.12.0 added an API for creating, removing, and fetching key-val file\n  // records. For the purposes of this SDK, we only hook into one type of kv\n  // file: address names.\n  if (!legacy && gte(v, [0, 12, 0])) {\n    c.kvActionsAllowed = true;\n    c.kvKeyMaxStrSz = 63;\n    c.kvValMaxStrSz = 63;\n    c.kvActionMaxNum = 10;\n    c.kvRemoveMaxNum = 100;\n  }\n\n  // --- V0.13.X ---\n  // V0.13.0 added native segwit addresses and fixed a bug in exporting\n  // legacy bitcoin addresses\n  if (!legacy && gte(v, [0, 13, 0])) {\n    c.allowBtcLegacyAndSegwitAddrs = true;\n    // Random address to be used when trying to deploy a contract\n    c.contractDeployKey = '0x08002e0fec8e6acf00835f43c9764f7364fa3f42';\n  }\n\n  // --- V0.14.X ---\n  // V0.14.0 added support for a more robust API around ABI definitions\n  // and generic signing functionality\n  if (!legacy && gte(v, [0, 14, 0])) {\n    // Size of `category` buffer. Inclusive of null terminator byte.\n    c.abiCategorySz = 32;\n    c.abiMaxRmv = 200; // Max number of ABI defs that can be removed with\n    // a single request\n    // See `sizeof(GenericSigningRequest_t)` in firmware\n    c.genericSigning.baseReqSz = 1552;\n    // See `GENERIC_SIGNING_BASE_MSG_SZ` in firmware\n    c.genericSigning.baseDataSz = 1519;\n    c.genericSigning.hashTypes = EXTERNAL.SIGNING.HASHES;\n    c.genericSigning.curveTypes = EXTERNAL.SIGNING.CURVES;\n    c.genericSigning.encodingTypes = {\n      NONE: EXTERNAL.SIGNING.ENCODINGS.NONE,\n      SOLANA: EXTERNAL.SIGNING.ENCODINGS.SOLANA,\n    };\n    // Supported flags for `getAddresses`\n    c.getAddressFlags = [\n      EXTERNAL.GET_ADDR_FLAGS.ED25519_PUB,\n      EXTERNAL.GET_ADDR_FLAGS.SECP256K1_PUB,\n    ];\n    // We updated the max number of params in EIP712 types\n    c.eip712MaxTypeParams = 36;\n  }\n  // DEPRECATED\n  // V0.14.1 Added the Terra decoder\n  // if (!legacy && gte(v, [0, 14, 1])) {\n  //   c.genericSigning.encodingTypes.TERRA = EXTERNAL.SIGNING.ENCODINGS.TERRA;\n  // }\n\n  // --- V0.15.X ---\n  // V0.15.0 added an EVM decoder and removed the legacy ETH signing pathway\n  if (!legacy && gte(v, [0, 15, 0])) {\n    c.genericSigning.encodingTypes.EVM = EXTERNAL.SIGNING.ENCODINGS.EVM;\n    // We now use the general signing data field as the base\n    // Note that we have NOT removed the ETH_MSG type so we should\n    // not change ethMaxMsgSz\n    c.ethMaxDataSz = 1550 - 31;\n    // Max buffer size for get/add decoder requests\n    c.maxDecoderBufSz = 1600;\n    // Code used to write a calldata decoder\n    c.genericSigning.calldataDecoding = {\n      reserved: 2895728,\n      maxSz: 1024,\n    };\n  }\n\n  // --- V0.17.X ---\n  // V0.17.0 added support for BLS12-381-G1 pubkeys and G2 sigs\n  if (!legacy && gte(v, [0, 17, 0])) {\n    c.getAddressFlags.push(EXTERNAL.GET_ADDR_FLAGS.BLS12_381_G1_PUB);\n    c.genericSigning.encodingTypes.ETH_DEPOSIT =\n      EXTERNAL.SIGNING.ENCODINGS.ETH_DEPOSIT;\n  }\n\n  // --- V0.18.X ---\n  // V0.18.0 added support for EIP7702 signing\n  // TODO: update patch version when this is released\n  if (!legacy && gte(v, [0, 18, 0])) {\n    c.genericSigning.encodingTypes = {\n      ...c.genericSigning.encodingTypes,\n      EIP7702_AUTH: EXTERNAL.SIGNING.ENCODINGS.EIP7702_AUTH,\n      EIP7702_AUTH_LIST: EXTERNAL.SIGNING.ENCODINGS.EIP7702_AUTH_LIST,\n    };\n  }\n\n  return c;\n}\n\n/** @internal */\n// eslint-disable-next-line no-control-regex\nconst ASCII_REGEX = /^[\\x00-\\x7F]+$/;\n\n/** @internal */\nconst EXTERNAL_NETWORKS_BY_CHAIN_ID_URL =\n  'https://gridplus.github.io/chains/chains.json';\n\n/** @internal - Max number of addresses to fetch */\nconst MAX_ADDR = 10;\n\n/** @internal */\nconst NETWORKS_BY_CHAIN_ID = {\n  1: {\n    name: 'ethereum',\n    baseUrl: 'https://api.etherscan.io',\n    apiRoute: 'api?module=contract&action=getabi',\n  },\n  137: {\n    name: 'polygon',\n    baseUrl: 'https://api.polygonscan.com',\n    apiRoute: 'api?module=contract&action=getabi',\n  },\n  56: {\n    name: 'binance',\n    baseUrl: 'https://api.bscscan.com',\n    apiRoute: 'api?module=contract&action=getabi',\n  },\n  42220: {\n    name: 'celo',\n    baseUrl: 'https://api.celoscan.io',\n    apiRoute: 'api?module=contract&action=getabi',\n  },\n  43114: {\n    name: 'avalanche',\n    baseUrl: 'https://api.snowtrace.io',\n    apiRoute: 'api?module=contract&action=getabi',\n  },\n};\n\n/** @internal */\nexport const EMPTY_WALLET_UID = Buffer.alloc(32);\n\n/** @internal */\nexport const DEFAULT_ACTIVE_WALLETS: ActiveWallets = {\n  internal: {\n    uid: EMPTY_WALLET_UID,\n    external: false,\n    name: Buffer.alloc(0),\n    capabilities: 0,\n  },\n  external: {\n    uid: EMPTY_WALLET_UID,\n    external: true,\n    name: Buffer.alloc(0),\n    capabilities: 0,\n  },\n};\n\n/** @internal */\nexport const DEFAULT_ETH_DERIVATION: WalletPath = [\n  HARDENED_OFFSET + 44,\n  HARDENED_OFFSET + 60,\n  HARDENED_OFFSET,\n  0,\n  0,\n];\n\n/** @internal */\nexport const BTC_LEGACY_DERIVATION = [\n  HARDENED_OFFSET + 44,\n  HARDENED_OFFSET + 0,\n  HARDENED_OFFSET,\n  0,\n  0,\n];\n\n/** @internal */\nexport const BTC_LEGACY_CHANGE_DERIVATION = [\n  HARDENED_OFFSET + 44,\n  HARDENED_OFFSET + 0,\n  HARDENED_OFFSET,\n  0,\n  0,\n];\n\n/** @internal */\nexport const BTC_SEGWIT_DERIVATION = [\n  HARDENED_OFFSET + 84,\n  HARDENED_OFFSET,\n  HARDENED_OFFSET,\n  0,\n  0,\n];\n\n/** @internal */\nexport const BTC_SEGWIT_CHANGE_DERIVATION = [\n  HARDENED_OFFSET + 84,\n  HARDENED_OFFSET,\n  HARDENED_OFFSET,\n  1,\n  0,\n];\n\n/** @internal */\nexport const BTC_WRAPPED_SEGWIT_DERIVATION = [\n  HARDENED_OFFSET + 49,\n  HARDENED_OFFSET,\n  HARDENED_OFFSET,\n  0,\n  0,\n];\n\n/** @internal */\nexport const BTC_WRAPPED_SEGWIT_CHANGE_DERIVATION = [\n  HARDENED_OFFSET + 49,\n  HARDENED_OFFSET,\n  HARDENED_OFFSET,\n  0,\n  0,\n];\n\n/**\n * Derivation path for Bitcoin legacy xpub (BIP44).\n * Use with fetchAddressesByDerivationPath() and LatticeGetAddressesFlag.secp256k1Xpub\n * @example\n * const xpub = await fetchAddressesByDerivationPath(BTC_LEGACY_XPUB_PATH, {\n *   flag: LatticeGetAddressesFlag.secp256k1Xpub\n * });\n */\nexport const BTC_LEGACY_XPUB_PATH = \"44'/0'/0'\";\n\n/**\n * Derivation path for Bitcoin wrapped segwit ypub (BIP49).\n * Use with fetchAddressesByDerivationPath() and LatticeGetAddressesFlag.secp256k1Xpub\n * @example\n * const ypub = await fetchAddressesByDerivationPath(BTC_WRAPPED_SEGWIT_YPUB_PATH, {\n *   flag: LatticeGetAddressesFlag.secp256k1Xpub\n * });\n */\nexport const BTC_WRAPPED_SEGWIT_YPUB_PATH = \"49'/0'/0'\";\n\n/**\n * Derivation path for Bitcoin native segwit zpub (BIP84).\n * Use with fetchAddressesByDerivationPath() and LatticeGetAddressesFlag.secp256k1Xpub\n * @example\n * const zpub = await fetchAddressesByDerivationPath(BTC_SEGWIT_ZPUB_PATH, {\n *   flag: LatticeGetAddressesFlag.secp256k1Xpub\n * });\n */\nexport const BTC_SEGWIT_ZPUB_PATH = \"84'/0'/0'\";\n\n/** @internal */\nexport const SOLANA_DERIVATION = [\n  HARDENED_OFFSET + 44,\n  HARDENED_OFFSET + 501,\n  HARDENED_OFFSET,\n  HARDENED_OFFSET,\n];\n\n/** @internal */\nexport const LEDGER_LIVE_DERIVATION = [\n  HARDENED_OFFSET + 49,\n  HARDENED_OFFSET + 60,\n  HARDENED_OFFSET,\n  0,\n  0,\n];\n\n/** @internal */\nexport const LEDGER_LEGACY_DERIVATION = [\n  HARDENED_OFFSET + 49,\n  HARDENED_OFFSET + 60,\n  HARDENED_OFFSET,\n  0,\n];\n\nexport {\n  ASCII_REGEX,\n  getFwVersionConst,\n  BIP_CONSTANTS,\n  BASE_URL,\n  CURRENCIES,\n  MAX_ADDR,\n  NETWORKS_BY_CHAIN_ID,\n  EXTERNAL_NETWORKS_BY_CHAIN_ID_URL,\n  addressSizes,\n  ethMsgProtocol,\n  signingSchema,\n  REQUEST_TYPE_BYTE,\n  VERSION_BYTE,\n  HARDENED_OFFSET,\n  HANDLE_LARGER_CHAIN_ID,\n  MAX_CHAIN_ID_BYTES,\n  ETH_ABI_LATTICE_FW_TYPE_MAP,\n  EXTERNAL as PUBLIC,\n};\n","import { Client } from '../client';\n\nexport let saveClient: (clientData: string | null) => Promise<void>;\n\nexport const setSaveClient = (\n  fn: (clientData: string | null) => Promise<void>,\n) => {\n  saveClient = fn;\n};\n\nexport let loadClient: () => Promise<Client | undefined>;\n\nexport const setLoadClient = (fn: () => Promise<Client | undefined>) => {\n  loadClient = fn;\n};\n\nlet functionQueue: Promise<any>;\n\nexport const getFunctionQueue = () => functionQueue;\n\nexport const setFunctionQueue = (queue: Promise<any>) => {\n  functionQueue = queue;\n};\n","import { Client } from '../client';\nimport { EXTERNAL, HARDENED_OFFSET } from '../constants';\nimport {\n  getFunctionQueue,\n  loadClient,\n  saveClient,\n  setFunctionQueue,\n} from './state';\n\n/**\n * `queue` is a function that wraps all functional API calls. It limits the number of concurrent\n * requests to the server to 1, and ensures that the client state data is saved after each call.\n * This is necessary because the ephemeral public key must be updated after each successful request,\n * and two concurrent requests could result in the same key being used twice or the wrong key being\n * written to memory locally.\n *\n * @internal\n */\nexport const queue = async (fn: (client: Client) => Promise<any>) => {\n  const client = await loadClient();\n  if (!client) throw new Error('Client not initialized');\n  if (!getFunctionQueue()) {\n    setFunctionQueue(Promise.resolve());\n  }\n  setFunctionQueue(\n    getFunctionQueue().then(\n      async () =>\n        await fn(client)\n          .catch((err) => {\n            // Empty the queue if any function call fails\n            setFunctionQueue(Promise.resolve());\n            throw err;\n          })\n          .then((returnValue) => {\n            saveClient(client.getStateData());\n            return returnValue;\n          }),\n    ),\n  );\n  return getFunctionQueue();\n};\n\nexport const getClient = async (): Promise<Client> => {\n  const client = loadClient ? await loadClient() : undefined;\n  if (!client) throw new Error('Client not initialized');\n  return client;\n};\n\nconst encodeClientData = (clientData: string) => {\n  return Buffer.from(clientData).toString('base64');\n};\n\nconst decodeClientData = (clientData: string) => {\n  return Buffer.from(clientData, 'base64').toString();\n};\n\nexport const buildSaveClientFn = (\n  setStoredClient: (clientData: string | null) => Promise<void>,\n) => {\n  return async (clientData: string | null) => {\n    if (!clientData) return;\n    const encodedData = encodeClientData(clientData);\n    await setStoredClient(encodedData);\n  };\n};\n\nexport const buildLoadClientFn = (getStoredClient: () => Promise<string>) => {\n  return async () => {\n    const clientData = await getStoredClient();\n    if (!clientData) return undefined;\n    const stateData = decodeClientData(clientData);\n    if (!stateData) return undefined;\n    const client = new Client({ stateData });\n    if (!client) throw new Error('Client not initialized');\n    return client;\n  };\n};\n\nexport const getStartPath = (\n  defaultStartPath: number[],\n  addressIndex = 0, // The value to increment `defaultStartPath`\n  pathIndex = 4, // Which index in `defaultStartPath` array to increment\n): number[] => {\n  const startPath = [...defaultStartPath];\n  if (addressIndex > 0) {\n    startPath[pathIndex] = defaultStartPath[pathIndex] + addressIndex;\n  }\n  return startPath;\n};\n\nexport const isEIP712Payload = (payload: any) =>\n  typeof payload !== 'string' &&\n  'types' in payload &&\n  'domain' in payload &&\n  'primaryType' in payload &&\n  'message' in payload;\n\nexport function parseDerivationPath(path: string): number[] {\n  if (!path) return [];\n  const components = path.split('/').filter(Boolean);\n  return parseDerivationPathComponents(components);\n}\n\nexport function parseDerivationPathComponents(components: string[]): number[] {\n  return components.map((part) => {\n    const lowerPart = part.toLowerCase();\n    if (lowerPart === 'x') return 0; // Wildcard\n    if (lowerPart === \"x'\") return HARDENED_OFFSET; // Hardened wildcard\n    if (part.endsWith(\"'\"))\n      return parseInt(part.slice(0, -1)) + HARDENED_OFFSET;\n    const val = parseInt(part);\n    if (isNaN(val)) {\n      throw new Error(`Invalid part in derivation path: ${part}`);\n    }\n    return val;\n  });\n}\n\nexport function getFlagFromPath(path: number[]): number | undefined {\n  if (path.length >= 2 && path[1] === 501 + HARDENED_OFFSET) {\n    return EXTERNAL.GET_ADDR_FLAGS.ED25519_PUB; // SOLANA\n  }\n  return undefined;\n}\n","// Static utility functions\nimport { RLP } from '@ethereumjs/rlp';\nimport aes from 'aes-js';\nimport BigNum from 'bignumber.js';\nimport { BN } from 'bn.js';\nimport { Buffer } from 'buffer';\nimport crc32 from 'crc-32';\nimport elliptic from 'elliptic';\nimport { Hash } from 'ox';\nimport inRange from 'lodash/inRange.js';\nimport isInteger from 'lodash/isInteger.js';\nimport secp256k1 from 'secp256k1';\nimport { parseTransaction, type Hex } from 'viem';\n\nconst EC = elliptic.ec;\nconst { ecdsaRecover } = secp256k1;\nimport { Calldata } from '.';\nimport {\n  BIP_CONSTANTS,\n  EXTERNAL_NETWORKS_BY_CHAIN_ID_URL,\n  HARDENED_OFFSET,\n  NETWORKS_BY_CHAIN_ID,\n  VERSION_BYTE,\n} from './constants';\nimport { LatticeResponseCode, ProtocolConstants } from './protocol';\nimport {\n  isValid4ByteResponse,\n  isValidBlockExplorerResponse,\n} from './shared/validators';\nimport { FirmwareConstants } from './types';\n\nconst { COINS, PURPOSES } = BIP_CONSTANTS;\nlet ec: any;\n\n//--------------------------------------------------\n// LATTICE UTILS\n//--------------------------------------------------\n\n/** @internal Parse a response from the Lattice1 */\nexport const parseLattice1Response = function (r: string): {\n  errorMessage?: string;\n  responseCode?: number;\n  data?: Buffer;\n} {\n  const parsed: {\n    errorMessage: string | null;\n    data: Buffer | null;\n    responseCode?: number;\n  } = {\n    errorMessage: null,\n    data: null,\n  };\n  const b = Buffer.from(r, 'hex');\n  let off = 0;\n\n  // Get protocol version\n  const protoVer = b.readUInt8(off);\n  off++;\n  if (protoVer !== VERSION_BYTE) {\n    parsed.errorMessage = 'Incorrect protocol version. Please update your SDK';\n    return parsed;\n  }\n\n  // Get the type of response\n  // Should always be 0x00\n  const msgType = b.readUInt8(off);\n  off++;\n  if (msgType !== 0x00) {\n    parsed.errorMessage = 'Incorrect response from Lattice1';\n    return parsed;\n  }\n\n  // Get the payload\n  b.readUInt32BE(off);\n  off += 4; // First 4 bytes is the id, but we don't need that anymore\n  const len = b.readUInt16BE(off);\n  off += 2;\n  const payload = b.slice(off, off + len);\n  off += len;\n\n  // Get response code\n  const responseCode = payload.readUInt8(0);\n  if (responseCode !== LatticeResponseCode.success) {\n    const errMsg = ProtocolConstants.responseMsg[responseCode];\n    parsed.errorMessage = `[Lattice] ${errMsg ? errMsg : 'Unknown Error'}`;\n    parsed.responseCode = responseCode;\n    return parsed;\n  } else {\n    parsed.data = payload.slice(1, payload.length);\n  }\n\n  // Verify checksum\n  const cs = b.readUInt32BE(off);\n  const expectedCs = checksum(b.slice(0, b.length - 4));\n  if (cs !== expectedCs) {\n    parsed.errorMessage = 'Invalid checksum from device response';\n    parsed.data = null;\n    return parsed;\n  }\n\n  return parsed;\n};\n\n/** @internal */\nexport const checksum = function (x: Buffer): number {\n  // crc32 returns a signed integer - need to cast it to unsigned\n  // Note that this uses the default 0xedb88320 polynomial\n  return crc32.buf(x) >>> 0; // Need this to be a uint, hence the bit shift\n};\n\n// Get a 74-byte padded DER-encoded signature buffer\n// `sig` must be the signature output from elliptic.js\n/** @internal */\nexport const toPaddedDER = function (sig: any): Buffer {\n  // We use 74 as the maximum length of a DER signature. All sigs must\n  // be right-padded with zeros so that this can be a fixed size field\n  const b = Buffer.alloc(74);\n  const ds = Buffer.from(sig.toDER());\n  ds.copy(b);\n  return b;\n};\n\n//--------------------------------------------------\n// TRANSACTION UTILS\n//--------------------------------------------------\n/** @internal */\nexport const isValidAssetPath = function (\n  path: number[],\n  fwConstants: FirmwareConstants,\n): boolean {\n  const allowedPurposes = [\n    PURPOSES.ETH,\n    PURPOSES.BTC_LEGACY,\n    PURPOSES.BTC_WRAPPED_SEGWIT,\n    PURPOSES.BTC_SEGWIT,\n  ];\n  const allowedCoins = [COINS.ETH, COINS.BTC, COINS.BTC_TESTNET];\n  // These coin types were given to us by MyCrypto. They should be allowed, but we expect\n  // an Ethereum-type address with these coin types.\n  // These all use SLIP44: https://github.com/satoshilabs/slips/blob/master/slip-0044.md\n  const allowedMyCryptoCoins = [\n    60, 61, 966, 700, 9006, 9000, 1007, 553, 178, 137, 37310, 108, 40, 889,\n    1987, 820, 6060, 1620, 1313114, 76, 246529, 246785, 1001, 227, 916, 464,\n    2221, 344, 73799, 246,\n  ];\n  // Make sure firmware supports this Bitcoin path\n  const isBitcoin = path[1] === COINS.BTC || path[1] === COINS.BTC_TESTNET;\n  const isBitcoinNonWrappedSegwit =\n    isBitcoin && path[0] !== PURPOSES.BTC_WRAPPED_SEGWIT;\n  if (isBitcoinNonWrappedSegwit && !fwConstants.allowBtcLegacyAndSegwitAddrs)\n    return false;\n  // Make sure this path is otherwise valid\n  return (\n    allowedPurposes.indexOf(path[0]) >= 0 &&\n    (allowedCoins.indexOf(path[1]) >= 0 ||\n      allowedMyCryptoCoins.indexOf(path[1] - HARDENED_OFFSET) > 0)\n  );\n};\n\n/** @internal */\nexport const splitFrames = function (data: Buffer, frameSz: number): Buffer[] {\n  const frames = [];\n  const n = Math.ceil(data.length / frameSz);\n  let off = 0;\n  for (let i = 0; i < n; i++) {\n    frames.push(data.slice(off, off + frameSz));\n    off += frameSz;\n  }\n  return frames;\n};\n\n/** @internal */\nfunction isBase10NumStr(x: string): boolean {\n  const bn = new BigNum(x).toFixed().split('.').join('');\n  const s = new String(x);\n  // Note that the JS native `String()` loses precision for large numbers, but we only\n  // want to validate the base of the number so we don't care about far out precision.\n  return bn.slice(0, 8) === s.slice(0, 8);\n}\n\n/** @internal Ensure a param is represented by a buffer */\nexport const ensureHexBuffer = function (\n  x: string | number | bigint | Buffer,\n  zeroIsNull = true,\n): Buffer {\n  try {\n    const isZeroNumber = typeof x === 'number' && x === 0;\n    const isZeroBigInt = typeof x === 'bigint' && x === 0n;\n    if (x === null || ((isZeroNumber || isZeroBigInt) && zeroIsNull === true))\n      return Buffer.alloc(0);\n    const isDecimalInput =\n      typeof x === 'number' ||\n      typeof x === 'bigint' ||\n      (typeof x === 'string' && isBase10NumStr(x));\n    let hexString: string;\n    if (isDecimalInput) {\n      const formatted =\n        typeof x === 'bigint' ? x.toString(10) : (x as string | number);\n      hexString = new BigNum(formatted).toString(16);\n    } else if (typeof x === 'string' && x.slice(0, 2) === '0x') {\n      hexString = x.slice(2);\n    } else if (Buffer.isBuffer(x)) {\n      return x;\n    } else {\n      hexString = x.toString();\n    }\n    if (hexString.length % 2 > 0) hexString = `0${hexString}`;\n    if (hexString === '00' && !isDecimalInput) return Buffer.alloc(0);\n    return Buffer.from(hexString, 'hex');\n  } catch (_err) {\n    throw new Error(\n      `Cannot convert ${x.toString()} to hex buffer (${(_err as Error).message})`,\n    );\n  }\n};\n\n/** @internal */\nexport const fixLen = function (msg: Buffer, length: number): Buffer {\n  const buf = Buffer.alloc(length);\n  if (msg.length < length) {\n    msg.copy(buf, length - msg.length);\n    return buf;\n  }\n  return msg.slice(-length);\n};\n\n//--------------------------------------------------\n// CRYPTO UTILS\n//--------------------------------------------------\n/** @internal */\nexport const aes256_encrypt = function (data: Buffer, key: Buffer): Buffer {\n  const iv = Buffer.from(ProtocolConstants.aesIv);\n  const aesCbc = new aes.ModeOfOperation.cbc(key, iv);\n  const paddedData =\n    data.length % 16 === 0 ? data : aes.padding.pkcs7.pad(data);\n  return Buffer.from(aesCbc.encrypt(paddedData));\n};\n\n/** @internal */\nexport const aes256_decrypt = function (data: Buffer, key: Buffer): Buffer {\n  const iv = Buffer.from(ProtocolConstants.aesIv);\n  const aesCbc = new aes.ModeOfOperation.cbc(key, iv);\n  return Buffer.from(aesCbc.decrypt(data));\n};\n\n// Decode a DER signature. Returns signature object {r, s } or null if there is an error\n/** @internal */\nexport const parseDER = function (sigBuf: Buffer) {\n  if (sigBuf[0] !== 0x30 || sigBuf[2] !== 0x02)\n    throw new Error('Failed to decode DER signature');\n  let off = 3;\n  const rLen = sigBuf[off];\n  off++;\n  const r = sigBuf.slice(off, off + rLen);\n  off += rLen;\n  if (sigBuf[off] !== 0x02) throw new Error('Failed to decode DER signature');\n  off++;\n  const sLen = sigBuf[off];\n  off++;\n  const s = sigBuf.slice(off, off + sLen);\n  return { r, s };\n};\n\n/** @internal */\nexport const getP256KeyPair = function (priv: Buffer | string): any {\n  if (ec === undefined) ec = new EC('p256');\n  return ec.keyFromPrivate(priv, 'hex');\n};\n\n/** @internal */\nexport const getP256KeyPairFromPub = function (pub: Buffer | string): any {\n  if (ec === undefined) ec = new EC('p256');\n  // Convert Buffer to hex string if needed\n  const pubHex = Buffer.isBuffer(pub) ? pub.toString('hex') : pub;\n  return ec.keyFromPublic(pubHex, 'hex');\n};\n\n/** @internal */\nexport const buildSignerPathBuf = function (\n  signerPath: number[],\n  varAddrPathSzAllowed: boolean,\n): Buffer {\n  const buf = Buffer.alloc(24);\n  let off = 0;\n  if (varAddrPathSzAllowed && signerPath.length > 5)\n    throw new Error('Signer path must be <=5 indices.');\n  if (!varAddrPathSzAllowed && signerPath.length !== 5)\n    throw new Error(\n      'Your Lattice firmware only supports 5-index derivation paths. Please upgrade.',\n    );\n  buf.writeUInt32LE(signerPath.length, off);\n  off += 4;\n  for (let i = 0; i < 5; i++) {\n    if (i < signerPath.length) buf.writeUInt32LE(signerPath[i], off);\n    else buf.writeUInt32LE(0, off);\n    off += 4;\n  }\n  return buf;\n};\n\n//--------------------------------------------------\n// OTHER UTILS\n//--------------------------------------------------\n/** @internal */\nexport const isAsciiStr = function (\n  str: string,\n  allowFormatChars = false,\n): boolean {\n  if (typeof str !== 'string') {\n    return false;\n  }\n  const extraChars = allowFormatChars\n    ? [\n        0x0020, // Space\n        0x000a, // New line\n      ]\n    : [];\n  for (let i = 0; i < str.length; i++) {\n    const c = str.charCodeAt(i);\n    if (extraChars.indexOf(c) < 0 && (c < 0x0020 || c > 0x007f)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n/** @internal Check if a value exists in an object. Only checks first level of keys. */\nexport const existsIn = function <T>(\n  val: T,\n  obj: { [key: string]: T },\n): boolean {\n  return Object.keys(obj).some((key) => obj[key] === val);\n};\n\n/** @internal Create a buffer of size `n` and fill it with random data */\nexport const randomBytes = function (n: number): Buffer {\n  const buf = Buffer.alloc(n);\n  for (let i = 0; i < n; i++) {\n    buf[i] = Math.round(Math.random() * 255);\n  }\n  return buf;\n};\n\n/** @internal `isUInt4` accepts a number and returns true if it is a UInt4 */\nexport const isUInt4 = (n: number) => isInteger(n) && inRange(n, 0, 16);\n\n/**\n * Fetches an external JSON file containing networks indexed by chain id from a GridPlus repo, and\n * returns the parsed JSON.\n */\nasync function fetchExternalNetworkForChainId(\n  chainId: number | string,\n): Promise<{\n  [key: string]: {\n    name: string;\n    baseUrl: string;\n    apiRoute: string;\n  };\n}> {\n  try {\n    const body = await fetch(EXTERNAL_NETWORKS_BY_CHAIN_ID_URL).then((res) =>\n      res.json(),\n    );\n    if (body) {\n      return body[chainId];\n    } else {\n      return undefined;\n    }\n  } catch (_err) {\n    console.warn('Fetching external networks failed.\\n', _err);\n  }\n}\n\n/**\n * Builds a URL for fetching calldata from block explorers for any supported chains\n * */\nfunction buildUrlForSupportedChainAndAddress({ supportedChain, address }) {\n  const baseUrl = supportedChain.baseUrl;\n  const apiRoute = supportedChain.apiRoute;\n  const urlWithRoute = `${baseUrl}/${apiRoute}&address=${address}`;\n\n  const apiKey = process.env.ETHERSCAN_KEY;\n  const apiKeyParam = apiKey ? `&apiKey=${process.env.ETHERSCAN_KEY}` : '';\n\n  return urlWithRoute + apiKeyParam;\n}\n\n/**\n * Takes a list of ABI data objects and a selector, and returns the earliest ABI data object that\n * matches the selector.\n */\nexport function selectDefFrom4byteABI(abiData: any[], selector: string) {\n  if (abiData.length > 1) {\n    console.warn('WARNING: There are multiple results. Using the first one.');\n  }\n  let def;\n  abiData\n    .sort((a, b) => {\n      const aTime = new Date(a.created_at).getTime();\n      const bTime = new Date(b.created_at).getTime();\n      return aTime - bTime;\n    })\n    .find((result) => {\n      try {\n        def = Calldata.EVM.parsers.parseCanonicalName(\n          selector,\n          result.text_signature,\n        );\n        return !!def;\n      } catch (_err) {\n        console.error('Failed to parse canonical name:', _err);\n        return false;\n      }\n    });\n  if (def) {\n    return def;\n  } else {\n    throw new Error('Could not find definition for selector');\n  }\n}\n\nexport async function fetchWithTimeout(\n  url: string,\n  options: RequestInit & { timeout?: number },\n): Promise<Response> {\n  const { timeout = 8000 } = options;\n  const controller = new AbortController();\n  const timeoutId = setTimeout(() => controller.abort(), timeout);\n  const response = await fetch(url, {\n    ...options,\n    signal: controller.signal,\n  });\n  clearTimeout(timeoutId);\n  return response;\n}\n\nasync function fetchAndCache(\n  url: string,\n  opts?: RequestInit,\n): Promise<Response> {\n  try {\n    if (globalThis.caches && globalThis.Request) {\n      const cache = await caches.open('gp-calldata');\n      const request = new Request(url, opts);\n      const match = await cache.match(request);\n      if (match) {\n        return match;\n      } else {\n        const response = await fetch(request, opts);\n        const responseClone = response.clone();\n        const data = await response.json();\n        if (\n          response.ok &&\n          (isValidBlockExplorerResponse(data) || isValid4ByteResponse(data))\n        ) {\n          await cache.put(request, responseClone);\n          return cache.match(request);\n        }\n        return response;\n      }\n    } else {\n      return fetch(url, opts);\n    }\n  } catch (err) {\n    console.error(err);\n    throw err;\n  }\n}\n\nasync function fetchSupportedChainData(\n  address: string,\n  supportedChain: number,\n) {\n  const url = buildUrlForSupportedChainAndAddress({ address, supportedChain });\n  return fetchAndCache(url)\n    .then((res) => res.json())\n    .then((body) => {\n      if (body && body.result) {\n        try {\n          return JSON.parse(body.result);\n        } catch {\n          throw new Error(\n            `Invalid JSON in response: ${body.result.substring(0, 50)}`,\n          );\n        }\n      } else {\n        throw new Error('Server response was malformed');\n      }\n    })\n    .catch((error) => {\n      console.log(error);\n      throw new Error('Fetching data from external network failed');\n    });\n}\n\nasync function fetch4byteData(selector: string): Promise<any> {\n  const url = `https://www.4byte.directory/api/v1/signatures/?hex_signature=0x${selector}`;\n  return await fetch(url)\n    .then((res) => res.json())\n    .then((body) => {\n      if (body && body.results) {\n        return body.results;\n      } else {\n        throw new Error('No results found');\n      }\n    })\n    .catch((err) => {\n      throw new Error(`Fetching data from 4byte failed: ${err.message}`);\n    });\n}\n\nfunction encodeDef(def: any) {\n  return Buffer.from(RLP.encode(def));\n}\n\n/**\n * Post-process fetched ABI definition.\n * @param def - Calldata decoder data definition for calling function\n * @param calldata - Raw transaction calldata\n * @return - Updated `def`\n */\nasync function postProcessDef(def, calldata) {\n  // Replace all nested defs if applicable. This is done by looping\n  // through each param in the definition and if it is of type `bytes`\n  // or `bytes[]`, checking the param value in `calldata`. If the param\n  // value (or for `bytes[]` each underlying value) is of size (4 + 32*n)\n  // it could be nested calldata. We should use that item's selector(s)\n  // to look up nested definition(s).\n  const nestedCalldata = Calldata.EVM.processors.getNestedCalldata(\n    def,\n    calldata,\n  );\n  const nestedDefs = await replaceNestedDefs(nestedCalldata);\n  // Need to recurse before doing the full replacement\n  for await (const [i] of nestedDefs.entries()) {\n    // If this is an array of nested defs, loop through each one and\n    // postprocess it. The first item of a single def is the function\n    // name so we need to check that it isn't a string in this case.\n    if (Array.isArray(nestedDefs[i]) && typeof nestedDefs[i][0] !== 'string') {\n      for await (const [j] of nestedDefs[i].entries()) {\n        if (nestedDefs[i][j] !== null) {\n          nestedDefs[i][j] = await postProcessDef(\n            nestedDefs[i][j],\n            Buffer.from(nestedCalldata[i][j].slice(2), 'hex'),\n          );\n        }\n      }\n    } else if (nestedDefs[i] !== null) {\n      nestedDefs[i] = await postProcessDef(\n        nestedDefs[i],\n        Buffer.from(nestedCalldata[i].slice(2), 'hex'),\n      );\n    }\n  }\n  // Replace any nested defs\n  const newDef = Calldata.EVM.processors.replaceNestedDefs(def, nestedDefs);\n  return newDef;\n}\n\n/**\n * Given a set of possible nested defs, slice out selectors and look up\n * definitions on 4byte.\n * @param possNestedDefs - result of `getPossibleNestedDefs` processor\n * @return Array containing calldata decoding data for each parameter\n *          that had a possible nested def. If there was no possible\n *          nested def or if a def could not be fetched from 4byte, the\n *          array item will be `null`. In the case of multiple possible\n *          defs behind one param (e.g. multicall pattern), ALL nested\n *          items must have defs associated or the item will map to a\n *          single `null` value in the return array.\n *\n */\nasync function replaceNestedDefs(possNestedDefs) {\n  // For all possible nested defs, attempt to fetch the underlying def\n  const nestedDefs = [];\n  for await (const d of possNestedDefs) {\n    if (d !== null) {\n      if (Array.isArray(d)) {\n        const _nestedDefs = [];\n        let shouldInclude = true;\n        for await (const _d of d) {\n          try {\n            const _nestedSelector = _d.slice(2, 10);\n            const _nestedAbi = await fetch4byteData(_nestedSelector);\n            const _nestedDef = selectDefFrom4byteABI(\n              _nestedAbi,\n              _nestedSelector,\n            );\n            _nestedDefs.push(_nestedDef);\n          } catch (_err) {\n            console.error('Failed to fetch nested 4byte data:', _err);\n            shouldInclude = false;\n            _nestedDefs.push(null);\n          }\n        }\n        if (shouldInclude) {\n          nestedDefs.push(_nestedDefs);\n        } else {\n          nestedDefs.push(null);\n        }\n      } else {\n        try {\n          const nestedSelector = d.slice(2, 10);\n          const nestedAbi = await fetch4byteData(nestedSelector);\n          const nestedDef = selectDefFrom4byteABI(nestedAbi, nestedSelector);\n          nestedDefs.push(nestedDef);\n        } catch (_err) {\n          console.error('Failed to fetch nested definition:', _err);\n          nestedDefs.push(null);\n        }\n      }\n    } else {\n      nestedDefs.push(null);\n    }\n  }\n  // For all nested defs, replace the\n  return nestedDefs;\n}\n\n//--------------------------------------------------\n//--------------------------------------------------\n// EXTERNAL UTILS\n//--------------------------------------------------\n//--------------------------------------------------\n/**\n *  Fetches calldata from a remote scanner based on the transaction's `chainId`\n */\nexport async function fetchCalldataDecoder(\n  _data: Uint8Array | string,\n  to: string,\n  _chainId: number | string,\n  recurse = true,\n) {\n  try {\n    // Exit if there is no data. The 2 comes from the 0x prefix, but a later\n    // check will confirm that there are at least 4 bytes of data in the buffer.\n    if (!_data || _data.length < 2) {\n      throw new Error('Data is either undefined or less than two bytes');\n    }\n    const isHexString = typeof _data === 'string' && _data.slice(0, 2) === '0x';\n    const data = isHexString\n      ? Buffer.from(_data.slice(2), 'hex')\n      : //@ts-expect-error - Buffer doesn't recognize Uint8Array type properly\n        Buffer.from(_data, 'hex');\n\n    // For empty data (just '0x'), return early - no calldata to decode\n    if (data.length === 0) {\n      return { def: null, abi: null };\n    }\n\n    if (data.length < 4) {\n      throw new Error(\n        'Data must contain at least 4 bytes of data to define the selector',\n      );\n    }\n    const selector = Buffer.from(data.slice(0, 4)).toString('hex');\n    // Convert the chainId to a number and use it to determine if we can call out to\n    // an etherscan-like explorer for richer data.\n    const chainId = Number(_chainId);\n    const cachedNetwork = NETWORKS_BY_CHAIN_ID[chainId];\n    const supportedChain = cachedNetwork\n      ? cachedNetwork\n      : await fetchExternalNetworkForChainId(chainId);\n    try {\n      if (supportedChain) {\n        const abi = await fetchSupportedChainData(to, supportedChain);\n        const parsedAbi = Calldata.EVM.parsers.parseSolidityJSONABI(\n          selector,\n          abi,\n        );\n        let def = parsedAbi.def;\n        if (recurse) {\n          def = await postProcessDef(def, data);\n        }\n        return { abi, def: encodeDef(def) };\n      } else {\n        throw new Error(`Chain (id: ${chainId}) is not supported`);\n      }\n    } catch (err) {\n      console.warn(err.message, '\\n', 'Falling back to 4byte');\n    }\n\n    // Fallback to checking 4byte\n    const abi = await fetch4byteData(selector);\n    let def = selectDefFrom4byteABI(abi, selector);\n    if (recurse) {\n      def = await postProcessDef(def, data);\n    }\n    return { abi, def: encodeDef(def) };\n  } catch (err) {\n    console.warn(`Fetching calldata failed: ${err.message}`);\n  }\n\n  return { def: null, abi: null };\n}\n\n/**\n * Generates an application secret for use in maintaining connection to device.\n * @param deviceId - The device ID of the device you want to generate a token for.\n * @param password - The password entered when connecting to the device.\n * @param appName - The name of the application.\n * @returns an application secret as a Buffer\n * @public\n */\nexport const generateAppSecret = (\n  deviceId: Buffer | string,\n  password: Buffer | string,\n  appName: Buffer | string,\n): Buffer => {\n  const deviceIdBuffer =\n    typeof deviceId === 'string' ? Buffer.from(deviceId) : deviceId;\n  const passwordBuffer =\n    typeof password === 'string' ? Buffer.from(password) : password;\n  const appNameBuffer =\n    typeof appName === 'string' ? Buffer.from(appName) : appName;\n\n  const preImage = Buffer.concat([\n    deviceIdBuffer,\n    passwordBuffer,\n    appNameBuffer,\n  ]);\n\n  return Buffer.from(Hash.sha256(preImage));\n};\n\n/**\n * Get the `v` component of signature using viem parsing.\n * @param tx - Serialized transaction (Buffer or hex string)\n * @param resp - Lattice response with sig and pubkey\n * @returns BN object containing the `v` param\n */\nexport const getV = function (tx: any, resp: any) {\n  let chainId: string | undefined;\n  let hash: Uint8Array;\n  let type: string | number | undefined;\n  let useEIP155 = false;\n\n  if (Buffer.isBuffer(tx) || typeof tx === 'string') {\n    const txHex = Buffer.isBuffer(tx)\n      ? (`0x${tx.toString('hex')}` as Hex)\n      : (tx as Hex);\n    const txBuf = Buffer.isBuffer(tx) ? tx : Buffer.from(tx.slice(2), 'hex');\n\n    hash = Buffer.from(Hash.keccak256(txBuf));\n\n    try {\n      const parsedTx = parseTransaction(txHex);\n      type = parsedTx.type;\n\n      if (parsedTx.chainId !== undefined && parsedTx.chainId !== null) {\n        chainId = parsedTx.chainId.toString();\n        if (type === 'legacy') {\n          useEIP155 = true;\n        }\n      }\n\n      if (type === 'legacy' && !useEIP155) {\n        const legacyTxArray = RLP.decode(txBuf);\n        if (legacyTxArray.length >= 9) {\n          const vBuf = legacyTxArray[6] as Uint8Array;\n          if (vBuf && vBuf.length > 0) {\n            chainId = new BN(vBuf).toString();\n            useEIP155 = true;\n          }\n        }\n      }\n    } catch (err) {\n      console.error('Failed to parse transaction, trying legacy format:', err);\n      try {\n        const txBufRaw = Buffer.isBuffer(tx)\n          ? tx\n          : Buffer.from(tx.slice(2), 'hex');\n        const legacyTxArray = RLP.decode(txBufRaw);\n\n        type = 'legacy';\n        if (legacyTxArray.length >= 9) {\n          const vBuf = legacyTxArray[6] as Uint8Array;\n          if (vBuf && vBuf.length > 0) {\n            chainId = new BN(vBuf).toString();\n            useEIP155 = true;\n          }\n        }\n      } catch {\n        throw new Error('Could not recover V. Bad transaction data.');\n      }\n    }\n  } else {\n    throw new Error(\n      'Unsupported transaction format. Expected Buffer or hex string.',\n    );\n  }\n\n  const rBuf = Buffer.isBuffer(resp.sig.r)\n    ? resp.sig.r\n    : Buffer.from(resp.sig.r.slice(2), 'hex');\n  const sBuf = Buffer.isBuffer(resp.sig.s)\n    ? resp.sig.s\n    : Buffer.from(resp.sig.s.slice(2), 'hex');\n  const rs = new Uint8Array(Buffer.concat([rBuf, sBuf]));\n  const pubkeyInput = resp.pubkey;\n\n  if (!pubkeyInput) {\n    throw new Error('Response did not include a public key.');\n  }\n\n  let pubkeyBuf: Buffer;\n  if (Buffer.isBuffer(pubkeyInput)) {\n    pubkeyBuf = Buffer.from(pubkeyInput);\n  } else if (pubkeyInput instanceof Uint8Array) {\n    pubkeyBuf = Buffer.from(pubkeyInput);\n  } else if (typeof pubkeyInput === 'string') {\n    const hex = pubkeyInput.startsWith('0x')\n      ? pubkeyInput.slice(2)\n      : pubkeyInput;\n    pubkeyBuf = Buffer.from(hex, 'hex');\n  } else {\n    pubkeyBuf = Buffer.from(pubkeyInput);\n  }\n\n  if (pubkeyBuf.length === 64) {\n    pubkeyBuf = Buffer.concat([Buffer.from([0x04]), pubkeyBuf]);\n  }\n\n  const isCompressedPubkey =\n    pubkeyBuf.length === 33 && (pubkeyBuf[0] === 0x02 || pubkeyBuf[0] === 0x03);\n  const isUncompressedPubkey = pubkeyBuf.length === 65 && pubkeyBuf[0] === 0x04;\n\n  if (!isCompressedPubkey && !isUncompressedPubkey) {\n    throw new Error('Unsupported public key format returned by device.');\n  }\n\n  const recovery0 = Buffer.from(ecdsaRecover(rs, 0, hash, isCompressedPubkey));\n  const recovery1 = Buffer.from(ecdsaRecover(rs, 1, hash, isCompressedPubkey));\n\n  const pubkeyStr = pubkeyBuf.toString('hex');\n  const recovery0Str = recovery0.toString('hex');\n  const recovery1Str = recovery1.toString('hex');\n\n  let recovery: number;\n  if (pubkeyStr === recovery0Str) {\n    recovery = 0;\n  } else if (pubkeyStr === recovery1Str) {\n    recovery = 1;\n  } else {\n    throw new Error(\n      'Failed to recover V parameter. Bad signature or transaction data.',\n    );\n  }\n\n  // Use the consolidated v parameter conversion logic\n  const result = convertRecoveryToV(recovery, {\n    chainId,\n    useEIP155,\n    type,\n  });\n\n  // Always return BN for consistent interface - convertRecoveryToV returns Buffer for typed txs\n  if (Buffer.isBuffer(result)) {\n    // For typed transactions that return recovery value (0 or 1) as buffer\n    if (result.length === 0) {\n      return new BN(0); // Empty buffer means 0\n    } else {\n      return new BN(result.toString('hex'), 16);\n    }\n  } else {\n    return result; // Already a BN\n  }\n};\n\n/**\n * Convert a recovery parameter (0/1) to the proper v value format based on transaction type.\n * Consolidates the v parameter conversion logic used across ethereum.ts and util.ts.\n *\n * @param recovery - Recovery parameter (0 or 1)\n * @param txData - Transaction data containing chainId, useEIP155, and type\n * @returns The properly formatted v value as Buffer or BN\n */\nexport const convertRecoveryToV = function (\n  recovery: number,\n  txData: any = {},\n): Buffer | InstanceType<typeof BN> {\n  const { chainId, useEIP155, type } = txData;\n\n  // For typed transactions (EIP-2930, EIP-1559, EIP-7702), we want the recoveryParam (0 or 1)\n  // rather than the `v` value because the `chainId` is already included in the\n  // transaction payload.\n  if (\n    type === 1 ||\n    type === 2 ||\n    type === 4 ||\n    type === 'eip2930' ||\n    type === 'eip1559' ||\n    type === 'eip7702'\n  ) {\n    return ensureHexBuffer(recovery, true); // 0 or 1, with 0 expected as an empty buffer\n  } else if (!useEIP155 || !chainId) {\n    // For ETH messages and non-EIP155 chains the set should be [27, 28] for `v`\n    return new BN(recovery).addn(27);\n  }\n\n  // We will use EIP155 in most cases. Convert recovery to a bignum and operate on it.\n  // Note that the protocol calls for v = (CHAIN_ID*2) + 35/36, where 35 or 36\n  // is decided on based on the ecrecover result. `recovery` is passed in as either 0 or 1\n  // so we add 35 to that.\n  return new BN(chainId).muln(2).addn(35).addn(recovery);\n};\n\n/**\n * Get the y-parity value for a signature by recovering the public key.\n *\n * Usage:\n * - Simple: getYParity(messageHash, signature, publicKey)\n * - Object: getYParity({ messageHash, signature, publicKey })\n * - Legacy: getYParity(tx, response)\n *\n * @param messageHash - The 32-byte message hash (or tx object for legacy)\n * @param signature - Object with r and s values\n * @param publicKey - Expected public key\n * @returns 0 or 1 for the y-parity value\n */\nexport const getYParity = function (\n  messageHash:\n    | Buffer\n    | Uint8Array\n    | string\n    | { messageHash: any; signature: any; publicKey: any }\n    | any,\n  signature?: { r: any; s: any } | any,\n  publicKey?: Buffer | Uint8Array | string,\n): number {\n  // Handle legacy object format for backward compatibility\n  if (\n    typeof messageHash === 'object' &&\n    messageHash &&\n    'messageHash' in messageHash\n  ) {\n    return getYParity(\n      messageHash.messageHash,\n      messageHash.signature,\n      messageHash.publicKey,\n    );\n  }\n\n  // Handle legacy transaction format for backward compatibility\n  if (signature && signature.sig && signature.pubkey && !publicKey) {\n    return getYParity(messageHash, signature.sig, signature.pubkey);\n  }\n\n  // Validate required parameters\n  if (!signature || !publicKey) {\n    throw new Error('Response with sig and pubkey required for legacy format');\n  }\n\n  if (!signature.r || !signature.s) {\n    throw new Error('Response with sig and pubkey required for legacy format');\n  }\n\n  // Handle transaction objects with getMessageToSign\n  let hash = messageHash;\n  if (\n    typeof messageHash === 'object' &&\n    messageHash &&\n    typeof messageHash.getMessageToSign === 'function'\n  ) {\n    const type = messageHash._type;\n    if (type !== undefined && type !== null) {\n      // EIP-1559 / EIP-2930 / future typed transactions\n      hash = messageHash.getMessageToSign(true);\n    } else {\n      // Legacy transaction objects\n      const preimage = RLP.encode(messageHash.getMessageToSign(false));\n      hash = Buffer.from(Hash.keccak256(preimage));\n    }\n  } else if (Buffer.isBuffer(messageHash) && messageHash.length !== 32) {\n    // If it's a buffer but not 32 bytes, hash it\n    hash = Buffer.from(Hash.keccak256(messageHash));\n  }\n\n  // Normalize inputs to Buffers\n  const toBuffer = (data: any): Buffer => {\n    if (!data) throw new Error('Invalid data');\n    if (Buffer.isBuffer(data)) return data;\n    if (data instanceof Uint8Array) return Buffer.from(data);\n    if (typeof data === 'string') {\n      return Buffer.from(data.replace(/^0x/i, ''), 'hex');\n    }\n    throw new Error('Invalid data type');\n  };\n\n  const hashBuf = toBuffer(hash);\n  const rBuf = toBuffer(signature.r);\n  const sBuf = toBuffer(signature.s);\n  const pubkeyBuf = toBuffer(publicKey);\n\n  // For non-32 byte hashes, hash them (legacy support)\n  const finalHash =\n    hashBuf.length === 32 ? hashBuf : Buffer.from(Hash.keccak256(hashBuf));\n\n  // Combine r and s\n  const rs = new Uint8Array(Buffer.concat([rBuf, sBuf]));\n  const hashBytes = new Uint8Array(finalHash);\n  const isCompressed = pubkeyBuf.length === 33;\n\n  // Try both recovery values\n  for (let recovery = 0; recovery <= 1; recovery++) {\n    try {\n      const recovered = ecdsaRecover(rs, recovery, hashBytes, isCompressed);\n      if (Buffer.from(recovered).equals(pubkeyBuf)) {\n        return recovery;\n      }\n    } catch {\n      continue;\n    }\n  }\n\n  throw new Error(\n    'Failed to recover Y parity. Bad signature or transaction data.',\n  );\n};\n\n/** @internal */\nexport const EXTERNAL = {\n  fetchCalldataDecoder,\n  generateAppSecret,\n  getV,\n  getYParity,\n  convertRecoveryToV,\n};\n","import { UInt4 } from 'bitwise/types';\nimport { Client } from '../client';\nimport { ASCII_REGEX, EMPTY_WALLET_UID, MAX_ADDR } from '../constants';\nimport { isUInt4 } from '../util';\nimport isEmpty from 'lodash/isEmpty.js';\nimport {\n  FirmwareConstants,\n  FirmwareVersion,\n  LatticeError,\n  Wallet,\n  KeyPair,\n  ActiveWallets,\n  KVRecords,\n} from '../types';\n\nexport const validateIsUInt4 = (n?: number) => {\n  if (typeof n !== 'number' || !isUInt4(n)) {\n    throw new Error('Must be an integer between 0 and 15 inclusive');\n  }\n  return n as UInt4;\n};\n\nexport const validateNAddresses = (n?: number) => {\n  if (!n) {\n    throw new Error('The number of addresses is required.');\n  }\n  if (n > MAX_ADDR) {\n    throw new Error(`You may only request ${MAX_ADDR} addresses at once.`);\n  }\n  return n;\n};\n\nexport const validateStartPath = (startPath?: number[]) => {\n  if (!startPath) {\n    throw new Error('Start path is required');\n  }\n  if (startPath.length < 1 || startPath.length > 5)\n    throw new Error('Path must include between 1 and 5 indices');\n\n  return startPath;\n};\n\nexport const validateDeviceId = (deviceId?: string) => {\n  if (!deviceId) {\n    throw new Error(\n      'No device ID has been stored. Please connect with your device ID first.',\n    );\n  }\n  return deviceId;\n};\n\nexport const validateAppName = (name?: string) => {\n  if (!name) {\n    throw new Error('Name is required.');\n  }\n  if (name.length < 5 || name.length > 24) {\n    throw new Error(\n      'Invalid length for name provided. Must be 5-24 characters.',\n    );\n  }\n  return name;\n};\n\nexport const validateUrl = (url?: string) => {\n  if (!url) {\n    throw new Error('URL does not exist. Please reconnect.');\n  }\n  try {\n    new URL(url);\n  } catch (err) {\n    console.error('Invalid URL format:', err);\n    throw new Error('Invalid URL provided. Please use a valid URL.');\n  }\n  return url;\n};\n\nexport const validateBaseUrl = (baseUrl?: string) => {\n  if (!baseUrl) {\n    throw new Error('Base URL is required.');\n  }\n  try {\n    new URL(baseUrl);\n  } catch (err) {\n    console.error('Invalid Base URL format:', err);\n    throw new Error('Invalid Base URL provided. Please use a valid URL.');\n  }\n  return baseUrl;\n};\n\nexport const validateFwConstants = (fwConstants?: FirmwareConstants) => {\n  if (!fwConstants) {\n    throw new Error('Firmware constants do not exist. Please reconnect.');\n  }\n  return fwConstants;\n};\n\nexport const validateFwVersion = (fwVersion?: FirmwareVersion) => {\n  if (!fwVersion) {\n    throw new Error('Firmware version does not exist. Please reconnect.');\n  }\n  if (\n    typeof fwVersion.fix !== 'number' ||\n    typeof fwVersion.minor !== 'number' ||\n    typeof fwVersion.major !== 'number'\n  ) {\n    throw new Error('Firmware version improperly formatted. Please reconnect.');\n  }\n  return fwVersion;\n};\n\nexport const validateRequestError = (err: LatticeError) => {\n  const isTimeout = err.code === 'ECONNABORTED' && err.errno === 'ETIME';\n  if (isTimeout) {\n    throw new Error(\n      'Timeout waiting for device. Please ensure it is connected to the internet and try again in a minute.',\n    );\n  }\n  throw new Error(`Failed to make request to device:\\n${err.message}`);\n};\n\nexport const validateWallet = (wallet?: Wallet) => {\n  if (!wallet || wallet === null) {\n    throw new Error('No active wallet.');\n  }\n  return wallet;\n};\n\nexport const validateConnectedClient = (client: Client) => {\n  const appName = validateAppName(client.getAppName());\n  const ephemeralPub = validateEphemeralPub(client.ephemeralPub);\n  const sharedSecret = validateSharedSecret(client.sharedSecret);\n  const url = validateUrl(client.url);\n  const fwConstants = validateFwConstants(client.getFwConstants());\n  const fwVersion = validateFwVersion(client.getFwVersion());\n  // @ts-expect-error - Key is private\n  const key = validateKey(client.key);\n\n  return {\n    appName,\n    ephemeralPub,\n    sharedSecret,\n    url,\n    fwConstants,\n    fwVersion,\n    key,\n  };\n};\n\nexport const validateEphemeralPub = (ephemeralPub?: KeyPair) => {\n  if (!ephemeralPub) {\n    throw new Error(\n      '`ephemeralPub` (ephemeral public key) is required. Please reconnect.',\n    );\n  }\n  return ephemeralPub;\n};\n\nexport const validateSharedSecret = (sharedSecret?: Buffer) => {\n  if (!sharedSecret) {\n    throw new Error('Shared secret required. Please reconnect.');\n  }\n  return sharedSecret;\n};\n\nexport const validateKey = (key?: KeyPair) => {\n  if (!key) {\n    throw new Error('Key is required. Please reconnect.');\n  }\n  return key;\n};\n\nexport const validateActiveWallets = (activeWallets?: ActiveWallets) => {\n  if (\n    !activeWallets ||\n    (activeWallets?.internal?.uid?.equals(EMPTY_WALLET_UID) &&\n      activeWallets?.external?.uid?.equals(EMPTY_WALLET_UID))\n  ) {\n    throw new Error('No active wallet.');\n  }\n  return activeWallets;\n};\n\nexport const validateKvRecords = (\n  records?: KVRecords,\n  fwConstants?: FirmwareConstants,\n) => {\n  if (!fwConstants || !fwConstants.kvActionsAllowed) {\n    throw new Error('Unsupported. Please update firmware.');\n  } else if (typeof records !== 'object' || Object.keys(records).length < 1) {\n    throw new Error(\n      'One or more key-value mapping must be provided in `records` param.',\n    );\n  } else if (Object.keys(records).length > fwConstants.kvActionMaxNum) {\n    throw new Error(\n      `Too many keys provided. Please only provide up to ${fwConstants.kvActionMaxNum}.`,\n    );\n  }\n  return records;\n};\n\nexport const validateKvRecord = (\n  { key, val }: KVRecords,\n  fwConstants: FirmwareConstants,\n) => {\n  if (\n    typeof key !== 'string' ||\n    String(key).length > fwConstants.kvKeyMaxStrSz\n  ) {\n    throw new Error(\n      `Key ${key} too large. Must be <=${fwConstants.kvKeyMaxStrSz} characters.`,\n    );\n  } else if (\n    typeof val !== 'string' ||\n    String(val).length > fwConstants.kvValMaxStrSz\n  ) {\n    throw new Error(\n      `Value ${val} too large. Must be <=${fwConstants.kvValMaxStrSz} characters.`,\n    );\n  } else if (String(key).length === 0 || String(val).length === 0) {\n    throw new Error('Keys and values must be >0 characters.');\n  } else if (!ASCII_REGEX.test(key) || !ASCII_REGEX.test(val)) {\n    throw new Error('Unicode characters are not supported.');\n  }\n  return { key, val };\n};\n\nexport const isValidBlockExplorerResponse = (data: any) => {\n  try {\n    const result = JSON.parse(data.result);\n    return !isEmpty(result);\n  } catch (err) {\n    console.error('Invalid block explorer response:', err);\n    return false;\n  }\n};\n\nexport const isValid4ByteResponse = (data: any) => {\n  try {\n    return !isEmpty(data.results);\n  } catch (err) {\n    console.error('Invalid 4byte response:', err);\n    return false;\n  }\n};\n","import { Hash } from 'ox';\nimport { Client } from '..';\nimport bitcoin from '../bitcoin';\nimport { EXTERNAL } from '../constants';\nimport ethereum from '../ethereum';\nimport { buildGenericSigningMsgRequest } from '../genericSigning';\nimport { fetchWithTimeout, parseLattice1Response } from '../util';\nimport { LatticeResponseError } from './errors';\nimport {\n  isDeviceBusy,\n  isInvalidEphemeralId,\n  isWrongWallet,\n  shouldUseEVMLegacyConverter,\n} from './predicates';\nimport { validateRequestError } from './validators';\nimport { Currency, FirmwareConstants, RequestParams } from '../types';\n\nexport const buildTransaction = ({\n  data,\n  currency,\n  fwConstants,\n}: {\n  data: any;\n  currency?: Currency;\n  fwConstants: FirmwareConstants;\n}) => {\n  // All transaction requests must be put into the same sized buffer. This comes from\n  // sizeof(GpTransactionRequest_t), but note we remove the 2-byte schemaId since it is not\n  // returned from our resolver. Note that different firmware versions may have different data\n  // sizes.\n\n  // TEMPORARY BRIDGE -- DEPRECATE ME In v0.15.0 Lattice firmware removed the legacy ETH\n  // signing path, so we need to convert such requests to general signing requests using the\n  // EVM decoder. NOTE: Not every request can be converted, so users should switch to using\n  // general signing requests for newer firmware versions. EIP1559 and EIP155 legacy\n  // requests will convert, but others may not.\n  if (currency === 'ETH' && shouldUseEVMLegacyConverter(fwConstants)) {\n    console.log(\n      'Using the legacy ETH signing path. This will soon be deprecated. ' +\n        'Please switch to general signing request.',\n    );\n    let payload;\n    try {\n      payload = ethereum.convertEthereumTransactionToGenericRequest(data);\n    } catch (err) {\n      console.error('Failed to convert legacy Ethereum transaction:', err);\n      throw new Error(\n        'Could not convert legacy request. Please switch to a general signing ' +\n          'request. See gridplus-sdk docs for more information.',\n      );\n    }\n    data = {\n      fwConstants,\n      encodingType: EXTERNAL.SIGNING.ENCODINGS.EVM,\n      curveType: EXTERNAL.SIGNING.CURVES.SECP256K1,\n      hashType: EXTERNAL.SIGNING.HASHES.KECCAK256,\n      signerPath: data.signerPath,\n      payload,\n    };\n    return {\n      requestData: buildGenericSigningMsgRequest({ ...data, fwConstants }),\n      isGeneric: true,\n    };\n  } else if (currency === 'ETH') {\n    // Legacy signing pathway -- should deprecate in the future\n    return {\n      requestData: ethereum.buildEthereumTxRequest({ ...data, fwConstants }),\n      isGeneric: false,\n    };\n  } else if (currency === 'ETH_MSG') {\n    return {\n      requestData: ethereum.buildEthereumMsgRequest({ ...data, fwConstants }),\n      isGeneric: false,\n    };\n  } else if (currency === 'BTC') {\n    return {\n      requestData: bitcoin.buildBitcoinTxRequest({ ...data, fwConstants }),\n      isGeneric: false,\n    };\n  }\n  return {\n    requestData: buildGenericSigningMsgRequest({ ...data, fwConstants }),\n    isGeneric: true,\n  };\n};\n\nexport const request = async ({\n  url,\n  payload,\n  timeout = 60000,\n}: RequestParams) => {\n  return fetchWithTimeout(url, {\n    method: 'POST',\n    body: JSON.stringify({ data: payload }),\n    headers: {\n      'Content-Type': 'application/json',\n    },\n    timeout,\n  })\n    .catch(validateRequestError)\n    .then((res) => res.json())\n    .then((body) => {\n      // Handle formatting or generic HTTP errors\n      if (!body || !body.message) {\n        throw new Error('Invalid response');\n      } else if (body.status !== 200) {\n        throw new Error(`Error code ${body.status}: ${body.message}`);\n      }\n\n      const { data, errorMessage, responseCode } = parseLattice1Response(\n        body.message,\n      );\n\n      if (errorMessage || responseCode) {\n        throw new LatticeResponseError(responseCode, errorMessage);\n      }\n\n      return data;\n    });\n};\n\n/**\n * `sleep()` returns a Promise that resolves after a given number of milliseconds.\n */\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Takes a function and a set of parameters, and returns a function that will retry the original\n * function with the given parameters a number of times\n *\n * @param client - a {@link Client} instance that is passed to the {@link retryWrapper}\n * @param retries - the number of times to retry the function before giving up\n * @returns a {@link retryWrapper} function for handing retry logic\n */\nexport const buildRetryWrapper = (client: Client, retries: number) => {\n  return (fn, params?) =>\n    retryWrapper({\n      fn,\n      params: { ...params, client },\n      retries,\n      client,\n    });\n};\n\n/**\n * Retries a function call if the error message or response code is present and the number of\n * retries is greater than 0.\n *\n * @param fn - The function to retry\n * @param params - The parameters to pass to the function\n * @param retries - The number of times to retry the function\n * @param client - The {@link Client} to use for side-effects\n */\nexport const retryWrapper = async ({\n  fn,\n  params,\n  retries,\n  client,\n}: {\n  fn: (...args: any[]) => Promise<any>;\n  params: any;\n  retries: number;\n  client: any;\n}) => {\n  return fn({ ...params }).catch(async (err: Error) => {\n    if (err instanceof LatticeResponseError) {\n      /** `string` returned from the Lattice if there's an error */\n      const errorMessage = err.errorMessage;\n      /** `number` returned from the Lattice if there's an error */\n      const responseCode = err.responseCode;\n\n      if ((errorMessage || responseCode) && retries) {\n        if (isDeviceBusy(responseCode)) {\n          await sleep(3000);\n        } else if (\n          isWrongWallet(responseCode) &&\n          !client.skipRetryOnWrongWallet\n        ) {\n          await client.fetchActiveWallet();\n        } else if (isInvalidEphemeralId(responseCode)) {\n          await client.connect(client.deviceId);\n        } else {\n          throw err;\n        }\n\n        return retryWrapper({\n          fn,\n          params,\n          retries: retries - 1,\n          client,\n        });\n      }\n    }\n    throw err;\n  });\n};\n\n/**\n * Get the ephemeral id, which is the first 4 bytes of the shared secret generated from the local\n * private key and the ephemeral public key from the device.\n * @internal\n * @returns Buffer\n */\nexport const getEphemeralId = (sharedSecret: Buffer) => {\n  // EphemId is the first 4 bytes of the hash of the shared secret\n  const hash = Buffer.from(Hash.sha256(sharedSecret));\n  return parseInt(hash.slice(0, 4).toString('hex'), 16);\n};\n","// Util for Bitcoin-specific functionality\nimport { bech32 } from 'bech32';\nimport bs58check from 'bs58check';\nimport { Hash } from 'ox';\nimport { ripemd160 } from 'hash.js/lib/hash/ripemd.js';\nimport { BIP_CONSTANTS } from './constants';\nimport { LatticeSignSchema } from './protocol';\nconst DEFAULT_SEQUENCE = 0xffffffff;\nconst DEFAULT_SIGHASH_BUFFER = Buffer.from('01', 'hex'); // SIGHASH_ALL = 0x01\nconst { PURPOSES, COINS } = BIP_CONSTANTS;\nconst OP = {\n  ZERO: 0x00,\n  HASH160: 0xa9,\n  DUP: 0x76,\n  EQUAL: 0x87,\n  EQUALVERIFY: 0x88,\n  CHECKSIG: 0xac,\n};\nconst SEGWIT_V0 = 0x00;\nconst SEGWIT_NATIVE_V0_PREFIX = 'bc';\nconst SEGWIT_NATIVE_V0_TESTNET_PREFIX = 'tb';\n\nconst FMT_SEGWIT_NATIVE_V0 = 0xd0;\nconst FMT_SEGWIT_NATIVE_V0_TESTNET = 0xf0;\nconst FMT_SEGWIT_WRAPPED = 0x05;\nconst FMT_SEGWIT_WRAPPED_TESTNET = 0xc4;\nconst FMT_LEGACY = 0x00;\nconst FMT_LEGACY_TESTNET = 0x6f;\nconst BTC_SCRIPT_TYPE_P2PKH = 0x01;\nconst BTC_SCRIPT_TYPE_P2SH_P2WPKH = 0x03;\nconst BTC_SCRIPT_TYPE_P2WPKH_V0 = 0x04;\n\n// We need to build two different objects here:\n// 1. bitcoinjs-lib TransactionBuilder object, which will be used in conjunction\n//    with the returned signatures to build and serialize the transaction before\n//    broadcasting it. We will replace `bitcoinjs-lib`'s signatures with the ones\n//    we get from the Lattice\n// 2. The serialized Lattice request, which includes data (outlined in the specification)\n//    that is needed to sign all of the inputs and build a change output.\n// @inputs (contained in `data`)\n// `prevOuts`: an array of objects with the following properties:\n//           a. txHash\n//           b. value\n//           c. index          -- the index of the output in the transaction\n//           d. signerPath -- the path of the address in our wallet that is signing this input\n// `recipient`: Receiving address, which must be converted to a pubkeyhash\n// `value`:     Number of satoshis to send the recipient\n// `fee`:       Number of satoshis to use for a transaction fee (should have been calculated)\n//              already based on the number of inputs plus two outputs\n// `version`:   Transaction version of the inputs. All inputs must be of the same version!\n// `isSegwit`: a boolean which determines how we serialize the data and parameterize txb\nconst buildBitcoinTxRequest = function (data) {\n  const { prevOuts, recipient, value, changePath, fee } = data;\n  if (!changePath) throw new Error('No changePath provided.');\n  if (changePath.length !== 5)\n    throw new Error('Please provide a full change path.');\n  // Serialize the request\n  const payload = Buffer.alloc(59 + 69 * prevOuts.length);\n  let off = 0;\n  // Change version byte (a.k.a. address format byte)\n  const changeFmt = getAddressFormat(changePath);\n  payload.writeUInt8(changeFmt, 0);\n  off++;\n\n  // Build the change data\n  payload.writeUInt32LE(changePath.length, off);\n  off += 4;\n  for (let i = 0; i < changePath.length; i++) {\n    payload.writeUInt32LE(changePath[i], off);\n    off += 4;\n  }\n\n  // Fee is a param\n  payload.writeUInt32LE(fee, off);\n  off += 4;\n  const dec = decodeAddress(recipient);\n  // Parameterize the recipient output\n  payload.writeUInt8(dec.versionByte, off);\n  off++;\n  dec.pkh.copy(payload, off);\n  off += dec.pkh.length;\n  writeUInt64LE(value, payload, off);\n  off += 8;\n\n  // Build the inputs from the previous outputs\n  payload.writeUInt8(prevOuts.length, off);\n  off++;\n  let inputSum = 0;\n\n  prevOuts.forEach((input) => {\n    if (!input.signerPath || input.signerPath.length !== 5) {\n      throw new Error('Full recipient path not specified ');\n    }\n    payload.writeUInt32LE(input.signerPath.length, off);\n    off += 4;\n    for (let i = 0; i < input.signerPath.length; i++) {\n      payload.writeUInt32LE(input.signerPath[i], off);\n      off += 4;\n    }\n    payload.writeUInt32LE(input.index, off);\n    off += 4;\n    writeUInt64LE(input.value, payload, off);\n    off += 8;\n    inputSum += input.value;\n    const scriptType = getScriptType(input);\n    payload.writeUInt8(scriptType, off);\n    off++;\n    if (!Buffer.isBuffer(input.txHash))\n      input.txHash = Buffer.from(input.txHash, 'hex');\n    input.txHash.copy(payload, off);\n    off += input.txHash.length;\n  });\n  // Send them back!\n  return {\n    payload,\n    schema: LatticeSignSchema.bitcoin,\n    origData: data, // We will need the original data for serializing the tx\n    changeData: {\n      // This data helps fill in the change output\n      value: inputSum - (value + fee),\n    },\n  };\n};\n\n// Serialize a transaction consisting of inputs, outputs, and some\n// metadata\n// -- inputs  = { hash, index, sig, pubkey }\n// -- outputs = { value, recipient }  // expects an address string for `recipient`\n// -- isSegwitSpend = true if the inputs are being spent using segwit\n//                    (NOTE: either ALL are being spent, or none are)\n// -- lockTime = Will probably always be 0\nconst serializeTx = function (data) {\n  const { inputs, outputs, lockTime = 0 } = data;\n  let payload = Buffer.alloc(4);\n  let off = 0;\n  // Always use version 2\n  const version = 2;\n  const useWitness = needsWitness(inputs);\n  payload.writeUInt32LE(version, off);\n  off += 4;\n  if (useWitness) {\n    payload = concat(payload, Buffer.from('00', 'hex')); // marker = 0x00\n    payload = concat(payload, Buffer.from('01', 'hex')); // flag = 0x01\n  }\n  // Serialize signed inputs\n  const numInputs = getVarInt(inputs.length);\n  payload = concat(payload, numInputs);\n  off += numInputs.length;\n  inputs.forEach((input) => {\n    payload = concat(payload, input.hash.reverse());\n    off += input.hash.length;\n    const index = getU32LE(input.index);\n    payload = concat(payload, index);\n    off += index.length;\n    const scriptType = getScriptType(input);\n    // Build the sigScript. Note that p2wpkh does not have a scriptSig.\n    if (scriptType === BTC_SCRIPT_TYPE_P2SH_P2WPKH) {\n      // Build a vector (varSlice of varSlice) containing the redeemScript\n      const redeemScript = buildRedeemScript(input.pubkey);\n      const redeemScriptLen = getVarInt(redeemScript.length);\n      const slice = Buffer.concat([redeemScriptLen, redeemScript]);\n      const sliceLen = getVarInt(slice.length);\n      payload = concat(payload, sliceLen);\n      off += sliceLen.length;\n      payload = concat(payload, slice);\n      off += slice.length;\n    } else if (scriptType === BTC_SCRIPT_TYPE_P2PKH) {\n      // Build the signature + pubkey script to spend this input\n      const slice = buildSig(input.sig, input.pubkey);\n      payload = concat(payload, slice);\n      off += slice.length;\n    } else if (scriptType === BTC_SCRIPT_TYPE_P2WPKH_V0) {\n      const emptyScript = Buffer.from('00', 'hex');\n      payload = concat(payload, emptyScript);\n      off += 1;\n    }\n    // Use the default sequence for all transactions\n    const sequence = getU32LE(DEFAULT_SEQUENCE);\n    payload = concat(payload, sequence);\n    off += sequence.length;\n  });\n  // Serialize outputs\n  const numOutputs = getVarInt(outputs.length);\n  payload = concat(payload, numOutputs);\n  off += numOutputs.length;\n  outputs.forEach((output) => {\n    const value = getU64LE(output.value);\n    payload = concat(payload, value);\n    off += value.length;\n    // Build the output locking script and write it as a var slice\n    const script = buildLockingScript(output.recipient);\n    const scriptLen = getVarInt(script.length);\n    payload = concat(payload, scriptLen);\n    off += scriptLen.length;\n    payload = concat(payload, script);\n    off += script.length;\n  });\n  // Add witness data if needed\n  if (useWitness) {\n    const sigs = [];\n    const pubkeys = [];\n    for (let i = 0; i < inputs.length; i++) {\n      sigs.push(inputs[i].sig);\n      pubkeys.push(inputs[i].pubkey);\n    }\n    const witnessSlice = buildWitness(sigs, pubkeys);\n    payload = concat(payload, witnessSlice);\n    off += witnessSlice.length;\n  }\n  // Finish with locktime\n  return Buffer.concat([payload, getU32LE(lockTime)]).toString('hex');\n};\n\n// Convert a pubkeyhash to a bitcoin base58check address with a version byte\nconst getBitcoinAddress = function (pubkeyhash, version) {\n  let bech32Prefix = null;\n  let bech32Version = null;\n  if (version === FMT_SEGWIT_NATIVE_V0) {\n    bech32Prefix = SEGWIT_NATIVE_V0_PREFIX;\n    bech32Version = SEGWIT_V0;\n  } else if (version === FMT_SEGWIT_NATIVE_V0_TESTNET) {\n    bech32Prefix = SEGWIT_NATIVE_V0_TESTNET_PREFIX;\n    bech32Version = SEGWIT_V0;\n  }\n  if (bech32Prefix !== null && bech32Version !== null) {\n    const words = bech32.toWords(pubkeyhash);\n    words.unshift(bech32Version);\n    return bech32.encode(bech32Prefix, words);\n  } else {\n    return bs58check.encode(\n      Buffer.concat([Buffer.from([version]), pubkeyhash]),\n    );\n  }\n};\n\n// Builder utils\n//-----------------------\nfunction buildRedeemScript(pubkey) {\n  const redeemScript = Buffer.alloc(22);\n  const shaHash = Buffer.from(Hash.sha256(pubkey));\n  const pubkeyhash = Buffer.from(\n    ripemd160().update(shaHash).digest('hex'),\n    'hex',\n  );\n  redeemScript.writeUInt8(OP.ZERO, 0);\n  redeemScript.writeUInt8(pubkeyhash.length, 1);\n  pubkeyhash.copy(redeemScript, 2);\n  return redeemScript;\n}\n\n// Var slice of signature + var slice of pubkey\nfunction buildSig(sig, pubkey) {\n  sig = Buffer.concat([sig, DEFAULT_SIGHASH_BUFFER]);\n  const sigLen = getVarInt(sig.length);\n  const pubkeyLen = getVarInt(pubkey.length);\n  const slice = Buffer.concat([sigLen, sig, pubkeyLen, pubkey]);\n  const len = getVarInt(slice.length);\n  return Buffer.concat([len, slice]);\n}\n\n// Witness is written as a \"vector\", which is a list of varSlices\n// prefixed by the number of items\nfunction buildWitness(sigs, pubkeys) {\n  let witness = Buffer.alloc(0);\n  // Two items in each vector (sig, pubkey)\n  const len = Buffer.alloc(1);\n  len.writeUInt8(2, 0);\n  for (let i = 0; i < sigs.length; i++) {\n    const sig = Buffer.concat([sigs[i], DEFAULT_SIGHASH_BUFFER]);\n    const sigLen = getVarInt(sig.length);\n    const pubkey = pubkeys[i];\n    const pubkeyLen = getVarInt(pubkey.length);\n    witness = Buffer.concat([witness, len, sigLen, sig, pubkeyLen, pubkey]);\n  }\n  return witness;\n}\n\n// Locking script buiders\n//-----------------------\nfunction buildLockingScript(address) {\n  const dec = decodeAddress(address);\n  switch (dec.versionByte) {\n    case FMT_SEGWIT_NATIVE_V0:\n    case FMT_SEGWIT_NATIVE_V0_TESTNET:\n      return buildP2wpkhLockingScript(dec.pkh);\n    case FMT_SEGWIT_WRAPPED:\n    case FMT_SEGWIT_WRAPPED_TESTNET:\n      return buildP2shLockingScript(dec.pkh);\n    case FMT_LEGACY:\n    case FMT_LEGACY_TESTNET:\n      return buildP2pkhLockingScript(dec.pkh);\n    default:\n      throw new Error(\n        `Unknown version byte: ${dec.versionByte}. Cannot build BTC transaction.`,\n      );\n  }\n}\n\nfunction buildP2pkhLockingScript(pubkeyhash) {\n  const out = Buffer.alloc(5 + pubkeyhash.length);\n  let off = 0;\n  out.writeUInt8(OP.DUP, off);\n  off++;\n  out.writeUInt8(OP.HASH160, off);\n  off++;\n  out.writeUInt8(pubkeyhash.length, off);\n  off++;\n  pubkeyhash.copy(out, off);\n  off += pubkeyhash.length;\n  out.writeUInt8(OP.EQUALVERIFY, off);\n  off++;\n  out.writeUInt8(OP.CHECKSIG, off);\n  off++;\n  return out;\n}\n\nfunction buildP2shLockingScript(pubkeyhash) {\n  const out = Buffer.alloc(3 + pubkeyhash.length);\n  let off = 0;\n  out.writeUInt8(OP.HASH160, off);\n  off++;\n  out.writeUInt8(pubkeyhash.length, off);\n  off++;\n  pubkeyhash.copy(out, off);\n  off += pubkeyhash.length;\n  out.writeUInt8(OP.EQUAL, off);\n  off++;\n  return out;\n}\n\nfunction buildP2wpkhLockingScript(pubkeyhash) {\n  const out = Buffer.alloc(2 + pubkeyhash.length);\n  out.writeUInt8(OP.ZERO, 0);\n  out.writeUInt8(pubkeyhash.length, 1);\n  pubkeyhash.copy(out, 2);\n  return out;\n}\n\n// Static Utils\n//----------------------\nfunction concat(base, addition) {\n  return Buffer.concat([base, addition]);\n}\n\nfunction getU64LE(x) {\n  const buffer = Buffer.alloc(8);\n  writeUInt64LE(x, buffer, 0);\n  return buffer;\n}\n\nfunction getU32LE(x) {\n  const buffer = Buffer.alloc(4);\n  buffer.writeUInt32LE(x, 0);\n  return buffer;\n}\n\nfunction getVarInt(x) {\n  let buffer: Buffer;\n  if (x < 0xfd) {\n    buffer = Buffer.alloc(1);\n    buffer.writeUInt8(x, 0);\n  } else if (x <= 0xffff) {\n    buffer = Buffer.alloc(3);\n    buffer.writeUInt8(0xfd, 0);\n    buffer.writeUInt16LE(x, 1);\n  } else if (x < 0xffffffff) {\n    buffer = Buffer.alloc(5);\n    buffer.writeUInt8(0xfe, 0);\n    buffer.writeUInt32LE(x, 1);\n  } else {\n    buffer = Buffer.alloc(9);\n    buffer.writeUInt8(0xff, 0);\n    buffer.writeUInt32LE(x >>> 0, 1);\n    buffer.writeUInt32LE((x / 0x100000000) | 0, 5);\n  }\n  return buffer;\n}\n\nfunction writeUInt64LE(n, buf, off) {\n  if (typeof n === 'number') n = n.toString(16);\n  const preBuf = Buffer.alloc(8);\n  const nStr = n.length % 2 === 0 ? n.toString(16) : `0${n.toString(16)}`;\n  const nBuf = Buffer.from(nStr, 'hex');\n  nBuf.reverse().copy(preBuf, 0);\n  preBuf.copy(buf, off);\n  return preBuf;\n}\n\nfunction decodeAddress(address) {\n  let versionByte, pkh;\n  try {\n    // Attempt to base58 decode the address. This will work for older\n    // P2PKH, P2SH, and P2SH-P2WPKH addresses\n    versionByte = bs58check.decode(address)[0];\n    pkh = Buffer.from(bs58check.decode(address).slice(1));\n  } catch (err) {\n    console.error('Failed to decode base58 address, trying bech32:', err);\n    // If we could not base58 decode, the address must be bech32 encoded.\n    // If neither decoding method works, the address is invalid.\n    try {\n      const bech32Dec = bech32.decode(address);\n      if (bech32Dec.prefix === SEGWIT_NATIVE_V0_PREFIX) {\n        versionByte = FMT_SEGWIT_NATIVE_V0;\n      } else if (bech32Dec.prefix === SEGWIT_NATIVE_V0_TESTNET_PREFIX) {\n        versionByte = FMT_SEGWIT_NATIVE_V0_TESTNET;\n      } else {\n        throw new Error('Unsupported prefix: must be bc or tb.');\n      }\n      // Make sure we decoded\n      if (bech32Dec.words[0] !== 0) {\n        throw new Error(\n          `Unsupported segwit version: must be 0, got ${bech32Dec.words[0]}`,\n        );\n      }\n      // Make sure address type is supported.\n      // We currently only support P2WPKH addresses, which bech-32decode to 33 words.\n      // P2WSH addresses are 53 words, but we do not support them.\n      // Not sure what other address types could exist, but if they exist we don't\n      // support them either.\n      if (bech32Dec.words.length !== 33) {\n        const isP2wpsh = bech32Dec.words.length === 53;\n        throw new Error(\n          `Unsupported address${\n            isP2wpsh ? ' (P2WSH not supported)' : ''\n          }: ${address}`,\n        );\n      }\n\n      pkh = Buffer.from(bech32.fromWords(bech32Dec.words.slice(1)));\n    } catch (err) {\n      throw new Error(`Unable to decode address: ${address}: ${err.message}`);\n    }\n  }\n  return { versionByte, pkh };\n}\n\n// Determine the address format (a.k.a. \"version\") depending on the\n// purpose of the dervation path.\nfunction getAddressFormat(path) {\n  if (path.length < 2) throw new Error('Path must be >1 index');\n  const purpose = path[0];\n  const coin = path[1];\n  if (purpose === PURPOSES.BTC_SEGWIT && coin === COINS.BTC) {\n    return FMT_SEGWIT_NATIVE_V0;\n  } else if (purpose === PURPOSES.BTC_SEGWIT && coin === COINS.BTC_TESTNET) {\n    return FMT_SEGWIT_NATIVE_V0_TESTNET;\n  } else if (purpose === PURPOSES.BTC_WRAPPED_SEGWIT && coin === COINS.BTC) {\n    return FMT_SEGWIT_WRAPPED;\n  } else if (\n    purpose === PURPOSES.BTC_WRAPPED_SEGWIT &&\n    coin === COINS.BTC_TESTNET\n  ) {\n    return FMT_SEGWIT_WRAPPED_TESTNET;\n  } else if (purpose === PURPOSES.BTC_LEGACY && coin === COINS.BTC) {\n    return FMT_LEGACY;\n  } else if (purpose === PURPOSES.BTC_LEGACY && coin === COINS.BTC_TESTNET) {\n    return FMT_LEGACY_TESTNET;\n  } else {\n    throw new Error(\n      'Invalid Bitcoin path provided. Cannot determine address format.',\n    );\n  }\n}\n\n// Determine the script type for an input based on its owner's derivation\n// path's `purpose` index.\n// We do not support p2sh and only issue single-key addresses from the Lattice\n// so we can determine this based on path alone.\nfunction getScriptType(input) {\n  switch (input.signerPath[0]) {\n    case PURPOSES.BTC_LEGACY:\n      return BTC_SCRIPT_TYPE_P2PKH;\n    case PURPOSES.BTC_WRAPPED_SEGWIT:\n      return BTC_SCRIPT_TYPE_P2SH_P2WPKH;\n    case PURPOSES.BTC_SEGWIT:\n      return BTC_SCRIPT_TYPE_P2WPKH_V0;\n    default:\n      throw new Error(\n        `Unsupported path purpose (${input.signerPath[0]}): cannot determine BTC script type.`,\n      );\n  }\n}\n\n// Determine if a a transaction should have a witness portion.\n// This will return true if any input is p2sh(p2wpkh) or p2wpkh.\n// We determine the script type based on the derivation path.\nfunction needsWitness(inputs) {\n  let w = false;\n  inputs.forEach((input) => {\n    if (\n      input.signerPath[0] === PURPOSES.BTC_SEGWIT ||\n      input.signerPath[0] === PURPOSES.BTC_WRAPPED_SEGWIT\n    ) {\n      w = true;\n    }\n  });\n  return w;\n}\n\nexport default {\n  buildBitcoinTxRequest,\n  serializeTx,\n  getBitcoinAddress,\n  getAddressFormat,\n};\n","// Utils for Ethereum transactions. This is effecitvely a shim of ethereumjs-util, which\n// does not have browser (or, by proxy, React-Native) support.\nimport BN from 'bignumber.js';\nimport { SignTypedDataVersion, TypedDataUtils } from '@metamask/eth-sig-util';\nimport { Hash } from 'ox';\nimport { RLP } from '@ethereumjs/rlp';\nimport secp256k1 from 'secp256k1';\nimport {\n  ASCII_REGEX,\n  HANDLE_LARGER_CHAIN_ID,\n  MAX_CHAIN_ID_BYTES,\n  ethMsgProtocol,\n  EXTERNAL,\n} from './constants';\nimport { LatticeSignSchema } from './protocol';\nimport {\n  buildSignerPathBuf,\n  ensureHexBuffer,\n  fixLen,\n  isAsciiStr,\n  splitFrames,\n  convertRecoveryToV,\n} from './util';\nimport cbor from 'cbor';\nimport bdec from 'cbor-bigdecimal';\nimport {\n  TransactionSerializable,\n  serializeTransaction,\n  type Hex,\n  hexToNumber,\n} from 'viem';\nimport {\n  type SigningPath,\n  type FirmwareConstants,\n  TransactionRequest,\n  TRANSACTION_TYPE,\n} from './types';\nimport { buildGenericSigningMsgRequest } from './genericSigning';\nimport { TransactionSchema, type FlexibleTransaction } from './schemas';\n\nconst { ecdsaRecover } = secp256k1;\n\nbdec(cbor);\n\nconst buildEthereumMsgRequest = function (input) {\n  if (!input.payload || !input.protocol || !input.signerPath)\n    throw new Error(\n      'You must provide `payload`, `signerPath`, and `protocol` arguments in the messsage request',\n    );\n  if (input.signerPath.length > 5 || input.signerPath.length < 2)\n    throw new Error('Please provide a signer path with 2-5 indices');\n  const req = {\n    schema: LatticeSignSchema.ethereumMsg,\n    payload: null,\n    input, // Save the input for later\n    msg: null, // Save the buffered message for later\n  };\n  switch (input.protocol) {\n    case 'signPersonal':\n      return buildPersonalSignRequest(req, input);\n    case 'eip712':\n      if (!input.fwConstants.eip712Supported)\n        throw new Error(\n          'EIP712 is not supported by your Lattice firmware version. Please upgrade.',\n        );\n      return buildEIP712Request(req, input);\n    default:\n      throw new Error('Unsupported protocol');\n  }\n};\n\nconst validateEthereumMsgResponse = function (res, req) {\n  const { signer, sig } = res;\n  const { input, msg, prehash = null } = req;\n  if (input.protocol === 'signPersonal') {\n    // NOTE: We are currently hardcoding networkID=1 and useEIP155=false but these\n    //       may be configurable in future versions\n    const hash = prehash\n      ? prehash\n      : Buffer.from(\n          Hash.keccak256(\n            Buffer.concat([get_personal_sign_prefix(msg.length), msg]),\n          ),\n        );\n    // Get recovery param with a `v` value of [27,28] by setting `useEIP155=false`\n    return addRecoveryParam(hash, sig, signer, {\n      chainId: 1,\n      useEIP155: false,\n    });\n  } else if (input.protocol === 'eip712') {\n    // Use the validationPayload that was created in buildEIP712Request\n    // This payload has been parsed with forJSParser=true, converting all numbers\n    // to the format that TypedDataUtils.eip712Hash expects\n    const rawPayloadForHashing = req.validationPayload || req.input.payload;\n    const payloadForHashing = req.validationPayload\n      ? cloneTypedDataPayload(req.validationPayload)\n      : normalizeTypedDataForHashing(rawPayloadForHashing);\n    const encoded = TypedDataUtils.eip712Hash(\n      payloadForHashing,\n      SignTypedDataVersion.V4,\n    );\n    const digest = prehash ? prehash : encoded;\n    // Parse chainId - it could be a number, hex string, decimal string, or bigint\n    let chainId =\n      input.payload.domain?.chainId || payloadForHashing.domain?.chainId;\n    if (typeof chainId === 'string') {\n      chainId = chainId.startsWith('0x')\n        ? parseInt(chainId, 16)\n        : parseInt(chainId, 10);\n    } else if (typeof chainId === 'bigint') {\n      chainId = Number(chainId);\n    }\n    // Get recovery param with a `v` value of [27,28] by setting `useEIP155=false`\n    return addRecoveryParam(digest, sig, signer, { chainId, useEIP155: false });\n  } else {\n    throw new Error('Unsupported protocol');\n  }\n};\n\nfunction normalizeTypedDataForHashing(value: any): any {\n  if (value === null || value === undefined) {\n    return value;\n  }\n\n  if (typeof value === 'string') {\n    const trimmed = value.trim();\n    if (/^0x[0-9a-fA-F]+$/.test(trimmed)) {\n      try {\n        const asBigInt = BigInt(trimmed);\n        if (\n          asBigInt <= BigInt(Number.MAX_SAFE_INTEGER) &&\n          asBigInt >= BigInt(Number.MIN_SAFE_INTEGER)\n        ) {\n          return Number(asBigInt);\n        }\n        return asBigInt.toString(10);\n      } catch {\n        return trimmed;\n      }\n    }\n    return trimmed;\n  }\n\n  if (typeof value === 'bigint') {\n    const asNumber = Number(value);\n    return Number.isSafeInteger(asNumber) ? asNumber : value.toString(10);\n  }\n\n  if (BN.isBigNumber(value)) {\n    const asNumber = Number(value.toString(10));\n    return Number.isSafeInteger(asNumber) ? asNumber : value.toString(10);\n  }\n\n  if (\n    value &&\n    typeof value === 'object' &&\n    typeof value.toString === 'function' &&\n    value.constructor &&\n    value.constructor.name === 'BN' &&\n    typeof value.toArray === 'function'\n  ) {\n    const str = value.toString(10);\n    const asNumber = Number(str);\n    return Number.isSafeInteger(asNumber) ? asNumber : str;\n  }\n\n  if (Buffer.isBuffer(value) || value instanceof Uint8Array) {\n    return `0x${Buffer.from(value).toString('hex')}`;\n  }\n\n  if (Array.isArray(value)) {\n    return value.map((item) => normalizeTypedDataForHashing(item));\n  }\n\n  if (typeof value === 'object') {\n    const normalized: Record<string, any> = {};\n    for (const [key, entry] of Object.entries(value)) {\n      normalized[key] = normalizeTypedDataForHashing(entry);\n    }\n    return normalized;\n  }\n\n  return value;\n}\n\nfunction cloneTypedDataPayload<T>(payload: T): T {\n  if (payload === undefined) return payload;\n  if (structuredCloneFn) {\n    return structuredCloneFn(payload);\n  }\n  return basicTypedDataClone(payload);\n}\n\nfunction basicTypedDataClone<T>(value: T): T {\n  if (value === null || typeof value !== 'object') {\n    return value;\n  }\n  if (Buffer.isBuffer(value)) {\n    return Buffer.from(value) as T;\n  }\n  if (value instanceof Uint8Array) {\n    return new Uint8Array(value) as T;\n  }\n  if (Array.isArray(value)) {\n    return value.map((item) => basicTypedDataClone(item)) as unknown as T;\n  }\n  if (BN.isBigNumber(value)) {\n    return new BN(value) as T;\n  }\n  if (\n    value &&\n    typeof value === 'object' &&\n    (value as { constructor?: { name?: string } }).constructor?.name === 'BN' &&\n    typeof (value as { clone?: () => unknown }).clone === 'function'\n  ) {\n    return (value as unknown as { clone: () => unknown }).clone() as T;\n  }\n  if (value instanceof Date) {\n    return new Date(value.getTime()) as T;\n  }\n  const cloned: Record<string, unknown> = {};\n  for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n    cloned[key] = basicTypedDataClone(entry);\n  }\n  return cloned as T;\n}\n\ntype StructuredCloneFn = <T>(value: T, transfer?: unknown) => T;\nconst structuredCloneFn: StructuredCloneFn | null =\n  typeof globalThis !== 'undefined' &&\n  typeof (globalThis as { structuredClone?: unknown }).structuredClone ===\n    'function'\n    ? (globalThis as { structuredClone: StructuredCloneFn }).structuredClone\n    : null;\n\nconst buildEthereumTxRequest = function (data) {\n  try {\n    let { chainId = 1 } = data;\n    const { signerPath, eip155 = null, fwConstants, type = null } = data;\n    const {\n      contractDeployKey,\n      extraDataFrameSz,\n      extraDataMaxFrames,\n      prehashAllowed,\n    } = fwConstants;\n    const EXTRA_DATA_ALLOWED = extraDataFrameSz > 0 && extraDataMaxFrames > 0;\n    const MAX_BASE_DATA_SZ = fwConstants.ethMaxDataSz;\n    const VAR_PATH_SZ = fwConstants.varAddrPathSzAllowed;\n    // Sanity checks:\n    // There are a handful of named chains we allow the user to reference (`chainIds`)\n    // Custom chainIDs should be either numerical or hex strings\n    if (\n      typeof chainId !== 'number' &&\n      isValidChainIdHexNumStr(chainId) === false\n    ) {\n      chainId = chainIds[chainId];\n    }\n    // If this was not a custom chainID and we cannot find the name of it, exit\n    if (!chainId) throw new Error('Unsupported chain ID or name');\n    // Sanity check on signePath\n    if (!signerPath) throw new Error('`signerPath` not provided');\n\n    // Is this a contract deployment?\n    if (data.to === null && !contractDeployKey) {\n      throw new Error(\n        'Contract deployment not supported. Please update your Lattice firmware.',\n      );\n    }\n    const isDeployment = data.to === null && contractDeployKey;\n    // We support eip1559 and eip2930 types (as well as legacy)\n    const eip1559IsAllowed =\n      fwConstants.allowedEthTxTypes &&\n      fwConstants.allowedEthTxTypes.indexOf(2) > -1;\n    const eip2930IsAllowed =\n      fwConstants.allowedEthTxTypes &&\n      fwConstants.allowedEthTxTypes.indexOf(1) > -1;\n    const isEip1559 = eip1559IsAllowed && (type === 2 || type === 'eip1559');\n    const isEip2930 = eip2930IsAllowed && (type === 1 || type === 'eip2930');\n    if (type !== null && !isEip1559 && !isEip2930)\n      throw new Error('Unsupported Ethereum transaction type');\n    // Determine if we should use EIP155 given the chainID.\n    // If we are explicitly told to use eip155, we will use it. Otherwise,\n    // we will look up if the specified chainId is associated with a chain\n    // that does not use EIP155 by default. Note that most do use EIP155.\n    let useEIP155 = chainUsesEIP155(chainId);\n    if (eip155 !== null && typeof eip155 === 'boolean') {\n      useEIP155 = eip155;\n    } else if (isEip1559 || isEip2930) {\n      // Newer transaction types do not use EIP155 since the chainId is serialized\n      useEIP155 = false;\n    }\n\n    // Hack for metamask, which sends value=null for 0 ETH transactions\n    if (!data.value) data.value = 0;\n\n    //--------------\n    // 1. BUILD THE RAW TX FOR FUTURE RLP ENCODING\n    //--------------\n    // Ensure all fields are 0x-prefixed hex strings\n    const rawTx = [];\n    // Build the transaction buffer array\n    const chainIdBytes = ensureHexBuffer(chainId);\n    const nonceBytes = ensureHexBuffer(data.nonce);\n    let gasPriceBytes;\n    const gasLimitBytes = ensureHexBuffer(data.gasLimit);\n    // Handle contract deployment (indicated by `to` being `null`)\n    // For contract deployment we write a 20-byte key to the request\n    // buffer, which gets swapped for an empty buffer in firmware.\n    let toRlpElem, toBytes;\n    if (isDeployment) {\n      toRlpElem = Buffer.alloc(0);\n      toBytes = ensureHexBuffer(contractDeployKey);\n    } else {\n      toRlpElem = ensureHexBuffer(data.to);\n      toBytes = ensureHexBuffer(data.to);\n    }\n    const valueBytes = ensureHexBuffer(data.value);\n    const dataBytes = ensureHexBuffer(data.data);\n\n    if (isEip1559 || isEip2930) {\n      // EIP1559 and EIP2930 transactions have a chainID field\n      rawTx.push(chainIdBytes);\n    }\n    rawTx.push(nonceBytes);\n    let maxPriorityFeePerGasBytes, maxFeePerGasBytes;\n    if (isEip1559) {\n      if (!data.maxPriorityFeePerGas)\n        throw new Error(\n          'EIP1559 transactions must include `maxPriorityFeePerGas`',\n        );\n      maxPriorityFeePerGasBytes = ensureHexBuffer(data.maxPriorityFeePerGas);\n      rawTx.push(maxPriorityFeePerGasBytes);\n      maxFeePerGasBytes = ensureHexBuffer(data.maxFeePerGas);\n      rawTx.push(maxFeePerGasBytes);\n      // EIP1559 renamed \"gasPrice\" to \"maxFeePerGas\", but firmware still\n      // uses `gasPrice` in the struct, so update that value here.\n      gasPriceBytes = maxFeePerGasBytes;\n    } else {\n      // EIP1559 transactions do not have the gasPrice field\n      gasPriceBytes = ensureHexBuffer(data.gasPrice);\n      rawTx.push(gasPriceBytes);\n    }\n    rawTx.push(gasLimitBytes);\n    rawTx.push(toRlpElem);\n    rawTx.push(valueBytes);\n    rawTx.push(dataBytes);\n    // We do not currently support accessList in firmware so we need to prehash if\n    // the list is non-null\n    let PREHASH_FROM_ACCESS_LIST = false;\n    if (isEip1559 || isEip2930) {\n      const accessList = [];\n      if (Array.isArray(data.accessList)) {\n        data.accessList.forEach((listItem) => {\n          const keys = [];\n          listItem.storageKeys.forEach((key) => {\n            keys.push(ensureHexBuffer(key));\n          });\n          accessList.push([ensureHexBuffer(listItem.address), keys]);\n          PREHASH_FROM_ACCESS_LIST = true;\n        });\n      }\n      rawTx.push(accessList);\n    } else if (useEIP155 === true) {\n      // Add empty v,r,s values for EIP155 legacy transactions\n      rawTx.push(chainIdBytes); // v (which is the same as chainId in EIP155 txs)\n      rawTx.push(ensureHexBuffer(null)); // r\n      rawTx.push(ensureHexBuffer(null)); // s\n    }\n    //--------------\n    // 2. BUILD THE LATTICE REQUEST PAYLOAD\n    //--------------\n    const ETH_TX_NON_DATA_SZ = 122; // Accounts for metadata and non-data params\n    const txReqPayload = Buffer.alloc(MAX_BASE_DATA_SZ + ETH_TX_NON_DATA_SZ);\n    let off = 0;\n    // 1. EIP155 switch and chainID\n    //------------------\n    txReqPayload.writeUInt8(Number(useEIP155), off);\n    off++;\n    // NOTE: Originally we designed for a 1-byte chainID, but modern rollup chains use much larger\n    // chainID values. To account for these, we will put the chainID into the `data` buffer if it\n    // is >=255. Values up to UINT64_MAX will be allowed.\n    let chainIdBuf;\n    let chainIdBufSz = 0;\n    if (useChainIdBuffer(chainId) === true) {\n      chainIdBuf = getChainIdBuf(chainId);\n      chainIdBufSz = chainIdBuf.length;\n      if (chainIdBufSz > MAX_CHAIN_ID_BYTES)\n        throw new Error('ChainID provided is too large.');\n      // Signal to Lattice firmware that it needs to read the chainId from the tx.data buffer\n      txReqPayload.writeUInt8(HANDLE_LARGER_CHAIN_ID, off);\n      off++;\n    } else {\n      // For chainIDs <255, write it to the chainId u8 slot in the main tx buffer\n      chainIdBuf = ensureHexBuffer(chainId);\n      if (chainIdBuf.length !== 1) throw new Error('Error parsing chainID');\n      chainIdBuf.copy(txReqPayload, off);\n      off += chainIdBuf.length;\n    }\n    // 2. Signer Path\n    //------------------\n    const signerPathBuf = buildSignerPathBuf(signerPath, VAR_PATH_SZ);\n    signerPathBuf.copy(txReqPayload, off);\n    off += signerPathBuf.length;\n\n    // 3. ETH TX request data\n    //------------------\n    if (nonceBytes.length > 4) throw new Error('Nonce too large');\n    nonceBytes.copy(txReqPayload, off + (4 - nonceBytes.length));\n    off += 4;\n    if (gasPriceBytes.length > 8) throw new Error('Gas price too large');\n    gasPriceBytes.copy(txReqPayload, off + (8 - gasPriceBytes.length));\n    off += 8;\n    if (gasLimitBytes.length > 4) throw new Error('Gas limit too large');\n    gasLimitBytes.copy(txReqPayload, off + (4 - gasLimitBytes.length));\n    off += 4;\n    if (toBytes.length !== 20) throw new Error('Invalid `to` address');\n    toBytes.copy(txReqPayload, off);\n    off += 20;\n    if (valueBytes.length > 32) throw new Error('Value too large');\n    valueBytes.copy(txReqPayload, off + (32 - valueBytes.length));\n    off += 32;\n\n    // Extra Tx data comes before `data` in the struct\n    let PREHASH_UNSUPPORTED = false;\n    if (fwConstants.allowedEthTxTypes) {\n      // Some types may not be supported by firmware, so we will need to prehash\n      if (PREHASH_FROM_ACCESS_LIST) {\n        PREHASH_UNSUPPORTED = true;\n      }\n      txReqPayload.writeUInt8(PREHASH_UNSUPPORTED ? 1 : 0, off);\n      off += 1;\n      // EIP1559 & EIP2930 struct version\n      if (isEip1559) {\n        txReqPayload.writeUInt8(2, off);\n        off += 1; // Eip1559 type enum value\n        if (maxPriorityFeePerGasBytes.length > 8)\n          throw new Error('maxPriorityFeePerGasBytes too large');\n        maxPriorityFeePerGasBytes.copy(\n          txReqPayload,\n          off + (8 - maxPriorityFeePerGasBytes.length),\n        );\n        off += 8; // Skip EIP1559 params\n      } else if (isEip2930) {\n        txReqPayload.writeUInt8(1, off);\n        off += 1; // Eip2930 type enum value\n        off += 8; // Skip EIP1559 params\n      } else {\n        off += 9; // Skip EIP1559 and EIP2930 params\n      }\n    }\n\n    // Flow data into extraData requests, which will follow-up transaction requests, if supported/applicable\n    const extraDataPayloads = [];\n    let prehash = null;\n\n    // Create the buffer, prefix with chainId (if needed) and add data slice\n    const dataSz = dataBytes.length || 0;\n    const chainIdExtraSz = chainIdBufSz > 0 ? chainIdBufSz + 1 : 0;\n    const dataToCopy = Buffer.alloc(dataSz + chainIdExtraSz);\n    if (chainIdExtraSz > 0) {\n      dataToCopy.writeUInt8(chainIdBufSz, 0);\n      chainIdBuf.copy(dataToCopy, 1);\n    }\n    dataBytes.copy(dataToCopy, chainIdExtraSz);\n\n    if (dataSz > MAX_BASE_DATA_SZ) {\n      // Determine sizes and run through sanity checks\n      const totalSz = dataSz + chainIdExtraSz;\n      const maxSzAllowed =\n        MAX_BASE_DATA_SZ + extraDataMaxFrames * extraDataFrameSz;\n\n      if (prehashAllowed && totalSz > maxSzAllowed) {\n        // If this payload is too large to send, but the Lattice allows a prehashed message, do that\n        prehash = Buffer.from(\n          Hash.keccak256(get_rlp_encoded_preimage(rawTx, type)),\n        );\n      } else {\n        if (\n          !EXTRA_DATA_ALLOWED ||\n          (EXTRA_DATA_ALLOWED && totalSz > maxSzAllowed)\n        )\n          throw new Error(\n            `Data field too large (got ${dataBytes.length}; must be <=${\n              maxSzAllowed - chainIdExtraSz\n            } bytes)`,\n          );\n        // Split overflow data into extraData frames\n        const frames = splitFrames(\n          dataToCopy.slice(MAX_BASE_DATA_SZ),\n          extraDataFrameSz,\n        );\n        frames.forEach((frame) => {\n          const szLE = Buffer.alloc(4);\n          szLE.writeUInt32LE(frame.length, 0);\n          extraDataPayloads.push(Buffer.concat([szLE, frame]));\n        });\n      }\n    } else if (PREHASH_UNSUPPORTED) {\n      // If something is unsupported in firmware but we want to allow such transactions,\n      // we prehash the message here.\n      prehash = Buffer.from(\n        Hash.keccak256(get_rlp_encoded_preimage(rawTx, type)),\n      );\n    }\n\n    // Write the data size (does *NOT* include the chainId buffer, if that exists)\n    txReqPayload.writeUInt16BE(dataBytes.length, off);\n    off += 2;\n    // Copy in the chainId buffer if needed\n    if (chainIdBufSz > 0) {\n      txReqPayload.writeUInt8(chainIdBufSz, off);\n      off++;\n      chainIdBuf.copy(txReqPayload, off);\n      off += chainIdBufSz;\n    }\n    // Copy the first slice of the data itself. If this payload has been pre-hashed, include it\n    // in the `data` field. This will result in a different Lattice screen being drawn.\n    if (prehash) {\n      prehash.copy(txReqPayload, off);\n      off += MAX_BASE_DATA_SZ;\n    } else {\n      dataBytes.slice(0, MAX_BASE_DATA_SZ).copy(txReqPayload, off);\n      off += MAX_BASE_DATA_SZ;\n    }\n    return {\n      rawTx,\n      type,\n      payload: txReqPayload.slice(0, off),\n      extraDataPayloads,\n      schema: LatticeSignSchema.ethereum, // We will use eth transfer for all ETH txs for v1\n      chainId,\n      useEIP155,\n      signerPath,\n    };\n  } catch (err) {\n    return { err: err.message };\n  }\n};\n\n// From ethereumjs-util\nfunction stripZeros(a) {\n  let first = a[0];\n  while (a.length > 0 && first.toString() === '0') {\n    a = a.slice(1);\n    first = a[0];\n  }\n  return a;\n}\n\n// Given a 64-byte signature [r,s] we need to figure out the v value\n// and attah the full signature to the end of the transaction payload\nconst buildEthRawTx = function (tx, sig, address) {\n  // RLP-encode the data we sent to the lattice\n  const hash = Buffer.from(\n    Hash.keccak256(get_rlp_encoded_preimage(tx.rawTx, tx.type)),\n  );\n  const newSig = addRecoveryParam(hash, sig, address, tx);\n  // Use the signature to generate a new raw transaction payload\n  // Strip the last 3 items and replace them with signature components\n  const newRawTx = tx.useEIP155 ? tx.rawTx.slice(0, -3) : tx.rawTx;\n  newRawTx.push(newSig.v);\n  // Per `ethereumjs-tx`, RLP encoding should include signature components w/ stripped zeros\n  // See: https://github.com/ethereumjs/ethereumjs-tx/blob/master/src/transaction.ts#L187\n  newRawTx.push(stripZeros(newSig.r));\n  newRawTx.push(stripZeros(newSig.s));\n  const rlpEncoded = Buffer.from(RLP.encode(newRawTx));\n  const rlpEncodedWithSig = tx.type\n    ? Buffer.concat([Buffer.from([tx.type]), rlpEncoded])\n    : rlpEncoded;\n\n  if (\n    tx.type === TRANSACTION_TYPE.EIP7702_AUTH ||\n    tx.type === TRANSACTION_TYPE.EIP7702_AUTH_LIST\n  ) {\n    // For EIP-7702 transactions, we return just the hex string\n    return rlpEncodedWithSig.toString('hex');\n  }\n\n  return { rawTx: rlpEncodedWithSig.toString('hex'), sigWithV: newSig };\n};\n\n// Attach a recovery parameter to a signature by brute-forcing ECRecover\nexport function addRecoveryParam(hashBuf, sig, address, txData = {}) {\n  try {\n    // Rebuild the keccak256 hash here so we can `ecrecover`\n    const hash = new Uint8Array(hashBuf);\n    const expectedAddrBuf = Buffer.isBuffer(address)\n      ? address\n      : ensureHexBuffer(address, false);\n    if (expectedAddrBuf.length !== 20)\n      throw new Error('Invalid signer address provided.');\n    let v = 0;\n    // Fix signature componenet lengths to 32 bytes each\n    const r = fixLen(sig.r, 32);\n    sig.r = r;\n    const s = fixLen(sig.s, 32);\n    sig.s = s;\n    // Calculate the recovery param\n    const rs = new Uint8Array(Buffer.concat([r, s]));\n    let pubkey = ecdsaRecover(rs, v, hash, false).slice(1);\n    const expectedAddrHex = expectedAddrBuf.toString('hex');\n    const recoveredAddrs: string[] = [];\n    // If the first `v` value is a match, return the sig!\n    let recovered = pubToAddrStr(pubkey);\n    recoveredAddrs.push(recovered);\n    if (recovered === expectedAddrHex) {\n      sig.v = getRecoveryParam(v, txData);\n      return sig;\n    }\n    // Otherwise, try the other `v` value\n    v = 1;\n    pubkey = ecdsaRecover(rs, v, hash, false).slice(1);\n    recovered = pubToAddrStr(pubkey);\n    recoveredAddrs.push(recovered);\n    if (recovered === expectedAddrHex) {\n      sig.v = getRecoveryParam(v, txData);\n      return sig;\n    } else {\n      // If neither is a match, we should return an error\n      throw new Error(\n        `Invalid Ethereum signature returned. expected=${expectedAddrHex}, recovered=${recoveredAddrs.join(',')}`,\n      );\n    }\n  } catch (err) {\n    if (err instanceof Error) throw err;\n    throw new Error(String(err));\n  }\n}\n\n/**\n * Normalize Lattice signature components to viem format.\n * Handles Buffer v value conversion and yParity vs v for different transaction types.\n */\nexport function normalizeLatticeSignature(\n  latticeResult: any,\n  originalTx: TransactionSerializable,\n) {\n  // Convert Buffer v value to number\n  let vValue: number;\n  if (Buffer.isBuffer(latticeResult.sig.v)) {\n    // Read entire buffer as big-endian integer\n    // Single byte: <Buffer 26> = 0x26 = 38\n    // Multi-byte: <Buffer 01 35> = 0x0135 = 309 (Polygon chainId 137 with EIP-155)\n    const bufferLength = latticeResult.sig.v.length;\n    if (bufferLength === 1) {\n      vValue = latticeResult.sig.v.readUInt8(0);\n    } else if (bufferLength === 2) {\n      vValue = latticeResult.sig.v.readUInt16BE(0);\n    } else if (bufferLength <= 4) {\n      vValue = latticeResult.sig.v.readUInt32BE(Math.max(0, 4 - bufferLength));\n    } else {\n      // For very large buffers, read as hex and convert\n      vValue = parseInt(latticeResult.sig.v.toString('hex'), 16);\n    }\n  } else if (typeof latticeResult.sig.v === 'number') {\n    vValue = latticeResult.sig.v;\n  } else if (typeof latticeResult.sig.v === 'string') {\n    vValue = hexToNumber(latticeResult.sig.v as Hex);\n  } else {\n    vValue = Number(latticeResult.sig.v);\n  }\n\n  // For typed transactions (non-legacy), viem expects yParity instead of v\n  if (originalTx.type !== 'legacy') {\n    // Convert v to yParity (v is either 27/28 or 0/1)\n    const yParity = vValue >= 27 ? vValue - 27 : vValue;\n    return {\n      ...originalTx,\n      r: latticeResult.sig.r as Hex,\n      s: latticeResult.sig.s as Hex,\n      yParity,\n    };\n  } else {\n    // Legacy transactions use v directly as BigInt\n    const result = {\n      ...originalTx,\n      r: latticeResult.sig.r as Hex,\n      s: latticeResult.sig.s as Hex,\n      v: BigInt(vValue),\n    };\n\n    // For legacy transactions, remove the type field to ensure Viem treats it as legacy\n    delete result.type;\n\n    // Also remove any typed transaction fields that might confuse viem\n    delete result.maxFeePerGas;\n    delete result.maxPriorityFeePerGas;\n    delete result.accessList;\n    delete result.authorizationList;\n\n    return result;\n  }\n}\n\n// Convert an RLP-serialized transaction (plus signature) into a transaction hash\nconst hashTransaction = function (serializedTx) {\n  return Hash.keccak256(Buffer.from(serializedTx, 'hex'));\n};\n\n// Returns address string given public key buffer\nfunction pubToAddrStr(pub) {\n  return Buffer.from(Hash.keccak256(pub)).slice(-20).toString('hex');\n}\n\n// Convert a 0/1 `v` into a recovery param:\n// * For non-EIP155 transactions, return `27 + v`\n// * For EIP155 transactions, return `(CHAIN_ID*2) + 35 + v`\n// Uses the consolidated convertRecoveryToV function from util.ts\nfunction getRecoveryParam(v, txData: any = {}) {\n  const result = convertRecoveryToV(v, txData);\n\n  // convertRecoveryToV returns Buffer for typed transactions, BN for legacy\n  // Always return Buffer to maintain compatibility with existing code\n  if (Buffer.isBuffer(result)) {\n    return result;\n  } else {\n    // Convert BN result to hex buffer\n    return ensureHexBuffer(`0x${result.toString(16)}`);\n  }\n}\n\nconst chainIds = {\n  mainnet: 1,\n  roptsten: 3,\n  rinkeby: 4,\n  kovan: 42,\n  goerli: 5,\n};\n\n// Get a buffer containing the chainId value.\n// Returns a 1, 2, 4, or 8 byte buffer with the chainId encoded in big endian\nfunction getChainIdBuf(chainId) {\n  let b;\n  // If our chainID is a hex string, we can convert it to a hex\n  // buffer directly\n  if (true === isValidChainIdHexNumStr(chainId)) b = ensureHexBuffer(chainId);\n  // If our chainID is a base-10 number, parse with bignumber.js and convert to hex buffer\n  else b = ensureHexBuffer(`0x${new BN(chainId).toString(16)}`);\n  // Make sure the buffer is an allowed size\n  if (b.length > 8) throw new Error('ChainID provided is too large.');\n  // If this matches a u16, u32, or u64 size, return it now\n  if (b.length <= 2 || b.length === 4 || b.length === 8) return b;\n  // For other size buffers, we need to pack into u32 or u64 before returning;\n  let buf;\n  if (b.length === 3) {\n    buf = Buffer.alloc(4);\n    buf.writeUInt32BE(chainId);\n  } else if (b.length <= 8) {\n    buf = Buffer.alloc(8);\n    b.copy(buf, 8 - b.length);\n  }\n  return buf;\n}\n\n// Determine if the chain uses EIP155 by default, based on the chainID\nfunction chainUsesEIP155(chainID) {\n  switch (chainID) {\n    case 3: // ropsten\n    case 4: // rinkeby\n      return false;\n    case 1: // mainnet\n    case 42: // kovan\n    case 5: // goerli\n    default:\n      // all others should use eip155\n      return true;\n  }\n}\n\n// Determine if a valid number was passed in as a hex string\nfunction isValidChainIdHexNumStr(s) {\n  if (typeof s !== 'string') return false;\n  if (s.slice(0, 2) !== '0x') return false;\n  try {\n    const b = new BN(s, 16);\n    return b.isNaN() === false;\n  } catch (err) {\n    console.error('Invalid chain ID hex string:', err);\n    return false;\n  }\n}\n\n// If this is a nubmer that fits in one byte, we don't need to add it\n// to the `data` buffer of the main transaction.\n// Note the one edge case: we still need to use the `data` field for chainID=255.\nfunction useChainIdBuffer(id) {\n  const buf = getChainIdBuf(id);\n  if (buf.length === 1) return buf.readUInt8(0) === 255;\n  return true;\n}\n\nfunction buildPersonalSignRequest(req, input) {\n  const MAX_BASE_MSG_SZ = input.fwConstants.ethMaxMsgSz;\n  const VAR_PATH_SZ = input.fwConstants.varAddrPathSzAllowed;\n  const L = 24 + MAX_BASE_MSG_SZ + 4;\n  let off = 0;\n  req.payload = Buffer.alloc(L);\n  req.payload.writeUInt8(ethMsgProtocol.SIGN_PERSONAL, 0);\n  off += 1;\n  // Write the signer path into the buffer\n  const signerPathBuf = buildSignerPathBuf(input.signerPath, VAR_PATH_SZ);\n  signerPathBuf.copy(req.payload, off);\n  off += signerPathBuf.length;\n  // Write the payload buffer. The payload can come in either as a buffer or as a string\n  let payload = input.payload;\n  // Determine if this is a hex string\n  let displayHex = false;\n  if (typeof input.payload === 'string') {\n    if (input.payload.slice(0, 2) === '0x') {\n      payload = ensureHexBuffer(input.payload);\n      displayHex =\n        false ===\n        ASCII_REGEX.test(Buffer.from(input.payload.slice(2), 'hex').toString());\n    } else {\n      if (false === isAsciiStr(input.payload))\n        throw new Error(\n          'Currently, the Lattice can only display ASCII strings.',\n        );\n      payload = Buffer.from(input.payload);\n    }\n  } else if (typeof input.displayHex === 'boolean') {\n    // If this is a buffer and the user has specified whether or not this\n    // is a hex buffer with the optional argument, write that\n    displayHex = input.displayHex;\n  } else {\n    // Otherwise, determine if this buffer is an ASCII string. If it is, set `displayHex` accordingly.\n    // NOTE: THIS MEANS THAT NON-ASCII STRINGS WILL DISPLAY AS HEX SINCE WE CANNOT KNOW IF THE REQUESTER\n    //        EXPECTED NON-ASCII CHARACTERS TO DISPLAY IN A STRING\n    // TODO: Develop a more elegant solution for this\n    if (!input.payload.toString) throw new Error('Unsupported input data type');\n    displayHex = false === ASCII_REGEX.test(input.payload.toString());\n  }\n  const fwConst = input.fwConstants;\n  let maxSzAllowed =\n    MAX_BASE_MSG_SZ + fwConst.extraDataMaxFrames * fwConst.extraDataFrameSz;\n  if (fwConst.personalSignHeaderSz) {\n    // Account for the personal_sign header string\n    maxSzAllowed -= fwConst.personalSignHeaderSz;\n  }\n  if (fwConst.ethMsgPreHashAllowed && payload.length > maxSzAllowed) {\n    // If this message will not fit and pre-hashing is allowed, do that\n    req.payload.writeUInt8(displayHex, off);\n    off += 1;\n    req.payload.writeUInt16LE(payload.length, off);\n    off += 2;\n    const prehash = Buffer.from(\n      Hash.keccak256(\n        Buffer.concat([get_personal_sign_prefix(payload.length), payload]),\n      ),\n    );\n    prehash.copy(req.payload, off);\n    req.prehash = prehash;\n  } else {\n    // Otherwise we can fit the payload.\n    // Flow data into extraData requests, which will follow-up transaction requests, if supported/applicable\n    const extraDataPayloads = getExtraData(payload, input);\n    // Write the payload and metadata into our buffer\n    req.extraDataPayloads = extraDataPayloads;\n    req.msg = payload;\n    req.payload.writeUInt8(displayHex, off);\n    off += 1;\n    req.payload.writeUInt16LE(payload.length, off);\n    off += 2;\n    payload.copy(req.payload, off);\n  }\n  return req;\n}\n\nfunction buildEIP712Request(req, input) {\n  const { ethMaxMsgSz, varAddrPathSzAllowed, eip712MaxTypeParams } =\n    input.fwConstants;\n  const { TYPED_DATA } = ethMsgProtocol;\n  const L = 24 + ethMaxMsgSz + 4;\n  let off = 0;\n  req.payload = Buffer.alloc(L);\n  req.payload.writeUInt8(TYPED_DATA.enumIdx, 0);\n  off += 1;\n  // Write the signer path\n  const signerPathBuf = buildSignerPathBuf(\n    input.signerPath,\n    varAddrPathSzAllowed,\n  );\n  signerPathBuf.copy(req.payload, off);\n  off += signerPathBuf.length;\n  // Parse/clean the EIP712 payload, serialize with CBOR, and write to the payload\n  const data = cloneTypedDataPayload(input.payload);\n  if (!data.primaryType || !data.types[data.primaryType])\n    throw new Error(\n      'primaryType must be specified and the type must be included.',\n    );\n  if (!data.message || !data.domain)\n    throw new Error('message and domain must be specified.');\n  if (0 > Object.keys(data.types).indexOf('EIP712Domain'))\n    throw new Error('EIP712Domain type must be defined.');\n  // Parse the payload to ensure we have valid EIP712 data types and that\n  // they are encoded such that Lattice firmware can parse them.\n  // We need two different encodings: one to send to the Lattice in a format that plays\n  // nicely with our firmware CBOR decoder. The other is formatted to be consumable by\n  // our EIP712 validation module.\n  // IMPORTANT: Create a new object for the validation payload instead of modifying input.payload\n  // in place, so that validation uses the correctly formatted data\n  const validationPayload = cloneTypedDataPayload(data);\n  validationPayload.message = parseEIP712Msg(\n    cloneTypedDataPayload(data.message),\n    cloneTypedDataPayload(data.primaryType),\n    cloneTypedDataPayload(data.types),\n    true,\n  );\n  validationPayload.domain = parseEIP712Msg(\n    cloneTypedDataPayload(data.domain),\n    'EIP712Domain',\n    cloneTypedDataPayload(data.types),\n    true,\n  );\n  // Store the validation payload separately without modifying input.payload\n  req.validationPayload = validationPayload;\n\n  data.domain = parseEIP712Msg(data.domain, 'EIP712Domain', data.types, false);\n  data.message = parseEIP712Msg(\n    data.message,\n    data.primaryType,\n    data.types,\n    false,\n  );\n  // Now build the message to be sent to the Lattice\n  const payload = Buffer.from(cbor.encode(data));\n  const fwConst = input.fwConstants;\n  const maxSzAllowed =\n    ethMaxMsgSz + fwConst.extraDataMaxFrames * fwConst.extraDataFrameSz;\n  // Determine if we need to prehash\n  let shouldPrehash = payload.length > maxSzAllowed;\n  Object.keys(data.types).forEach((k) => {\n    if (data.types[k].length > eip712MaxTypeParams) {\n      shouldPrehash = true;\n    }\n  });\n  if (fwConst.ethMsgPreHashAllowed && shouldPrehash) {\n    // If this payload is too large to send, but the Lattice allows a prehashed message, do that\n    req.payload.writeUInt16LE(payload.length, off);\n    off += 2;\n    const prehash = TypedDataUtils.eip712Hash(\n      req.validationPayload,\n      SignTypedDataVersion.V4,\n    );\n    const prehashBuf = Buffer.from(prehash);\n    prehashBuf.copy(req.payload, off);\n    req.prehash = prehash;\n  } else {\n    const extraDataPayloads = getExtraData(payload, input);\n    req.extraDataPayloads = extraDataPayloads;\n    req.payload.writeUInt16LE(payload.length, off);\n    off += 2;\n    payload.copy(req.payload, off);\n    off += payload.length;\n    // Slice out the part of the buffer that we didn't use.\n    req.payload = req.payload.slice(0, off);\n  }\n  return req;\n}\n\nfunction getExtraData(payload, input) {\n  const { ethMaxMsgSz, extraDataFrameSz, extraDataMaxFrames } =\n    input.fwConstants;\n  const MAX_BASE_MSG_SZ = ethMaxMsgSz;\n  const EXTRA_DATA_ALLOWED = extraDataFrameSz > 0 && extraDataMaxFrames > 0;\n  const extraDataPayloads = [];\n  if (payload.length > MAX_BASE_MSG_SZ) {\n    // Determine sizes and run through sanity checks\n    const maxSzAllowed =\n      MAX_BASE_MSG_SZ + extraDataMaxFrames * extraDataFrameSz;\n    if (!EXTRA_DATA_ALLOWED)\n      throw new Error(\n        `Your message is ${payload.length} bytes, but can only be a maximum of ${MAX_BASE_MSG_SZ}`,\n      );\n    else if (EXTRA_DATA_ALLOWED && payload.length > maxSzAllowed)\n      throw new Error(\n        `Your message is ${payload.length} bytes, but can only be a maximum of ${maxSzAllowed}`,\n      );\n    // Split overflow data into extraData frames\n    const frames = splitFrames(\n      payload.slice(MAX_BASE_MSG_SZ),\n      extraDataFrameSz,\n    );\n    frames.forEach((frame) => {\n      const szLE = Buffer.alloc(4);\n      szLE.writeUInt32LE(frame.length, 0);\n      extraDataPayloads.push(Buffer.concat([szLE, frame]));\n    });\n  }\n  return extraDataPayloads;\n}\n\nfunction parseEIP712Msg(msg, typeName, types, forJSParser = false) {\n  const type = types[typeName];\n  type.forEach((item) => {\n    const isArrayType = item.type.indexOf('[') > -1;\n    const singularType = isArrayType\n      ? item.type.slice(0, item.type.indexOf('['))\n      : item.type;\n    const isCustomType = Object.keys(types).indexOf(singularType) > -1;\n    if (isCustomType && Array.isArray(msg)) {\n      // For custom types we need to jump into the `msg` using the key (name of type) and\n      // parse that entire sub-struct as if it were a message.\n      // We will recurse into sub-structs until we reach a level where every item is an\n      // elementary (i.e. non-custom) type.\n      // For arrays, we need to loop through each message item.\n      for (let i = 0; i < msg.length; i++) {\n        msg[i][item.name] = parseEIP712Msg(\n          msg[i][item.name],\n          singularType,\n          types,\n          forJSParser,\n        );\n      }\n    } else if (isCustomType) {\n      // Not an array means we can jump directly into the sub-struct to convert\n      msg[item.name] = parseEIP712Msg(\n        msg[item.name],\n        singularType,\n        types,\n        forJSParser,\n      );\n    } else if (Array.isArray(msg)) {\n      // If we have an array for this particular type and the type we are parsing\n      // is *not* a custom type, loop through the array elements and convert the types.\n      for (let i = 0; i < msg.length; i++) {\n        if (isArrayType) {\n          // If this type is itself an array, loop through those elements and parse individually.\n          // This code is not reachable for custom types so we assume these are arrays of\n          // elementary types.\n          for (let j = 0; j < msg[i][item.name].length; j++) {\n            msg[i][item.name][j] = parseEIP712Item(\n              msg[i][item.name][j],\n              singularType,\n              forJSParser,\n            );\n          }\n        } else {\n          // Non-arrays parse + replace one value for the elementary type\n          msg[i][item.name] = parseEIP712Item(\n            msg[i][item.name],\n            singularType,\n            forJSParser,\n          );\n        }\n      }\n    } else if (isArrayType) {\n      // If we have an elementary array type and a non-array message level,\n      //loop through the array and parse + replace  each item individually.\n      for (let i = 0; i < msg[item.name].length; i++) {\n        msg[item.name][i] = parseEIP712Item(\n          msg[item.name][i],\n          singularType,\n          forJSParser,\n        );\n      }\n    } else {\n      // If this is a singular elementary type, simply parse + replace.\n      msg[item.name] = parseEIP712Item(\n        msg[item.name],\n        singularType,\n        forJSParser,\n      );\n    }\n  });\n\n  return msg;\n}\n\nfunction parseEIP712Item(data, type, forJSParser = false) {\n  if (type === 'bytes') {\n    // Variable sized bytes need to be buffer type\n    data = ensureHexBuffer(data);\n    if (forJSParser) {\n      // For EIP712 encoding module it's easier to encode hex strings\n      data = `0x${data.toString('hex')}`;\n    }\n  } else if (type.slice(0, 5) === 'bytes') {\n    // Fixed sizes bytes need to be buffer type. We also add some sanity checks.\n    const nBytes = parseInt(type.slice(5));\n    data = ensureHexBuffer(data);\n    // Edge case to handle empty bytesN values\n    if (data.length === 0) {\n      data = Buffer.alloc(nBytes);\n    }\n    if (data.length !== nBytes)\n      throw new Error(`Expected ${type} type, but got ${data.length} bytes`);\n    if (forJSParser) {\n      // For EIP712 encoding module it's easier to encode hex strings\n      data = `0x${data.toString('hex')}`;\n    }\n  } else if (type === 'address') {\n    // Address must be a 20 byte buffer\n    data = ensureHexBuffer(data);\n    // Edge case to handle the 0-address\n    if (data.length === 0) {\n      data = Buffer.alloc(20);\n    }\n    if (data.length !== 20)\n      throw new Error(\n        `Address type must be 20 bytes, but got ${data.length} bytes`,\n      );\n    // For EIP712 encoding module it's easier to encode hex strings\n    if (forJSParser) {\n      data = `0x${data.toString('hex')}`;\n    }\n  } else if (\n    ethMsgProtocol.TYPED_DATA.typeCodes[type] &&\n    type.indexOf('uint') === -1 &&\n    type.indexOf('int') > -1\n  ) {\n    // Handle signed integers using bignumber.js directly\n    if (forJSParser) {\n      // For EIP712 encoding in this module we need hex strings for signed ints too\n      const bn = new BN(data);\n      // Preserve full precision by returning the decimal string representation\n      data = bn.toFixed();\n    } else {\n      // `bignumber.js` is needed for `cbor` encoding, which gets sent to the Lattice and plays\n      // nicely with its firmware cbor lib.\n      // NOTE: If we instantiate a `bignumber.js` object, it will not match what `borc` creates\n      // when run inside of the browser (i.e. MetaMask). Thus we introduce this hack to make sure\n      // we are creating a compatible type.\n      // TODO: Find another cbor lib that is compataible with the firmware's lib in a browser\n      // context. This is surprisingly difficult - I tried several libs and only cbor/borc have\n      // worked (borc is a supposedly \"browser compatible\" version of cbor)\n      data = new BN(data);\n    }\n  } else if (\n    ethMsgProtocol.TYPED_DATA.typeCodes[type] &&\n    (type.indexOf('uint') > -1 || type.indexOf('int') > -1)\n  ) {\n    // For uints, convert to a buffer and do some sanity checking.\n    // Note that we could probably just use bignumber.js directly as we do with\n    // signed ints, but this code is battle tested and we don't want to change it.\n    let b = ensureHexBuffer(data);\n    // Edge case to handle 0-value bignums\n    if (b.length === 0) {\n      b = Buffer.from('00', 'hex');\n    }\n    // Uint256s should be encoded as bignums.\n    if (forJSParser) {\n      // For EIP712 encoding in this module we need hex strings to represent the numbers\n      data = `0x${b.toString('hex')}`;\n    } else {\n      // Load into bignumber.js used by cbor lib\n      data = new BN(b.toString('hex'), 16);\n    }\n  } else if (type === 'bool') {\n    // Booleans need to be cast to a u8\n    data = data === true ? 1 : 0;\n  }\n  // Other types don't need to be modified\n  return data;\n}\n\nfunction get_personal_sign_prefix(L) {\n  return Buffer.from(\n    `\\u0019Ethereum Signed Message:\\n${L.toString()}`,\n    'utf-8',\n  );\n}\n\nfunction get_rlp_encoded_preimage(rawTx, txType) {\n  if (txType) {\n    return Buffer.concat([\n      Buffer.from([txType]),\n      Buffer.from(RLP.encode(rawTx)),\n    ]);\n  } else {\n    return Buffer.from(RLP.encode(rawTx));\n  }\n}\n\n/**\n * Normalizes a flexible transaction input object into a `viem`-compatible\n * `TransactionSerializable` object. It uses a comprehensive `zod` schema\n * to validate, parse, and transform various input formats into a consistent,\n * secure, and well-typed structure. This function serves as the single entry\n * point for handling all EVM transaction types.\n *\n * @param tx - A flexible transaction object. Can be a legacy, EIP-1559,\n * EIP-2930, or EIP-7702 transaction with fields in various formats (e.g.,\n * hex strings, numbers, bigints).\n * @returns A `viem`-compatible `TransactionSerializable` object.\n */\nexport const normalizeToViemTransaction = (\n  tx: unknown,\n): TransactionSerializable => {\n  const parsed = TransactionSchema.parse(tx);\n\n  return {\n    ...parsed,\n    to: parsed.to as Hex,\n    data: parsed.data as Hex,\n    gas: parsed.gas,\n    value: parsed.value,\n    nonce: parsed.nonce,\n    chainId: parsed.chainId,\n    gasPrice: 'gasPrice' in parsed ? parsed.gasPrice : undefined,\n    maxFeePerGas: 'maxFeePerGas' in parsed ? parsed.maxFeePerGas : undefined,\n    maxPriorityFeePerGas:\n      'maxPriorityFeePerGas' in parsed\n        ? parsed.maxPriorityFeePerGas\n        : undefined,\n    accessList: 'accessList' in parsed ? parsed.accessList : undefined,\n    authorizationList:\n      'authorizationList' in parsed ? parsed.authorizationList : undefined,\n  };\n};\n\n/**\n * Convert Ethereum transaction to serialized bytes for generic signing.\n * Bridge function for firmware v0.15.0+ which removed legacy ETH signing paths.\n */\nconst convertEthereumTransactionToGenericRequest = function (\n  req: FlexibleTransaction,\n) {\n  // Use the unified normalization and serialization pipeline.\n  // 1. Normalize the potentially varied input to a standard viem format.\n  const viemTx = normalizeToViemTransaction(req);\n  // 2. Serialize the transaction to RLP-encoded bytes.\n  const serializedTx = serializeTransaction(viemTx);\n  return Buffer.from(serializedTx.slice(2), 'hex');\n};\n\n// Type for Ethereum generic signing request\ntype EthereumGenericSigningRequestParams = FlexibleTransaction & {\n  fwConstants: FirmwareConstants;\n  signerPath: SigningPath;\n};\n\n/**\n * Build complete generic signing request for Ethereum transactions.\n * One-step function combining transaction conversion and generic signing setup.\n */\nexport const buildEthereumGenericSigningRequest = function (\n  req: EthereumGenericSigningRequestParams,\n) {\n  const { fwConstants, signerPath, ...txData } = req;\n\n  const payload = convertEthereumTransactionToGenericRequest(txData);\n\n  return buildGenericSigningMsgRequest({\n    fwConstants,\n    encodingType: EXTERNAL.SIGNING.ENCODINGS.EVM,\n    curveType: EXTERNAL.SIGNING.CURVES.SECP256K1,\n    hashType: EXTERNAL.SIGNING.HASHES.KECCAK256,\n    signerPath,\n    payload,\n  });\n};\n\n/**\n * Serializes an EIP7702 transaction using Viem.\n *\n * @param tx The EIP7702 transaction to serialize\n * @returns The serialized transaction as a hex string\n */\nexport function serializeEIP7702Transaction(tx: TransactionRequest): Hex {\n  if (\n    tx.type !== TRANSACTION_TYPE.EIP7702_AUTH_LIST &&\n    tx.type !== TRANSACTION_TYPE.EIP7702_AUTH\n  ) {\n    throw new Error(\n      `Only EIP-7702 auth transactions (type ${TRANSACTION_TYPE.EIP7702_AUTH}) and auth-list transactions (type ${TRANSACTION_TYPE.EIP7702_AUTH_LIST}) are supported`,\n    );\n  }\n\n  // Type guard to ensure we have an EIP7702 transaction with appropriate authorization data\n  const hasAuthList = 'authorizationList' in tx;\n  const hasSingleAuth = 'authorization' in tx;\n\n  if (!hasAuthList && !hasSingleAuth) {\n    throw new Error(\n      'Transaction does not have authorization or authorizationList property',\n    );\n  }\n\n  // For type 4 transactions, convert single authorization to array format\n  let authorizationList: any[];\n  if (tx.type === TRANSACTION_TYPE.EIP7702_AUTH) {\n    if (!hasSingleAuth) {\n      throw new Error(\n        'EIP-7702 auth transaction (type 4) must contain authorization property',\n      );\n    }\n    authorizationList = [(tx as any).authorization];\n  } else {\n    // Type 5 transaction - only handle authorizationList field\n    if (hasAuthList) {\n      authorizationList = (tx as any).authorizationList;\n    } else {\n      throw new Error(\n        'EIP-7702 auth list transaction (type 5) must contain authorizationList property',\n      );\n    }\n  }\n\n  // Validate that all required fields exist\n  if (\n    !authorizationList ||\n    !Array.isArray(authorizationList) ||\n    authorizationList.length === 0\n  ) {\n    throw new Error(\n      'EIP-7702 transaction must contain at least one authorization',\n    );\n  }\n\n  // Validate each authorization\n  authorizationList.forEach((auth, index) => {\n    if (!auth.address) {\n      throw new Error(\n        `Authorization at index ${index} is missing a contract address`,\n      );\n    }\n  });\n\n  // Validate required transaction fields\n  if (!tx.to) {\n    throw new Error('EIP-7702 transaction must include a valid \"to\" address');\n  }\n\n  // Convert to Viem's expected format\n  const viemTx = {\n    type: 'eip7702' as const,\n    chainId: tx.chainId,\n    nonce: tx.nonce,\n    maxPriorityFeePerGas:\n      typeof tx.maxPriorityFeePerGas === 'string'\n        ? BigInt(tx.maxPriorityFeePerGas)\n        : tx.maxPriorityFeePerGas,\n    maxFeePerGas:\n      typeof tx.maxFeePerGas === 'string'\n        ? BigInt(tx.maxFeePerGas)\n        : tx.maxFeePerGas,\n    gas:\n      typeof (tx as any).gas === 'string'\n        ? BigInt((tx as any).gas)\n        : (tx as any).gas ||\n          (typeof (tx as any).gasLimit === 'string'\n            ? BigInt((tx as any).gasLimit)\n            : (tx as any).gasLimit),\n    to: tx.to as `0x${string}`,\n    value: typeof tx.value === 'string' ? BigInt(tx.value) : tx.value,\n    data: tx.data || '0x',\n    authorizationList: authorizationList.map((auth, idx) => {\n      // Create the Viem-formatted authorization\n      // Ensure proper address handling with 0x prefix\n      const address = auth.address || '';\n      const addressStr =\n        typeof address === 'string'\n          ? address.startsWith('0x')\n            ? address\n            : `0x${address}`\n          : `0x`;\n\n      if (!addressStr || addressStr === '0x') {\n        throw new Error(\n          `Authorization at index ${idx} is missing a valid address`,\n        );\n      }\n\n      // Handle viem's SignedAuthorization format\n      if ('signature' in auth && auth.signature) {\n        // Viem format with nested signature\n        return {\n          chainId: auth.chainId,\n          address: addressStr as `0x${string}`,\n          nonce: BigInt(auth.nonce || 0),\n          signature: auth.signature,\n        };\n      } else {\n        // Direct signature properties (r, s, yParity/v)\n        return {\n          chainId: auth.chainId,\n          address: addressStr as `0x${string}`,\n          nonce: BigInt(auth.nonce || 0),\n          signature: {\n            yParity:\n              typeof auth.yParity === 'number'\n                ? auth.yParity\n                : typeof auth.yParity === 'string'\n                  ? auth.yParity === '0x01' ||\n                    auth.yParity === '0x1' ||\n                    auth.yParity === '1'\n                    ? 1\n                    : 0\n                  : 0,\n            r: auth.r || '0x0',\n            s: auth.s || '0x0',\n          },\n        };\n      }\n    }),\n  };\n\n  return serializeTransaction(viemTx as any);\n}\n\nexport const isEip7702Transaction = (tx: TransactionRequest): boolean => {\n  return (\n    typeof tx === 'object' &&\n    'type' in tx &&\n    (tx.type === TRANSACTION_TYPE.EIP7702_AUTH_LIST ||\n      tx.type === TRANSACTION_TYPE.EIP7702_AUTH)\n  );\n};\n\nexport default {\n  buildEthereumMsgRequest,\n  validateEthereumMsgResponse,\n  buildEthereumTxRequest,\n  buildEthRawTx,\n  hashTransaction,\n  chainIds,\n  ensureHexBuffer,\n  normalizeToViemTransaction,\n  convertEthereumTransactionToGenericRequest,\n  buildEthereumGenericSigningRequest,\n};\n","import type {\n  Address,\n  Hex,\n  TypedData,\n  TypedDataDefinition,\n  AccessList,\n  SignedAuthorization,\n  SignedAuthorizationList,\n} from 'viem';\nimport { Client } from '../client';\nimport { Currency, SigningPath, Wallet } from './client';\nimport { FirmwareConstants } from './firmware';\n\nexport type ETH_MESSAGE_PROTOCOLS = 'eip712' | 'signPersonal';\n\nexport const TRANSACTION_TYPE = {\n  LEGACY: 0,\n  EIP2930: 1,\n  EIP1559: 2,\n  EIP7702_AUTH: 4,\n  EIP7702_AUTH_LIST: 5,\n} as const;\n\n// Base transaction request with common fields\ntype BaseTransactionRequest = {\n  from?: Address;\n  to: Address;\n  value?: Hex | bigint;\n  data?: Hex;\n  chainId: number;\n  nonce: number;\n  gasLimit?: Hex | bigint;\n};\n\n// Legacy transaction request\ntype LegacyTransactionRequest = BaseTransactionRequest & {\n  type: typeof TRANSACTION_TYPE.LEGACY;\n  gasPrice: Hex | bigint;\n};\n\n// EIP-2930 transaction request\ntype EIP2930TransactionRequest = BaseTransactionRequest & {\n  type: typeof TRANSACTION_TYPE.EIP2930;\n  gasPrice: Hex | bigint;\n  accessList?: AccessList;\n};\n\n// EIP-1559 transaction request\ntype EIP1559TransactionRequest = BaseTransactionRequest & {\n  type: typeof TRANSACTION_TYPE.EIP1559;\n  maxFeePerGas: Hex | bigint;\n  maxPriorityFeePerGas: Hex | bigint;\n  accessList?: AccessList;\n};\n\n// EIP-7702 single authorization transaction request (type 4)\nexport type EIP7702AuthTransactionRequest = BaseTransactionRequest & {\n  type: typeof TRANSACTION_TYPE.EIP7702_AUTH;\n  maxFeePerGas: Hex | bigint;\n  maxPriorityFeePerGas: Hex | bigint;\n  accessList?: AccessList;\n  authorization: SignedAuthorization;\n};\n\n// EIP-7702 authorization list transaction request (type 5)\nexport type EIP7702AuthListTransactionRequest = BaseTransactionRequest & {\n  type: typeof TRANSACTION_TYPE.EIP7702_AUTH_LIST;\n  maxFeePerGas: Hex | bigint;\n  maxPriorityFeePerGas: Hex | bigint;\n  accessList?: AccessList;\n  authorizationList: SignedAuthorizationList;\n};\n\n// Main discriminated union for transaction requests\nexport type TransactionRequest =\n  | LegacyTransactionRequest\n  | EIP2930TransactionRequest\n  | EIP1559TransactionRequest\n  | EIP7702AuthTransactionRequest\n  | EIP7702AuthListTransactionRequest;\n\nexport interface SigningPayload<\n  TTypedData extends TypedData | Record<string, unknown> = TypedData,\n> {\n  signerPath: SigningPath;\n  payload:\n    | Uint8Array\n    | Uint8Array[]\n    | Buffer\n    | Buffer[]\n    | Hex\n    | EIP712MessagePayload<TTypedData>;\n  curveType: number;\n  hashType: number;\n  encodingType?: number;\n  protocol?: ETH_MESSAGE_PROTOCOLS;\n  decoder?: Buffer;\n}\n\nexport interface SignRequestParams<\n  TTypedData extends TypedData | Record<string, unknown> = TypedData,\n> {\n  data: SigningPayload<TTypedData> | BitcoinSignPayload;\n  currency?: Currency;\n  cachedData?: unknown;\n  nextCode?: Buffer;\n}\n\nexport interface SignRequestFunctionParams<\n  TTypedData extends TypedData | Record<string, unknown> = TypedData,\n> extends SignRequestParams<TTypedData> {\n  client: Client;\n}\n\nexport interface EncodeSignRequestParams {\n  fwConstants: FirmwareConstants;\n  wallet: Wallet;\n  requestData: unknown;\n  cachedData?: unknown;\n  nextCode?: Buffer;\n}\n\nexport interface SignRequest {\n  payload: Buffer;\n  schema: number;\n}\n\nexport interface EthSignRequest extends SignRequest {\n  curveType: number;\n  encodingType: number;\n  hashType: number;\n  omitPubkey: boolean;\n  origPayloadBuf: Buffer;\n  extraDataPayloads: Buffer[];\n}\n\nexport interface EthMsgSignRequest extends SignRequest {\n  input: {\n    signerPath: SigningPath;\n    payload: Buffer;\n    protocol: string;\n    fwConstants: FirmwareConstants;\n  };\n}\n\nexport interface BitcoinSignRequest extends SignRequest {\n  origData: {\n    prevOuts: PreviousOutput[];\n    recipient: string;\n    value: number;\n    fee: number;\n    changePath: number[];\n    fwConstants: FirmwareConstants;\n  };\n  changeData?: { value: number };\n}\n\nexport type PreviousOutput = {\n  txHash: string;\n  value: number;\n  index: number;\n  signerPath: number[];\n};\n\nexport type BitcoinSignPayload = {\n  prevOuts: PreviousOutput[];\n  recipient: string;\n  value: number;\n  fee: number;\n  changePath: number[];\n};\n\nexport interface DecodeSignResponseParams {\n  data: Buffer;\n  request: SignRequest;\n  isGeneric: boolean;\n  currency?: Currency;\n}\n\n// Align EIP712MessagePayload with Viem's TypedDataDefinition\nexport interface EIP712MessagePayload<\n  TTypedData extends TypedData | Record<string, unknown> = TypedData,\n  TPrimaryType extends keyof TTypedData | 'EIP712Domain' = keyof TTypedData,\n> {\n  types: TTypedData;\n  domain: TTypedData extends TypedData\n    ? TypedDataDefinition<TTypedData, 'EIP712Domain'>['domain']\n    : Record<string, unknown>;\n  primaryType: TPrimaryType;\n  message: TTypedData extends TypedData\n    ? TypedDataDefinition<TTypedData, TPrimaryType>['message']\n    : Record<string, unknown>;\n}\n","/**\nGeneric signing module. Any payload can be sent to the Lattice and\nwill be displayed in full (note that \\n and \\t characters will be\ndisplayed as line breaks and tabs on the screen).\n\nThis payload should be coupled with:\n* Signer's BIP44 path\n* Curve on which to derive the signing key\n* Hash function to use on the message\n*/\nimport { Hash } from 'ox';\nimport { RLP } from '@ethereumjs/rlp';\nimport {\n  parseTransaction,\n  serializeTransaction,\n  type Hex,\n  type TransactionSerializable,\n} from 'viem';\n// keccak256 now imported from ox via Hash module\nimport { HARDENED_OFFSET } from './constants';\nimport { Constants } from './index';\nimport { LatticeSignSchema } from './protocol';\nimport {\n  buildSignerPathBuf,\n  existsIn,\n  fixLen,\n  getYParity,\n  getV,\n  parseDER,\n  splitFrames,\n} from './util';\n\nexport const buildGenericSigningMsgRequest = function (req) {\n  const {\n    signerPath,\n    curveType,\n    hashType,\n    encodingType = null,\n    decoder = null,\n    omitPubkey = false,\n    fwConstants,\n    blsDst = Constants.SIGNING.BLS_DST.BLS_DST_NUL,\n  } = req;\n  const {\n    extraDataFrameSz,\n    extraDataMaxFrames,\n    prehashAllowed,\n    genericSigning,\n    varAddrPathSzAllowed,\n  } = fwConstants;\n  const {\n    curveTypes,\n    encodingTypes,\n    hashTypes,\n    baseDataSz,\n    baseReqSz,\n    calldataDecoding,\n  } = genericSigning;\n  const encodedPayload = getEncodedPayload(\n    req.payload,\n    encodingType,\n    encodingTypes,\n  );\n  const { encoding } = encodedPayload;\n  let { payloadBuf } = encodedPayload;\n  const origPayloadBuf = payloadBuf;\n  let payloadDataSz = payloadBuf.length;\n  // Size of data payload that can be included in the first/base request\n  const maxExpandedSz = baseDataSz + extraDataMaxFrames * extraDataFrameSz;\n  // Sanity checks\n  if (!payloadDataSz) {\n    throw new Error('Payload could not be handled.');\n  } else if (\n    !genericSigning ||\n    !extraDataFrameSz ||\n    !extraDataMaxFrames ||\n    !prehashAllowed\n  ) {\n    throw new Error('Unsupported. Please update your Lattice firmware.');\n  } else if (!existsIn(curveType, curveTypes)) {\n    throw new Error('Unsupported curve type.');\n  } else if (!existsIn(hashType, hashTypes)) {\n    throw new Error('Unsupported hash type.');\n  }\n\n  // If there is a decoder attached to our payload, add it to\n  // the data field of the request.\n  const hasDecoder =\n    decoder && calldataDecoding && decoder.length <= calldataDecoding.maxSz;\n  // Make sure the payload AND decoder data fits in the firmware buffer.\n  // If it doesn't, we can't include the decoder because the payload will likely\n  // be pre-hashed and the decoder data isn't part of the message to sign.\n  const decoderFits =\n    hasDecoder && payloadBuf.length + decoder.length <= maxExpandedSz;\n  if (hasDecoder && decoderFits) {\n    const decoderBuf = Buffer.alloc(8 + decoder.length);\n    // First write th reserved word\n    decoderBuf.writeUInt32LE(calldataDecoding.reserved, 0);\n    // Then write size, then the data\n    decoderBuf.writeUInt32LE(decoder.length, 4);\n    Buffer.from(decoder).copy(decoderBuf, 8);\n    payloadBuf = Buffer.concat([payloadBuf, decoderBuf]);\n  }\n\n  // Ed25519 specific sanity checks\n  if (curveType === curveTypes.ED25519) {\n    if (hashType !== hashTypes.NONE) {\n      throw new Error('Signing on ed25519 requires unhashed message');\n    }\n    signerPath.forEach((idx) => {\n      if (idx < HARDENED_OFFSET) {\n        throw new Error(\n          'Signing on ed25519 requires all signer path indices be hardened.',\n        );\n      }\n    });\n  }\n  // BLS12_381 specific processing\n  else if (curveType === curveTypes.BLS12_381_G2) {\n    // For BLS signing we need to prefix 4 bytes to represent the\n    // domain separator (DST). If none is provided, we use the default\n    // value of DST_NUL.\n    const blsDstBuf = Buffer.alloc(4);\n    blsDstBuf.writeUInt32LE(blsDst);\n    payloadBuf = Buffer.concat([blsDstBuf, payloadBuf]);\n    payloadDataSz += blsDstBuf.length;\n  }\n\n  // Build the request buffer with metadata and then the payload to sign.\n  const buf = Buffer.alloc(baseReqSz);\n  let off = 0;\n  buf.writeUInt32LE(encoding, off);\n  off += 4;\n  buf.writeUInt8(hashType, off);\n  off += 1;\n  buf.writeUInt8(curveType, off);\n  off += 1;\n  const signerPathBuf = buildSignerPathBuf(signerPath, varAddrPathSzAllowed);\n  signerPathBuf.copy(buf, off);\n  off += signerPathBuf.length;\n  buf.writeUInt8(omitPubkey ? 1 : 0, off);\n  off += 1;\n\n  // Flow data into extraData requests if applicable\n  const extraDataPayloads = [];\n  let prehash = null;\n\n  let didPrehash = false;\n  if (payloadBuf.length > baseDataSz) {\n    if (prehashAllowed && payloadBuf.length > maxExpandedSz) {\n      // If we prehash, we need to provide the full payload size\n      buf.writeUInt16LE(payloadBuf.length, off);\n      off += 2;\n      didPrehash = true;\n      // If we have to prehash, only hash the actual payload data, i.e. exclude\n      // any optional calldata decoder data.\n      const payloadData = payloadBuf.slice(0, payloadDataSz);\n      // If this payload is too large to send, but the Lattice allows a prehashed message, do that\n      if (hashType === hashTypes.NONE) {\n        // This cannot be done for ED25519 signing, which must sign the full message\n        throw new Error(\n          'Message too large to send and could not be prehashed (hashType=NONE).',\n        );\n      } else if (hashType === hashTypes.KECCAK256) {\n        prehash = Buffer.from(Hash.keccak256(payloadData));\n      } else if (hashType === hashTypes.SHA256) {\n        prehash = Buffer.from(Hash.sha256(payloadData));\n      } else {\n        throw new Error('Unsupported hash type.');\n      }\n    } else {\n      // Split overflow data into extraData frames\n      const frames = splitFrames(\n        payloadBuf.slice(baseDataSz),\n        extraDataFrameSz,\n      );\n      frames.forEach((frame) => {\n        const szLE = Buffer.alloc(4);\n        szLE.writeUInt32LE(frame.length, 0);\n        extraDataPayloads.push(Buffer.concat([szLE, frame]));\n      });\n    }\n  }\n\n  // If we didn't prehash, we know the full request (including calldata info) fits.\n  // Set the payload size to only include message data. This will inform firmware\n  // where to slice off calldata info.\n  if (!didPrehash) {\n    buf.writeUInt16LE(payloadDataSz, off);\n    off += 2;\n  }\n\n  // If the message had to be prehashed, we will only copy the hash data into the request.\n  // Otherwise copy as many payload bytes into the request as possible. Follow up data\n  // from `frames` will come in follow up requests.\n  const toCopy = prehash ? prehash : payloadBuf;\n  toCopy.copy(buf, off);\n\n  // Return all the necessary data\n  return {\n    payload: buf,\n    extraDataPayloads,\n    schema: LatticeSignSchema.generic,\n    curveType,\n    encodingType,\n    hashType,\n    omitPubkey,\n    origPayloadBuf,\n  };\n};\n\nexport const parseGenericSigningResponse = function (res, off, req) {\n  const parsed = {\n    pubkey: null,\n    sig: null,\n  };\n  let digestFromResponse: Buffer | undefined;\n  // Parse BIP44 path\n  // Parse pubkey and then sig\n  if (req.curveType === Constants.SIGNING.CURVES.SECP256K1) {\n    // Handle `GpEccPubkey256_t`\n    if (!req.omitPubkey) {\n      const compression = res.readUInt8(off);\n      off += 1;\n      if (compression === 0x02 || compression === 0x03) {\n        // Compressed key - only copy x\n        parsed.pubkey = Buffer.alloc(33);\n        parsed.pubkey.writeUInt8(compression, 0);\n        res.slice(off, off + 32).copy(parsed.pubkey, 1);\n      } else if (compression === 0x04) {\n        // Uncompressed key\n        parsed.pubkey = Buffer.alloc(65);\n        parsed.pubkey.writeUInt8(compression, 0);\n        res.slice(off).copy(parsed.pubkey, 1);\n      } else {\n        throw new Error('Bad compression byte in signing response.');\n      }\n      off += 64;\n    } else {\n      // Skip pubkey section\n      off += 65;\n    }\n    // Handle `GpECDSASig_t`\n    const sigLength = 2 + res[off + 1];\n    const derSlice = res.slice(off, off + sigLength);\n    const derSig = parseDER(derSlice);\n    // Remove any leading zeros in signature components to ensure\n    // the result is a 64 byte sig\n    const rBuf = fixLen(derSig.r, 32);\n    const sBuf = fixLen(derSig.s, 32);\n\n    parsed.sig = {\n      r: `0x${rBuf.toString('hex')}`,\n      s: `0x${sBuf.toString('hex')}`,\n    };\n    off += sigLength;\n    if (res.length >= off + 32) {\n      digestFromResponse = Buffer.from(res.slice(off, off + 32));\n      off += 32;\n    }\n\n    if (req.encodingType === Constants.SIGNING.ENCODINGS.EVM) {\n      // Full EVM transaction - use getV for proper chainId/EIP-155 handling\n      const vBn = getV(req.origPayloadBuf, parsed);\n      parsed.sig.v = BigInt(vBn.toString());\n      populateViemSignedTx(parsed.sig.v, req, parsed);\n    } else if (\n      req.hashType === Constants.SIGNING.HASHES.KECCAK256 &&\n      req.encodingType !== Constants.SIGNING.ENCODINGS.EVM\n    ) {\n      // Generic Keccak256 message - determine if it looks like a transaction\n      let isTransaction = false;\n\n      try {\n        let bufferToDecode = req.origPayloadBuf;\n\n        // Try to skip EIP-2718 type byte if present\n        if (bufferToDecode[0] <= 0x7f) {\n          bufferToDecode = bufferToDecode.slice(1);\n        }\n\n        const decoded = RLP.decode(bufferToDecode);\n        // A legacy transaction has 9 fields (or 6 if pre-EIP155)\n        isTransaction = Array.isArray(decoded) && decoded.length >= 6;\n      } catch {\n        isTransaction = false;\n      }\n\n      if (isTransaction) {\n        try {\n          // If it looks like a transaction, use the robust getV\n          const vBn = getV(req.origPayloadBuf, parsed);\n          parsed.sig.v = BigInt(vBn.toString());\n          populateViemSignedTx(parsed.sig.v, req, parsed);\n        } catch (err) {\n          console.error(\n            'Failed to get V from transaction, using fallback:',\n            err,\n          );\n          // Fall back to simple recovery if getV fails (e.g., malformed RLP)\n          // Use the correct hash type specified in the request\n          const msgHash = computeMessageHash(req, digestFromResponse);\n          const yParity = getYParity({\n            messageHash: msgHash,\n            signature: parsed.sig,\n            publicKey: parsed.pubkey,\n          });\n          parsed.sig.v = BigInt(27 + yParity);\n        }\n      } else {\n        // Generic message - use simple recovery (v = 27 + recoveryId)\n        // Use the correct hash type specified in the request\n        const msgHash = computeMessageHash(req, digestFromResponse);\n        const yParity = getYParity({\n          messageHash: msgHash,\n          signature: parsed.sig,\n          publicKey: parsed.pubkey,\n        });\n        parsed.sig.v = BigInt(27 + yParity);\n      }\n    }\n  } else if (req.curveType === Constants.SIGNING.CURVES.ED25519) {\n    if (!req.omitPubkey) {\n      // Handle `GpEdDSAPubkey_t`\n      parsed.pubkey = Buffer.alloc(32);\n      res.slice(off, off + 32).copy(parsed.pubkey);\n    }\n    off += 32;\n    // Handle `GpEdDSASig_t`\n    parsed.sig = {\n      r: `0x${res.slice(off, off + 32).toString('hex')}`,\n      s: `0x${res.slice(off + 32, off + 64).toString('hex')}`,\n    };\n    off += 64;\n  } else if (req.curveType === Constants.SIGNING.CURVES.BLS12_381_G2) {\n    if (!req.omitPubkey) {\n      // Handle `GpBLS12_381_G1Pub_t`\n      parsed.pubkey = Buffer.alloc(48);\n      res.slice(off, off + 48).copy(parsed.pubkey);\n    }\n    off += 48;\n    // Handle `GpBLS12_381_G2Sig_t`\n    parsed.sig = Buffer.alloc(96);\n    res.slice(off, off + 96).copy(parsed.sig);\n    off += 96;\n  } else {\n    throw new Error('Unsupported curve.');\n  }\n  return parsed;\n};\n\nfunction computeMessageHash(\n  req: {\n    hashType: number;\n    origPayloadBuf: Buffer;\n  },\n  digestFromResponse?: Buffer,\n): Buffer {\n  if (\n    digestFromResponse &&\n    digestFromResponse.length === 32 &&\n    digestFromResponse.some((byte) => byte !== 0)\n  ) {\n    return digestFromResponse;\n  }\n  if (req.hashType === Constants.SIGNING.HASHES.SHA256) {\n    return Buffer.from(Hash.sha256(req.origPayloadBuf));\n  }\n  if (req.hashType === Constants.SIGNING.HASHES.KECCAK256) {\n    return Buffer.from(Hash.keccak256(req.origPayloadBuf));\n  }\n  throw new Error('Unsupported hash type for message hash computation.');\n}\n\n// Reconstruct a viem-compatible signed transaction string from the raw payload and\n// recovered signature so consumers can compare or broadcast without extra parsing.\nfunction populateViemSignedTx(\n  sigV: bigint,\n  req: any,\n  parsed: { sig: { r: string; s: string; v?: bigint }; viemTx?: string },\n) {\n  if (req.encodingType !== Constants.SIGNING.ENCODINGS.EVM) return;\n\n  try {\n    const rawTxHex = `0x${req.origPayloadBuf.toString('hex')}` as Hex;\n    const parsedTx: any = parseTransaction(rawTxHex);\n\n    const baseTx: any = {\n      chainId: parsedTx.chainId,\n      to: parsedTx.to ?? undefined,\n      value: parsedTx.value ?? 0n,\n      data: (parsedTx.data ?? '0x') as Hex,\n      nonce: parsedTx.nonce ?? 0n,\n      gas: parsedTx.gas ?? parsedTx.gasLimit ?? 0n,\n    };\n\n    if (parsedTx.maxFeePerGas !== undefined) {\n      baseTx.maxFeePerGas = parsedTx.maxFeePerGas;\n    }\n    if (parsedTx.maxPriorityFeePerGas !== undefined) {\n      baseTx.maxPriorityFeePerGas = parsedTx.maxPriorityFeePerGas;\n    }\n    if (parsedTx.gasPrice !== undefined) {\n      baseTx.gasPrice = parsedTx.gasPrice;\n    }\n    if (parsedTx.accessList !== undefined) {\n      baseTx.accessList = parsedTx.accessList;\n    }\n    if (parsedTx.authorizationList !== undefined) {\n      baseTx.authorizationList = parsedTx.authorizationList;\n    }\n\n    if (parsedTx.type !== undefined && parsedTx.type !== null) {\n      baseTx.type = parsedTx.type;\n    }\n\n    const signature =\n      parsedTx.type === 'legacy' || parsedTx.type === undefined\n        ? {\n            v: sigV,\n            r: parsed.sig.r as Hex,\n            s: parsed.sig.s as Hex,\n          }\n        : {\n            yParity: Number(sigV),\n            r: parsed.sig.r as Hex,\n            s: parsed.sig.s as Hex,\n          };\n\n    parsed.viemTx = serializeTransaction(\n      baseTx as TransactionSerializable,\n      signature as any,\n    );\n  } catch (_err) {\n    console.debug('Failed to build viemTx from response', _err);\n  }\n}\n\nexport const getEncodedPayload = function (\n  payload,\n  encoding,\n  allowedEncodings,\n) {\n  if (!encoding) {\n    encoding = Constants.SIGNING.ENCODINGS.NONE;\n  }\n  // Make sure the encoding type specified is supported by firmware\n  if (!existsIn(encoding, allowedEncodings)) {\n    throw new Error(\n      'Encoding not supported by Lattice firmware. You may want to update.',\n    );\n  }\n  let payloadBuf;\n  if (!payload) {\n    throw new Error('No payload included');\n  }\n  if (typeof payload === 'string' && payload.slice(0, 2) === '0x') {\n    payloadBuf = Buffer.from(payload.slice(2), 'hex');\n  } else {\n    payloadBuf = Buffer.from(payload);\n  }\n  // Build the request with the specified encoding type\n  return {\n    payloadBuf,\n    encoding,\n  };\n};\n","import { z } from 'zod';\nimport { type Hex, isHex, hexToBigInt, isAddress, getAddress } from 'viem';\nimport { TRANSACTION_TYPE } from '../types';\n\n// Helper to handle various numeric inputs and convert them to BigInt.\n// It also validates that the value is not negative.\nconst toPositiveBigInt = z\n  .union([\n    z.string().regex(/^(0x[0-9a-fA-F]+|[0-9]+)$/, 'Invalid number format'),\n    z.number(),\n    z.bigint(),\n  ])\n  .transform((val, ctx) => {\n    try {\n      const b =\n        typeof val === 'string' && isHex(val) ? hexToBigInt(val) : BigInt(val);\n      if (b < 0n) {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message: 'Value must be non-negative',\n        });\n        return z.NEVER;\n      }\n      return b;\n    } catch {\n      ctx.addIssue({\n        code: z.ZodIssueCode.custom,\n        message: 'Invalid numeric value',\n      });\n      return z.NEVER;\n    }\n  });\n\n// Schema for gas-related fields, ensuring they are non-negative BigInts.\nconst GasValueSchema = toPositiveBigInt.refine((val) => val >= 0n, {\n  message: 'Gas values must be non-negative',\n});\n\n// Schema for chainId, ensuring it's a positive integer.\nconst ChainIdSchema = z\n  .union([z.string(), z.number()])\n  .transform((val) =>\n    typeof val === 'string' && isHex(val)\n      ? Number(hexToBigInt(val as Hex))\n      : Number(val),\n  )\n  .refine((val) => Number.isInteger(val) && val > 0, {\n    message: 'Chain ID must be a positive integer',\n  });\n\n// Schema for an Ethereum address, which validates and checksums it.\nconst AddressSchema = z\n  .string()\n  .refine(isAddress, 'Invalid address')\n  .transform((addr) => getAddress(addr));\n\n// Schema for hex data, ensuring it's a valid hex string.\nconst DataSchema = z\n  .string()\n  .refine(isHex, 'Data must be a valid hex string')\n  .default('0x');\n\nconst NonceSchema = z\n  .union([\n    z.string().regex(/^(0x[0-9a-fA-F]+|[0-9]+)$/, 'Invalid nonce format'),\n    z.number().int().nonnegative(),\n    z.bigint(),\n  ])\n  .transform((val, ctx) => {\n    try {\n      const bigVal =\n        typeof val === 'string'\n          ? isHex(val as Hex)\n            ? hexToBigInt(val as Hex)\n            : BigInt(val)\n          : typeof val === 'number'\n            ? BigInt(val)\n            : val;\n\n      if (bigVal < 0n) {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message: 'Nonce must be non-negative',\n        });\n        return z.NEVER;\n      }\n\n      const maxSafe = BigInt(Number.MAX_SAFE_INTEGER);\n      if (bigVal > maxSafe) {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message: 'Nonce exceeds JavaScript safe integer range',\n        });\n        return z.NEVER;\n      }\n\n      return Number(bigVal);\n    } catch {\n      ctx.addIssue({\n        code: z.ZodIssueCode.custom,\n        message: 'Invalid nonce value',\n      });\n      return z.NEVER;\n    }\n  });\n\n// Schema for access list entries.\nconst AccessListEntrySchema = z.object({\n  address: AddressSchema,\n  storageKeys: z.array(\n    z.string().refine(isHex, 'Storage key must be a hex string'),\n  ),\n});\n\n// Schema for EIP-7702 authorization entries.\nconst AuthorizationSchema = z.object({\n  chainId: z.number().int().positive(),\n  address: AddressSchema,\n  nonce: z.number().int().nonnegative(),\n  yParity: z.number().optional().default(0),\n  r: z.string().refine(isHex).optional(),\n  s: z.string().refine(isHex).optional(),\n});\n\n// Base schema for all transaction types.\nconst BaseTxSchema = z.object({\n  to: AddressSchema.optional(),\n  value: toPositiveBigInt.optional(),\n  data: DataSchema,\n  nonce: NonceSchema.optional(),\n  gas: GasValueSchema.optional(),\n  gasLimit: GasValueSchema.optional(),\n  chainId: ChainIdSchema.optional().default(1),\n  accessList: z.array(AccessListEntrySchema).optional(),\n});\n\n// Schema for Legacy (Type 0) transactions.\nconst LegacyTxSchema = BaseTxSchema.extend({\n  type: z\n    .union([z.literal('legacy'), z.literal(TRANSACTION_TYPE.LEGACY)])\n    .optional(),\n  gasPrice: GasValueSchema,\n});\n\n// Schema for EIP-2930 (Type 1) transactions.\nconst EIP2930TxSchema = BaseTxSchema.extend({\n  type: z.union([z.literal('eip2930'), z.literal(TRANSACTION_TYPE.EIP2930)]),\n  gasPrice: GasValueSchema,\n});\n\n// Schema for EIP-1559 (Type 2) transactions.\nconst EIP1559TxSchema = BaseTxSchema.extend({\n  type: z.union([z.literal('eip1559'), z.literal(TRANSACTION_TYPE.EIP1559)]),\n  maxFeePerGas: GasValueSchema,\n  maxPriorityFeePerGas: GasValueSchema,\n});\n\n// Schema for EIP-7702 (Type 4/5) transactions.\nconst EIP7702TxSchema = BaseTxSchema.extend({\n  type: z.union([\n    z.literal('eip7702'),\n    z.literal(TRANSACTION_TYPE.EIP7702_AUTH),\n    z.literal(TRANSACTION_TYPE.EIP7702_AUTH_LIST),\n  ]),\n  maxFeePerGas: GasValueSchema,\n  maxPriorityFeePerGas: GasValueSchema,\n  authorizationList: z.array(AuthorizationSchema).min(1),\n});\n\n/**\n * A comprehensive zod schema that validates and normalizes a flexible transaction input.\n * It handles:\n * - Type inference (legacy, EIP-1559, etc.) based on provided fields.\n * - Coercion of numbers, strings, and hex values to their correct types (BigInt, Address).\n * - Validation of addresses, hex data, and transaction-specific rules.\n * - Merging of `gas` and `gasLimit` fields.\n */\nexport const TransactionSchema = z\n  .any()\n  // Pre-process to check for circular references before zod touches it\n  .refine(\n    (val) => {\n      try {\n        JSON.stringify(val, (_, value) =>\n          typeof value === 'bigint' ? value.toString() : value,\n        );\n        return true;\n      } catch {\n        return false;\n      }\n    },\n    { message: 'Circular reference detected in transaction object' },\n  )\n  .transform((tx) => {\n    // Prioritize gasLimit over gas\n    if (tx.gasLimit) {\n      tx.gas = tx.gasLimit;\n    }\n\n    if (tx.data === null || tx.data === undefined || tx.data === '') {\n      tx.data = '0x';\n    }\n\n    // Normalize EIP-7702 `authorization` to `authorizationList`\n    if (tx.authorization) {\n      tx.authorizationList = [tx.authorization];\n    }\n    return tx;\n  })\n  .transform((tx: any) => {\n    // Type inference and validation logic\n    const hasAuthList = !!tx.authorizationList;\n    const hasMaxFee = !!tx.maxFeePerGas || !!tx.maxPriorityFeePerGas;\n    const hasAccessList = !!tx.accessList;\n    const hasGasPrice = !!tx.gasPrice;\n\n    let type: 'eip7702' | 'eip1559' | 'eip2930' | 'legacy' = 'legacy';\n    let schema: z.ZodTypeAny = LegacyTxSchema;\n\n    if (\n      tx.type === 'eip7702' ||\n      tx.type === 4 ||\n      tx.type === 5 ||\n      hasAuthList\n    ) {\n      type = 'eip7702';\n      schema = EIP7702TxSchema;\n    } else if (tx.type === 'eip1559' || tx.type === 2 || hasMaxFee) {\n      type = 'eip1559';\n      schema = EIP1559TxSchema;\n    } else if (tx.type === 'eip2930' || tx.type === 1 || hasAccessList) {\n      type = 'eip2930';\n      schema = EIP2930TxSchema;\n    }\n\n    // For legacy, if gasPrice is missing, it's an invalid tx\n    if (type === 'legacy' && !hasGasPrice) {\n      throw new Error('Legacy transactions require a `gasPrice` field.');\n    }\n\n    const result = schema.parse(tx);\n\n    // Post-process the successfully parsed data\n    const data: any = result;\n    data.type = type;\n    if (type === 'legacy' && data.gas === undefined) {\n      data.gas = 21000n; // Default gas for legacy transfers\n    }\n\n    // Remove fields that are not part of the final type\n    if (type !== 'legacy' && type !== 'eip2930') delete data.gasPrice;\n    if (type !== 'eip1559' && type !== 'eip7702') {\n      delete data.maxFeePerGas;\n      delete data.maxPriorityFeePerGas;\n    }\n    delete data.gasLimit;\n    if (type !== 'eip7702') delete data.authorizationList;\n\n    return data;\n  });\n\nexport type FlexibleTransaction = z.infer<typeof TransactionSchema>;\n","import { LatticeResponseCode, ProtocolConstants } from '../protocol';\n\nconst buildLatticeResponseErrorMessage = ({\n  responseCode,\n  errorMessage,\n}: {\n  responseCode?: LatticeResponseCode;\n  errorMessage?: string;\n}) => {\n  const msg: string[] = [];\n  if (responseCode) {\n    msg.push(`${ProtocolConstants.responseMsg[responseCode]}`);\n  }\n  if (errorMessage) {\n    msg.push('Error Message: ');\n    msg.push(errorMessage);\n  }\n  return msg.join('\\n');\n};\n\nexport class LatticeResponseError extends Error {\n  constructor(\n    public responseCode?: LatticeResponseCode,\n    public errorMessage?: string,\n  ) {\n    const message = buildLatticeResponseErrorMessage({\n      responseCode,\n      errorMessage,\n    });\n    super(message);\n    this.name = 'LatticeResponseError';\n    this.responseCode = responseCode;\n    this.errorMessage = errorMessage;\n  }\n}\n","import { HARDENED_OFFSET } from '../constants';\nimport { KeyPair, ActiveWallets, FirmwareVersion } from '../types';\n\n/**\n * Get 64 bytes representing the public key This is the uncompressed key without the leading 04\n * byte\n * @param KeyPair - //TODO Describe the keypair\n * @param LE - Whether to return the public key in little endian format.\n * @returns A Buffer containing the public key.\n */\nexport const getPubKeyBytes = (key: KeyPair, LE = false) => {\n  const k = key.getPublic();\n  const p = k.encode('hex', false);\n  const pb = Buffer.from(p, 'hex');\n  if (LE === true) {\n    // Need to flip X and Y components to little endian\n    const x = pb.slice(1, 33).reverse();\n    const y = pb.slice(33, 65).reverse();\n    // @ts-expect-error - TODO: Find out why Buffer won't accept pb[0]\n    return Buffer.concat([pb[0], x, y]);\n  } else {\n    return pb;\n  }\n};\n\n/**\n * Get the shared secret, derived via ECDH from the local private key and the ephemeral public key\n * @internal\n * @returns Buffer\n */\nexport const getSharedSecret = (key: KeyPair, ephemeralPub: KeyPair) => {\n  // Once every ~256 attempts, we will get a key that starts with a `00` byte, which can lead to\n  // problems initializing AES if we don't force a 32 byte BE buffer.\n  return Buffer.from(key.derive(ephemeralPub.getPublic()).toArray('be', 32));\n};\n\n// Given a set of wallet data, which contains two wallet descriptors, parse the data and save it\n// to memory\nexport const parseWallets = (walletData: any): ActiveWallets => {\n  // Read the external wallet data first. If it is non-null, the external wallet will be the\n  // active wallet of the device and we should save it. If the external wallet is blank, it means\n  // there is no card present and we should save and use the interal wallet. If both wallets are\n  // empty, it means the device still needs to be set up.\n  const walletDescriptorLen = 71;\n  // Internal first\n  let off = 0;\n  const activeWallets: ActiveWallets = {\n    internal: {\n      uid: undefined,\n      capabilities: undefined,\n      name: undefined,\n      external: false,\n    },\n    external: {\n      uid: undefined,\n      capabilities: undefined,\n      name: undefined,\n      external: true,\n    },\n  };\n  activeWallets.internal.uid = walletData.slice(off, off + 32);\n  // NOTE: `capabilities` and `name` were deprecated in Lattice firmware.\n  // They never provided any real information, but have been archived here\n  // since the response size has been preserved and we may bring them back\n  // in a different form.\n  // activeWallets.internal.capabilities = walletData.readUInt32BE(off + 32);\n  // activeWallets.internal.name = walletData.slice(\n  // off + 36,\n  // off + walletDescriptorLen,\n  // );\n  // Offset the first item\n  off += walletDescriptorLen;\n  // External\n  activeWallets.external.uid = walletData.slice(off, off + 32);\n  // activeWallets.external.capabilities = walletData.readUInt32BE(off + 32);\n  // activeWallets.external.name = walletData.slice(\n  // off + 36,\n  // off + walletDescriptorLen,\n  // );\n\n  return activeWallets;\n};\n\n// Determine if a provided firmware version matches or exceeds the current firmware version\nexport const isFWSupported = (\n  fwVersion: FirmwareVersion,\n  versionSupported: FirmwareVersion,\n): boolean => {\n  const { major, minor, fix } = fwVersion;\n  const { major: _major, minor: _minor, fix: _fix } = versionSupported;\n  return (\n    major > _major ||\n    (major >= _major && minor > _minor) ||\n    (major >= _major && minor >= _minor && fix >= _fix)\n  );\n};\n\n/**\n * Convert a set of BIP39 path indices to a string\n * @param path - Set of indices\n */\nexport const getPathStr = function (path) {\n  let pathStr = 'm';\n  path.forEach((idx) => {\n    if (idx >= HARDENED_OFFSET) {\n      pathStr += `/${idx - HARDENED_OFFSET}'`;\n    } else {\n      pathStr += `/${idx}`;\n    }\n  });\n  return pathStr;\n};\n","import { LatticeResponseCode } from '../protocol';\nimport { FirmwareVersion, FirmwareConstants } from '../types';\nimport { isFWSupported } from './utilities';\n\nexport const isDeviceBusy = (responseCode: number) =>\n  responseCode === LatticeResponseCode.deviceBusy ||\n  responseCode === LatticeResponseCode.gceTimeout;\n\nexport const isWrongWallet = (responseCode: number) =>\n  responseCode === LatticeResponseCode.wrongWallet;\n\nexport const isInvalidEphemeralId = (responseCode: number) =>\n  responseCode === LatticeResponseCode.invalidEphemId;\n\nexport const doesFetchWalletsOnLoad = (fwVersion: FirmwareVersion) =>\n  isFWSupported(fwVersion, { major: 0, minor: 14, fix: 1 });\n\nexport const shouldUseEVMLegacyConverter = (fwConstants: FirmwareConstants) =>\n  fwConstants.genericSigning &&\n  fwConstants.genericSigning.encodingTypes &&\n  fwConstants.genericSigning.encodingTypes.EVM;\n","/**\n * All messages sent to the Lattice from this SDK will be\n * \"secure messages\", of which there are two types:\n *\n * 1. Connect requests are *unencrypted* and serve to establish\n *    a connection between the SDK Client instance and the target\n *    Lattice. If the client is already paired to the target Lattice,\n *    the response will indicate that. If the client has never paired\n *    with this Lattice, the Lattice will go into \"pairing mode\" and\n *    will expect a follow up `finalizePairing` request, which is\n *    an encrypted request. This will return an ephemeral public key,\n *    which is used to encrypt the next request.\n * 2. Encrypted requests are *encrypted* (obviously) and from a Lattice\n *    protocol perspective they are all constructed the same way:\n *    create a buffer of `payload` length and fill it with unencrypted\n *    data, then encrypt the entire payload (not just the data you filled)\n *    with the ECDH secret formed from the last ephemeral public key.\n *    The response to this request will contain a new ephemral public\n *    key, which you will need for the next encrypted request.\n */\nimport {\n  ProtocolConstants as Constants,\n  LatticeMsgType,\n  LatticeProtocolVersion,\n  LatticeSecureEncryptedRequestType,\n  LatticeSecureMsgType,\n} from './latticeConstants';\nimport {\n  aes256_decrypt,\n  aes256_encrypt,\n  checksum,\n  getP256KeyPairFromPub,\n  randomBytes,\n} from '../util';\nimport { getEphemeralId, request } from '../shared/functions';\nimport { validateEphemeralPub } from '../shared/validators';\nimport {\n  DecryptedResponse,\n  LatticeSecureRequestPayload,\n  LatticeMessageHeader,\n  LatticeSecureRequest,\n  LatticeSecureConnectRequestPayloadData,\n  LatticeSecureDecryptedResponse,\n  KeyPair,\n} from '../types';\n\nconst { msgSizes } = Constants;\nconst { secure: szs } = msgSizes;\n\n/**\n * Build and make a request to connect to a specific Lattice\n * based on its `deviceId`.\n * @param deviceId - Device ID for the target Lattice. Must be in\n *                   the same `client.baseUrl` domain to be found.\n * @return {Buffer} - Connection response payload data, which contains\n *                    information about the connected Lattice.\n */\nexport async function connectSecureRequest({\n  url,\n  pubkey,\n}: {\n  url: string;\n  pubkey: Buffer;\n}): Promise<Buffer> {\n  // Build the secure request message\n  const payloadData = serializeSecureRequestConnectPayloadData({\n    pubkey: pubkey,\n  });\n  const msgId = randomBytes(4);\n  const msg = serializeSecureRequestMsg(\n    msgId,\n    LatticeSecureMsgType.connect,\n    payloadData,\n  );\n  // Send request to the Lattice\n  const resp = await request({ url, payload: msg });\n  if (resp.length !== szs.payload.response.connect - 1) {\n    throw new Error('Wrong Lattice response message size.');\n  }\n\n  return resp;\n}\n\n/**\n * Build an encrypted secure request using raw data,\n * then send that request to the target Lattice, handle\n * the response, and return the *decrypted* response\n * payload data.\n * Also updates ephemeral public key in the client.\n * This is a wrapper around several local util functions.\n * @param data - Unencrypted raw calldata for function\n * @param requestType - Type of encrypted reques to make\n * @return {Buffer} Decrypted response data (excluding metadata)\n */\nexport async function encryptedSecureRequest({\n  data,\n  requestType,\n  sharedSecret,\n  ephemeralPub,\n  url,\n}: {\n  data: Buffer;\n  requestType: LatticeSecureEncryptedRequestType;\n  sharedSecret: Buffer;\n  ephemeralPub: KeyPair;\n  url: string;\n}): Promise<DecryptedResponse> {\n  // Generate a random message id for internal tracking\n  // of this specific request (internal on both sides).\n  const msgId = randomBytes(4);\n\n  // Serialize the request data into encrypted request\n  // payload data.\n  const payloadData = serializeSecureRequestEncryptedPayloadData({\n    data,\n    requestType,\n    ephemeralPub,\n    sharedSecret,\n  });\n\n  // Serialize the payload data into an encrypted secure\n  // request message.\n  const msg = serializeSecureRequestMsg(\n    msgId,\n    LatticeSecureMsgType.encrypted,\n    payloadData,\n  );\n\n  // Send request to Lattice\n  const resp = await request({\n    url,\n    payload: msg,\n  });\n\n  // Deserialize the response payload data\n  if (resp.length !== szs.payload.response.encrypted - 1) {\n    throw new Error('Wrong Lattice response message size.');\n  }\n\n  const encPayloadData = resp.slice(\n    0,\n    szs.data.response.encrypted.encryptedData,\n  );\n\n  // Return decrypted response payload data\n  return decryptEncryptedLatticeResponseData({\n    encPayloadData,\n    requestType,\n    sharedSecret,\n  });\n}\n\n/**\n * @internal\n * Serialize a Secure Request message for the Lattice.\n * All outgoing SDK requests are of this form.\n * @param msgId - Random 4 bytes of data for internally tracking this message\n * @param secureRequestType - 0x01 for connect, 0x02 for encrypted\n * @param payloadData - Request data\n * @return {Buffer} Serialized message to be sent to Lattice\n */\nfunction serializeSecureRequestMsg(\n  msgId: Buffer,\n  secureRequestType: LatticeSecureMsgType,\n  payloadData: Buffer,\n): Buffer {\n  // Sanity check request data\n  if (msgId.length !== 4) {\n    throw new Error('msgId must be four bytes');\n  }\n  if (\n    secureRequestType !== LatticeSecureMsgType.connect &&\n    secureRequestType !== LatticeSecureMsgType.encrypted\n  ) {\n    throw new Error('Invalid Lattice secure request type');\n  }\n\n  // Validate the incoming payload data size. Note that the payload\n  // data is prepended with a secure request type byte, so the\n  // payload data size is one less than the expected size.\n  const isValidConnectPayloadDataSz =\n    secureRequestType === LatticeSecureMsgType.connect &&\n    payloadData.length === szs.payload.request.connect - 1;\n  const isValidEncryptedPayloadDataSz =\n    secureRequestType === LatticeSecureMsgType.encrypted &&\n    payloadData.length === szs.payload.request.encrypted - 1;\n\n  // Build payload and size\n  let msgSz = msgSizes.header + msgSizes.checksum;\n  let payloadLen;\n  const payload: LatticeSecureRequestPayload = {\n    requestType: secureRequestType,\n    data: payloadData,\n  };\n  if (isValidConnectPayloadDataSz) {\n    payloadLen = szs.payload.request.connect;\n  } else if (isValidEncryptedPayloadDataSz) {\n    payloadLen = szs.payload.request.encrypted;\n  } else {\n    throw new Error('Invalid Lattice secure request payload size');\n  }\n  msgSz += payloadLen;\n\n  // Construct the request in object form\n  const header: LatticeMessageHeader = {\n    version: LatticeProtocolVersion.v1,\n    type: LatticeMsgType.secure,\n    id: msgId,\n    len: payloadLen,\n  };\n  const req: LatticeSecureRequest = {\n    header,\n    payload,\n  };\n\n  // Now serialize the whole message\n  // Header | requestType | payloadData | checksum\n  const msg = Buffer.alloc(msgSz);\n  let off = 0;\n  // Header\n  msg.writeUInt8(req.header.version, off);\n  off += 1;\n  msg.writeUInt8(req.header.type, off);\n  off += 1;\n  req.header.id.copy(msg, off);\n  off += req.header.id.length;\n  msg.writeUInt16BE(req.header.len, off);\n  off += 2;\n  // Payload\n  msg.writeUInt8(req.payload.requestType, off);\n  off += 1;\n  req.payload.data.copy(msg, off);\n  off += req.payload.data.length;\n  // Checksum\n  msg.writeUInt32BE(checksum(msg.slice(0, off)), off);\n  off += 4;\n  if (off !== msgSz) {\n    throw new Error('Failed to build request message');\n  }\n\n  // We have our serialized secure message!\n  return msg;\n}\n\n/**\n * @internal\n * Serialize payload data for a Lattice secure request: connect\n * @return {Buffer} - 1700 bytes, of which only 65 are used\n */\nfunction serializeSecureRequestConnectPayloadData(\n  payloadData: LatticeSecureConnectRequestPayloadData,\n): Buffer {\n  const serPayloadData = Buffer.alloc(szs.data.request.connect);\n  payloadData.pubkey.copy(serPayloadData, 0);\n  return serPayloadData;\n}\n\n/**\n * @internal\n * Serialize payload data for Lattice secure request: encrypted\n * @param data - Raw (unencrypted) request data\n * @return {Buffer} - 1700 bytes, all of which should be used\n */\nfunction serializeSecureRequestEncryptedPayloadData({\n  data,\n  requestType,\n  ephemeralPub,\n  sharedSecret,\n}: {\n  data: Buffer;\n  requestType: LatticeSecureEncryptedRequestType;\n  ephemeralPub: KeyPair;\n  sharedSecret: Buffer;\n}): Buffer {\n  // Sanity checks request size\n  if (data.length > szs.data.request.encrypted.encryptedData) {\n    throw new Error('Encrypted request data too large');\n  }\n  // Make sure we have a shared secret. An error will be thrown\n  // if there is no ephemeral pub, indicating we need to reconnect.\n  validateEphemeralPub(ephemeralPub);\n\n  // Validate the request data size matches the desired request\n  const requestDataSize = szs.data.request.encrypted[requestType];\n  if (data.length !== requestDataSize) {\n    throw new Error(\n      `Invalid request datasize (wanted ${requestDataSize}, got ${data.length})`,\n    );\n  }\n\n  // Build the pre-encrypted data payload, which variable sized and of form:\n  // encryptedRequestType | data | checksum\n  const preEncryptedData = Buffer.alloc(1 + requestDataSize);\n  preEncryptedData[0] = requestType;\n  data.copy(preEncryptedData, 1);\n  const preEncryptedDataChecksum = checksum(preEncryptedData);\n\n  // Encrypt the data into a fixed size buffer. The buffer size should\n  // equal to the full message request less the 4-byte ephemeral id.\n  const _encryptedData = Buffer.alloc(szs.data.request.encrypted.encryptedData);\n  preEncryptedData.copy(_encryptedData, 0);\n  _encryptedData.writeUInt32LE(\n    preEncryptedDataChecksum,\n    preEncryptedData.length,\n  );\n  const encryptedData = aes256_encrypt(_encryptedData, sharedSecret);\n\n  // Calculate ephemeral ID\n  const ephemeralId = getEphemeralId(sharedSecret);\n\n  // Now we will serialize the payload data.\n  const serPayloadData = Buffer.alloc(szs.payload.request.encrypted - 1);\n  serPayloadData.writeUInt32LE(ephemeralId);\n  encryptedData.copy(serPayloadData, 4);\n  return serPayloadData;\n}\n\n/**\n * @internal\n * Decrypt the response data from an encrypted request.\n * @param encPayloadData - Encrypted payload data in response\n * @return {Buffer} Decrypted response data (excluding metadata)\n */\nfunction decryptEncryptedLatticeResponseData({\n  encPayloadData,\n  requestType,\n  sharedSecret,\n}: {\n  encPayloadData: Buffer;\n  requestType: LatticeSecureEncryptedRequestType;\n  sharedSecret: Buffer;\n}) {\n  // Decrypt data using the *current* shared secret\n  const decData = aes256_decrypt(encPayloadData, sharedSecret);\n\n  // Bulid the object\n  const ephemeralPubSz = 65; // secp256r1 pubkey\n  const checksumOffset =\n    ephemeralPubSz + szs.data.response.encrypted[requestType];\n  const respData: LatticeSecureDecryptedResponse = {\n    ephemeralPub: decData.slice(0, ephemeralPubSz),\n    data: decData.slice(ephemeralPubSz, checksumOffset),\n    checksum: decData.readUInt32BE(checksumOffset),\n  };\n\n  // Validate the checksum\n  const validChecksum = checksum(decData.slice(0, checksumOffset));\n  if (respData.checksum !== validChecksum) {\n    throw new Error('Checksum mismatch in decrypted Lattice data');\n  }\n\n  // Validate the response data size\n  const validSz = szs.data.response.encrypted[requestType];\n  if (respData.data.length !== validSz) {\n    throw new Error('Incorrect response data returned from Lattice');\n  }\n\n  const newEphemeralPub = getP256KeyPairFromPub(respData.ephemeralPub);\n\n  // Returned the decrypted data\n  return { decryptedData: respData.data, newEphemeralPub };\n}\n","import {\n  LatticeSecureEncryptedRequestType,\n  encryptedSecureRequest,\n} from '../protocol';\nimport {\n  validateConnectedClient,\n  validateKvRecord,\n  validateKvRecords,\n} from '../shared/validators';\nimport {\n  AddKvRecordsRequestFunctionParams,\n  KVRecords,\n  FirmwareConstants,\n} from '../types';\n\n/**\n * `addKvRecords` takes in a set of key-value records and sends a request to add them to the\n * Lattice.\n * @category Lattice\n * @returns A callback with an error or null.\n */\nexport async function addKvRecords({\n  client,\n  records,\n  type,\n  caseSensitive,\n}: AddKvRecordsRequestFunctionParams): Promise<Buffer> {\n  const { url, sharedSecret, ephemeralPub, fwConstants } =\n    validateConnectedClient(client);\n  validateAddKvRequest({ records, fwConstants });\n\n  // Build the data for this request\n  const data = encodeAddKvRecordsRequest({\n    records,\n    type,\n    caseSensitive,\n    fwConstants,\n  });\n\n  const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({\n    data,\n    requestType: LatticeSecureEncryptedRequestType.addKvRecords,\n    sharedSecret,\n    ephemeralPub,\n    url,\n  });\n\n  client.mutate({\n    ephemeralPub: newEphemeralPub,\n  });\n\n  return decryptedData;\n}\n\nexport const validateAddKvRequest = ({\n  records,\n  fwConstants,\n}: {\n  records: KVRecords;\n  fwConstants: FirmwareConstants;\n}) => {\n  validateKvRecords(records, fwConstants);\n};\n\nexport const encodeAddKvRecordsRequest = ({\n  records,\n  type,\n  caseSensitive,\n  fwConstants,\n}: {\n  records: KVRecords;\n  type: number;\n  caseSensitive: boolean;\n  fwConstants: FirmwareConstants;\n}) => {\n  const payload = Buffer.alloc(1 + 139 * fwConstants.kvActionMaxNum);\n  payload.writeUInt8(Object.keys(records).length, 0);\n  let off = 1;\n  Object.entries(records).forEach(([_key, _val]) => {\n    const { key, val } = validateKvRecord(\n      { key: _key, val: _val },\n      fwConstants,\n    );\n    // Skip the ID portion. This will get added by firmware.\n    payload.writeUInt32LE(0, off);\n    off += 4;\n    payload.writeUInt32LE(type, off);\n    off += 4;\n    payload.writeUInt8(caseSensitive ? 1 : 0, off);\n    off += 1;\n    payload.writeUInt8(String(key).length + 1, off);\n    off += 1;\n    Buffer.from(String(key)).copy(payload, off);\n    off += fwConstants.kvKeyMaxStrSz + 1;\n    payload.writeUInt8(String(val).length + 1, off);\n    off += 1;\n    Buffer.from(String(val)).copy(payload, off);\n    off += fwConstants.kvValMaxStrSz + 1;\n  });\n  return payload;\n};\n","import { ProtocolConstants, connectSecureRequest } from '../protocol';\nimport { doesFetchWalletsOnLoad } from '../shared/predicates';\nimport { getSharedSecret, parseWallets } from '../shared/utilities';\nimport {\n  validateBaseUrl,\n  validateDeviceId,\n  validateKey,\n} from '../shared/validators';\nimport { ConnectRequestFunctionParams, KeyPair, ActiveWallets } from '../types';\nimport { aes256_decrypt, getP256KeyPairFromPub } from '../util';\n\nexport async function connect({\n  client,\n  id,\n}: ConnectRequestFunctionParams): Promise<boolean> {\n  const { deviceId, key, baseUrl } = validateConnectRequest({\n    deviceId: id,\n    // @ts-expect-error - private access\n    key: client.key,\n    baseUrl: client.baseUrl,\n  });\n\n  const url = `${baseUrl}/${deviceId}`;\n\n  const respPayloadData = await connectSecureRequest({\n    url,\n    pubkey: client.publicKey,\n  });\n\n  // Decode response data params.\n  // Response payload data is *not* encrypted.\n  const { isPaired, fwVersion, activeWallets, ephemeralPub } =\n    await decodeConnectResponse(respPayloadData, key);\n\n  // Update client state with response data\n\n  client.mutate({\n    deviceId,\n    ephemeralPub,\n    url,\n    isPaired,\n    fwVersion,\n    activeWallets,\n  });\n\n  // If we are paired and are on older firmware (<0.14.1), we need a\n  // follow up request to sync wallet state.\n  if (isPaired && !doesFetchWalletsOnLoad(client.getFwVersion())) {\n    await client.fetchActiveWallet();\n  }\n\n  // Return flag indicating whether we are paired or not.\n  // If we are *not* already paired, the Lattice is now in\n  // pairing mode and expects a `finalizePairing` encrypted\n  // request as a follow up.\n  return isPaired;\n}\n\nexport const validateConnectRequest = ({\n  deviceId,\n  key,\n  baseUrl,\n}: {\n  deviceId?: string;\n  key?: KeyPair;\n  baseUrl?: string;\n}): {\n  deviceId: string;\n  key: KeyPair;\n  baseUrl: string;\n} => {\n  const validDeviceId = validateDeviceId(deviceId);\n  const validKey = validateKey(key);\n  const validBaseUrl = validateBaseUrl(baseUrl);\n\n  return {\n    deviceId: validDeviceId,\n    key: validKey,\n    baseUrl: validBaseUrl,\n  };\n};\n\n/**\n * `decodeConnectResponse` will call `StartPairingMode` on the device, which gives the user 60 seconds to\n * finalize the pairing. This will return an ephemeral public key, which is needed for the next\n * request.\n * - If the device is already paired, this ephemPub is simply used to encrypt the next request.\n * - If the device is not paired, it is needed to pair the device within 60 seconds.\n * @category Device Response\n * @internal\n * @returns true if we are paired to the device already\n */\nexport const decodeConnectResponse = (\n  response: Buffer,\n  key: KeyPair,\n): {\n  isPaired: boolean;\n  fwVersion: Buffer;\n  activeWallets: ActiveWallets | undefined;\n  ephemeralPub: KeyPair;\n} => {\n  let off = 0;\n  const isPaired =\n    response.readUInt8(off) === ProtocolConstants.pairingStatus.paired;\n  off++;\n  // If we are already paired, we get the next ephemeral key\n  const pub = response.slice(off, off + 65).toString('hex');\n  off += 65; // Set the public key\n  const ephemeralPub = getP256KeyPairFromPub(pub);\n  // Grab the firmware version (will be 0-length for older fw versions) It is of format\n  // |fix|minor|major|reserved|\n  const fwVersion = response.slice(off, off + 4);\n  off += 4;\n\n  // If we are already paired, the response will include some encrypted data about the current\n  // wallets This data was added in Lattice firmware v0.14.1\n  if (isPaired) {\n    //TODO && this._fwVersionGTE(0, 14, 1)) {\n    // Later versions of firmware added wallet info\n    const encWalletData = response.slice(off, off + 160);\n    off += 160;\n    const sharedSecret = getSharedSecret(key, ephemeralPub);\n    const decWalletData = aes256_decrypt(encWalletData, sharedSecret);\n    // Sanity check to make sure the last part of the decrypted data is empty. The last 2 bytes\n    // are AES padding\n    if (\n      decWalletData[decWalletData.length - 2] !== 0 ||\n      decWalletData[decWalletData.length - 1] !== 0\n    ) {\n      throw new Error('Failed to connect to Lattice.');\n    }\n    const activeWallets = parseWallets(decWalletData);\n    return { isPaired, fwVersion, activeWallets, ephemeralPub };\n  }\n  // return the state of our pairing\n  return { isPaired, fwVersion, activeWallets: undefined, ephemeralPub };\n};\n","/**\n * Export encrypted data from the Lattice. Data must conform\n * to known schema, e.g. EIP2335 derived privkey export.\n */\nimport { v4 as uuidV4 } from 'uuid';\nimport { EXTERNAL } from '../constants';\nimport {\n  LatticeSecureEncryptedRequestType,\n  encryptedSecureRequest,\n} from '../protocol';\nimport { getPathStr } from '../shared/utilities';\nimport {\n  validateConnectedClient,\n  validateStartPath,\n  validateWallet,\n} from '../shared/validators';\nimport {\n  FetchEncDataRequestFunctionParams,\n  EIP2335KeyExportReq,\n  FirmwareVersion,\n  Wallet,\n  EIP2335KeyExportData,\n} from '../types';\n\nconst { ENC_DATA } = EXTERNAL;\nconst ENC_DATA_ERR_STR =\n  'Unknown encrypted data export type requested. Exiting.';\nconst ENC_DATA_REQ_DATA_SZ = 1025;\nconst ENC_DATA_RESP_SZ = {\n  EIP2335: {\n    CIPHERTEXT: 32,\n    SALT: 32,\n    CHECKSUM: 32,\n    IV: 16,\n    PUBKEY: 48,\n  },\n} as const;\n\nexport async function fetchEncData({\n  client,\n  schema,\n  params,\n}: FetchEncDataRequestFunctionParams): Promise<Buffer> {\n  const { url, sharedSecret, ephemeralPub, fwVersion } =\n    validateConnectedClient(client);\n  const activeWallet = validateWallet(client.getActiveWallet());\n  validateFetchEncDataRequest({ params });\n\n  const data = encodeFetchEncDataRequest({\n    schema,\n    params,\n    fwVersion,\n    activeWallet,\n  });\n\n  const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({\n    data,\n    requestType: LatticeSecureEncryptedRequestType.fetchEncryptedData,\n    sharedSecret,\n    ephemeralPub,\n    url,\n  });\n\n  client.mutate({\n    ephemeralPub: newEphemeralPub,\n  });\n\n  return decodeFetchEncData({ data: decryptedData, schema, params });\n}\n\nexport const validateFetchEncDataRequest = ({\n  params,\n}: {\n  params: EIP2335KeyExportReq;\n}) => {\n  // Validate derivation path\n  validateStartPath(params.path);\n};\n\nexport const encodeFetchEncDataRequest = ({\n  schema,\n  params,\n  fwVersion,\n  activeWallet,\n}: {\n  schema: number;\n  params: EIP2335KeyExportReq;\n  fwVersion: FirmwareVersion;\n  activeWallet: Wallet;\n}) => {\n  // Check firmware version\n  if (fwVersion.major < 1 && fwVersion.minor < 17) {\n    throw new Error(\n      'Firmware version >=v0.17.0 is required for encrypted data export.',\n    );\n  }\n  // Update params depending on what type of data is being exported\n  if (schema === ENC_DATA.SCHEMAS.BLS_KEYSTORE_EIP2335_PBKDF_V4) {\n    // Set the wallet UID to the client's current active wallet\n    params.walletUID = activeWallet.uid;\n  } else {\n    throw new Error(ENC_DATA_ERR_STR);\n  }\n  // Build the payload data\n  const payload = Buffer.alloc(ENC_DATA_REQ_DATA_SZ);\n  let off = 0;\n  payload.writeUInt8(schema, off);\n  off += 1;\n  if (schema === ENC_DATA.SCHEMAS.BLS_KEYSTORE_EIP2335_PBKDF_V4) {\n    params.walletUID.copy(payload, off);\n    off += params.walletUID.length;\n    payload.writeUInt8(params.path.length, off);\n    off += 1;\n    for (let i = 0; i < 5; i++) {\n      if (i <= params.path.length) {\n        payload.writeUInt32LE(params.path[i], off);\n      }\n      off += 4;\n    }\n    if (params.c) {\n      payload.writeUInt32LE(params.c, off);\n    }\n    off += 4;\n    return payload;\n  } else {\n    throw new Error(ENC_DATA_ERR_STR);\n  }\n};\n\nexport const decodeFetchEncData = ({\n  data,\n  schema,\n  params,\n}: {\n  schema: number;\n  params: EIP2335KeyExportReq;\n  data: Buffer;\n}): Buffer => {\n  let off = 0;\n  if (schema === ENC_DATA.SCHEMAS.BLS_KEYSTORE_EIP2335_PBKDF_V4) {\n    const respData = {} as EIP2335KeyExportData;\n    const { CIPHERTEXT, SALT, CHECKSUM, IV, PUBKEY } = ENC_DATA_RESP_SZ.EIP2335;\n    const expectedSz =\n      4 + // iterations = u32\n      CIPHERTEXT +\n      SALT +\n      CHECKSUM +\n      IV +\n      PUBKEY;\n    const dataSz = data.readUInt32LE(off);\n    off += 4;\n    if (dataSz !== expectedSz) {\n      throw new Error(\n        'Invalid data returned from Lattice. Expected EIP2335 data.',\n      );\n    }\n    respData.iterations = data.readUInt32LE(off);\n    off += 4;\n    respData.cipherText = data.slice(off, off + CIPHERTEXT);\n    off += CIPHERTEXT;\n    respData.salt = data.slice(off, off + SALT);\n    off += SALT;\n    respData.checksum = data.slice(off, off + CHECKSUM);\n    off += CHECKSUM;\n    respData.iv = data.slice(off, off + IV);\n    off += IV;\n    respData.pubkey = data.slice(off, off + PUBKEY);\n    off += PUBKEY;\n    return formatEIP2335ExportData(respData, params.path);\n  } else {\n    throw new Error(ENC_DATA_ERR_STR);\n  }\n};\n\nconst formatEIP2335ExportData = (\n  resp: EIP2335KeyExportData,\n  path: number[],\n): Buffer => {\n  try {\n    const { iterations, salt, checksum, iv, cipherText, pubkey } = resp;\n    return Buffer.from(\n      JSON.stringify({\n        version: 4,\n        uuid: uuidV4(),\n        path: getPathStr(path),\n        pubkey: pubkey.toString('hex'),\n        crypto: {\n          kdf: {\n            function: 'pbkdf2',\n            params: {\n              dklen: 32,\n              c: iterations,\n              prf: 'hmac-sha256',\n              salt: salt.toString('hex'),\n            },\n            message: '',\n          },\n          checksum: {\n            function: 'sha256',\n            params: {},\n            message: checksum.toString('hex'),\n          },\n          cipher: {\n            function: 'aes-128-ctr',\n            params: {\n              iv: iv.toString('hex'),\n            },\n            message: cipherText.toString('hex'),\n          },\n        },\n      }),\n    );\n  } catch (err) {\n    throw Error(`Failed to format EIP2335 return data: ${err.toString()}`);\n  }\n};\n","import { EMPTY_WALLET_UID } from '../constants';\nimport {\n  LatticeSecureEncryptedRequestType,\n  encryptedSecureRequest,\n} from '../protocol';\nimport {\n  validateActiveWallets,\n  validateConnectedClient,\n} from '../shared/validators';\nimport {\n  FetchActiveWalletRequestFunctionParams,\n  ActiveWallets,\n} from '../types';\n\n/**\n * Fetch the active wallet in the device.\n *\n * The Lattice has two wallet interfaces: internal and external. If a SafeCard is inserted and\n * unlocked, the external interface is considered \"active\" and this will return its {@link Wallet}\n * data. Otherwise it will return the info for the internal Lattice wallet.\n */\nexport async function fetchActiveWallet({\n  client,\n}: FetchActiveWalletRequestFunctionParams): Promise<ActiveWallets> {\n  const { url, sharedSecret, ephemeralPub } = validateConnectedClient(client);\n\n  const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({\n    data: Buffer.alloc(0),\n    requestType: LatticeSecureEncryptedRequestType.getWallets,\n    sharedSecret,\n    ephemeralPub,\n    url,\n  });\n\n  const activeWallets = decodeFetchActiveWalletResponse(decryptedData);\n  const validActiveWallets = validateActiveWallets(activeWallets);\n\n  client.mutate({\n    ephemeralPub: newEphemeralPub,\n    activeWallets: validActiveWallets,\n  });\n\n  return validActiveWallets;\n}\n\nexport const decodeFetchActiveWalletResponse = (data: Buffer) => {\n  // Read the external wallet data first. If it is non-null, the external wallet will be the\n  // active wallet of the device and we should save it. If the external wallet is blank, it means\n  // there is no card present and we should save and use the interal wallet. If both wallets are\n  // empty, it means the device still needs to be set up.\n  const walletDescriptorLen = 71;\n  // Internal first\n  const activeWallets: ActiveWallets = {\n    internal: {\n      uid: EMPTY_WALLET_UID,\n      external: false,\n      name: Buffer.alloc(0),\n      capabilities: 0,\n    },\n    external: {\n      uid: EMPTY_WALLET_UID,\n      external: true,\n      name: Buffer.alloc(0),\n      capabilities: 0,\n    },\n  };\n  let off = 0;\n  activeWallets.internal.uid = data.slice(off, off + 32);\n  activeWallets.internal.capabilities = data.readUInt32BE(off + 32);\n  activeWallets.internal.name = data.slice(off + 36, off + walletDescriptorLen);\n  // Offset the first item\n  off += walletDescriptorLen;\n  // External\n  activeWallets.external.uid = data.slice(off, off + 32);\n  activeWallets.external.capabilities = data.readUInt32BE(off + 32);\n  activeWallets.external.name = data.slice(off + 36, off + walletDescriptorLen);\n  return activeWallets;\n};\n","import {\n  LatticeGetAddressesFlag,\n  LatticeSecureEncryptedRequestType,\n  ProtocolConstants,\n  encryptedSecureRequest,\n} from '../protocol';\nimport {\n  validateConnectedClient,\n  validateIsUInt4,\n  validateNAddresses,\n  validateStartPath,\n  validateWallet,\n} from '../shared/validators';\nimport {\n  GetAddressesRequestFunctionParams,\n  FirmwareConstants,\n  Wallet,\n} from '../types';\nimport { isValidAssetPath } from '../util';\n\n/**\n * `getAddresses` takes a starting path and a number to get the addresses or public keys associated\n * with the active wallet.\n * @category Lattice\n * @returns An array of addresses or public keys.\n */\nexport async function getAddresses({\n  client,\n  startPath: _startPath,\n  n: _n,\n  flag: _flag,\n  iterIdx,\n}: GetAddressesRequestFunctionParams): Promise<Buffer[]> {\n  const { url, sharedSecret, ephemeralPub, fwConstants } =\n    validateConnectedClient(client);\n  const activeWallet = validateWallet(client.getActiveWallet());\n\n  const { startPath, n, flag } = validateGetAddressesRequest({\n    startPath: _startPath,\n    n: _n,\n    flag: _flag,\n  });\n\n  const data = encodeGetAddressesRequest({\n    startPath,\n    n,\n    flag,\n    fwConstants,\n    wallet: activeWallet,\n    iterIdx,\n  });\n\n  const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({\n    data,\n    requestType: LatticeSecureEncryptedRequestType.getAddresses,\n    sharedSecret,\n    ephemeralPub,\n    url,\n  });\n\n  client.mutate({\n    ephemeralPub: newEphemeralPub,\n  });\n\n  return decodeGetAddressesResponse(decryptedData, flag);\n}\n\nexport const validateGetAddressesRequest = ({\n  startPath,\n  n,\n  flag,\n}: {\n  startPath?: number[];\n  n?: number;\n  flag?: number;\n}) => {\n  return {\n    startPath: validateStartPath(startPath),\n    n: validateNAddresses(n),\n    flag: validateIsUInt4(flag),\n  };\n};\n\nexport const encodeGetAddressesRequest = ({\n  startPath,\n  n,\n  flag,\n  fwConstants,\n  wallet,\n  iterIdx,\n}: {\n  startPath: number[];\n  n: number;\n  flag: number;\n  fwConstants: FirmwareConstants;\n  wallet: Wallet;\n  iterIdx?: number;\n}) => {\n  const flags = fwConstants.getAddressFlags || ([] as any[]);\n  const isPubkeyOnly =\n    flags.indexOf(flag) > -1 &&\n    (flag === LatticeGetAddressesFlag.ed25519Pubkey ||\n      flag === LatticeGetAddressesFlag.secp256k1Pubkey ||\n      flag === LatticeGetAddressesFlag.bls12_381Pubkey);\n  const isXpub = flag === LatticeGetAddressesFlag.secp256k1Xpub;\n  if (!isPubkeyOnly && !isXpub && !isValidAssetPath(startPath, fwConstants)) {\n    throw new Error(\n      'Derivation path or flag is not supported. Try updating Lattice firmware.',\n    );\n  }\n\n  // Ensure path depth is valid (2-5 indices)\n  if (startPath.length < 2 || startPath.length > 5) {\n    throw new Error('Derivation path must include 2-5 indices.');\n  }\n\n  // Validate iterIdx (0-5)\n  if (iterIdx < 0 || iterIdx > 5) {\n    throw new Error('Iteration index must be between 0 and 5.');\n  }\n\n  // Ensure iterIdx is not greater than path depth\n  if (iterIdx > startPath.length) {\n    throw new Error('Iteration index cannot be greater than path depth.');\n  }\n\n  const sz = 32 + 1 + 20 + 1; // walletUID + pathDepth_IterIdx + 5 u32 indices + count/flag\n  const payload = Buffer.alloc(sz);\n  let off = 0;\n\n  // walletUID\n  wallet.uid.copy(payload, off);\n  off += 32;\n\n  // pathDepth_IterIdx\n  const pathDepth_IterIdx = ((iterIdx & 0x0f) << 4) | (startPath.length & 0x0f);\n  payload.writeUInt8(pathDepth_IterIdx, off);\n  off += 1;\n\n  // Build the start path (5x u32 indices)\n  for (let i = 0; i < 5; i++) {\n    const val = i < startPath.length ? startPath[i] : 0;\n    payload.writeUInt32BE(val, off);\n    off += 4;\n  }\n\n  // Combine count and flag into a single byte\n  const countVal = n & 0x0f;\n  const flagVal = (flag & 0x0f) << 4;\n  payload.writeUInt8(countVal | flagVal, off);\n\n  return payload;\n};\n/**\n * @internal\n * @return an array of address strings or pubkey buffers\n */\nexport const decodeGetAddressesResponse = (\n  data: Buffer,\n  flag: number,\n): Buffer[] => {\n  let off = 0;\n  const addressOffset =\n    flag === LatticeGetAddressesFlag.ed25519Pubkey ? 113 : 65;\n  // Look for addresses until we reach the end (a 4 byte checksum)\n  const addrs: any[] = [];\n  // Pubkeys are formatted differently in the response\n  const arePubkeys =\n    flag === LatticeGetAddressesFlag.secp256k1Pubkey ||\n    flag === LatticeGetAddressesFlag.ed25519Pubkey ||\n    flag === LatticeGetAddressesFlag.bls12_381Pubkey;\n  if (arePubkeys) {\n    off += 1; // skip uint8 representing pubkey type\n  }\n  const respDataLength =\n    ProtocolConstants.msgSizes.secure.data.response.encrypted[\n      LatticeSecureEncryptedRequestType.getAddresses\n    ];\n  while (off < respDataLength) {\n    if (arePubkeys) {\n      // Pubkeys are shorter and are returned as buffers\n      const pubBytes = data.slice(off, off + addressOffset);\n      const isEmpty = pubBytes.every((byte: number) => byte === 0x00);\n      if (!isEmpty && flag === LatticeGetAddressesFlag.ed25519Pubkey) {\n        // ED25519 pubkeys are 32 bytes\n        addrs.push(pubBytes.slice(0, 32));\n      } else if (!isEmpty && flag === LatticeGetAddressesFlag.bls12_381Pubkey) {\n        // BLS12_381_G1 keys are 48 bytes\n        addrs.push(pubBytes.slice(0, 48));\n      } else if (!isEmpty) {\n        // Only other returned pubkeys are ECC, or 65 bytes Note that we return full\n        // (uncompressed) ECC pubkeys\n        addrs.push(pubBytes);\n      }\n      off += addressOffset;\n    } else {\n      // Otherwise we are dealing with address strings or XPUB strings\n      const addrBytes = data.slice(off, off + ProtocolConstants.addrStrLen);\n      off += ProtocolConstants.addrStrLen;\n      // Return the UTF-8 representation\n      const len = addrBytes.indexOf(0); // First 0 is the null terminator\n      if (len > 0) {\n        // Clean control characters from the string before adding to array\n        const cleanStr = addrBytes\n          .slice(0, len)\n          .toString()\n          // eslint-disable-next-line no-control-regex\n          .replace(/[\\x00-\\x1F\\x7F-\\x9F]/g, '');\n        addrs.push(cleanStr);\n      }\n    }\n  }\n\n  return addrs;\n};\n","import {\n  LatticeSecureEncryptedRequestType,\n  encryptedSecureRequest,\n} from '../protocol';\nimport { validateConnectedClient } from '../shared/validators';\nimport {\n  GetKvRecordsRequestFunctionParams,\n  GetKvRecordsData,\n  FirmwareConstants,\n} from '../types';\n\nexport async function getKvRecords({\n  client,\n  type: _type,\n  n: _n,\n  start: _start,\n}: GetKvRecordsRequestFunctionParams): Promise<GetKvRecordsData> {\n  const { url, sharedSecret, ephemeralPub, fwConstants } =\n    validateConnectedClient(client);\n\n  const { type, n, start } = validateGetKvRequest({\n    type: _type,\n    n: _n,\n    start: _start,\n    fwConstants,\n  });\n\n  const data = encodeGetKvRecordsRequest({ type, n, start });\n\n  const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({\n    data,\n    requestType: LatticeSecureEncryptedRequestType.getKvRecords,\n    sharedSecret,\n    ephemeralPub,\n    url,\n  });\n\n  client.mutate({\n    ephemeralPub: newEphemeralPub,\n  });\n\n  return decodeGetKvRecordsResponse(decryptedData, fwConstants);\n}\n\nexport const validateGetKvRequest = ({\n  fwConstants,\n  n,\n  type,\n  start,\n}: {\n  fwConstants: FirmwareConstants;\n  n?: number;\n  type?: number;\n  start?: number;\n}) => {\n  if (!fwConstants.kvActionsAllowed) {\n    throw new Error('Unsupported. Please update firmware.');\n  }\n  if (!n || n < 1) {\n    throw new Error('You must request at least one record.');\n  }\n  if (n > fwConstants.kvActionMaxNum) {\n    throw new Error(\n      `You may only request up to ${fwConstants.kvActionMaxNum} records at once.`,\n    );\n  }\n  if (type !== 0 && !type) {\n    throw new Error('You must specify a type.');\n  }\n  if (start !== 0 && !start) {\n    throw new Error('You must specify a type.');\n  }\n\n  return { fwConstants, n, type, start };\n};\n\nexport const encodeGetKvRecordsRequest = ({\n  type,\n  n,\n  start,\n}: {\n  type: number;\n  n: number;\n  start: number;\n}) => {\n  const payload = Buffer.alloc(9);\n  payload.writeUInt32LE(type, 0);\n  payload.writeUInt8(n, 4);\n  payload.writeUInt32LE(start, 5);\n  return payload;\n};\n\nexport const decodeGetKvRecordsResponse = (\n  data: Buffer,\n  fwConstants: FirmwareConstants,\n) => {\n  let off = 0;\n  const nTotal = data.readUInt32BE(off);\n  off += 4;\n  const nFetched = parseInt(data.slice(off, off + 1).toString('hex'), 16);\n  off += 1;\n  if (nFetched > fwConstants.kvActionMaxNum)\n    throw new Error('Too many records fetched. Firmware error.');\n  const records: any = [];\n  for (let i = 0; i < nFetched; i++) {\n    const r: any = {};\n    r.id = data.readUInt32BE(off);\n    off += 4;\n    r.type = data.readUInt32BE(off);\n    off += 4;\n    r.caseSensitive =\n      parseInt(data.slice(off, off + 1).toString('hex'), 16) === 1\n        ? true\n        : false;\n    off += 1;\n    const keySz = parseInt(data.slice(off, off + 1).toString('hex'), 16);\n    off += 1;\n    r.key = data.slice(off, off + keySz - 1).toString();\n    off += fwConstants.kvKeyMaxStrSz + 1;\n    const valSz = parseInt(data.slice(off, off + 1).toString('hex'), 16);\n    off += 1;\n    r.val = data.slice(off, off + valSz - 1).toString();\n    off += fwConstants.kvValMaxStrSz + 1;\n    records.push(r);\n  }\n  return {\n    records,\n    total: nTotal,\n    fetched: nFetched,\n  };\n};\n","import {\n  LatticeSecureEncryptedRequestType,\n  encryptedSecureRequest,\n} from '../protocol';\nimport { getPubKeyBytes } from '../shared/utilities';\nimport { validateConnectedClient } from '../shared/validators';\nimport { PairRequestParams, KeyPair } from '../types';\nimport { generateAppSecret, toPaddedDER } from '../util';\n\n/**\n * If a pairing secret is provided, `pair` uses it to sign a hash of the public key, name, and\n * pairing secret. It then sends the name and signature to the device. If no pairing secret is\n * provided, `pair` sends a zero-length name buffer to the device.\n * @category Lattice\n * @returns The active wallet object.\n */\nexport async function pair({\n  client,\n  pairingSecret,\n}: PairRequestParams): Promise<boolean> {\n  const { url, sharedSecret, ephemeralPub, appName, key } =\n    validateConnectedClient(client);\n  const data = encodePairRequest({ pairingSecret, key, appName });\n\n  const { newEphemeralPub } = await encryptedSecureRequest({\n    data,\n    requestType: LatticeSecureEncryptedRequestType.finalizePairing,\n    sharedSecret,\n    ephemeralPub,\n    url,\n  });\n\n  client.mutate({\n    ephemeralPub: newEphemeralPub,\n    isPaired: true,\n  });\n\n  await client.fetchActiveWallet();\n  return client.hasActiveWallet();\n}\n\nexport const encodePairRequest = ({\n  key,\n  pairingSecret,\n  appName,\n}: {\n  key: KeyPair;\n  pairingSecret: string;\n  appName: string;\n}) => {\n  // Build the payload data\n  const pubKeyBytes = getPubKeyBytes(key);\n  const nameBuf = Buffer.alloc(25);\n  if (pairingSecret.length > 0) {\n    // If a pairing secret of zero length is passed in, it usually indicates we want to cancel\n    // the pairing attempt. In this case we pass a zero-length name buffer so the firmware can\n    // know not to draw the error screen. Note that we still expect an error to come back\n    // (RESP_ERR_PAIR_FAIL)\n    nameBuf.write(appName);\n  }\n  const hash = generateAppSecret(\n    pubKeyBytes,\n    nameBuf,\n    Buffer.from(pairingSecret),\n  );\n  const sig = key.sign(hash);\n  const derSig = toPaddedDER(sig);\n  const payload = Buffer.concat([nameBuf, derSig]);\n  return payload;\n};\n","import {\n  LatticeSecureEncryptedRequestType,\n  encryptedSecureRequest,\n} from '../protocol';\nimport { validateConnectedClient } from '../shared/validators';\nimport {\n  RemoveKvRecordsRequestFunctionParams,\n  FirmwareConstants,\n} from '../types';\n\n/**\n * `removeKvRecords` takes in an array of ids and sends a request to remove them from the Lattice.\n * @category Lattice\n * @returns A callback with an error or null.\n */\nexport async function removeKvRecords({\n  client,\n  type: _type,\n  ids: _ids,\n}: RemoveKvRecordsRequestFunctionParams): Promise<Buffer> {\n  const { url, sharedSecret, ephemeralPub, fwConstants } =\n    validateConnectedClient(client);\n\n  const { type, ids } = validateRemoveKvRequest({\n    fwConstants,\n    type: _type,\n    ids: _ids,\n  });\n\n  const data = encodeRemoveKvRecordsRequest({\n    type,\n    ids,\n    fwConstants,\n  });\n\n  const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({\n    data,\n    requestType: LatticeSecureEncryptedRequestType.removeKvRecords,\n    sharedSecret,\n    ephemeralPub,\n    url,\n  });\n\n  client.mutate({\n    ephemeralPub: newEphemeralPub,\n  });\n\n  return decryptedData;\n}\n\nexport const validateRemoveKvRequest = ({\n  fwConstants,\n  type,\n  ids,\n}: {\n  fwConstants: FirmwareConstants;\n  type?: number;\n  ids?: string[];\n}) => {\n  if (!fwConstants.kvActionsAllowed) {\n    throw new Error('Unsupported. Please update firmware.');\n  }\n  if (!Array.isArray(ids) || ids.length < 1) {\n    throw new Error('You must include one or more `ids` to removed.');\n  }\n  if (ids.length > fwConstants.kvRemoveMaxNum) {\n    throw new Error(\n      `Only up to ${fwConstants.kvRemoveMaxNum} records may be removed at once.`,\n    );\n  }\n  if (type !== 0 && !type) {\n    throw new Error('You must specify a type.');\n  }\n  return { type, ids };\n};\n\nexport const encodeRemoveKvRecordsRequest = ({\n  fwConstants,\n  type,\n  ids,\n}: {\n  fwConstants: FirmwareConstants;\n  type: number;\n  ids: string[];\n}) => {\n  const payload = Buffer.alloc(5 + 4 * fwConstants.kvRemoveMaxNum);\n  payload.writeUInt32LE(type, 0);\n  payload.writeUInt8(ids.length, 4);\n  for (let i = 0; i < ids.length; i++) {\n    const id = parseInt(ids[i] as string);\n    payload.writeUInt32LE(id, 5 + 4 * i);\n  }\n  return payload;\n};\n","import { Hash } from 'ox';\nimport { type Hex, type Address } from 'viem';\nimport bitcoin from '../bitcoin';\nimport { CURRENCIES } from '../constants';\nimport ethereum from '../ethereum';\nimport { parseGenericSigningResponse } from '../genericSigning';\nimport {\n  LatticeSecureEncryptedRequestType,\n  LatticeSignSchema,\n  encryptedSecureRequest,\n} from '../protocol';\nimport { buildTransaction } from '../shared/functions';\nimport { validateConnectedClient, validateWallet } from '../shared/validators';\nimport { parseDER } from '../util';\nimport {\n  SignRequestFunctionParams,\n  SigningRequestResponse,\n  EncodeSignRequestParams,\n  DecodeSignResponseParams,\n  SignData,\n  BitcoinSignRequest,\n  SignRequest,\n} from '../types';\n\n/**\n * `sign` builds and sends a request for signing to the device.\n * @category Lattice\n * @returns The response from the device.\n */\nexport async function sign({\n  client,\n  data,\n  currency,\n  cachedData,\n  nextCode,\n}: SignRequestFunctionParams): Promise<SigningRequestResponse> {\n  try {\n    const { url, sharedSecret, ephemeralPub, fwConstants } =\n      validateConnectedClient(client);\n    const wallet = validateWallet(client.getActiveWallet());\n\n    const { requestData, isGeneric } = buildTransaction({\n      data,\n      currency,\n      fwConstants,\n    });\n\n    const { payload, hasExtraPayloads } = encodeSignRequest({\n      fwConstants,\n      wallet,\n      requestData,\n      cachedData,\n      nextCode,\n    });\n\n    const { decryptedData, newEphemeralPub } = await encryptedSecureRequest({\n      data: payload,\n      requestType: LatticeSecureEncryptedRequestType.sign,\n      sharedSecret,\n      ephemeralPub,\n      url,\n    });\n\n    client.mutate({\n      ephemeralPub: newEphemeralPub,\n    });\n\n    // If this request has multiple payloads, we need to recurse\n    // so that we can make the next request.\n    // It is chained to the first request using `nextCode`\n    if (hasExtraPayloads) {\n      return client.sign({\n        data,\n        currency,\n        cachedData: requestData,\n        nextCode: decryptedData.slice(0, 8),\n      });\n    }\n    // If this is the only (or final) request,\n    // decode response data and return\n    const decodedResponse = decodeSignResponse({\n      data: decryptedData,\n      request: requestData as SignRequest,\n      isGeneric,\n      currency,\n    });\n\n    return decodedResponse;\n  } catch (err) {\n    console.error('Error signing transaction:', {\n      message: err.message,\n      payload: JSON.stringify(\n        {\n          data,\n          currency,\n        },\n        (_key, value) => (typeof value === 'bigint' ? value.toString() : value),\n      ),\n    });\n    throw err;\n  }\n}\n\nexport const encodeSignRequest = ({\n  fwConstants,\n  wallet,\n  requestData,\n  cachedData,\n  nextCode,\n}: EncodeSignRequestParams) => {\n  let reqPayload: Buffer;\n  let schema: number;\n  let hasExtraPayloads = 0;\n  const typedRequestData = requestData as SignRequest & {\n    extraDataPayloads?: Buffer[];\n  };\n\n  if (cachedData && nextCode) {\n    const typedCachedData = cachedData as SignRequest & {\n      extraDataPayloads: Buffer[];\n    };\n    const nextExtraPayload = typedCachedData.extraDataPayloads.shift();\n    if (!nextExtraPayload) {\n      throw new Error(\n        'No cached extra payload available for multipart sign request.',\n      );\n    }\n    if (typedRequestData.extraDataPayloads) {\n      typedRequestData.extraDataPayloads = typedCachedData.extraDataPayloads;\n    }\n    reqPayload = Buffer.concat([nextCode, nextExtraPayload]);\n    schema = LatticeSignSchema.extraData;\n    hasExtraPayloads = Number(\n      (typedCachedData.extraDataPayloads?.length ?? 0) > 0,\n    );\n  } else {\n    reqPayload = typedRequestData.payload;\n    schema = typedRequestData.schema;\n    hasExtraPayloads = Number(\n      (typedRequestData.extraDataPayloads?.length ?? 0) > 0,\n    );\n  }\n\n  const payload = Buffer.alloc(2 + fwConstants.reqMaxDataSz);\n  let off = 0;\n\n  payload.writeUInt8(hasExtraPayloads, off);\n  off += 1;\n  // Copy request schema (e.g. ETH or BTC transfer)\n  payload.writeUInt8(schema, off);\n  off += 1;\n  // Copy the wallet UID\n  wallet.uid?.copy(payload, off);\n  off += wallet.uid?.length ?? 0;\n  // Build data based on the type of request\n  reqPayload.copy(payload, off);\n  return { payload, hasExtraPayloads };\n};\n\nexport const decodeSignResponse = ({\n  data,\n  request,\n  isGeneric,\n  currency,\n}: DecodeSignResponseParams): SignData => {\n  let off = 0;\n  const derSigLen = 74; // DER signatures are 74 bytes\n  if (currency === CURRENCIES.BTC) {\n    const btcRequest = request as BitcoinSignRequest;\n    const pkhLen = 20; // Pubkeyhashes are 20 bytes\n    const sigsLen = 760; // Up to 10x DER signatures\n    const changeVersion = bitcoin.getAddressFormat(\n      btcRequest.origData.changePath,\n    );\n    const changePubKeyHash = data.slice(off, off + pkhLen);\n    off += pkhLen;\n    const changeRecipient = bitcoin.getBitcoinAddress(\n      changePubKeyHash,\n      changeVersion,\n    );\n    const compressedPubLength = 33; // Size of compressed public key\n    const pubkeys = [] as any[];\n    const sigs = [] as any[];\n    let n = 0;\n    // Parse the signature for each output -- they are returned in the serialized payload in form\n    // [pubkey, sig] There is one signature per output\n    while (off < data.length) {\n      // Exit out if we have seen all the returned sigs and pubkeys\n      if (data[off] !== 0x30) break;\n      // Otherwise grab another set Note that all DER sigs returned fill the maximum 74 byte\n      // buffer, but also contain a length at off+1, which we use to parse the non-zero data.\n      // First get the signature from its slot\n      const sigStart = off;\n      const sigEnd = off + 2 + data[off + 1];\n      sigs.push(data.slice(sigStart, sigEnd));\n      off += derSigLen;\n      // Next, shift by the full set of signatures to hit the respective pubkey NOTE: The data\n      // returned is: [<sig0>, <sig1>, ... <sig9>][<pubkey0>, <pubkey1>, ... <pubkey9>]\n      const pubStart = n * compressedPubLength + sigsLen;\n      const pubEnd = (n + 1) * compressedPubLength + sigsLen;\n      pubkeys.push(data.slice(pubStart, pubEnd));\n      // Update offset to hit the next signature slot\n      n += 1;\n    }\n    // Build the transaction data to be serialized\n    const preSerializedData: any = {\n      inputs: [],\n      outputs: [],\n    };\n\n    // First output comes from request dta\n    preSerializedData.outputs.push({\n      value: btcRequest.origData.value,\n      recipient: btcRequest.origData.recipient,\n    });\n    if (btcRequest.changeData?.value && btcRequest.changeData.value > 0) {\n      // Second output comes from change data\n      preSerializedData.outputs.push({\n        value: btcRequest.changeData.value,\n        recipient: changeRecipient,\n      });\n    }\n\n    // Add the inputs\n    for (let i = 0; i < sigs.length; i++) {\n      preSerializedData.inputs.push({\n        hash: btcRequest.origData.prevOuts[i].txHash,\n        index: btcRequest.origData.prevOuts[i].index,\n        sig: sigs[i],\n        pubkey: pubkeys[i],\n        signerPath: btcRequest.origData.prevOuts[i].signerPath,\n      });\n    }\n\n    // Finally, serialize the transaction\n    const serializedTx = bitcoin.serializeTx(preSerializedData);\n    // Generate the transaction hash so the user can look this transaction up later\n    const preImageTxHash = serializedTx;\n    const txHashPre: Buffer = Buffer.from(\n      Hash.sha256(Buffer.from(preImageTxHash, 'hex')),\n    );\n    // Add extra data for debugging/lookup purposes\n    return {\n      tx: serializedTx,\n      txHash: `0x${Buffer.from(Hash.sha256(txHashPre)).toString('hex')}` as Hex,\n      changeRecipient,\n      sigs,\n    };\n  } else if (currency === CURRENCIES.ETH && !isGeneric) {\n    const sig = parseDER(data.slice(off, off + 2 + data[off + 1]));\n    off += derSigLen;\n    const ethAddr = data.slice(off, off + 20);\n    // Determine the `v` param and add it to the sig before returning\n    const result = ethereum.buildEthRawTx(request, sig, ethAddr);\n\n    // Handle both object and string returns from buildEthRawTx\n    if (typeof result === 'string') {\n      // EIP-7702 transactions return only the hex string\n      // Per EIP-7702: \"The [EIP-2718] `ReceiptPayload` for this transaction is\n      // `rlp([status, cumulative_transaction_gas_used, logs_bloom, logs])`.\"\n      return {\n        tx: `0x${result}`,\n        txHash: `0x${ethereum.hashTransaction(result)}` as Hex,\n        sig: {\n          v: 0n,\n          r: `0x${''}` as Hex,\n          s: `0x${''}` as Hex,\n        },\n        signer: `0x${ethAddr.toString('hex')}` as Address,\n      };\n    } else {\n      // Normal transactions return object with rawTx and sigWithV\n      const response: SignData = {\n        tx: `0x${result.rawTx}`,\n        txHash: `0x${ethereum.hashTransaction(result.rawTx)}` as Hex,\n        sig: {\n          v: BigInt(`0x${result.sigWithV.v.toString('hex')}`),\n          r: `0x${result.sigWithV.r.toString('hex')}` as Hex,\n          s: `0x${result.sigWithV.s.toString('hex')}` as Hex,\n        },\n        signer: `0x${ethAddr.toString('hex')}` as Address,\n      };\n\n      // Add normalized viem-compatible signed transaction if original transaction data is available\n      // Note: For now, skip viem transaction normalization due to interface compatibility\n      // This can be added back when proper transaction data is available\n\n      return response;\n    }\n  } else if (currency === CURRENCIES.ETH_MSG) {\n    const sig = parseDER(data.slice(off, off + 2 + data[off + 1]));\n    off += derSigLen;\n    const signer = data.slice(off, off + 20);\n    const validatedSig = ethereum.validateEthereumMsgResponse(\n      { signer, sig },\n      request,\n    );\n    return {\n      sig: {\n        v: BigInt(`0x${validatedSig.v.toString('hex')}`),\n        r: `0x${validatedSig.r.toString('hex')}` as Hex,\n        s: `0x${validatedSig.s.toString('hex')}` as Hex,\n      },\n      signer: `0x${signer.toString('hex')}` as Address,\n    };\n  } else {\n    // Generic signing request\n    return parseGenericSigningResponse(data, off, request);\n  }\n};\n","import { buildSaveClientFn } from './api/utilities';\nimport {\n  BASE_URL,\n  DEFAULT_ACTIVE_WALLETS,\n  EMPTY_WALLET_UID,\n  getFwVersionConst,\n} from './constants';\nimport {\n  addKvRecords,\n  connect,\n  fetchActiveWallet,\n  fetchEncData,\n  getAddresses,\n  getKvRecords,\n  pair,\n  removeKvRecords,\n  sign,\n} from './functions/index';\nimport { buildRetryWrapper } from './shared/functions';\nimport { getPubKeyBytes } from './shared/utilities';\nimport { validateEphemeralPub } from './shared/validators';\nimport {\n  KeyPair,\n  ActiveWallets,\n  GetAddressesRequestParams,\n  SignRequestParams,\n  SignData,\n  AddKvRecordsRequestParams,\n  GetKvRecordsRequestParams,\n  GetKvRecordsData,\n  RemoveKvRecordsRequestParams,\n  FetchEncDataRequest,\n} from './types';\nimport { getP256KeyPair, getP256KeyPairFromPub, randomBytes } from './util';\n\n/**\n * `Client` is a class-based interface for managing a Lattice device.\n *\n * @deprecated\n * - This class is deprecated for external use. It is used internally by the SDK to manage\n * the state of the connection to the Lattice device. It is not recommended to use this class directly.\n * The recommended way to interact with the Lattice is through the functional interface.\n * - See the [`src/api` directory on GitHub](https://github.com/GridPlus/gridplus-sdk/tree/dev/src/api)\n *  or [learn more in the docs](https://gridplus.github.io/gridplus-sdk/).\n *\n */\nexport class Client {\n  /** Is the Lattice paired with this Client. */\n  public isPaired: boolean;\n  /** The time to wait for a response before cancelling. */\n  public timeout: number;\n  /** The base of the remote url to which the SDK sends requests. */\n  public baseUrl: string;\n  /** @internal The `baseUrl` plus the `deviceId`. Set in {@link connect} when it completes successfully.  */\n  public url?: string;\n  /** `name` is a human readable string associated with this app on the Lattice */\n  private name: string;\n  private key: KeyPair;\n  /**`privKey` is used to generate a keypair, which is used for maintaining an encrypted messaging channel with the target Lattice  */\n  private privKey: Buffer | string;\n  private retryCount: number;\n  private fwVersion?: Buffer;\n  private skipRetryOnWrongWallet: boolean;\n  /** Temporary secret that is generated by the Lattice device */\n  private _ephemeralPub!: KeyPair;\n  /** The ID of the connected Lattice */\n  private deviceId?: string;\n  /** Information about the current wallet. Should be null unless we know a wallet is present */\n  public activeWallets: ActiveWallets;\n  /** A wrapper function for handling retries and injecting the {@link Client} class  */\n  private retryWrapper: (fn: any, params?: any) => Promise<any>;\n  /** Function to set the stored client data */\n  private setStoredClient?: (clientData: string | null) => Promise<void>;\n\n  /**\n   * @param params - Parameters are passed as an object.\n   */\n  constructor({\n    baseUrl,\n    name,\n    privKey,\n    stateData,\n    timeout,\n    retryCount,\n    skipRetryOnWrongWallet,\n    deviceId,\n    setStoredClient,\n  }: {\n    /** The base URL of the signing server. */\n    baseUrl?: string;\n    /** The name of the client. */\n    name?: string;\n    /** The private key of the client.*/\n    privKey?: Buffer | string;\n    /** Number of times to retry a request if it fails. */\n    retryCount?: number;\n    /** The time to wait for a response before cancelling. */\n    timeout?: number;\n    /** User can pass in previous state data to rehydrate connected session */\n    stateData?: string;\n    /** If true we will not retry if we get a wrong wallet error code */\n    skipRetryOnWrongWallet?: boolean;\n    /** The ID of the connected Lattice */\n    deviceId?: string;\n    /** Function to set the stored client data */\n    setStoredClient?: (clientData: string | null) => Promise<void>;\n  }) {\n    this.name = name || 'Unknown';\n    this.baseUrl = baseUrl || BASE_URL;\n    this.deviceId = deviceId;\n    this.isPaired = false;\n    this.activeWallets = DEFAULT_ACTIVE_WALLETS;\n    this.timeout = timeout || 60000;\n    this.retryCount = retryCount || 3;\n    this.skipRetryOnWrongWallet = skipRetryOnWrongWallet || false;\n    this.privKey = privKey || randomBytes(32);\n    this.key = getP256KeyPair(this.privKey);\n    this.retryWrapper = buildRetryWrapper(this, this.retryCount);\n    this.setStoredClient = setStoredClient\n      ? buildSaveClientFn(setStoredClient)\n      : undefined;\n\n    /** The user may pass in state data to rehydrate a session that was previously cached */\n    if (stateData) {\n      this.unpackAndApplyStateData(stateData);\n    }\n  }\n\n  /**\n   * Get the public key associated with the client's static keypair.\n   * The public key is used for identifying the client to the Lattice.\n   * @internal\n   * @returns Buffer\n   */\n  public get publicKey() {\n    return getPubKeyBytes(this.key);\n  }\n\n  /**\n   * Get the pairing name for this client instance\n   */\n  public getAppName() {\n    return this.name;\n  }\n\n  /**\n   * Get the `deviceId` for this client instance\n   */\n  public getDeviceId() {\n    return this.deviceId;\n  }\n\n  /**\n   * Get the shared secret, derived via ECDH from the local private key and the ephemeral public key\n   * @internal\n   * @returns Buffer\n   */\n  public get sharedSecret() {\n    // Once every ~256 attempts, we will get a key that starts with a `00` byte, which can lead to\n    // problems initializing AES if we don't force a 32 byte BE buffer.\n    return Buffer.from(\n      this.key.derive(this.ephemeralPub.getPublic()).toArray('be', 32),\n    );\n  }\n\n  /** @internal */\n  public get ephemeralPub() {\n    return this._ephemeralPub;\n  }\n\n  /** @internal */\n  public set ephemeralPub(ephemeralPub: KeyPair) {\n    validateEphemeralPub(ephemeralPub);\n    this._ephemeralPub = ephemeralPub;\n  }\n\n  /**\n   * Attempt to contact a device based on its `deviceId`. The response should include an ephemeral\n   * public key, which is used to pair with the device in a later request.\n   * @category Lattice\n   */\n  public async connect(deviceId: string) {\n    return this.retryWrapper(connect, { id: deviceId });\n  }\n\n  /**\n   * If a pairing secret is provided, `pair` uses it to sign a hash of the public key, name, and\n   * pairing secret. It then sends the name and signature to the device. If no pairing secret is\n   * provided, `pair` sends a zero-length name buffer to the device.\n   * @category Lattice\n   */\n  public async pair(pairingSecret: string) {\n    return this.retryWrapper(pair, { pairingSecret });\n  }\n\n  /**\n   * Takes a starting path and a number to get the addresses associated with the active wallet.\n   * @category Lattice\n   */\n  public async getAddresses({\n    startPath,\n    n = 1,\n    flag = 0,\n    iterIdx = 0,\n  }: GetAddressesRequestParams): Promise<Buffer[] | string[]> {\n    return this.retryWrapper(getAddresses, { startPath, n, flag, iterIdx });\n  }\n\n  /**\n   * Builds and sends a request for signing to the Lattice.\n   * @category Lattice\n   */\n  public async sign({\n    data,\n    currency,\n    cachedData,\n    nextCode,\n  }: SignRequestParams): Promise<SignData> {\n    return this.retryWrapper(sign, { data, currency, cachedData, nextCode });\n  }\n\n  /**\n   * Fetch the active wallet in the Lattice.\n   */\n  public async fetchActiveWallet(): Promise<ActiveWallets> {\n    return this.retryWrapper(fetchActiveWallet);\n  }\n\n  /**\n   * Takes in a set of key-value records and sends a request to add them to the Lattice.\n   * @category Lattice\n   */\n  async addKvRecords({\n    type = 0,\n    records,\n    caseSensitive = false,\n  }: AddKvRecordsRequestParams): Promise<Buffer> {\n    return this.retryWrapper(addKvRecords, { type, records, caseSensitive });\n  }\n\n  /**\n   * Fetches a list of key-value records from the Lattice.\n   * @category Lattice\n   */\n  public async getKvRecords({\n    type = 0,\n    n = 1,\n    start = 0,\n  }: GetKvRecordsRequestParams): Promise<GetKvRecordsData> {\n    return this.retryWrapper(getKvRecords, { type, n, start });\n  }\n\n  /**\n   * Takes in an array of ids and sends a request to remove them from the Lattice.\n   * @category Lattice\n   */\n  public async removeKvRecords({\n    type = 0,\n    ids = [],\n  }: RemoveKvRecordsRequestParams): Promise<Buffer> {\n    return this.retryWrapper(removeKvRecords, { type, ids });\n  }\n\n  /**\n   * Fetch a record of encrypted data from the Lattice.\n   * Must specify a data type. Returns a Buffer containing\n   * data formatted according to the specified type.\n   * @category Lattice\n   */\n  public async fetchEncryptedData(\n    params: FetchEncDataRequest,\n  ): Promise<Buffer> {\n    return this.retryWrapper(fetchEncData, params);\n  }\n\n  /** Get the active wallet */\n  public getActiveWallet() {\n    if (\n      this.activeWallets.external.uid &&\n      !EMPTY_WALLET_UID.equals(this.activeWallets.external.uid)\n    ) {\n      return this.activeWallets.external;\n    } else if (\n      this.activeWallets.internal.uid &&\n      !EMPTY_WALLET_UID.equals(this.activeWallets.internal.uid)\n    ) {\n      return this.activeWallets.internal;\n    } else {\n      return undefined;\n    }\n  }\n\n  /** Check if the user has an active wallet */\n  public hasActiveWallet() {\n    return !!this.getActiveWallet();\n  }\n\n  /**\n   * Reset the active wallets to empty values.\n   * @category Device Response\n   * @internal\n   */\n  public resetActiveWallets() {\n    this.activeWallets = DEFAULT_ACTIVE_WALLETS;\n  }\n\n  /**\n   * Get a JSON string containing state data that can be used to rehydrate a session. Pass the\n   * contents of this to the constructor as `stateData` to rehydrate.\n   * @internal\n   */\n  public getStateData() {\n    return this.packStateData();\n  }\n\n  /**\n   * Returns the firmware version constants for the given firmware version.\n   * @internal\n   */\n  public getFwConstants() {\n    return getFwVersionConst(this.fwVersion ?? Buffer.alloc(0));\n  }\n\n  /**\n   * `getFwVersion` gets the firmware version of the paired device.\n   * @internal\n   */\n  public getFwVersion(): {\n    fix: number;\n    minor: number;\n    major: number;\n  } {\n    if (this.fwVersion && this.fwVersion.length >= 3) {\n      return {\n        fix: this.fwVersion[0],\n        minor: this.fwVersion[1],\n        major: this.fwVersion[2],\n      };\n    }\n    return { fix: 0, minor: 0, major: 0 };\n  }\n\n  /**\n   * Handles the mutation of Client state in the primary functions.\n   */\n  public mutate({\n    deviceId,\n    ephemeralPub,\n    url,\n    isPaired,\n    fwVersion,\n    activeWallets,\n  }: {\n    deviceId?: string;\n    ephemeralPub?: KeyPair;\n    url?: string;\n    isPaired?: boolean;\n    fwVersion?: Buffer;\n    activeWallets?: ActiveWallets;\n  }) {\n    if (deviceId !== undefined) this.deviceId = deviceId;\n    if (ephemeralPub !== undefined) this.ephemeralPub = ephemeralPub;\n    if (url !== undefined) this.url = url;\n    if (isPaired !== undefined) this.isPaired = isPaired;\n    if (fwVersion !== undefined) this.fwVersion = fwVersion;\n    if (activeWallets !== undefined) this.activeWallets = activeWallets;\n\n    if (this.setStoredClient) {\n      this.setStoredClient(this.getStateData());\n    }\n  }\n\n  /**\n   * Return JSON-stringified version of state data. Can be used to rehydrate an SDK session without\n   * reconnecting to the target Lattice.\n   * @internal\n   */\n  private packStateData() {\n    try {\n      const data = {\n        activeWallets: {\n          internal: {\n            uid: this.activeWallets.internal.uid?.toString('hex'),\n            name: this.activeWallets.internal.name?.toString(),\n            capabilities: this.activeWallets.internal.capabilities,\n          },\n          external: {\n            uid: this.activeWallets.external.uid?.toString('hex'),\n            name: this.activeWallets.external.name?.toString(),\n            capabilities: this.activeWallets.external.capabilities,\n          },\n        },\n        ephemeralPub: this.ephemeralPub?.getPublic()?.encode('hex', false),\n        fwVersion: this.fwVersion?.toString('hex'),\n        deviceId: this.deviceId,\n        name: this.name,\n        baseUrl: this.baseUrl,\n        privKey: this.privKey.toString('hex'),\n        retryCount: this.retryCount,\n        timeout: this.timeout,\n      };\n      return JSON.stringify(data);\n    } catch (err) {\n      console.warn('Could not pack state data:', err);\n      return null;\n    }\n  }\n\n  /**\n   * Unpack a JSON-stringified version of state data and apply it to state. This will allow us to\n   * rehydrate an old session.\n   * @internal\n   */\n  private unpackAndApplyStateData(data: string) {\n    try {\n      const unpacked = JSON.parse(data);\n      // Attempt to parse the data\n      const internalWallet = {\n        uid: Buffer.from(unpacked.activeWallets.internal.uid, 'hex'),\n        name: unpacked.activeWallets.internal.name\n          ? Buffer.from(unpacked.activeWallets.internal.name)\n          : null,\n        capabilities: unpacked.activeWallets.internal.capabilities,\n        external: false,\n      };\n      const externalWallet = {\n        uid: Buffer.from(unpacked.activeWallets.external.uid, 'hex'),\n        name: unpacked.activeWallets.external.name\n          ? Buffer.from(unpacked.activeWallets.external.name)\n          : null,\n        capabilities: unpacked.activeWallets.external.capabilities,\n        external: true,\n      };\n      const ephemeralPubBytes = Buffer.from(unpacked.ephemeralPub, 'hex');\n      const fwVersionBytes = Buffer.from(unpacked.fwVersion, 'hex');\n      const privKeyBytes = Buffer.from(unpacked.privKey, 'hex');\n      // Apply unpacked params\n      this.activeWallets.internal = internalWallet;\n      this.activeWallets.external = externalWallet;\n      this.ephemeralPub = getP256KeyPairFromPub(ephemeralPubBytes);\n      this.fwVersion = fwVersionBytes;\n      this.deviceId = unpacked.deviceId;\n      this.name = unpacked.name;\n      this.baseUrl = unpacked.baseUrl;\n      this.url = `${this.baseUrl}/${this.deviceId}`;\n      this.privKey = privKeyBytes;\n      this.key = getP256KeyPair(this.privKey);\n      this.retryCount = unpacked.retryCount;\n      this.timeout = unpacked.timeout;\n      this.retryWrapper = buildRetryWrapper(this, this.retryCount);\n    } catch (err) {\n      console.warn('Could not apply state data:', err);\n    }\n  }\n}\n","import {\n  BTC_LEGACY_CHANGE_DERIVATION,\n  BTC_LEGACY_DERIVATION,\n  BTC_LEGACY_XPUB_PATH,\n  BTC_SEGWIT_CHANGE_DERIVATION,\n  BTC_SEGWIT_DERIVATION,\n  BTC_SEGWIT_ZPUB_PATH,\n  BTC_WRAPPED_SEGWIT_CHANGE_DERIVATION,\n  BTC_WRAPPED_SEGWIT_DERIVATION,\n  BTC_WRAPPED_SEGWIT_YPUB_PATH,\n  DEFAULT_ETH_DERIVATION,\n  HARDENED_OFFSET,\n  LEDGER_LEGACY_DERIVATION,\n  LEDGER_LIVE_DERIVATION,\n  MAX_ADDR,\n  SOLANA_DERIVATION,\n} from '../constants';\nimport { LatticeGetAddressesFlag } from '../protocol/latticeConstants';\nimport { GetAddressesRequestParams, WalletPath } from '../types';\nimport {\n  getStartPath,\n  parseDerivationPathComponents,\n  queue,\n  getFlagFromPath,\n} from './utilities';\n\ntype FetchAddressesParams = {\n  n?: number;\n  startPathIndex?: number;\n  flag?: number;\n};\n\nexport const fetchAddresses = async (\n  overrides?: Partial<GetAddressesRequestParams>,\n) => {\n  let allAddresses: string[] = [];\n  let totalFetched = 0;\n  const totalToFetch = overrides?.n || MAX_ADDR;\n\n  while (totalFetched < totalToFetch) {\n    const batchSize = Math.min(MAX_ADDR, totalToFetch - totalFetched);\n    const startPath = getStartPath(DEFAULT_ETH_DERIVATION, totalFetched);\n    await queue((client) =>\n      client\n        .getAddresses({\n          startPath,\n          ...overrides,\n          n: batchSize,\n        })\n        .then((addresses: string[]) => {\n          if (addresses.length > 0) {\n            allAddresses = [...allAddresses, ...addresses];\n            totalFetched += addresses.length;\n          }\n        }),\n    );\n  }\n\n  return allAddresses;\n};\n\n/**\n * Fetches a single address from the device.\n *\n * @note By default, this function fetches m/44'/60'/0'/0/0\n * @param path - either the index of ETH signing path or the derivation path to fetch\n */\nexport const fetchAddress = async (\n  path: number | WalletPath = 0,\n): Promise<string> => {\n  return fetchAddresses({\n    startPath:\n      typeof path === 'number'\n        ? getStartPath(DEFAULT_ETH_DERIVATION, path)\n        : path,\n    n: 1,\n  }).then((addrs) => addrs[0]);\n};\n\nfunction createFetchBtcAddressesFunction(derivationPath: number[]) {\n  return async (\n    { n, startPathIndex }: FetchAddressesParams = {\n      n: MAX_ADDR,\n      startPathIndex: 0,\n    },\n  ) => {\n    return fetchAddresses({\n      startPath: getStartPath(derivationPath, startPathIndex),\n      n,\n    });\n  };\n}\nexport const fetchBtcLegacyAddresses = createFetchBtcAddressesFunction(\n  BTC_LEGACY_DERIVATION,\n);\nexport const fetchBtcSegwitAddresses = createFetchBtcAddressesFunction(\n  BTC_SEGWIT_DERIVATION,\n);\nexport const fetchBtcWrappedSegwitAddresses = createFetchBtcAddressesFunction(\n  BTC_WRAPPED_SEGWIT_DERIVATION,\n);\nexport const fetchBtcLegacyChangeAddresses = createFetchBtcAddressesFunction(\n  BTC_LEGACY_CHANGE_DERIVATION,\n);\nexport const fetchBtcSegwitChangeAddresses = createFetchBtcAddressesFunction(\n  BTC_SEGWIT_CHANGE_DERIVATION,\n);\nexport const fetchBtcWrappedSegwitChangeAddresses =\n  createFetchBtcAddressesFunction(BTC_WRAPPED_SEGWIT_CHANGE_DERIVATION);\n\nexport const fetchSolanaAddresses = async (\n  { n, startPathIndex }: FetchAddressesParams = {\n    n: MAX_ADDR,\n    startPathIndex: 0,\n  },\n) => {\n  return fetchAddresses({\n    startPath: getStartPath(SOLANA_DERIVATION, startPathIndex, 2),\n    n,\n    flag: 4,\n  });\n};\n\nexport const fetchLedgerLiveAddresses = async (\n  { n, startPathIndex }: FetchAddressesParams = {\n    n: MAX_ADDR,\n    startPathIndex: 0,\n  },\n) => {\n  const addresses = [];\n  for (let i = 0; i < n; i++) {\n    addresses.push(\n      queue((client) =>\n        client\n          .getAddresses({\n            startPath: getStartPath(\n              LEDGER_LIVE_DERIVATION,\n              startPathIndex + i,\n              2,\n            ),\n            n: 1,\n          })\n          .then((addresses) => addresses.map((address) => `${address}`)),\n      ),\n    );\n  }\n  return Promise.all(addresses);\n};\n\nexport const fetchLedgerLegacyAddresses = async (\n  { n, startPathIndex }: FetchAddressesParams = {\n    n: MAX_ADDR,\n    startPathIndex: 0,\n  },\n) => {\n  const addresses = [];\n  for (let i = 0; i < n; i++) {\n    addresses.push(\n      queue((client) =>\n        client\n          .getAddresses({\n            startPath: getStartPath(\n              LEDGER_LEGACY_DERIVATION,\n              startPathIndex + i,\n              3,\n            ),\n            n: 1,\n          })\n          .then((addresses) => addresses.map((address) => `${address}`)),\n      ),\n    );\n  }\n  return Promise.all(addresses);\n};\n\nexport const fetchBip44ChangeAddresses = async ({\n  n = MAX_ADDR,\n  startPathIndex = 0,\n}: FetchAddressesParams = {}) => {\n  const addresses = [];\n  for (let i = 0; i < n; i++) {\n    addresses.push(\n      queue((client) => {\n        const startPath = [\n          44 + HARDENED_OFFSET,\n          501 + HARDENED_OFFSET,\n          startPathIndex + i + HARDENED_OFFSET,\n          0 + HARDENED_OFFSET,\n        ];\n        return client\n          .getAddresses({\n            startPath,\n            n: 1,\n            flag: 4,\n          })\n          .then((addresses) => addresses.map((address) => `${address}`));\n      }),\n    );\n  }\n  return Promise.all(addresses);\n};\n\nexport async function fetchAddressesByDerivationPath(\n  path: string,\n  { n = 1, startPathIndex = 0, flag }: FetchAddressesParams = {},\n): Promise<string[]> {\n  const components = path.split('/').filter(Boolean);\n  const parsedPath = parseDerivationPathComponents(components);\n  const _flag = getFlagFromPath(parsedPath);\n  const wildcardIndex = components.findIndex((part) =>\n    part.toLowerCase().includes('x'),\n  );\n\n  if (wildcardIndex === -1) {\n    return queue((client) =>\n      client.getAddresses({\n        startPath: parsedPath,\n        flag: flag || _flag,\n        n,\n      }),\n    );\n  }\n\n  const addresses: string[] = [];\n  for (let i = 0; i < n; i++) {\n    const currentPath = [...parsedPath];\n    currentPath[wildcardIndex] =\n      currentPath[wildcardIndex] + startPathIndex + i;\n\n    const result = await queue((client) =>\n      client.getAddresses({\n        startPath: currentPath,\n        flag: flag || _flag,\n        n: 1,\n      }),\n    );\n    addresses.push(...result);\n  }\n\n  return addresses;\n}\n\n/**\n * Fetches Bitcoin legacy extended public key (xpub) for BIP44 (m/44'/0'/0').\n * @returns xpub string\n */\nexport async function fetchBtcXpub(): Promise<string> {\n  const result = await fetchAddressesByDerivationPath(BTC_LEGACY_XPUB_PATH, {\n    flag: LatticeGetAddressesFlag.secp256k1Xpub,\n  });\n  return result[0];\n}\n\n/**\n * Fetches Bitcoin wrapped segwit extended public key (ypub) for BIP49 (m/49'/0'/0').\n * @returns ypub string\n */\nexport async function fetchBtcYpub(): Promise<string> {\n  const result = await fetchAddressesByDerivationPath(\n    BTC_WRAPPED_SEGWIT_YPUB_PATH,\n    {\n      flag: LatticeGetAddressesFlag.secp256k1Xpub,\n    },\n  );\n  return result[0];\n}\n\n/**\n * Fetches Bitcoin native segwit extended public key (zpub) for BIP84 (m/84'/0'/0').\n * @returns zpub string\n */\nexport async function fetchBtcZpub(): Promise<string> {\n  const result = await fetchAddressesByDerivationPath(BTC_SEGWIT_ZPUB_PATH, {\n    flag: LatticeGetAddressesFlag.secp256k1Xpub,\n  });\n  return result[0];\n}\n","import { Client } from '../client';\nimport { MAX_ADDR } from '../constants';\nimport { AddressTag } from '../types';\nimport { queue } from './utilities';\n\n/**\n * Sends request to the Lattice to add Address Tags.\n */\nexport const addAddressTags = async (\n  tags: [{ [key: string]: string }],\n): Promise<Buffer> => {\n  // convert an array of objects to an object\n  const records = tags.reduce((acc, tag) => {\n    const key = Object.keys(tag)[0];\n    acc[key] = tag[key];\n    return acc;\n  }, {});\n\n  return queue((client) => client.addKvRecords({ records }));\n};\n\n/**\n * Fetches Address Tags from the Lattice.\n */\nexport const fetchAddressTags = async ({\n  n = MAX_ADDR,\n  start = 0,\n}: { n?: number; start?: number } = {}) => {\n  const addressTags: AddressTag[] = [];\n  let remainingToFetch = n;\n  let fetched = start;\n\n  while (remainingToFetch > 0) {\n    await queue((client) =>\n      client\n        .getKvRecords({\n          start: fetched,\n          n: remainingToFetch > MAX_ADDR ? MAX_ADDR : remainingToFetch,\n        })\n        .then(async (res) => {\n          addressTags.push(...res.records);\n          fetched = res.fetched + fetched;\n          remainingToFetch = res.total - fetched;\n        }),\n    );\n  }\n  return addressTags;\n};\n\n/**\n * Removes Address Tags from the Lattice.\n */\nexport const removeAddressTags = async (\n  tags: AddressTag[],\n): Promise<Buffer> => {\n  const ids = tags.map((tag) => `${tag.id}`);\n  return queue((client: Client) => client.removeKvRecords({ ids }));\n};\n","import { RLP } from '@ethereumjs/rlp';\nimport { Hash } from 'ox';\nimport {\n  serializeTransaction,\n  type Address,\n  type Authorization,\n  type Hex,\n  type TransactionSerializable,\n  type TransactionSerializableEIP7702,\n} from 'viem';\nimport { Constants } from '..';\nimport {\n  BTC_LEGACY_DERIVATION,\n  BTC_SEGWIT_DERIVATION,\n  BTC_WRAPPED_SEGWIT_DERIVATION,\n  CURRENCIES,\n  DEFAULT_ETH_DERIVATION,\n  SOLANA_DERIVATION,\n} from '../constants';\nimport { fetchDecoder } from '../functions/fetchDecoder';\nimport {\n  BitcoinSignPayload,\n  EIP712MessagePayload,\n  SignData,\n  SigningPayload,\n  SignRequestParams,\n  TransactionRequest,\n} from '../types';\nimport { getYParity } from '../util';\nimport { isEIP712Payload, queue } from './utilities';\n\n// Define the authorization request type based on Viem's structure\ntype AuthorizationRequest = {\n  chainId: number;\n  nonce: number;\n} & ({ address: Address } | { contractAddress: Address });\n\n/**\n * Sign a transaction using Viem-compatible transaction types\n */\ntype RawTransaction = Hex | Uint8Array | Buffer;\n\nexport const sign = async (\n  transaction: TransactionSerializable | RawTransaction,\n  overrides?: Omit<SignRequestParams, 'data'>,\n): Promise<SignData> => {\n  const isRaw = isRawTransaction(transaction);\n  const serializedTx = isRaw\n    ? normalizeRawTransaction(transaction)\n    : serializeTransaction(transaction as TransactionSerializable);\n\n  // Determine the encoding type based on transaction type\n  let encodingType:\n    | typeof Constants.SIGNING.ENCODINGS.EVM\n    | typeof Constants.SIGNING.ENCODINGS.EIP7702_AUTH\n    | typeof Constants.SIGNING.ENCODINGS.EIP7702_AUTH_LIST =\n    Constants.SIGNING.ENCODINGS.EVM;\n  if (!isRaw && (transaction as TransactionSerializable).type === 'eip7702') {\n    const eip7702Tx = transaction as TransactionSerializableEIP7702;\n    const hasAuthList =\n      eip7702Tx.authorizationList && eip7702Tx.authorizationList.length > 0;\n    encodingType = hasAuthList\n      ? Constants.SIGNING.ENCODINGS.EIP7702_AUTH_LIST\n      : Constants.SIGNING.ENCODINGS.EIP7702_AUTH;\n  }\n\n  // Only fetch decoder if we have the required fields\n  let decoder: Buffer | undefined;\n  if (\n    !isRaw &&\n    'data' in (transaction as TransactionSerializable) &&\n    'to' in (transaction as TransactionSerializable) &&\n    'chainId' in (transaction as TransactionSerializable)\n  ) {\n    decoder = await fetchDecoder({\n      data: (transaction as TransactionSerializable).data,\n      to: (transaction as TransactionSerializable).to,\n      chainId: (transaction as TransactionSerializable).chainId,\n    } as TransactionRequest);\n  }\n\n  const payload: SigningPayload = {\n    signerPath: DEFAULT_ETH_DERIVATION,\n    curveType: Constants.SIGNING.CURVES.SECP256K1,\n    hashType: Constants.SIGNING.HASHES.KECCAK256,\n    encodingType,\n    payload: serializedTx,\n    decoder,\n  };\n\n  return queue((client) => client.sign({ data: payload, ...overrides }));\n};\n\n/**\n * Sign a message with support for EIP-712 typed data and const assertions\n */\nexport function signMessage(\n  payload:\n    | string\n    | Uint8Array\n    | Buffer\n    | Buffer[]\n    | EIP712MessagePayload<Record<string, unknown>>,\n  overrides?: Omit<SignRequestParams, 'data'>,\n): Promise<SignData> {\n  const basePayload: SigningPayload<Record<string, unknown>> = {\n    signerPath: DEFAULT_ETH_DERIVATION,\n    curveType: Constants.SIGNING.CURVES.SECP256K1,\n    hashType: Constants.SIGNING.HASHES.KECCAK256,\n    protocol: isEIP712Payload(payload) ? 'eip712' : 'signPersonal',\n    payload: payload as SigningPayload<Record<string, unknown>>['payload'],\n  };\n\n  const tx: SignRequestParams = {\n    data: basePayload as SignRequestParams['data'],\n    currency: overrides?.currency ?? CURRENCIES.ETH_MSG,\n    ...(overrides ?? {}),\n  };\n\n  return queue((client) => client.sign(tx));\n}\n\nfunction isRawTransaction(\n  value: TransactionSerializable | RawTransaction,\n): value is RawTransaction {\n  return (\n    typeof value === 'string' ||\n    value instanceof Uint8Array ||\n    Buffer.isBuffer(value)\n  );\n}\n\nfunction normalizeRawTransaction(tx: RawTransaction): Hex | Buffer {\n  if (typeof tx === 'string') {\n    return tx.startsWith('0x') ? (tx as Hex) : (`0x${tx}` as Hex);\n  }\n  return Buffer.from(tx);\n}\n\n/**\n * Signs an EIP-7702 authorization to set code for an externally owned account (EOA).\n * Returns a Viem-compatible authorization object.\n */\nexport const signAuthorization = async (\n  authorization: AuthorizationRequest,\n  overrides?: Omit<SignRequestParams, 'data'>,\n): Promise<Authorization> => {\n  // EIP-7702 authorization message is: MAGIC || rlp([chain_id, address, nonce])\n  // MAGIC = 0x05 per EIP-7702 spec\n  const MAGIC = Buffer.from([0x05]);\n\n  // Handle the address/contractAddress alias\n  const address =\n    'address' in authorization\n      ? authorization.address\n      : authorization.contractAddress;\n\n  const message = Buffer.concat([\n    MAGIC,\n    Buffer.from(\n      RLP.encode([authorization.chainId, address, authorization.nonce]),\n    ),\n  ]);\n\n  const payload: SigningPayload = {\n    signerPath: DEFAULT_ETH_DERIVATION,\n    curveType: Constants.SIGNING.CURVES.SECP256K1,\n    hashType: Constants.SIGNING.HASHES.KECCAK256,\n    encodingType: Constants.SIGNING.ENCODINGS.EIP7702_AUTH,\n    payload: message,\n  };\n\n  // Get the signature with all components\n  const response = await queue((client) =>\n    client.sign({ data: payload, ...overrides }),\n  );\n\n  // Extract signature components if they exist\n  if (response.sig && response.pubkey) {\n    // Calculate the correct y-parity value\n    const messageHash = Buffer.from(Hash.keccak256(message));\n    const yParity = getYParity(messageHash, response.sig, response.pubkey);\n\n    // Handle both Buffer and string formats for r and s\n    const rValue = Buffer.isBuffer(response.sig.r)\n      ? `0x${response.sig.r.toString('hex')}`\n      : response.sig.r;\n    const sValue = Buffer.isBuffer(response.sig.s)\n      ? `0x${response.sig.s.toString('hex')}`\n      : response.sig.s;\n\n    // Create a complete Authorization object with all required signature components\n    const result: Authorization = {\n      address, // Viem compatibility\n      chainId: authorization.chainId,\n      nonce: authorization.nonce,\n      yParity,\n      r: rValue as Hex,\n      s: sValue as Hex,\n    };\n\n    return result;\n  }\n\n  throw new Error('Failed to get signature from device');\n};\n\n/**\n * Sign an EIP-7702 transaction using Viem-compatible types\n */\nexport const signAuthorizationList = async (\n  tx: TransactionSerializableEIP7702,\n): Promise<SignData> => {\n  const serializedTx = serializeTransaction(tx);\n\n  const payload: SigningPayload = {\n    signerPath: DEFAULT_ETH_DERIVATION,\n    curveType: Constants.SIGNING.CURVES.SECP256K1,\n    hashType: Constants.SIGNING.HASHES.KECCAK256,\n    encodingType: Constants.SIGNING.ENCODINGS.EIP7702_AUTH_LIST,\n    payload: serializedTx,\n  };\n\n  const signedPayload = await queue((client) => client.sign({ data: payload }));\n\n  // Return the SignData structure from Lattice, not the converted signature\n  return signedPayload;\n};\n\nexport const signBtcLegacyTx = async (\n  payload: BitcoinSignPayload,\n): Promise<SignData> => {\n  const tx = {\n    data: {\n      signerPath: BTC_LEGACY_DERIVATION,\n      ...payload,\n    },\n    currency: CURRENCIES.BTC,\n  };\n  return queue((client) => client.sign(tx));\n};\n\nexport const signBtcSegwitTx = async (\n  payload: BitcoinSignPayload,\n): Promise<SignData> => {\n  const tx = {\n    data: {\n      signerPath: BTC_SEGWIT_DERIVATION,\n      ...payload,\n    },\n    currency: CURRENCIES.BTC,\n  };\n  return queue((client) => client.sign(tx));\n};\n\nexport const signBtcWrappedSegwitTx = async (\n  payload: BitcoinSignPayload,\n): Promise<SignData> => {\n  const tx = {\n    data: {\n      signerPath: BTC_WRAPPED_SEGWIT_DERIVATION,\n      ...payload,\n    },\n    currency: CURRENCIES.BTC,\n  };\n  return queue((client) => client.sign(tx));\n};\n\nexport const signSolanaTx = async (\n  payload: Buffer,\n  overrides?: SignRequestParams,\n): Promise<SignData> => {\n  const tx = {\n    data: {\n      signerPath: SOLANA_DERIVATION,\n      curveType: Constants.SIGNING.CURVES.ED25519,\n      hashType: Constants.SIGNING.HASHES.NONE,\n      encodingType: Constants.SIGNING.ENCODINGS.SOLANA,\n      payload,\n      ...overrides,\n    },\n  };\n  return queue((client) => client.sign(tx));\n};\n","import { validateConnectedClient } from '../shared/validators';\n\nimport { getClient } from '../api';\nimport { fetchCalldataDecoder } from '../util';\nimport { TransactionRequest } from '../types';\n\n/**\n * `fetchDecoder` fetches the ABI for a given contract address and chain ID.\n * @category Lattice\n * @returns An object containing the ABI and encoded definition of the contract.\n */\nexport async function fetchDecoder({\n  data,\n  to,\n  chainId,\n}: TransactionRequest): Promise<Buffer | undefined> {\n  try {\n    const client = await getClient();\n    validateConnectedClient(client);\n\n    const fwVersion = client.getFwVersion();\n    const supportsDecoderRecursion =\n      fwVersion.major > 0 || fwVersion.minor >= 16;\n\n    const { def } = await fetchCalldataDecoder(\n      data,\n      to,\n      chainId,\n      supportsDecoderRecursion,\n    );\n\n    return def;\n  } catch (error) {\n    console.warn('Failed to fetch ABI:', error);\n    return undefined;\n  }\n}\n","import { ActiveWallets } from '../types';\nimport { queue } from './utilities';\n\n/**\n * Fetches the active wallets\n */\nexport const fetchActiveWallets = async (): Promise<ActiveWallets> => {\n  return queue((client) => client.fetchActiveWallet());\n};\n","import { Utils } from '..';\nimport { Client } from '../client';\nimport { setSaveClient, setLoadClient, saveClient, loadClient } from './state';\nimport { buildLoadClientFn, buildSaveClientFn, queue } from './utilities';\n\n/**\n * @interface {Object} SetupParameters - parameters for the setup function\n * @prop {string} SetupParameters.deviceId - the device id of the client\n * @prop {string} SetupParameters.password - the password of the client\n * @prop {string} SetupParameters.name - the name of the client\n * @prop {string} SetupParameters.appSecret - the app secret of the client\n * @prop {Function} SetupParameters.getStoredClient - a function that returns the stored client data\n * @prop {Function} SetupParameters.setStoredClient - a function that stores the client data\n */\ntype SetupParameters =\n  | {\n      deviceId: string;\n      password: string;\n      name: string;\n      appSecret?: string;\n      getStoredClient: () => Promise<string>;\n      setStoredClient: (clientData: string | null) => Promise<void>;\n      baseUrl?: string;\n    }\n  | {\n      getStoredClient: () => Promise<string>;\n      setStoredClient: (clientData: string | null) => Promise<void>;\n    };\n\n/**\n * `setup` initializes the Client and executes `connect()` if necessary. It returns a promise that\n * resolves to a boolean that indicates whether the Client is paired to the application to which it's\n * attempting to connect.\n *\n * @param {Object} SetupParameters - paramaters for the setup function\n * @param {string} SetupParameters.deviceId - the device id of the client\n * @param {string} SetupParameters.password - the password of the client\n * @param {string} SetupParameters.name - the name of the client\n * @param {string} SetupParameters.appSecret - the app secret of the client\n * @param {Function} SetupParameters.getStoredClient - a function that returns the stored client data\n * @param {Function} SetupParameters.setStoredClient - a function that stores the client data\n * @returns {Promise<boolean>} - a promise that resolves to a boolean that indicates whether the Client is paired to the application to which it's attempting to connect\n *\n */\nexport const setup = async (params: SetupParameters): Promise<boolean> => {\n  if (!params.getStoredClient) throw new Error('Client data getter required');\n  setLoadClient(buildLoadClientFn(params.getStoredClient));\n\n  if (!params.setStoredClient) throw new Error('Client data setter required');\n  setSaveClient(buildSaveClientFn(params.setStoredClient));\n\n  if ('deviceId' in params && 'password' in params && 'name' in params) {\n    const privKey =\n      params.appSecret ||\n      Utils.generateAppSecret(params.deviceId, params.password, params.name);\n    const client = new Client({\n      deviceId: params.deviceId,\n      privKey,\n      name: params.name,\n      baseUrl: params.baseUrl,\n    });\n    return client.connect(params.deviceId).then(async (isPaired) => {\n      await saveClient(client.getStateData());\n      return isPaired;\n    });\n  } else {\n    const client = await loadClient();\n    if (!client) throw new Error('Client not initialized');\n    const deviceId = client.getDeviceId();\n    if (!client.ephemeralPub && deviceId) {\n      return connect(deviceId);\n    } else {\n      await saveClient(client.getStateData());\n      return Promise.resolve(true);\n    }\n  }\n};\n\nexport const connect = async (deviceId: string): Promise<boolean> => {\n  return queue((client) => client.connect(deviceId));\n};\n\nexport const pair = async (pairingCode: string): Promise<boolean> => {\n  return queue((client) => client.pair(pairingCode));\n};\n"],"mappings":"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","names":["recursed","szs","v","queue","Buffer","Hash","Buffer","request","replaceNestedDefs","abi","def","Hash","EXTERNAL","Hash","Hash","PURPOSES","COINS","Hash","err","BN","Hash","RLP","secp256k1","serializeTransaction","Hash","RLP","parseTransaction","Hash","RLP","parseTransaction","ecdsaRecover","secp256k1","Hash","BN","RLP","Hash","BN","RLP","serializeTransaction","Hash","checksum","isEmpty","Hash","request","Hash","addresses","RLP","Hash","serializeTransaction","sign","serializeTransaction","RLP","Hash","EXTERNAL","connect","pair"]}