> ## Documentation Index
> Fetch the complete documentation index at: https://voltaire.tevm.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# generateErc3448

> Generate ERC-3448 MetaProxy bytecode with metadata

## `generateErc3448(implementation: Uint8Array, metadata: Uint8Array): Uint8Array`

Generates ERC-3448 MetaProxy bytecode with embedded metadata.

Extends ERC-1167 minimal proxy by appending metadata after the proxy code, enabling factory patterns with embedded configuration.

**Parameters:**

* `implementation: Uint8Array` - 20-byte implementation address
* `metadata: Uint8Array` - Metadata to embed (arbitrary length)

**Returns:** `Uint8Array` - Complete MetaProxy bytecode (55 + metadata.length + 32 bytes)

**Throws:**

* `Error` - If implementation address is not 20 bytes

**Example:**

```typescript theme={null}
import { generateErc3448 } from '@tevm/voltaire/Proxy';
import { Address } from '@tevm/voltaire/Address';

// Prepare metadata
const metadata = new TextEncoder().encode(JSON.stringify({
  creator: '0xCreatorAddress...',
  salt: '0x1234...',
  version: 1,
  timestamp: Date.now()
}));

// Generate MetaProxy bytecode
const implementation = Address.from('0x1234567890123456789012345678901234567890');
const bytecode = generateErc3448(implementation, metadata);

console.log('Bytecode size:', bytecode.length);
// 55 (ERC-1167) + metadata.length + 32 (length) bytes
```

**Defined in:** [src/primitives/Proxy/generateErc3448.js](https://github.com/evmts/voltaire/blob/main/src/primitives/Proxy/generateErc3448.js)

## Factory Pattern with Metadata

```typescript theme={null}
import { generateErc3448 } from '@tevm/voltaire/Proxy';
import { Address } from '@tevm/voltaire/Address';
import { keccak256 } from '@tevm/voltaire/crypto';

class MetaProxyFactory {
  async createProxy(
    implementation: string,
    config: {
      creator: string;
      salt: string;
      chainId: number;
    }
  ) {
    // Encode configuration as metadata
    const metadata = new TextEncoder().encode(
      JSON.stringify(config)
    );

    // Generate bytecode
    const bytecode = generateErc3448(
      Address.from(implementation),
      metadata
    );

    // Calculate CREATE2 address
    const factoryAddress = Address.from(this.address);
    const saltBytes = keccak256(
      new TextEncoder().encode(config.salt)
    );
    const proxyAddress = Address.calculateCreate2Address(
      factoryAddress,
      saltBytes,
      bytecode
    );

    return {
      bytecode,
      address: proxyAddress.toHex(),
      metadata: config
    };
  }
}
```

## See Also

* [parseErc3448](/primitives/proxy/parse-erc3448)
* [generateErc1167](/primitives/proxy/generate-erc1167)
* [ERC-3448 Specification](https://eips.ethereum.org/EIPS/eip-3448)
