Bako Safe SDK
Utilities
Signature Coders

Signature Coders

The coders module handles encoding and decoding of signatures for different wallet types.

SignatureType Enum

enum SignatureType {
  WebAuthn = 0,      // Passkey/biometric signatures
  Fuel = 1,          // Native Fuel wallet signatures
  Evm = 2,           // EVM wallet signatures
  RawNoPrefix = 9    // Raw signatures without BAKO prefix
}

Signature Type Hex Values

const SIGNATURE_TYPE_HEX = {
  WebAuthn: '00000000',
  Fuel: '00000001',
  Evm: '00000002',
  RawNoPrefix: '00000009'
};

Input Types

Each signature type has a specific input format:

FuelInput

interface FuelInput {
  type: SignatureType.Fuel;
  signature: string;
}

EvmInput

interface EvmInput {
  type: SignatureType.Evm;
  signature: string;
}

WebAuthnInput

interface WebAuthnInput {
  type: SignatureType.WebAuthn;
  signature: string;
  prefix: string;
  suffix: string;
  authData: string;
}

RawNoPrefixInput

interface RawNoPrefixInput {
  type: SignatureType.RawNoPrefix;
  signature: string;
}

SignatureInput Union

type SignatureInput =
  | FuelInput
  | EvmInput
  | WebAuthnInput
  | RawNoPrefixInput;

Encoding Operations

CoderOperation

interface CoderOperation {
  input: SignatureInput;
  encoding: 'signature' | 'transaction';
}

Using Vault Signature Encoding

The Vault class provides a method for encoding signatures:

const vault = await Vault.fromAddress(address, provider);
 
// Encode a signature for the vault
const encodedSignature = vault.encodeSignature(
  signerAddress,
  rawSignature
);

Signature Flow

┌─────────────────────────────────────────────────────┐
│                  Signature Flow                      │
├─────────────────────────────────────────────────────┤
│                                                      │
│  1. User signs message with wallet                   │
│     └── Raw signature produced                       │
│                                                      │
│  2. Detect signature type                            │
│     └── Based on wallet/address type                 │
│                                                      │
│  3. Create typed input                               │
│     └── FuelInput, EvmInput, WebAuthnInput, etc.     │
│                                                      │
│  4. Encode for predicate                             │
│     └── Format for on-chain verification             │
│                                                      │
│  5. Add to transaction witnesses                     │
│     └── Ready for execution                          │
│                                                      │
└─────────────────────────────────────────────────────┘

Version-Specific Encoding

Some predicate versions require specific byte encoding:

type BytesVersion = string;
 
const BYTE_VERSION_LIST: BytesVersion[] = [
  // Versions requiring byte array encoding
];

Example: Manual Signature Encoding

import { SignatureType } from 'bakosafe';
 
function createSignatureInput(
  walletType: string,
  signature: string,
  extra?: any
): SignatureInput {
  switch (walletType) {
    case 'fuel':
      return {
        type: SignatureType.Fuel,
        signature
      };
 
    case 'evm':
      return {
        type: SignatureType.Evm,
        signature
      };
 
    case 'webauthn':
      return {
        type: SignatureType.WebAuthn,
        signature,
        prefix: extra.prefix,
        suffix: extra.suffix,
        authData: extra.authData
      };
 
    default:
      throw new Error(`Unknown wallet type: ${walletType}`);
  }
}

Next Steps