# Cairo 1.0 Migration Proposal: Upgrading the Cairo 0 Verifier
## Background
With the evolution of the Cairo language and the advent of Cairo 1.0, there is an imminent need to transition our legacy tools. A prime example is the Cairo 0 verifier which should be updated to be compatible with the latest standard.
**Reference**: [cairo_verifier.cairo in starkware-libs repository](https://github.com/starkware-libs/cairo-lang/blob/master/src/starkware/cairo/cairo_verifier.cairo)
## Goals
1. Transition from Cairo 0 to Cairo 1.0.
2. Integrate a fact registry system.
3. Design a hookable interface (events) to initiate on-chain operations in StarkNet upon proof verification based on state changes.
## Proposed Framework
1. **Cairo Verifier**
- A function that accepts a proof and verifies its validity.
2. **Fact Registry**:
- A function designed to accept proof and respond with `true` or `false`.
- If affirmed, the fact (a hash combining the program and its output) is incorporated into a mapping, which can be referred to later.
## Implementation Path
1. **Core Code Development**:
- Refer to the central codebase at [cairo_verifier.cairo in starkware-libs repository](https://github.com/starkware-libs/cairo-lang/blob/master/src/starkware/cairo/cairo_verifier/layouts/all_cairo/cairo_verifier.cairo).
- The pivotal function is `verify_cairo_proof` with the signature:
```cairo
fn verify_cairo_proof(proof: StarkProof) -> CairoVerifierOutput
```
- Modules to port from [stark verifier](https://github.com/starkware-libs/cairo-lang/tree/master/src/starkware/cairo/stark_verifier)
- [air](https://github.com/starkware-libs/cairo-lang/tree/master/src/starkware/cairo/stark_verifier/air)
- verify
- global_values
- public_verify
- public_input
- public_memory
- [core](https://github.com/starkware-libs/cairo-lang/tree/master/src/starkware/cairo/stark_verifier/core)
- air_interface
- channel
- config
- fri
- queries
- table_commitment
- traces
- vector_commitment
- [crypto](https://github.com/starkware-libs/cairo-lang/tree/master/src/starkware/crypto/signature)
- fast_pedersen_hash (research if we can use poseidon?)
2. **Fact Registry**:
- **Registering Fact Interface**:
- Construct the function:
```cairo
trait FactRegistry {
fn verify_proof_and_register(proof: StarkProof);
fn is_valid(fact: felt252) -> bool;
}
```
- This interface should mirror the [solidity_verifier](https://book.starknet.io/chapter_3/solidity_verifier.html), with contract details accessible on [Etherscan](https://etherscan.io/address/0x6cb3ee90c50a38a0e4662bb7e7e6e40b91361bf6#code).
- **Fact Validation Interface**:
- Adopt the validation interface as depicted [here](https://etherscan.io/address/0x6cb3ee90c50a38a0e4662bb7e7e6e40b91361bf6#code#F7#L1).
- The fact should be a unique signature of the executed program. Potentially constructed as (akin to Solidity's fact creation for SHARP):
```
bytes32 fact = keccak256(
abi.encodePacked(cairoProgramHash, outputHash)
);
```
```cairo
fn generate_fact(cairo_program_hash: felt252, output_hash: felt252) -> felt252;
```
ensuring the exclusive identification of the program's operation.
We should be able to achieve similar behaviour [example contract](https://github.com/visoftsolutions/cairo-presentation/blob/master/contracts/Treasury.sol#L38-L60)
4. **Testing & Integration**:
- Implement the Cairo 1.0 verifier.
- Rigorously test the entire setup using a prototype dApp, particularly emphasizing the seamless flow involving the L2 claim function.