// SPDX-License-Identifier: (Apache-2.0 OR AGPL-3.0 OR BSL-1.1) // Copyright 2026 Bel Esprit D'Accord Irrevocable Trust (EIN: 42-697643) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // OR // // Licensed under the GNU Affero General Public License, Version 3.0 // (the "AGPL"); you may not use this file except in compliance with the AGPL. // You may obtain a copy of the AGPL at // // https://www.gnu.org/licenses/agpl-3.0.html // // OR // // Licensed under the Business Source License 1.1 (BSL-1.1); // converts to Apache-2.0 after 4 years. See LICENSE-BSL for terms. pragma solidity ^0.8.24; /// @title Groth16 Verifier for ALGORITHM_ENGINE /// @notice Auto-generated from snarkjs zkey export solidityverifier /// @dev This file should be replaced with actual output from: /// snarkjs zkey export solidityverifier engine_final.zkey Groth16Verifier.sol interface IGroth16Verifier { function verifyProof( uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[2] calldata _pubSignals ) external view returns (bool); } /// @title ALGORITHM_ENGINE Anchor Contract /// @notice Ingress router for Ledge SDK event-driven workflows /// @dev Only accepts objectives with valid Groth16 proofs contract AlgorithmEngineAnchor { IGroth16Verifier public immutable verifier; /// @notice Tracks executed objectives to prevent replay mapping(uint256 => bool) public executedObjectives; /// @notice Emitted when objective is committed to audit chain event ObjectiveCommitted( uint256 indexed resultHash, uint256 indexed priority, uint256 timestamp ); error InvalidObjectiveProof(); error ObjectiveAlreadyExecuted(); constructor(address _verifierAddress) { verifier = IGroth16Verifier(_verifierAddress); } /// @notice Commits a verified objective to the Ledge audit chain /// @param pA Groth16 proof point A (G1) /// @param pB Groth16 proof point B (G2) /// @param pC Groth16 proof point C (G1) /// @param resultHash Public output 0 from Circom (Poseidon hash) /// @param priority Public input 1 from Circom (objective priority) function commitObjective( uint[2] calldata pA, uint[2][2] calldata pB, uint[2] calldata pC, uint256 resultHash, uint256 priority ) external { if (executedObjectives[resultHash]) { revert ObjectiveAlreadyExecuted(); } // snarkjs orders: publicSignals = [resultHash, priority] uint[2] memory pubSignals = [resultHash, priority]; bool isValid = verifier.verifyProof(pA, pB, pC, pubSignals); if (!isValid) { revert InvalidObjectiveProof(); } executedObjectives[resultHash] = true; emit ObjectiveCommitted(resultHash, priority, block.timestamp); } /// @notice Batch commit multiple objectives function commitObjectives( uint[2][] calldata pAs, uint[2][2][] calldata pBs, uint[2][] calldata pCs, uint256[] calldata resultHashes, uint256[] calldata priorities ) external { require(pAs.length == pBs.length && pBs.length == pCs.length); require(pAs.length == resultHashes.length && resultHashes.length == priorities.length); for (uint i = 0; i < pAs.length; i++) { commitObjective(pAs[i], pBs[i], pCs[i], resultHashes[i], priorities[i]); } } }