{"version":3,"file":"index.mjs","sources":["../../../../../../src/mods/secp256k1/verifying/index.ts"],"sourcesContent":["import { Base16 } from \"@hazae41/base16\";\nimport { Box } from \"@hazae41/box\";\nimport { Bytes, Uint8Array } from \"@hazae41/bytes\";\nimport { RawHexString, ZeroHexString } from \"@hazae41/hexane\";\nimport { Keccak256 } from \"@hazae41/keccak256\";\nimport { Secp256k1 } from \"@hazae41/secp256k1\";\nimport { Copiable } from \"libs/copiable/index.js\";\nimport { Address } from \"mods/address/index.js\";\nimport { BytesAsInteger, BytesAsUtf8, ZeroHexAsInteger } from \"mods/convert/index.js\";\nimport { ExtSignature, RsvBytesSignature, Signature } from \"../signature/index.js\";\n\nexport function recoverUnprefixedMessageOrThrow(signature: Signature.From, message: BytesAsUtf8.From) {\n  const signatureRsvBytes = RsvBytesSignature.fromOrThrow(signature)\n\n  if (signatureRsvBytes.v !== 27 && signatureRsvBytes.v !== 28)\n    throw new Error(\"Unshifted signature\")\n\n  const { r, s } = signatureRsvBytes\n  const v = signatureRsvBytes.v - 27\n\n  using signatureExtBox = ExtSignature.fromRsvOrThrow({ r, s, v })\n  const messageBytes = BytesAsUtf8.fromOrThrow(message)\n\n  using hashMemoryExt = Keccak256.get().getOrThrow().hashOrThrow(messageBytes)\n  const recoveredVerifyingKeyExt = Secp256k1.get().getOrThrow().VerifyingKey.recoverOrThrow(hashMemoryExt, signatureExtBox.get())\n\n  return recoveredVerifyingKeyExt\n}\n\nexport function recoverMessageOrThrow(signature: Signature.From, message: BytesAsUtf8.From) {\n  const signatureRsvBytes = RsvBytesSignature.fromOrThrow(signature)\n\n  if (signatureRsvBytes.v !== 27 && signatureRsvBytes.v !== 28)\n    throw new Error(\"Unshifted signature\")\n\n  const { r, s } = signatureRsvBytes\n  const v = signatureRsvBytes.v - 27\n\n  using signatureExtBox = ExtSignature.fromRsvOrThrow({ r, s, v })\n  const messageBytes = BytesAsUtf8.fromOrThrow(message)\n\n  const prefixExt = Bytes.fromUtf8(\"\\x19Ethereum Signed Message:\\n\" + messageBytes.length.toString())\n  const concatExt = Bytes.concat([prefixExt, messageBytes])\n\n  using hashMemoryExt = Keccak256.get().getOrThrow().hashOrThrow(concatExt)\n  const recoveredVerifyingKeyExt = Secp256k1.get().getOrThrow().VerifyingKey.recoverOrThrow(hashMemoryExt, signatureExtBox.get())\n\n  return recoveredVerifyingKeyExt\n}\n\nexport type VerifyingKey =\n  | ZeroHexVerifyingKey\n  | BytesVerifyingKey\n  | ExtVerifyingKey\n\nexport namespace VerifyingKey {\n\n  export type From =\n    | ZeroHexVerifyingKey.From\n    | BytesVerifyingKey.From\n    | ExtVerifyingKey.From\n\n  export function getUncheckedAddressOrThrow(verifyingKey: VerifyingKey.From) {\n    const verifyingKeyBytes = BytesVerifyingKey.fromOrThrow(verifyingKey)\n\n    using hashMemoryExt = Keccak256.get().getOrThrow().hashOrThrow(verifyingKeyBytes.subarray(1))\n    const rawLowerCase = Base16.get().getOrThrow().encodeOrThrow(hashMemoryExt)\n\n    return `0x${rawLowerCase.slice(-40)}` as ZeroHexString<20>\n  }\n\n  export function getAddressOrThrow(verifyingKey: VerifyingKey.From) {\n    const verifyingKeyBytes = BytesVerifyingKey.fromOrThrow(verifyingKey)\n\n    using hashMemoryExt = Keccak256.get().getOrThrow().hashOrThrow(verifyingKeyBytes.subarray(1))\n    const rawLowerCase = Base16.get().getOrThrow().encodeOrThrow(hashMemoryExt)\n\n    return Address.fromRawHexOrThrow(rawLowerCase.slice(-40) as RawHexString<20>)\n  }\n\n  export function verifyUnprefixedMessageOrThrow(verifyingKey: VerifyingKey.From, signature: Signature.From, message: BytesAsUtf8.From) {\n    const signatureRsvBytes = RsvBytesSignature.fromOrThrow(signature)\n\n    if (signatureRsvBytes.v !== 27 && signatureRsvBytes.v !== 28)\n      throw new Error(\"Unshifted signature\")\n\n    const { r, s } = signatureRsvBytes\n    const v = signatureRsvBytes.v - 27\n\n    const verifyingKeyBytes = BytesVerifyingKey.fromOrThrow(verifyingKey)\n    using signatureExtBox = ExtSignature.fromRsvOrThrow({ r, s, v })\n    const messageBytes = BytesAsUtf8.fromOrThrow(message)\n\n    using hashMemoryExt = Keccak256.get().getOrThrow().hashOrThrow(messageBytes)\n    using recoveredVerifyingKeyExt = Secp256k1.get().getOrThrow().VerifyingKey.recoverOrThrow(hashMemoryExt, signatureExtBox.get())\n    using recoveredVerifyingKeyMemoryExt = recoveredVerifyingKeyExt.exportUncompressedOrThrow()\n\n    return Bytes.equals(verifyingKeyBytes, recoveredVerifyingKeyMemoryExt.bytes)\n  }\n\n  export function verifyMessageOrThrow(verifyingKey: VerifyingKey.From, signature: Signature.From, message: BytesAsUtf8.From) {\n    const signatureRsvBytes = RsvBytesSignature.fromOrThrow(signature)\n\n    if (signatureRsvBytes.v !== 27 && signatureRsvBytes.v !== 28)\n      throw new Error(\"Unshifted signature\")\n\n    const { r, s } = signatureRsvBytes\n    const v = signatureRsvBytes.v - 27\n\n    const verifyingKeyBytes = BytesVerifyingKey.fromOrThrow(verifyingKey)\n    using signatureExtBox = ExtSignature.fromRsvOrThrow({ r, s, v })\n    const messageBytes = BytesAsUtf8.fromOrThrow(message)\n\n    const prefixBytes = Bytes.fromUtf8(\"\\x19Ethereum Signed Message:\\n\" + messageBytes.length.toString())\n    const concatBytes = Bytes.concat([prefixBytes, messageBytes])\n\n    using hashMemoryExt = Keccak256.get().getOrThrow().hashOrThrow(concatBytes)\n    using recoveredVerifiyngKeyExt = Secp256k1.get().getOrThrow().VerifyingKey.recoverOrThrow(hashMemoryExt, signatureExtBox.get())\n    using recoveredVerifyingKeyMemoryExt = recoveredVerifiyngKeyExt.exportUncompressedOrThrow()\n\n    return Bytes.equals(verifyingKeyBytes, recoveredVerifyingKeyMemoryExt.bytes)\n  }\n\n}\n\nexport type ZeroHexVerifyingKey = ZeroHexString<65>\n\nexport namespace ZeroHexVerifyingKey {\n\n  export type From = ZeroHexAsInteger.From\n\n  export function fromOrThrow(from: VerifyingKey.From): ZeroHexVerifyingKey {\n    if (from instanceof Secp256k1.VerifyingKey)\n      return fromExtOrThrow(from)\n    return fromOtherOrThrow(from)\n  }\n\n  export function fromExtOrThrow(from: ExtVerifyingKey): ZeroHexVerifyingKey {\n    using slice = from.exportUncompressedOrThrow()\n\n    const base16 = Base16.get().getOrThrow().encodeOrThrow(slice.bytes)\n\n    return `0x${base16}` as ZeroHexString<65>\n  }\n\n  export function fromOtherOrThrow(from: ZeroHexAsInteger.From): ZeroHexVerifyingKey {\n    return ZeroHexAsInteger.Length.fromOrThrow(from, 65)\n  }\n\n}\n\nexport type BytesVerifyingKey = Uint8Array<65>\n\nexport namespace BytesVerifyingKey {\n\n  export type From = BytesAsInteger.From\n\n  export function fromOrThrow(from: VerifyingKey.From): BytesVerifyingKey {\n    if (from instanceof Secp256k1.VerifyingKey)\n      return fromExtOrThrow(from)\n    return fromOtherOrThrow(from)\n  }\n\n  export function fromExtOrThrow(from: ExtVerifyingKey): BytesVerifyingKey {\n    return Copiable.copyAndDispose(from.exportUncompressedOrThrow()) as Uint8Array<65>\n  }\n\n  export function fromOtherOrThrow(from: BytesAsInteger.From): BytesVerifyingKey {\n    return BytesAsInteger.Length.fromOrThrow(from, 65)\n  }\n\n}\n\nexport type ExtVerifyingKey = Secp256k1.VerifyingKey\n\nexport namespace ExtVerifyingKey {\n\n  export type From = Secp256k1.VerifyingKey\n\n  export function fromOrThrow(from: VerifyingKey.From): Box<ExtVerifyingKey> {\n    if (from instanceof Secp256k1.VerifyingKey)\n      return fromExtOrThrow(from)\n    return fromOtherOrThrow(from)\n  }\n\n  export function fromExtOrThrow(from: ExtVerifyingKey): Box<ExtVerifyingKey> {\n    return Box.createAsDropped(from)\n  }\n\n  export function fromOtherOrThrow(from: BytesAsInteger.From): Box<ExtVerifyingKey> {\n    return new Box(Secp256k1.get().getOrThrow().VerifyingKey.importOrThrow(BytesAsInteger.Length.fromOrThrow(from, 65)))\n  }\n\n}"],"names":[],"mappings":"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"}