# Prohairesis transaction guide

> Construct explicit wallet-authorized transactions against the NFT contract identified in the current deployment configuration.

Read the [agent guide](/agents/index.md), [ABI reference](/agents/contracts.md), and [deployment configuration](/prohairesis-deployment.json). If the deployment address or block is missing, stop: there is no production target to send to.

## Deployment details

Network: Ethereum mainnet (chain ID 1). Mint, evolve, and freeze all use the NFT contract below.

Connected contract: Prohairesis-test (PROH-test). Prohairesis has not launched. This is a testing connection; transactions on Ethereum mainnet use real ETH.

- Prohairesis (NFT): [0xDcc3E1ba202EDfCCB458dbff9C6d4F762C17623a](https://etherscan.io/address/0xDcc3E1ba202EDfCCB458dbff9C6d4F762C17623a).
- ProhairesisMetadata: [0x3fCAB09b0B316E46285EF9F86cd385abd7917189](https://etherscan.io/address/0x3fCAB09b0B316E46285EF9F86cd385abd7917189).
- ProhairesisRenderer: [0x2355734606eF0338f6745176087D514993F10fE4](https://etherscan.io/address/0x2355734606eF0338f6745176087D514993F10fE4).
- RoundedMachineKernel: [0x2876A946279077Ef82B75cB4d9eE7BdC48F27885](https://etherscan.io/address/0x2876A946279077Ef82B75cB4d9eE7BdC48F27885).
- AtlasRenderer: [0x90e6914516Ac7D1831079BeE0ac32A1651f6500B](https://etherscan.io/address/0x90e6914516Ac7D1831079BeE0ac32A1651f6500B).

Mint price: 0.004 ETH per piece, plus network fees. Mint 10 pieces maximum per transaction.

- Mint opens: 2026-10-07 20:30:11 UTC.
- Mint closes: 2026-10-08 20:30:11 UTC.
- Freeze deadline: 2026-10-14 20:30:11 UTC; transactions must confirm before this time.

History starts at NFT deployment block 26142910. These are deployment facts, not a statement that minting is currently open; compare the dates with current chain time. [Refresh the deployment configuration](/prohairesis-deployment.json) and read current contract state before acting.

Transfer cooldown: 6 blocks after each evolution or freeze. Read `TRANSFER_LOCK_BLOCKS()` from the target contract.

## Before any write

Validate the chain ID and target address, read fresh contract state, show the exact intended action to the owner, and let their wallet authorize it. Estimate gas and simulate with the actual sender. Simulation is advisory; state and fees can change before inclusion. Decode errors with the [errors ABI](/agents/errors.json).

Track the receipt and its status, handle replacements/cancellations, and re-read state after confirmation. Do not automatically resend an uncertain mint: first check the original transaction and its events to avoid minting twice.

## Mint

Call `mint(uint8 quantity)` with quantity 1–10 and value exactly `MINT_PRICE() * quantity` in wei. Minting opens at the NFT deployment block timestamp and closes 24 hours later. There is no activation transaction. Minting is valid when `mintStart() <= block.timestamp < mintEnd()`; execution after the end reverts even if the request was submitted earlier. Gas is additional to the mint price.

The receipt's `Minted(buyer, firstTokenId, quantity)` gives the batch's sequential IDs, and ERC-721 `Transfer` logs verify delivery. No separate reveal or claim transaction is required.

## Evolve

Read `canManage(tokenId, sender)`, `state(tokenId)`, and all four `candidate` calls at one fresh block. Ask the owner to choose lane 0, 1, 2, or 3; then call `select(uint256 tokenId, uint8 lane)` with zero ETH value. Only the current owner or their creative manager can do this.

The execution block determines the selected form. The third selection permanently freezes the work; a third selection at or after the shared deadline does not preserve transfers. Selection also starts the transfer cooldown reported by `TRANSFER_LOCK_BLOCKS()`.

## Freeze

Call `freeze(uint256 tokenId)` with zero ETH value after explicit approval for permanent freezing. Confirm current creative authority and the current genome; the contract has no expected-genome argument, so another selection before inclusion can change the form that gets frozen.

Freezing cannot be undone by a later owner or collection administrator. It must execute strictly before `freezeDeadline()` to preserve transfers afterward, and starts a cooldown of `TRANSFER_LOCK_BLOCKS()` blocks. Animation playback continues.

## Creative delegation

`setManager(address manager)` authorizes one address to evolve or freeze every artwork currently or subsequently owned by the sender. Set the zero address to revoke it. This is an owner-wide permission, not a per-token permission, and grants no transfer authority.

ERC-721 approvals (`approve`, `setApprovalForAll`) permit transfers but do not permit evolution or freezing. Do not request broad marketplace approval just to evolve or freeze an artwork.

## Transfer

Use standard ERC-721 `safeTransferFrom` with the correct overloaded signature. Check current ownership/approval and `transferStatus(tokenId)` immediately before sending. `transferUnlockBlock` is only one condition; missing the shared freeze deadline permanently prevents transfer.

The transfer lock does not cancel existing marketplace listings or protect a buyer against every intervening artwork change. Marketplace behavior and fees are outside this contract interface.

## Construct and simulate without broadcasting

This example builds a selection transaction; `from` is the wallet address that will authorize it. Replace the identifiers with validated data from the preceding reads. Never supply a private key to the website or agent documentation.

```js
import {Interface} from 'ethers';
const iface = new Interface(abi);
const request = {
  from: ownerOrManager,
  to: deployment.address,
  data: iface.encodeFunctionData('select', [tokenId, lane]),
  value: '0x0'
};
await provider.send('eth_call', [request, 'latest']);
const estimatedGas = await provider.send('eth_estimateGas', [request]);
// Present action, token, branch, irreversibility, deadline, and gas to the user.
// Their authorized wallet submits the transaction; this example does not.
```

For mint, encode `mint` and use integer price-times-quantity as `value`. For freeze, encode `freeze` and use zero value. Estimate each action separately; do not carry an estimate across accounts or chain changes.

## Administration is separate

The ABI also exposes collection ownership, voluntary royalty configuration, and treasury withdrawal. Those are not collector actions. Collection ownership does not grant an artwork override or unfreeze ability. `withdraw()` sends the entire current ETH balance, including forced ETH, only to the fixed treasury; `withdrawable()` reports that balance; it is not a token-owner withdrawal function. ERC-2981 reports royalties but does not enforce marketplace payment.

## Freeze several artworks

Use `freezeBatch(uint256[] tokenIds)` with 1–10 distinct IDs. Read `MAX_FREEZE_BATCH()` for the limit. The signer must own or be the current creative manager for each unfrozen work; ERC-721 transfer approvals are insufficient. Empty, oversized, duplicate, nonexistent, unauthorized, or already-frozen items cause the entire batch to revert. Every success preserves the execution-time canonical genome, emits per-token compact `ArtworkFrozen`, `TransferLockUpdated`, and `MetadataUpdate` events, and starts the `TRANSFER_LOCK_BLOCKS()` cooldown. The collection-wide seven-day deadline applies unchanged, including to late batch freezes. Batch freezing does not train the collective model.
