> ## 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.

# Constructors

> Methods for creating SIWE message instances

<Card title="Try it Live" icon="play" href="https://playground.tevm.sh?example=primitives/siwe.ts">
  Run SIWE examples in the interactive playground
</Card>

# Constructors

Methods for creating SIWE message instances.

## create

Create new SIWE message with automatic defaults.

### Signature

```typescript theme={null}
function create<
  TDomain extends string,
  TAddress extends AddressType,
  TUri extends string,
  TChainId extends number
>(params: {
  domain: TDomain;
  address: TAddress;
  uri: TUri;
  chainId: TChainId;
  statement?: string;
  expirationTime?: string;
  notBefore?: string;
  requestId?: string;
  resources?: string[];
  nonce?: string;
  issuedAt?: string;
}): BrandedMessage<TDomain, TAddress, TUri, "1", TChainId>
```

### Parameters

**Required:**

* `domain` - RFC 4501 dns authority requesting signing
* `address` - AddressType performing signing (20 bytes)
* `uri` - RFC 3986 URI referring to subject of signing
* `chainId` - EIP-155 Chain ID (positive integer)

**Optional:**

* `statement` - Human-readable ASCII assertion
* `expirationTime` - ISO 8601 datetime for expiration
* `notBefore` - ISO 8601 datetime for not-before
* `requestId` - System-specific identifier
* `resources` - Array of resource URIs
* `nonce` - Custom nonce (auto-generated if omitted, min 8 chars)
* `issuedAt` - Custom issued time (current time if omitted)

### Returns

`BrandedMessage` with:

* `version` automatically set to `"1"`
* `nonce` auto-generated if not provided (11 chars, base62)
* `issuedAt` auto-set to current ISO 8601 time if not provided
* Optional fields only included if provided

### Example

```typescript theme={null}
// Minimal creation
const message = Siwe.create({
  domain: "example.com",
  address: Address("0x742d35Cc6634C0532925a3b844Bc9e7595f251e3"),
  uri: "https://example.com/login",
  chainId: 1,
});
// Auto-generates nonce and issuedAt, sets version to "1"

// Full creation with optional fields
const message = Siwe.create({
  domain: "example.com",
  address: userAddress,
  uri: "https://example.com/login",
  chainId: 1,
  statement: "Sign in to access your account",
  expirationTime: "2025-12-31T23:59:59.000Z",
  notBefore: "2025-01-01T00:00:00.000Z",
  requestId: "req-abc123",
  resources: [
    "https://example.com/api/admin",
    "https://example.com/api/users",
  ],
  nonce: "customnonce12345",
  issuedAt: "2025-06-01T12:00:00.000Z",
});

// Chain-specific authentication
const mainnetAuth = Siwe.create({
  domain: "example.com",
  address: userAddress,
  uri: "https://example.com",
  chainId: 1,  // Ethereum mainnet
});

const polygonAuth = Siwe.create({
  domain: "example.com",
  address: userAddress,
  uri: "https://example.com",
  chainId: 137,  // Polygon
});
```

### Type Safety

Generic parameters preserve exact types:

```typescript theme={null}
const message = Siwe.create({
  domain: "example.com" as const,
  address: specificAddress,
  uri: "https://example.com" as const,
  chainId: 1 as const,
});
// message.domain: "example.com" (literal type)
// message.chainId: 1 (literal type)
// message.version: "1" (always literal "1")
```

### Notes

* **Nonce generation**: Uses `crypto.getRandomValues()` for secure randomness
* **Timestamp format**: ISO 8601 format required for all timestamps
* **Version**: Always "1" per EIP-4361 current specification
* **Optional fields**: Only present in returned object if provided (no undefined)
* **Address format**: Must be valid 20-byte AddressType

### Common Use Cases

#### Session with Expiration

```typescript theme={null}
const message = Siwe.create({
  domain: "example.com",
  address: userAddress,
  uri: "https://example.com",
  chainId: 1,
  expirationTime: new Date(Date.now() + 3600000).toISOString(),  // 1 hour
});
```

#### Resource-Restricted Access

```typescript theme={null}
const message = Siwe.create({
  domain: "example.com",
  address: userAddress,
  uri: "https://example.com/admin",
  chainId: 1,
  statement: "Grant admin access",
  resources: [
    "https://example.com/api/admin/users",
    "https://example.com/api/admin/settings",
  ],
});
```

#### Delayed Activation

```typescript theme={null}
const message = Siwe.create({
  domain: "example.com",
  address: userAddress,
  uri: "https://example.com",
  chainId: 1,
  notBefore: new Date(Date.now() + 60000).toISOString(),  // Valid in 1 minute
  expirationTime: new Date(Date.now() + 3600000).toISOString(),  // Expires in 1 hour
});
```

#### Request Tracking

```typescript theme={null}
const requestId = crypto.randomUUID();
const message = Siwe.create({
  domain: "example.com",
  address: userAddress,
  uri: "https://example.com",
  chainId: 1,
  requestId,
});
storeAuthRequest(requestId, { address: userAddress, timestamp: Date.now() });
```

### Implementation Details

* Uses conditional spreading for optional fields (no `undefined` values)
* Delegates nonce generation to `generateNonce()`
* Current timestamp from `new Date().toISOString()`
* Version hardcoded to "1" per EIP-4361 spec
* Returns plain object (not class instance)

### See Also

* [Siwe.parse](/primitives/siwe/parsing) - Parse from formatted string
* [Siwe.generateNonce](/primitives/siwe/utilities) - Nonce generation
* [Message Format](/primitives/siwe/message-format) - EIP-4361 format specification
* [Validation](/primitives/siwe/validation) - Message validation rules
