{"version":3,"file":"index.cjs","sources":["../../../../../src/mods/address/index.ts"],"sourcesContent":["import { Bytes } from \"@hazae41/bytes\";\nimport { $error } from \"@hazae41/gardien\";\nimport { RawHexString, ZeroHexString } from \"@hazae41/hexane\";\nimport { Keccak256 } from \"@hazae41/keccak256\";\nimport { Nullable } from \"libs/nullable/index.js\";\nimport { RawHexAsInteger } from \"../convert/index.js\";\n\ndeclare const AddressSymbol: unique symbol\n\n/**\n * A \"0x\"-prefixed and checksummed valid hex string of length 42\n */\nexport type Address = ZeroHexString<20> & { readonly [AddressSymbol]: true }\n\nexport namespace Address {\n\n  export function is(value: string): value is Address {\n    return value === fromOrNull(value)\n  }\n\n  export function asOrThrow(value: string): Address\n\n  export function asOrThrow(value: ZeroHexString): Address\n\n  export function asOrThrow(value: string): Address {\n    if (!is(value))\n      throw new Error()\n    return value\n  }\n\n  export type From = RawHexAsInteger.From\n\n  export function fromOrThrow(from: From) {\n    return fromRawHexOrThrow(RawHexAsInteger.Length.fromOrThrow(from, 20))\n  }\n\n  export function fromOrNull(from: From): Nullable<Address> {\n    try {\n      return fromOrThrow(from)\n    } catch { }\n  }\n\n  export function fromRawHexOrThrow(from: RawHexString<20>) {\n    const lowerCase = from.toLowerCase()\n    const upperCase = from.toUpperCase()\n\n    const bytes = Bytes.fromUtf8(lowerCase)\n    using hashed = Keccak256.get().getOrThrow().hashOrThrow(bytes)\n\n    let address = \"0x\"\n\n    for (let i = 0; i < 40; i += 2) {\n      const byte = hashed.bytes[i >> 1]\n\n      address += (byte >> 4) > 7\n        ? upperCase[i]\n        : lowerCase[i]\n\n      address += (byte & 0x0f) > 7\n        ? upperCase[i + 1]\n        : lowerCase[i + 1]\n    }\n\n    return address as Address\n  }\n\n  export type Formatted = `0x${string}...${string}`\n\n  /**\n   * Format address as \"0xFFFF...FFFF\" for UI display\n   * @param address \n   * @returns \n   */\n  export function format(address: Address): Formatted {\n    return `0x${address.slice(2, 6)}...${address.slice(-4)}`\n  }\n\n}\n\nexport function $address(message?: string) {\n  return $error(Address, message)\n}"],"names":["Address","RawHexAsInteger","bytes","Bytes","__addDisposableResource","Keccak256","$error"],"mappings":";;;;;;;;AAciBA;AAAjB,CAAA,UAAiB,OAAO,EAAA;IAEtB,SAAgB,EAAE,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC;;AADpB,IAAA,OAAA,CAAA,EAAE,KAEjB;IAMD,SAAgB,SAAS,CAAC,KAAa,EAAA;AACrC,QAAA,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YACZ,MAAM,IAAI,KAAK,EAAE;AACnB,QAAA,OAAO,KAAK;;AAHE,IAAA,OAAA,CAAA,SAAS,YAIxB;IAID,SAAgB,WAAW,CAAC,IAAU,EAAA;AACpC,QAAA,OAAO,iBAAiB,CAACC,qBAAe,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;;AADxD,IAAA,OAAA,CAAA,WAAW,cAE1B;IAED,SAAgB,UAAU,CAAC,IAAU,EAAA;AACnC,QAAA,IAAI;AACF,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC;;QACxB,MAAM;;AAHM,IAAA,OAAA,CAAA,UAAU,aAIzB;IAED,SAAgB,iBAAiB,CAAC,IAAsB,EAAA;;;AACtD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE;AACpC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE;YAEpC,MAAMC,OAAK,GAAGC,WAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;AACvC,YAAA,MAAM,MAAM,GAAAC,iCAAA,CAAA,KAAA,EAAGC,mBAAS,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,WAAW,CAACH,OAAK,CAAC,QAAA;YAE9D,IAAI,OAAO,GAAG,IAAI;AAElB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;gBAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;AAEjC,gBAAA,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;AACvB,sBAAE,SAAS,CAAC,CAAC;AACb,sBAAE,SAAS,CAAC,CAAC,CAAC;AAEhB,gBAAA,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI;AACzB,sBAAE,SAAS,CAAC,CAAC,GAAG,CAAC;AACjB,sBAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;;AAGtB,YAAA,OAAO,OAAkB;;;;;;;;;AAC1B;AAtBe,IAAA,OAAA,CAAA,iBAAiB,oBAsBhC;AAID;;;;AAIG;IACH,SAAgB,MAAM,CAAC,OAAgB,EAAA;AACrC,QAAA,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAM,GAAA,EAAA,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;;AAD1C,IAAA,OAAA,CAAA,MAAM,SAErB;AAEH,CAAC,EA/DgBF,eAAO,KAAPA,eAAO,GA+DvB,EAAA,CAAA,CAAA;AAEK,SAAU,QAAQ,CAAC,OAAgB,EAAA;AACvC,IAAA,OAAOM,cAAM,CAACN,eAAO,EAAE,OAAO,CAAC;AACjC;;;;"}