Skip to main content
Submit a signed resolution attestation to settle an expired option series. Anyone holding option tokens for the series (or the contract owner) can relay the attestation. The contract verifies the EIP-712 signature against the registered resolutionSigner. After settlement, holders can call claimHolderPayout() and writers can call claimWriterCollateral(). Contract: ConvallaxCore0xc760F8f6B8830463822be9F68eB10e1b5Dace378

Function Signature

function settleWithAttestation(
    uint256 seriesId,
    uint16 resolutionBps,
    uint256 validUntil,
    bytes calldata signature
) external

Parameters

seriesId
uint256
required
The expired option series to settle.
resolutionBps
uint16
required
Resolution price in basis points (0–100). 0 = NO wins, 100 = YES wins, or any value for VWAP.
validUntil
uint256
required
Attestation expiry (Unix timestamp). Must be ≥ block.timestamp.
signature
bytes
required
EIP-712 signature from the resolution signer over the SettlementAttestation struct.

EIP-712 Domain

FieldValue
nameConvallaxCore
version1
chainId80002
verifyingContract0xc760F8f6B8830463822be9F68eB10e1b5Dace378

Attestation Struct

struct SettlementAttestation {
    uint256 seriesId;
    uint16  resolutionBps;
    uint256 validUntil;
}

Getting the Attestation

Use POST /settlement/prepare to compute the VWAP and receive the signed attestation. Pass the returned values directly to this function.

Prerequisites

  • block.timestamp ≥ expiry — the option must have expired
  • The series must not already be settled
  • The caller must hold option tokens for the series, or be the contract owner
  • block.timestamp ≤ validUntil — the attestation must not have expired
  • The signature must recover to the registered resolutionSigner

Example

const core = new ethers.Contract(
  '0xc760F8f6B8830463822be9F68eB10e1b5Dace378',
  ['function settleWithAttestation(uint256 seriesId, uint16 resolutionBps, uint256 validUntil, bytes signature) external'],
  signer
);

// Values from POST /settlement/prepare
const tx = await core.settleWithAttestation(
  seriesId,
  59,        // resolutionBps
  validUntil,
  signature
);
await tx.wait();

Reverts

ConditionReason
Not yet expiredSeriesNotExpired(seriesId)
Already settledAlreadySettled(seriesId)
Attestation expiredAttestationExpired
Invalid signerInvalidSigner
Caller has no tokens and is not ownerNotHolderOrOwner