Skip to content

Offer/listing creation docs missing counter, protocol_address, and EIP-712 typedData format #22

@0xildefonso

Description

@0xildefonso

Problem

The vendor skill references document the offer/listing creation API endpoints but omit fields and context required for an agent to actually create orders programmatically.

An AI agent following the documented workflow (marketplace-api.md "Build an Offer" + seaport.md "Creating Listings") will fail at submission with iterative 400 errors:

  1. "Missing required field 'counter'" — not documented anywhere
  2. "Missing required field 'protocol_address'" — not shown as a top-level required field in the offer request body
  3. "Missing required field 'signature'" — the signing flow (EIP-712 typedData) is mentioned but the exact domain/types/message structure for Seaport orders is not provided

What's missing

1. counter field

The parameters object requires a counter field (the offerer's current Seaport nonce). Neither marketplace-api.md nor seaport.md mention it. Agents need to know:

  • That counter is required
  • How to get it: getCounter(address) on the Seaport contract, or that "0" works for accounts that haven't incremented

2. protocol_address as top-level field

The offer/listing submission requires protocol_address at the top level alongside parameters and signature:

{
  "protocol_address": "0x0000000000000068f116a894984e2db1123eb395",
  "parameters": { ... },
  "signature": "0x..."
}

The current docs show protocol_address only in fulfillment requests, not in order creation.

3. EIP-712 typedData format for signing

seaport.md says "Sign order with EIP-712" but doesn't provide the typedData structure. Agents need the exact:

  • domain: { name: "Seaport", version: "1.6", chainId, verifyingContract }
  • types: The OrderComponents type with all field types
  • message: How to map the parameters object to the message fields

4. salt format

marketplace-api.md shows "salt": "random_salt_value" — Seaport expects a uint256. Agents don't know if this should be a hex string, decimal string, or how to generate one.

Impact

We tested this with an AI agent (minimax-m2.7) that:

  1. Read all vendor references
  2. Built the Seaport parameters correctly (offer items, consideration, timestamps)
  3. Posted to opensea-post.sh and got "Missing required field 'counter'"
  4. Added counter (guessed "0") → "Missing required field 'protocol_address'"
  5. Added protocol_address → "Missing required field 'signature'"
  6. Got stuck — didn't know the EIP-712 typedData format to sign

The agent got 80% of the way there from the docs but couldn't bridge the gaps.

Suggested fix

Add a complete worked example to seaport.md or marketplace-api.md showing offer creation end-to-end:

# 1. Get counter (usually "0" for new accounts)
cast call 0x0000000000000068F116a894984e2DB1123eB395 "getCounter(address)" 0xYourWallet --rpc-url https://ethereum-rpc.publicnode.com

# 2. Build parameters (with counter, salt as uint256)
# 3. Sign EIP-712 typedData with exact domain/types
# 4. POST with { protocol_address, parameters, signature }

Or alternatively, document these fields inline in the existing "Build an Offer" section.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions