aere-contracts/contracts/intents/IAerePQCOrder.sol
Aere Network a13a649b77
Some checks are pending
contracts-ci / Install (lockfile) → compile → full test suite (push) Waiting to run
contracts-ci / PQC known-answer tests (NIST vectors) (push) Waiting to run
contracts-ci / Coverage (scoped, with artifacts) (push) Waiting to run
Initial public release
Aere Network public source. Everything here can be checked against the live
chain (chain id 2800, https://rpc.aere.network).

Scope note, stated up front rather than buried: consensus on chain 2800 is
classical secp256k1 ECDSA QBFT. The post-quantum work in this repository is at
the signature, precompile, account and transport layers. Nothing here makes the
consensus post-quantum, and no document in it should be read as claiming so.
2026-07-20 01:02:37 +03:00

74 lines
3.9 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;
/**
* @title IAerePQCOrder — post-quantum-authorized ERC-7683 cross-chain intent types
*
* @notice Shared header for the PQC intent path. A {PQCGaslessOrder} is the exact
* ERC-7683 gasless-order shape used by {AereSpokePool.openForPQC}, except the
* off-chain authorization is a NIST post-quantum signature (Falcon-512/1024,
* ML-DSA-44, SLH-DSA-128s) instead of an ECDSA secp256k1 signature. The order
* is therefore quantum-durable end to end: the message a solver's fill settles
* against was authorized only by a lattice/hash signature that a quantum
* adversary cannot forge, and it is verified on-chain by AERE's live native
* PQC precompiles routed through the governed crypto-agility registry.
*
* @dev orderData reuses the SAME "AereV3Order" ABI encoding as the ECDSA path:
* (address inputToken, uint256 inputAmount, address outputToken,
* uint256 outputAmount, bytes32 recipient, uint64 destinationChainId)
* so an existing ERC-7683 / Across V3 solver fills a PQC-authorized order with
* no changes; only the AUTHORIZATION leg differs.
*/
/// @notice A gasless ERC-7683 order whose authorization is a post-quantum signature.
/// @param user the funder: it must have bound `pubKey` (bindPQCKey) and
/// approved the settler to pull `inputToken`. Anyone may relay.
/// @param nonce per-user PQC replay nonce (monotonic; must equal the settler's
/// current pqcNonce[user]).
/// @param originChainId the intent's origin chain id; must equal the settler's chain.
/// @param openDeadline relay-by timestamp (the order can be opened until then).
/// @param fillDeadline ERC-7683 fill-by timestamp for the destination fill.
/// @param algorithmId the requested crypto-agility registry scheme id. 0 means
/// "use the authorizer's governed default". The value is
/// resolveActive'd at open time, so a Foundation scheme swap
/// migrates the accepted scheme with ZERO redeploy.
/// @param orderDataType the order-data discriminator (must be the settler's AERE type).
/// @param orderData the AereV3Order-encoded intent payload (see above).
struct PQCGaslessOrder {
address user;
uint256 nonce;
uint256 originChainId;
uint32 openDeadline;
uint32 fillDeadline;
uint256 algorithmId;
bytes32 orderDataType;
bytes orderData;
}
/**
* @notice The PQC-order authorizer surface a settler consumes. A crypto-agility
* CONSUMER over AereCryptoRegistry: it computes the EIP-712 order digest and
* verifies the post-quantum signature through the registry's routed native
* verifier under whatever scheme is currently ACTIVE (resolveActive), so
* scheme migration requires no settler redeploy.
*/
interface IAerePQCOrderAuthorizer {
/// @notice The EIP-712 digest (the 32-byte message the PQC key signs) for `order`
/// authorized by `pubKey`, domain-separated to `settler`.
function orderDigest(address settler, PQCGaslessOrder calldata order, bytes calldata pubKey)
external
view
returns (bytes32);
/// @notice Fail-closed: true iff `signature` is a valid post-quantum signature by
/// `pubKey` over {orderDigest}(settler, order, pubKey), under the ACTIVE
/// scheme reachable from `order.algorithmId` (0 => governed default).
/// Never reverts: any registry revert (unknown id, dead-end/cyclic
/// successor chain, hash-only or revoked scheme, malformed input) is
/// reported as `false`.
function checkOrder(address settler, PQCGaslessOrder calldata order, bytes calldata pubKey, bytes calldata signature)
external
view
returns (bool);
}