# SignatureEnvelope

Signature envelope utilities for secp256k1, P256, WebAuthn, and keychain signatures.

Tempo transactions support multiple signature types: secp256k1 (65 bytes), P256 for passkeys
(type `0x01`), WebAuthn (type `0x02`), and Keychain for access keys (type `0x03`).

[Signature Types Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#signature-types)

## Examples

```ts twoslash
import { Secp256k1 } from 'ox'
import { SignatureEnvelope } from 'ox/tempo'

const privateKey = Secp256k1.randomPrivateKey()
const signature = Secp256k1.sign({
  payload: '0xdeadbeef',
  privateKey
})

const envelope = SignatureEnvelope.from(signature)
```

## Functions

| Name                | Description                         |
| ------------------- | ----------------------------------- |
| [`SignatureEnvelope.assert`](/tempo/reference/SignatureEnvelope/assert) | Asserts that a [`SignatureEnvelope.SignatureEnvelope`](/tempo/reference/SignatureEnvelope/types#signatureenvelope) is valid. |
| [`SignatureEnvelope.deserialize`](/tempo/reference/SignatureEnvelope/deserialize) | Deserializes a hex-encoded signature envelope into a typed signature object. |
| [`SignatureEnvelope.extractAddress`](/tempo/reference/SignatureEnvelope/extractAddress) | Extracts the address of the signer from a [`SignatureEnvelope.SignatureEnvelope`](/tempo/reference/SignatureEnvelope/types#signatureenvelope). |
| [`SignatureEnvelope.extractPublicKey`](/tempo/reference/SignatureEnvelope/extractPublicKey) | Extracts the public key of the signer from a [`SignatureEnvelope.SignatureEnvelope`](/tempo/reference/SignatureEnvelope/types#signatureenvelope). |
| [`SignatureEnvelope.from`](/tempo/reference/SignatureEnvelope/from) | Coerces a value to a signature envelope. |
| [`SignatureEnvelope.fromRpc`](/tempo/reference/SignatureEnvelope/fromRpc) | Converts an RPC-formatted signature envelope to a typed signature envelope. |
| [`SignatureEnvelope.getType`](/tempo/reference/SignatureEnvelope/getType) | Determines the signature type of an envelope. |
| [`SignatureEnvelope.serialize`](/tempo/reference/SignatureEnvelope/serialize) | Serializes a signature envelope to a hex-encoded string. |
| [`SignatureEnvelope.sortMultisigApprovals`](/tempo/reference/SignatureEnvelope/sortMultisigApprovals) | Orders native multisig owner approvals into the strictly-ascending recovered-owner order the Tempo node requires for the multisig `signatures` array (the node enforces "recovered owners must be strictly ascending"). |
| [`SignatureEnvelope.toRpc`](/tempo/reference/SignatureEnvelope/toRpc) | Converts a signature envelope to RPC format. |
| [`SignatureEnvelope.validate`](/tempo/reference/SignatureEnvelope/validate) | Validates a signature envelope. Returns `true` if the envelope is valid, `false` otherwise. |
| [`SignatureEnvelope.verify`](/tempo/reference/SignatureEnvelope/verify) | Verifies a signature envelope against a digest/payload. |

## Errors

| Name                | Description                         |
| ------------------- | ----------------------------------- |
| [`SignatureEnvelope.CoercionError`](/tempo/reference/SignatureEnvelope/errors#signatureenvelopecoercionerror) | Error thrown when a signature envelope cannot be coerced to a valid type. |
| [`SignatureEnvelope.InvalidMultisigApprovalError`](/tempo/reference/SignatureEnvelope/errors#signatureenvelopeinvalidmultisigapprovalerror) | Error thrown when a native multisig owner approval is invalid. |
| [`SignatureEnvelope.InvalidSerializedError`](/tempo/reference/SignatureEnvelope/errors#signatureenvelopeinvalidserializederror) | Error thrown when a serialized signature envelope cannot be deserialized. |
| [`SignatureEnvelope.MissingPropertiesError`](/tempo/reference/SignatureEnvelope/errors#signatureenvelopemissingpropertieserror) | Error thrown when a signature envelope is missing required properties. |
| [`SignatureEnvelope.VerificationError`](/tempo/reference/SignatureEnvelope/errors#signatureenvelopeverificationerror) | Error thrown when a signature envelope fails to verify. |

## Types

| Name                | Description                         |
| ------------------- | ----------------------------------- |
| [`SignatureEnvelope.GetType`](/tempo/reference/SignatureEnvelope/types#signatureenvelopegettype) | Statically determines the signature type of an envelope at compile time. |
| [`SignatureEnvelope.Keychain`](/tempo/reference/SignatureEnvelope/types#signatureenvelopekeychain) |  |
| [`SignatureEnvelope.KeychainRpc`](/tempo/reference/SignatureEnvelope/types#signatureenvelopekeychainrpc) |  |
| [`SignatureEnvelope.KeychainVersion`](/tempo/reference/SignatureEnvelope/types#signatureenvelopekeychainversion) | Keychain signature version. |
| [`SignatureEnvelope.Multisig`](/tempo/reference/SignatureEnvelope/types#signatureenvelopemultisig) | Native multisig signature (type `0x05`). |
| [`SignatureEnvelope.MultisigRpc`](/tempo/reference/SignatureEnvelope/types#signatureenvelopemultisigrpc) |  |
| [`SignatureEnvelope.P256`](/tempo/reference/SignatureEnvelope/types#signatureenvelopep256) |  |
| [`SignatureEnvelope.P256Rpc`](/tempo/reference/SignatureEnvelope/types#signatureenvelopep256rpc) |  |
| [`SignatureEnvelope.Secp256k1`](/tempo/reference/SignatureEnvelope/types#signatureenvelopesecp256k1) |  |
| [`SignatureEnvelope.Secp256k1Flat`](/tempo/reference/SignatureEnvelope/types#signatureenvelopesecp256k1flat) |  |
| [`SignatureEnvelope.Secp256k1Rpc`](/tempo/reference/SignatureEnvelope/types#signatureenvelopesecp256k1rpc) |  |
| [`SignatureEnvelope.Serialized`](/tempo/reference/SignatureEnvelope/types#signatureenvelopeserialized) | Hex-encoded serialized signature envelope. |
| [`SignatureEnvelope.SignatureEnvelope`](/tempo/reference/SignatureEnvelope/types#signatureenvelopesignatureenvelope) | Represents a signature envelope that can contain different signature types. |
| [`SignatureEnvelope.SignatureEnvelopeRpc`](/tempo/reference/SignatureEnvelope/types#signatureenvelopesignatureenveloperpc) | RPC-formatted signature envelope. |
| [`SignatureEnvelope.Type`](/tempo/reference/SignatureEnvelope/types#signatureenvelopetype) | Union type of supported signature types. |
| [`SignatureEnvelope.WebAuthn`](/tempo/reference/SignatureEnvelope/types#signatureenvelopewebauthn) |  |
| [`SignatureEnvelope.WebAuthnRpc`](/tempo/reference/SignatureEnvelope/types#signatureenvelopewebauthnrpc) |  |
