diff --git a/Cargo.lock b/Cargo.lock index 2742764a10..8bde134e7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3723,7 +3723,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 2.0.106", + "syn 1.0.109", ] [[package]] @@ -4804,12 +4804,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - [[package]] name = "flume" version = "0.11.1" @@ -5090,7 +5084,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7cb8796f93fa038f979a014234d632e9688a120e745f936e2635123c77537f7" dependencies = [ - "frame-metadata 21.0.0", + "frame-metadata 20.0.0", "parity-scale-codec", "scale-decode", "scale-info", @@ -5156,17 +5150,6 @@ dependencies = [ "serde", ] -[[package]] -name = "frame-metadata" -version = "21.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20dfd1d7eae1d94e32e869e2fb272d81f52dd8db57820a373adb83ea24d7d862" -dependencies = [ - "cfg-if", - "parity-scale-codec", - "scale-info", -] - [[package]] name = "frame-metadata" version = "23.0.0" @@ -6171,7 +6154,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -6530,7 +6513,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.15.5", "serde", "serde_core", ] @@ -7921,9 +7904,9 @@ dependencies = [ [[package]] name = "merkleized-metadata" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e3e3f549d27d2dc054372f320ddf68045a833fab490563ff70d4cf1b9d91ea" +checksum = "a55738f9a2a91692acbdc68066e4b60d4101a8599a474e039dbd449cf2cff701" dependencies = [ "array-bytes 9.3.0", "blake3", @@ -8777,7 +8760,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ - "proc-macro-crate 3.4.0", + "proc-macro-crate 1.1.3", "proc-macro2", "quote", "syn 2.0.106", @@ -8935,7 +8918,7 @@ dependencies = [ "expander", "indexmap 2.11.4", "itertools 0.11.0", - "petgraph 0.6.5", + "petgraph", "proc-macro-crate 3.4.0", "proc-macro2", "quote", @@ -9913,6 +9896,14 @@ dependencies = [ "scale-info", ] +[[package]] +name = "pallet-evm-precompile-blake2" +version = "2.0.0-dev" +source = "git+https://github.com/RaoFoundation/frontier?rev=d553a11551333c2457d9e64d6d912e2210a4ca26#d553a11551333c2457d9e64d6d912e2210a4ca26" +dependencies = [ + "fp-evm", +] + [[package]] name = "pallet-evm-precompile-bn128" version = "2.0.0-dev" @@ -11645,17 +11636,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ - "fixedbitset 0.4.2", - "indexmap 2.11.4", -] - -[[package]] -name = "petgraph" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" -dependencies = [ - "fixedbitset 0.5.7", + "fixedbitset", "indexmap 2.11.4", ] @@ -13608,12 +13589,12 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ - "heck 0.5.0", + "heck 0.4.1", "itertools 0.14.0", "log", "multimap", "once_cell", - "petgraph 0.7.1", + "petgraph", "prettyplease", "prost 0.13.5", "prost-types", @@ -18495,10 +18476,16 @@ dependencies = [ name = "subtensor-precompiles" version = "0.1.0" dependencies = [ + "ark-bls12-381 0.4.0", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", "ed25519-dalek", "fp-evm", "frame-support", "frame-system", + "hex", + "hex-literal", "log", "pallet-admin-utils", "pallet-alpha-assets", @@ -18507,6 +18494,7 @@ dependencies = [ "pallet-drand", "pallet-evm", "pallet-evm-chain-id", + "pallet-evm-precompile-blake2", "pallet-evm-precompile-bn128", "pallet-evm-precompile-dispatch", "pallet-evm-precompile-modexp", @@ -18522,6 +18510,9 @@ dependencies = [ "parity-scale-codec", "precompile-utils", "scale-info", + "serde", + "serde_json", + "sha2 0.10.9", "sp-core", "sp-io", "sp-runtime", diff --git a/Cargo.toml b/Cargo.toml index 8b8eb786ce..c5977c4b78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -278,6 +278,7 @@ pallet-evm-precompile-modexp = { git = "https://github.com/RaoFoundation/frontie pallet-evm-precompile-sha3fips = { git = "https://github.com/RaoFoundation/frontier", rev = "d553a11551333c2457d9e64d6d912e2210a4ca26", default-features = false } pallet-evm-precompile-simple = { git = "https://github.com/RaoFoundation/frontier", rev = "d553a11551333c2457d9e64d6d912e2210a4ca26", default-features = false } pallet-evm-precompile-bn128 = { git = "https://github.com/RaoFoundation/frontier", rev = "d553a11551333c2457d9e64d6d912e2210a4ca26", default-features = false } +pallet-evm-precompile-blake2 = { git = "https://github.com/RaoFoundation/frontier", rev = "d553a11551333c2457d9e64d6d912e2210a4ca26", default-features = false } pallet-hotfix-sufficients = { git = "https://github.com/RaoFoundation/frontier", rev = "d553a11551333c2457d9e64d6d912e2210a4ca26", default-features = false } #DRAND diff --git a/docs/precompiles.md b/docs/precompiles.md new file mode 100644 index 0000000000..6803e6e31d --- /dev/null +++ b/docs/precompiles.md @@ -0,0 +1,534 @@ +# Subtensor EVM Precompiles + +This document describes all precompiles registered in +[`precompiles/src/lib.rs`](../precompiles/src/lib.rs). + +Precompile addresses are derived from a numeric index with: + +```text +address = H160::from_low_u64_be(index) +``` + +For example, index `2048` is `0x0000000000000000000000000000000000000800`. + +> [!NOTE-1] +> Solidity interface files and ABIs for Subtensor-specific precompiles live under +> [`precompiles/src/solidity/`](../precompiles/src/solidity/). + +> [!NOTE-2] +> For some known precompile contracts, the addresses differ from the Ethereum standard. For example, Blake2F. The contract developers should check the table to get correct address. +--- + +## Address Overview + +| Index | Address | Category | Precompile | +|------:|---------|----------|------------| +| 1 | `0x…0001` | Ethereum | ECRecover | +| 2 | `0x…0002` | Ethereum | SHA-256 | +| 3 | `0x…0003` | Ethereum | RIPEMD-160 | +| 4 | `0x…0004` | Ethereum | Identity | +| 5 | `0x…0005` | Ethereum | ModExp | +| 6 | `0x…0006` | Frontier | Dispatch | +| 7 | `0x…0007` | Ethereum | Bn128Mul | +| 8 | `0x…0008` | Ethereum | Bn128Pairing | +| 9 | `0x…0009` | Ethereum | Bn128Add | +| 10 | `0x…000a` | Ethereum (Cancun) | PointEvaluation (EIP-4844) | +| 1024 | `0x…0400` | Frontier | SHA3-FIPS256 | +| 1025 | `0x…0401` | Frontier | ECRecoverPublicKey | +| 1026 | `0x…0402` | Crypto | Ed25519Verify | +| 1027 | `0x…0403` | Crypto | Sr25519Verify | +| 1028 | `0x…0404` | Ethereum | Blake2F | +| 2048 | `0x…0800` | Subtensor | BalanceTransfer | +| 2049 | `0x…0801` | Subtensor | Staking (v1) | +| 2050 | `0x…0802` | Subtensor | Metagraph | +| 2051 | `0x…0803` | Subtensor | Subnet | +| 2052 | `0x…0804` | Subtensor | Neuron | +| 2053 | `0x…0805` | Subtensor | Staking (v2) | +| 2054 | `0x…0806` | Subtensor | UidLookup | +| 2055 | `0x…0807` | Subtensor | StorageQuery | +| 2056 | `0x…0808` | Subtensor | Alpha | +| 2057 | `0x…0809` | Subtensor | Crowdloan | +| 2058 | `0x…080a` | Subtensor | Leasing | +| 2059 | `0x…080b` | Subtensor | Proxy | +| 2060 | `0x…080c` | Subtensor | AddressMapping | +| 2061 | `0x…080d` | Subtensor | VotingPower | + +--- + +## Ethereum Precompiles + +These are standard EVM built-ins from Frontier / Ethereum. + +### 1. ECRecover — `0x…0001` + +Recovers an Ethereum address from a secp256k1 signature. + +| Item | Value | +|------|-------| +| Input | 128 bytes: `hash (32) \|\| v (32) \|\| r (32) \|\| s (32)` | +| Output | 32-byte left-padded address | + +### 2. SHA-256 — `0x…0002` + +Computes SHA-256 of arbitrary input. + +| Item | Value | +|------|-------| +| Input | any length | +| Output | 32-byte digest | + +### 3. RIPEMD-160 — `0x…0003` + +Computes RIPEMD-160 of arbitrary input. + +| Item | Value | +|------|-------| +| Input | any length | +| Output | 32-byte left-padded digest | + +### 4. Identity — `0x…0004` + +Returns input unchanged (data copy precompile). + +| Item | Value | +|------|-------| +| Input | any length | +| Output | same as input | + +### 5. ModExp — `0x…0005` + +Modular exponentiation (`EIP-198`). + +| Item | Value | +|------|-------| +| Input | length-prefixed base / exponent / modulus | +| Output | modular exponentiation result | + +### 6. Dispatch — `0x…0006` + +Frontier-specific precompile that dispatches a Substrate runtime call from EVM. + +| Item | Value | +|------|-------| +| Input | SCALE-encoded runtime call | +| Output | empty on success | + +> [!IMPORTANT] +> In this runtime, address `0x06` is **Dispatch**, not `Bn128Add`. Ethereum’s +> usual bn128 layout is remapped below. + +### 7. Bn128Mul — `0x…0007` + +Elliptic-curve scalar multiplication on alt_bn128 (`EIP-196`). + +### 8. Bn128Pairing — `0x…0008` + +Elliptic-curve pairing check on alt_bn128 (`EIP-197`). + +### 9. Bn128Add — `0x…0009` + +Elliptic-curve point addition on alt_bn128 (`EIP-196`). + +### 10. PointEvaluation — `0x…000a` + +KZG point evaluation precompile from **EIP-4844** (Cancun). + +| Item | Value | +|------|-------| +| Gas | `50_000` | +| Input | exactly **192 bytes**: `versioned_hash (32) \|\| z (32) \|\| y (32) \|\| commitment (48) \|\| proof (48)` | +| Output on success | `FIELD_ELEMENTS_PER_BLOB (4096)` \|\| `BLS_MODULUS` (64 bytes total) | + +Source: [`precompiles/src/point_evaluation.rs`](../precompiles/src/point_evaluation.rs) + +--- + +## Frontier / Crypto Precompiles + +### 1024. SHA3-FIPS256 — `0x…0400` + +FIPS-compatible SHA3-256 digest. + +### 1025. ECRecoverPublicKey — `0x…0401` + +Like ECRecover, but returns the recovered public key instead of the address. + +### 1026. Ed25519Verify — `0x…0402` + +Verifies an Ed25519 signature. + +| Item | Value | +|------|-------| +| Index | `1026` | +| Gas base | `6000` | +| Input layout | `0x00..0x04` padding / selector region + `msg (32)` + `pubkey (32)` + `signature (64)` (minimum 132 bytes) | +| Output | 32 bytes; `1` in the last byte if valid, otherwise `0` | + +Solidity reference: [`ed25519Verify.sol`](../precompiles/src/solidity/ed25519Verify.sol) + +### 1027. Sr25519Verify — `0x…0403` + +Verifies an sr25519 signature (Substrate native). + +| Item | Value | +|------|-------| +| Index | `1027` | +| Gas base | `6000` | +| Input layout | same shape as Ed25519Verify | +| Output | 32 bytes; `1` in the last byte if valid, otherwise `0` | + +Solidity reference: [`sr25519Verify.sol`](../precompiles/src/solidity/sr25519Verify.sol) + +### 1028. Blake2F — `0x…0404` + +BLAKE2 compression function (`EIP-152`). + +--- + +## Subtensor Precompiles + +Most Subtensor-specific precompiles: + +- use Solidity ABI selectors generated by `precompile-utils` +- map the EVM caller through `HashedAddressMapping` before pallet dispatch +- may require admin enablement via `PrecompileEnum` (except `StorageQuery` and a few always-on cases) + +`bytes32` arguments typically represent Substrate `AccountId32` values +(hotkeys / coldkeys). + +--- + +### 2048. BalanceTransfer — `0x…0800` + +Transfer the call’s `msg.value` (in TAO, after EVM↔substrate balance conversion) to a Substrate account. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `transfer(bytes32)` | yes | Transfer TAO to the given `AccountId32` | + +Solidity: [`balanceTransfer.sol`](../precompiles/src/solidity/balanceTransfer.sol) + +--- + +### 2049. Staking (v1) — `0x…0801` + +Legacy staking interface. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `addStake(bytes32,uint256)` | yes | Add stake to hotkey on `netuid` (value from `msg.value`) | +| `removeStake(bytes32,uint256,uint256)` | yes | Remove stake amount from hotkey/netuid | +| `getTotalColdkeyStake(bytes32)` | no | Total coldkey stake | +| `getTotalHotkeyStake(bytes32)` | no | Total hotkey stake | +| `getStake(bytes32,bytes32,uint256)` | no | Stake for hotkey/coldkey/netuid | +| `addProxy(bytes32)` | yes | Add staking proxy | +| `removeProxy(bytes32)` | yes | Remove staking proxy | + +Solidity: [`staking.sol`](../precompiles/src/solidity/staking.sol) + +--- + +### 2050. Metagraph — `0x…0802` + +Read-only metagraph / neuron metrics. + +| Method | Description | +|--------|-------------| +| `getUidCount(uint16)` | Number of UIDs on subnet | +| `getStake(uint16,uint16)` | Stake at UID | +| `getRank(uint16,uint16)` | Rank | +| `getTrust(uint16,uint16)` | Trust | +| `getConsensus(uint16,uint16)` | Consensus | +| `getIncentive(uint16,uint16)` | Incentive | +| `getDividends(uint16,uint16)` | Dividends | +| `getEmission(uint16,uint16)` | Emission | +| `getVtrust(uint16,uint16)` | Validator trust | +| `getValidatorStatus(uint16,uint16)` | Whether UID is a validator | +| `getLastUpdate(uint16,uint16)` | Last update block | +| `getIsActive(uint16,uint16)` | Active status | +| `getAxon(uint16,uint16)` | Axon endpoint info | +| `getHotkey(uint16,uint16)` | Hotkey for UID | +| `getColdkey(uint16,uint16)` | Coldkey for UID | + +Solidity: [`metagraph.sol`](../precompiles/src/solidity/metagraph.sol) + +--- + +### 2051. Subnet — `0x…0803` + +Subnet registration and owner hyperparameter get/set. + +#### Network registration + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `registerNetwork(bytes32)` | yes | Register network with hotkey | +| `registerNetwork(bytes32,string,string,string,string,string,string,string)` | yes | Register with identity fields | +| `getNetworkRegistrationBlock(uint16)` | no | Block when network was registered | + +#### Common hyperparameters + +Methods follow `getX(uint16)` / `setX(uint16, …)` patterns for: + +- serving rate limit +- min / max difficulty +- weights version key & set rate limit +- adjustment alpha +- max weight limit +- immunity period +- min allowed weights +- kappa / rho / alpha sigmoid steepness +- activity cutoff & factor +- network registration / PoW registration allowed +- min / max burn +- difficulty +- bonds moving average +- commit-reveal weights enabled & interval +- liquid alpha / Yuma3 / bonds reset toggles +- alpha values +- toggle transfers + +Solidity: [`subnet.sol`](../precompiles/src/solidity/subnet.sol) + +--- + +### 2052. Neuron — `0x…0804` + +Neuron registration, weights, and serving endpoints. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `setWeights(uint16,uint16[],uint16[],uint64)` | yes | Set weights | +| `commitWeights(uint16,bytes32)` | yes | Commit weights hash | +| `revealWeights(uint16,uint16[],uint16[],uint16[],uint64)` | yes | Reveal committed weights | +| `burnedRegister(uint16,bytes32)` | yes | Burned registration | +| `registerLimit(uint16,bytes32,uint64)` | yes | Registration with limit | +| `serveAxon(uint16,uint32,uint128,uint16,uint8,uint8,uint8,uint8)` | yes | Publish axon endpoint | +| TLS axon serve overload | yes | Publish axon with TLS certificate | +| `servePrometheus(uint16,uint32,uint128,uint16,uint8)` | yes | Publish Prometheus endpoint | + +Solidity: [`neuron.sol`](../precompiles/src/solidity/neuron.sol) + +--- + +### 2053. Staking (v2) — `0x…0805` + +Current staking interface with limits, alpha burn, allowances, and stake movement. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `addStake(bytes32,uint256,uint256)` | yes | Add stake amount on netuid | +| `removeStake(bytes32,uint256,uint256)` | yes | Remove stake amount | +| `removeStakeFull(bytes32,uint256)` | yes | Fully remove stake | +| `removeStakeFullLimit(bytes32,uint256,uint256)` | yes | Fully remove with price limit | +| `moveStake(bytes32,bytes32,uint256,uint256,uint256)` | yes | Move stake between hotkeys / nets | +| `transferStake(bytes32,bytes32,uint256,uint256,uint256)` | yes | Transfer stake between coldkeys | +| `burnAlpha(bytes32,uint256,uint256)` | yes | Burn alpha stake | +| `addStakeLimit(...)` | yes | Add stake with max price / allow partial | +| `removeStakeLimit(...)` | yes | Remove stake with min price / allow partial | +| `getTotalColdkeyStake(bytes32)` | no | Total coldkey stake | +| `getTotalHotkeyStake(bytes32)` | no | Total hotkey stake | +| `getStake(bytes32,bytes32,uint256)` | no | Stake lookup | +| `getAlphaStakedValidators(bytes32,uint256)` | no | Alpha-staked validators | +| `getTotalAlphaStaked(bytes32,uint256)` | no | Total alpha staked | +| `getNominatorMinRequiredStake()` | no | Minimum nominator stake | +| `getTotalColdkeyStakeOnSubnet(bytes32,uint256)` | no | Coldkey stake on subnet | +| `addProxy(bytes32)` / `removeProxy(bytes32)` | yes | Proxy management | +| `approve(address,uint256,uint256)` | yes | Approve stake allowance | +| `allowance(address,address,uint256)` | no | Read allowance | +| `increaseAllowance(...)` / `decreaseAllowance(...)` | yes | Adjust allowance | +| `transferStakeFrom(...)` | yes | Transfer stake using allowance | + +Solidity: [`stakingV2.sol`](../precompiles/src/solidity/stakingV2.sol) + +--- + +### 2054. UidLookup — `0x…0806` + +Look up a subnet UID associated with an EVM address / associated key. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `uidLookup(uint16,address,uint16)` | no | Returns UID + association metadata for `netuid` | + +Solidity: [`uidLookup.sol`](../precompiles/src/solidity/uidLookup.sol) + +--- + +### 2055. StorageQuery — `0x…0807` + +Raw Substrate storage reader for allowlisted pallet key prefixes. + +| Item | Value | +|------|-------| +| Input | full storage key bytes (must start with an authorized 16-byte twox128 pallet prefix) | +| Output | raw SCALE storage value, or empty if missing | +| Allowlist | `SubtensorModule`, `Swap`, `Balances`, `Proxy`, `Scheduler`, `Drand`, `Crowdloan`, `Sudo`, `Multisig`, `Timestamp` | + +> [!WARNING] +> Keys outside the allowlist are rejected with `"Invalid key"`. + +Source: [`storage_query.rs`](../precompiles/src/storage_query.rs) + +--- + +### 2056. Alpha — `0x…0808` + +Subnet AMM / alpha economics views and swap simulations. + +| Method | Description | +|--------|-------------| +| `getAlphaPrice(uint16)` | Current alpha price | +| `getMovingAlphaPrice(uint16)` | Moving alpha price | +| `getTaoInPool(uint16)` | TAO reserve | +| `getAlphaInPool(uint16)` | Alpha-in reserve | +| `getAlphaOutPool(uint16)` | Alpha-out | +| `getAlphaIssuance(uint16)` | Alpha issuance | +| `getTaoWeight()` | Global TAO weight | +| `getCKBurn()` | CK burn value | +| `simSwapTaoForAlpha(uint16,uint64)` | Simulate TAO → alpha | +| `simSwapAlphaForTao(uint16,uint64)` | Simulate alpha → TAO | +| `getSubnetMechanism(uint16)` | Mechanism id | +| `getRootNetuid()` | Root netuid | +| `getEMAPriceHalvingBlocks(uint16)` | EMA halving period | +| `getSubnetVolume(uint16)` | Subnet volume | +| `getTaoInEmission(uint16)` | TAO-in emission | +| `getAlphaInEmission(uint16)` | Alpha-in emission | +| `getAlphaOutEmission(uint16)` | Alpha-out emission | +| `getSumAlphaPrice()` | Sum of alpha prices | + +Solidity: [`alpha.sol`](../precompiles/src/solidity/alpha.sol) + +--- + +### 2057. Crowdloan — `0x…0809` + +Crowdloan create / contribute / admin flows. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `getCrowdloan(uint32)` | no | Crowdloan details | +| `getContribution(uint32,bytes32)` | no | Contributor amount | +| `create(uint64,uint64,uint64,uint32,address)` | yes | Create crowdloan | +| `contribute(uint32,uint64)` | yes | Contribute | +| `withdraw(uint32)` | yes | Withdraw contribution | +| `finalize(uint32)` | yes | Finalize capped crowdloan | +| `refund(uint32)` | yes | Refund contributors | +| `dissolve(uint32)` | yes | Dissolve crowdloan | +| `updateMinContribution(uint32,uint64)` | yes | Update min contribution | +| `updateEnd(uint32,uint32)` | yes | Update end block | +| `updateCap(uint32,uint64)` | yes | Update cap | + +Solidity: [`crowdloan.sol`](../precompiles/src/solidity/crowdloan.sol) + +--- + +### 2058. Leasing — `0x…080a` + +Subnet leasing via crowdloan. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `getLease(uint32)` | no | Lease details | +| `getContributorShare(uint32,bytes32)` | no | Contributor share | +| `getLeaseIdForSubnet(uint16)` | no | Lease id for subnet | +| `createLeaseCrowdloan(uint64,uint64,uint64,uint32,uint8,bool,uint32)` | yes | Create lease crowdloan | +| `terminateLease(uint32,bytes32)` | yes | Terminate ended lease | + +Solidity: [`leasing.sol`](../precompiles/src/solidity/leasing.sol) + +--- + +### 2059. Proxy — `0x…080b` + +Subtensor proxy management and proxied calls from EVM. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `createPureProxy(uint8,uint32,uint16)` | yes | Create pure proxy | +| `killPureProxy(bytes32,uint8,uint16,uint32,uint32)` | yes | Kill pure proxy | +| `proxyCall(bytes32,uint8[],uint8[])` | yes | Execute call through proxy | +| `addProxy(bytes32,uint8,uint32)` | yes | Add proxy | +| `removeProxy(bytes32,uint8,uint32)` | yes | Remove proxy | +| `removeProxies()` | yes | Remove all proxies | +| `pokeDeposit()` | yes | Refresh proxy deposit | +| `getProxies(bytes32)` | no | List proxies for account | + +Solidity: [`proxy.sol`](../precompiles/src/solidity/proxy.sol) + +--- + +### 2060. AddressMapping — `0x…080c` + +Maps an EVM `address` to its Substrate `AccountId32` under the runtime +`HashedAddressMapping`. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `addressMapping(address)` | no | Returns 32-byte Substrate account id | + +Solidity: [`addressMapping.sol`](../precompiles/src/solidity/addressMapping.sol) + +--- + +### 2061. VotingPower — `0x…080d` + +Read voting-power tracking state for subnets. + +| Method | Mutating | Description | +|--------|:--------:|-------------| +| `getVotingPower(uint16,bytes32)` | no | Voting power for account on subnet | +| `isVotingPowerTrackingEnabled(uint16)` | no | Whether tracking is enabled | +| `getVotingPowerDisableAtBlock(uint16)` | no | Disable-at block | +| `getVotingPowerEmaAlpha(uint16)` | no | EMA alpha parameter | +| `getTotalVotingPower(uint16)` | no | Total tracked voting power | + +Source: [`voting_power.rs`](../precompiles/src/voting_power.rs) + +--- + +## Notes for Integrators + +1. **Address format** + Always call the 20-byte `H160` derived from the index (left-padded with zeros). + +2. **ABI vs raw input** + - Ethereum / Frontier crypto precompiles generally use raw byte layouts. + - Subtensor precompiles use Solidity ABI (`precompile-utils` selectors). + +3. **Account mapping** + EVM callers are mapped to Substrate accounts via `HashedAddressMapping` + (`BlakeTwo256`). Use `AddressMapping` (`0x…080c`) to inspect the mapping. + +4. **Decimals** + EVM balances are scaled relative to Substrate TAO (commonly ×10⁹ in this + codebase). Prefer the Solidity helpers / existing ABIs when converting amounts. + +5. **Enablement** + Many Subtensor precompiles go through `try_execute` and may be gated by + `PrecompileEnum` admin settings. If a call reverts unexpectedly, check that + the corresponding precompile feature is enabled on-chain. + +--- + +## Source Map + +| Precompile | Source | +|------------|--------| +| PointEvaluation | `precompiles/src/point_evaluation.rs` | +| Ed25519Verify | `precompiles/src/ed25519.rs` | +| Sr25519Verify | `precompiles/src/sr25519.rs` | +| BalanceTransfer | `precompiles/src/balance_transfer.rs` | +| Staking v1 / v2 | `precompiles/src/staking.rs` | +| Metagraph | `precompiles/src/metagraph.rs` | +| Subnet | `precompiles/src/subnet.rs` | +| Neuron | `precompiles/src/neuron.rs` | +| UidLookup | `precompiles/src/uid_lookup.rs` | +| StorageQuery | `precompiles/src/storage_query.rs` | +| Alpha | `precompiles/src/alpha.rs` | +| Crowdloan | `precompiles/src/crowdloan.rs` | +| Leasing | `precompiles/src/leasing.rs` | +| Proxy | `precompiles/src/proxy.rs` | +| AddressMapping | `precompiles/src/address_mapping.rs` | +| VotingPower | `precompiles/src/voting_power.rs` | +| Registry | `precompiles/src/lib.rs` | diff --git a/precompiles/Cargo.toml b/precompiles/Cargo.toml index d7df04dc14..887342caea 100644 --- a/precompiles/Cargo.toml +++ b/precompiles/Cargo.toml @@ -13,10 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec.workspace = true ed25519-dalek = { workspace = true, features = ["alloc"] } +ark-bls12-381.workspace = true +ark-ec.workspace = true +ark-ff.workspace = true +ark-serialize.workspace = true fp-evm.workspace = true frame-support.workspace = true frame-system.workspace = true +hex-literal.workspace = true log.workspace = true +sha2.workspace = true pallet-alpha-assets.workspace = true pallet-balances.workspace = true pallet-evm.workspace = true @@ -24,6 +30,7 @@ pallet-evm-precompile-dispatch.workspace = true pallet-evm-precompile-modexp.workspace = true pallet-evm-precompile-sha3fips.workspace = true pallet-evm-precompile-simple.workspace = true +pallet-evm-precompile-blake2.workspace = true pallet-evm-precompile-bn128.workspace = true pallet-subtensor-proxy.workspace = true precompile-utils.workspace = true @@ -58,8 +65,14 @@ std = [ "pallet-balances/std", "pallet-crowdloan/std", "pallet-drand/std", + "ark-bls12-381/std", + "ark-ec/std", + "ark-ff/std", + "ark-serialize/std", + "pallet-evm-precompile-blake2/std", "pallet-evm-precompile-bn128/std", "pallet-evm-chain-id/std", + "sha2/std", "pallet-evm-precompile-dispatch/std", "pallet-evm-precompile-modexp/std", "pallet-evm-precompile-sha3fips/std", @@ -81,6 +94,9 @@ std = [ "substrate-fixed/std", "subtensor-runtime-common/std", "subtensor-swap-interface/std", + "hex/std", + "serde/std", + "serde_json/std" ] runtime-benchmarks = [ "frame-support/runtime-benchmarks", @@ -99,13 +115,16 @@ runtime-benchmarks = [ "pallet-timestamp/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "subtensor-runtime-common/runtime-benchmarks", - "subtensor-swap-interface/runtime-benchmarks" + "subtensor-swap-interface/runtime-benchmarks", ] [dev-dependencies] +hex = { workspace = true, features = ["std"] } pallet-drand = { workspace = true, features = ["std"] } pallet-evm-chain-id = { workspace = true, features = ["std"] } pallet-preimage = { workspace = true, features = ["std"] } pallet-scheduler = { workspace = true, features = ["std"] } pallet-timestamp = { workspace = true, features = ["std"] } precompile-utils = { workspace = true, features = ["std", "testing"] } +serde = { workspace = true, features = ["std", "derive"] } +serde_json = { workspace = true, features = ["std"] } diff --git a/precompiles/src/lib.rs b/precompiles/src/lib.rs index cf54934d95..0dc0f44938 100644 --- a/precompiles/src/lib.rs +++ b/precompiles/src/lib.rs @@ -25,12 +25,14 @@ use pallet_evm::{ AddressMapping, IsPrecompileResult, Precompile, PrecompileHandle, PrecompileResult, PrecompileSet, }; +use pallet_evm_precompile_blake2::Blake2F; use pallet_evm_precompile_bn128::{Bn128Add, Bn128Mul, Bn128Pairing}; use pallet_evm_precompile_dispatch::Dispatch; use pallet_evm_precompile_modexp::Modexp; use pallet_evm_precompile_sha3fips::Sha3FIPS256; use pallet_evm_precompile_simple::{ECRecover, ECRecoverPublicKey, Identity, Ripemd160, Sha256}; use pallet_subtensor_proxy as pallet_proxy; +pub use point_evaluation::PointEvaluation; pub use proxy::ProxyPrecompile; use sp_core::{H160, U256, crypto::ByteArray}; use sp_runtime::traits::{AsSystemOriginSigner, Dispatchable, StaticLookup}; @@ -51,6 +53,7 @@ mod extensions; mod leasing; mod metagraph; mod neuron; +mod point_evaluation; mod proxy; mod sr25519; mod staking; @@ -137,7 +140,7 @@ where Self(Default::default()) } - pub fn used_addresses() -> [H160; 27] { + pub fn used_addresses() -> [H160; 29] { [ hash(1), hash(2), @@ -148,10 +151,12 @@ where hash(7), hash(8), hash(9), + hash(10), hash(1024), hash(1025), hash(Ed25519Verify::::INDEX), hash(Sr25519Verify::::INDEX), + hash(1028), hash(BalanceTransferPrecompile::::INDEX), hash(StakingPrecompile::::INDEX), hash(SubnetPrecompile::::INDEX), @@ -216,6 +221,7 @@ where a if a == hash(7) => Some(Bn128Mul::execute(handle)), a if a == hash(8) => Some(Bn128Pairing::execute(handle)), a if a == hash(9) => Some(Bn128Add::execute(handle)), + a if a == hash(10) => Some(PointEvaluation::execute(handle)), // Non-Frontier specific nor Ethereum precompiles : a if a == hash(1024) => Some(Sha3FIPS256::execute(handle)), a if a == hash(1025) => Some(ECRecoverPublicKey::execute(handle)), @@ -225,6 +231,7 @@ where a if a == hash(Sr25519Verify::::INDEX) => { Some(Sr25519Verify::::execute(handle)) } + a if a == hash(1028) => Some(Blake2F::execute(handle)), // Subtensor specific precompiles : a if a == hash(BalanceTransferPrecompile::::INDEX) => { BalanceTransferPrecompile::::try_execute::( diff --git a/precompiles/src/point_evaluation.rs b/precompiles/src/point_evaluation.rs new file mode 100644 index 0000000000..e68e34dd29 --- /dev/null +++ b/precompiles/src/point_evaluation.rs @@ -0,0 +1,605 @@ +#![allow(clippy::arithmetic_side_effects)] +extern crate alloc; + +use alloc::vec::Vec; + +use fp_evm::{ + ExitError, ExitSucceed, Precompile, PrecompileFailure, PrecompileHandle, PrecompileOutput, + PrecompileResult, +}; + +use ark_bls12_381::{Bls12_381, Fr, G1Affine, G1Projective, G2Affine, G2Projective}; +use ark_ec::pairing::Pairing; +use ark_ec::{AffineRepr, CurveGroup}; +use ark_ff::{One, PrimeField}; +use ark_serialize::CanonicalDeserialize; + +use hex_literal::hex; +use sha2::{Digest, Sha256}; + +const GAS_COST: u64 = 50_000; + +const INPUT_LEN: usize = 192; + +const G2_SRS: [u8; 96] = hex!( + "b5bfd7dd8cdeb128843bc287230af38926187075cbfbefa81009a2ce615ac53d2914e5870cb452d2afaaab24f3499f72185cbfee53492714734429b7b38608e23926c911cceceac9a36851477ba4c60b087041de621000edc98edada20c1def2" +); + +const FIELD_ELEMENTS_PER_BLOB_BYTES: [u8; 32] = { + let mut buf = [0u8; 32]; + buf[30] = 0x10; + buf[31] = 0x00; + buf +}; + +const BLS_MODULUS_BYTES: [u8; 32] = + hex!("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001"); + +pub struct PointEvaluation; + +impl PointEvaluation { + fn execute_impl(input: &[u8], g2_srs: &[u8]) -> PrecompileResult { + if input.len() != INPUT_LEN { + return Err(PrecompileFailure::Error { + exit_status: ExitError::Other("input must be 192 bytes".into()), + }); + } + + let mut buf = [0u8; INPUT_LEN]; + buf.copy_from_slice(input); + + let mut versioned_hash = [0u8; 32]; + versioned_hash.copy_from_slice(&buf[0..32]); + + let z = &buf[32..64]; + let y = &buf[64..96]; + let commitment_bytes = &buf[96..144]; + let proof_bytes = &buf[144..INPUT_LEN]; + + let commitment_hash = Sha256::digest(commitment_bytes); + if versioned_hash[0] != 0x01 || versioned_hash.get(1..) != commitment_hash.get(1..) { + return Err(PrecompileFailure::Error { + exit_status: ExitError::Other("versioned hash mismatch".into()), + }); + } + + let deserialize_bls_scalar = |bytes: &[u8]| { + if bytes >= BLS_MODULUS_BYTES.as_slice() { + return Err(PrecompileFailure::Error { + exit_status: ExitError::Other("invalid field element".into()), + }); + } + Ok(Fr::from_be_bytes_mod_order(bytes)) + }; + let z_fr = deserialize_bls_scalar(z)?; + let y_fr = deserialize_bls_scalar(y)?; + + let commitment = G1Affine::deserialize_compressed(commitment_bytes).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other("invalid commitment".into()), + } + })?; + + let proof = G1Affine::deserialize_compressed(proof_bytes).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other("invalid proof".into()), + } + })?; + + let g2_srs = + G2Affine::deserialize_compressed(g2_srs).map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other("invalid G2 SRS".into()), + })?; + + let g1_gen = G1Affine::generator(); + let g2_gen = G2Affine::generator(); + + #[allow(clippy::arithmetic_side_effects)] + let p_minus_y = + (G1Projective::from(commitment) - G1Projective::from(g1_gen) * y_fr).into_affine(); + + let neg_g2 = -g2_gen; + + let s_minus_z = + (G2Projective::from(g2_srs) + G2Projective::from(g2_gen) * (-z_fr)).into_affine(); + + let valid = Bls12_381::multi_pairing([p_minus_y, proof], [neg_g2, s_minus_z]) + .0 + .is_one(); + + if !valid { + return Err(PrecompileFailure::Error { + exit_status: ExitError::Other("KZG proof verification failed".into()), + }); + } + + let mut output = Vec::with_capacity(64); + output.extend_from_slice(&FIELD_ELEMENTS_PER_BLOB_BYTES); + output.extend_from_slice(&BLS_MODULUS_BYTES); + + Ok(PrecompileOutput { + exit_status: ExitSucceed::Returned, + output, + }) + } +} + +impl Precompile for PointEvaluation { + fn execute(handle: &mut impl PrecompileHandle) -> PrecompileResult { + handle.record_cost(GAS_COST)?; + Self::execute_impl(handle.input(), &G2_SRS) + } +} + +#[cfg(test)] +mod tests { + #![allow( + clippy::indexing_slicing, + clippy::panic, + clippy::unwrap_used, + clippy::expect_used + )] + use super::*; + use crate::mock::{addr_from_index, new_test_ext}; + use precompile_utils::testing::MockHandle; + use serde::Deserialize; + use sp_core::{H160, U256}; + + /// KZG infinity point (`0xc0 << 376`), from EEST `common.INF_POINT`. + const INF_POINT: [u8; 48] = hex!( + "c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ); + + /// Valid evaluation point from EEST `common.Z`. + const Z: [u8; 32] = hex!("623ce31cf9759a5c8daf3a357992f9f3dd7f9339d8998bc8e68373e54f00b75e"); + + const EXPECTED_OUTPUT: [u8; 64] = hex!( + "0000000000000000000000000000000000000000000000000000000000001000" + "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001" + ); + + #[derive(Deserialize)] + struct VectorInput { + commitment: String, + proof: String, + z: String, + y: String, + } + + #[derive(Deserialize)] + struct ExternalVector { + name: String, + input: VectorInput, + /// `true` = success, `false`/`null` = failure (null usually means + /// deserialization reject). + output: Option, + } + + fn execute_point_eval(input: Vec) -> Result, PrecompileFailure> { + let addr = H160::from_low_u64_be(10); + let caller = addr_from_index(1); + let mut handle = MockHandle::new( + addr, + fp_evm::Context { + address: addr, + caller, + apparent_value: U256::zero(), + }, + ); + handle.input = input; + match PointEvaluation::execute(&mut handle) { + Ok(output) => Ok(output.output), + Err(e) => Err(e), + } + } + + fn decode_hex(s: &str) -> Vec { + let s = s.strip_prefix("0x").unwrap_or(s); + hex::decode(s).expect("valid hex") + } + + /// Mirrors EEST `Spec.kzg_to_versioned_hash`. + fn kzg_to_versioned_hash(commitment: &[u8], version: u8) -> [u8; 32] { + let commitment_hash = Sha256::digest(commitment); + let mut versioned_hash = [0u8; 32]; + versioned_hash[0] = version; + versioned_hash[1..].copy_from_slice(&commitment_hash[1..]); + versioned_hash + } + + /// Mirrors EEST `precompile_input` fixture. + fn precompile_input( + versioned_hash: Option<&[u8]>, + z: &[u8], + y: &[u8], + commitment: &[u8], + proof: &[u8], + ) -> Vec { + let vh = versioned_hash + .map(|v| v.to_vec()) + .unwrap_or_else(|| kzg_to_versioned_hash(commitment, 0x01).to_vec()); + let mut input = + Vec::with_capacity(vh.len() + z.len() + y.len() + commitment.len() + proof.len()); + input.extend_from_slice(&vh); + input.extend_from_slice(z); + input.extend_from_slice(y); + input.extend_from_slice(commitment); + input.extend_from_slice(proof); + input + } + + fn bls_modulus_be() -> [u8; 32] { + BLS_MODULUS_BYTES + } + + fn assert_success(input: Vec) { + let result = execute_point_eval(input); + assert!(result.is_ok(), "Expected Ok, got: {:?}", result.err()); + assert_eq!(result.unwrap(), EXPECTED_OUTPUT); + } + + fn assert_failure(input: Vec) { + let result = execute_point_eval(input); + assert!(result.is_err(), "Expected Err, got Ok({:?})", result.ok()); + } + + // ── Length / versioned-hash sanity ─────────────────────────────────────── + + #[test] + fn point_evaluation_requires_192_bytes() { + new_test_ext().execute_with(|| { + assert_failure(vec![0u8; 100]); + }); + } + + #[test] + fn point_evaluation_rejects_invalid_versioned_hash() { + new_test_ext().execute_with(|| { + let mut input = vec![0u8; 192]; + input[0] = 0x00; + assert_failure(input); + }); + } + + #[test] + fn point_evaluation_rejects_versioned_hash_mismatch() { + new_test_ext().execute_with(|| { + let mut input = vec![0u8; 192]; + input[0] = 0x01; + input[1] = 0x42; + assert_failure(input); + }); + } + + // ── EEST `test_valid_inputs` ───────────────────────────────────────────── + + #[test] + fn eest_valid_in_bounds_z() { + // Spec.BLS_MODULUS - 1, y=0, INF_POINT commitment/proof. + new_test_ext().execute_with(|| { + let mut z = bls_modulus_be(); + // subtract 1 from big-endian modulus + let mut i = 31; + loop { + if z[i] > 0 { + z[i] -= 1; + break; + } + z[i] = 0xff; + if i == 0 { + break; + } + i -= 1; + } + let y = [0u8; 32]; + assert_success(precompile_input(None, &z, &y, &INF_POINT, &INF_POINT)); + }); + } + + #[test] + fn eest_valid_mainnet_1() { + // Mainnet tx + // https://etherscan.io/tx/0xcb3dc8f3b14f1cda0c16a619a112102a8ec70dce1b3f1b28272227cf8d5fbb0e + new_test_ext().execute_with(|| { + let z = hex!("019123bcb9d06356701f7be08b4494625b87a7b02edc566126fb81f6306e915f"); + let y = hex!("6c2eb1e94c2532935b8465351ba1bd88eabe2b3fa1aadff7d1cd816e8315bd38"); + let commitment = hex!( + "a9546d41993e10df2a7429b8490394ea9ee62807bae6f326d1044a51581306f58d4b9dfd5931e044688855280ff3799e" + ); + let proof = hex!( + "a2ea83d9391e0ee42e0c650acc7a1f842a7d385189485ddb4fd54ade3d9fd50d608167dca6c776aad4b8ad5c20691bfe" + ); + let versioned_hash = + hex!("018156b94fe9735e573bab36dad05d60feb720d424ccd20aaf719343c31e4246"); + assert_success(precompile_input( + Some(&versioned_hash), + &z, + &y, + &commitment, + &proof, + )); + }); + } + + // ── EEST `test_invalid_inputs` ─────────────────────────────────────────── + + #[test] + fn eest_invalid_out_of_bounds_z() { + new_test_ext().execute_with(|| { + let z = bls_modulus_be(); + let y = [0u8; 32]; + assert_failure(precompile_input(None, &z, &y, &INF_POINT, &INF_POINT)); + }); + } + + #[test] + fn eest_invalid_out_of_bounds_y() { + new_test_ext().execute_with(|| { + let z = [0u8; 32]; + let y = bls_modulus_be(); + assert_failure(precompile_input(None, &z, &y, &INF_POINT, &INF_POINT)); + }); + } + + #[test] + fn eest_invalid_proof_input_too_short() { + new_test_ext().execute_with(|| { + let y = [0u8; 32]; + let proof = &INF_POINT[..47]; + assert_failure(precompile_input(None, &Z, &y, &INF_POINT, proof)); + }); + } + + #[test] + fn eest_invalid_proof_input_too_short_2() { + new_test_ext().execute_with(|| { + let y = [0u8; 32]; + let proof = &INF_POINT[..1]; + assert_failure(precompile_input(None, &Z, &y, &INF_POINT, proof)); + }); + } + + #[test] + fn eest_invalid_proof_input_too_long() { + new_test_ext().execute_with(|| { + let y = [0u8; 32]; + let mut proof = INF_POINT.to_vec(); + proof.push(0); + assert_failure(precompile_input(None, &Z, &y, &INF_POINT, &proof)); + }); + } + + #[test] + fn eest_invalid_proof_input_extra_long() { + new_test_ext().execute_with(|| { + let y = [0u8; 32]; + let mut proof = INF_POINT.to_vec(); + proof.extend(vec![0u8; 1023]); + assert_failure(precompile_input(None, &Z, &y, &INF_POINT, &proof)); + }); + } + + #[test] + fn eest_invalid_null_inputs() { + new_test_ext().execute_with(|| { + assert_failure(precompile_input(Some(&[]), &[], &[], &[], &[])); + }); + } + + #[test] + fn eest_invalid_zeros_inputs() { + new_test_ext().execute_with(|| { + let zeros32 = [0u8; 32]; + let zeros48 = [0u8; 48]; + assert_failure(precompile_input( + Some(&zeros32), + &zeros32, + &zeros32, + &zeros48, + &zeros48, + )); + }); + } + + #[test] + fn eest_invalid_zeros_inputs_correct_versioned_hash() { + new_test_ext().execute_with(|| { + let zeros32 = [0u8; 32]; + let zeros48 = [0u8; 48]; + assert_failure(precompile_input( + None, &zeros32, &zeros32, &zeros48, &zeros48, + )); + }); + } + + #[test] + fn eest_invalid_versioned_hash_version_0x00() { + new_test_ext().execute_with(|| { + let y = [0u8; 32]; + let vh = kzg_to_versioned_hash(&INF_POINT, 0x00); + assert_failure(precompile_input(Some(&vh), &Z, &y, &INF_POINT, &INF_POINT)); + }); + } + + #[test] + fn eest_invalid_versioned_hash_version_0x02() { + new_test_ext().execute_with(|| { + let y = [0u8; 32]; + let vh = kzg_to_versioned_hash(&INF_POINT, 0x02); + assert_failure(precompile_input(Some(&vh), &Z, &y, &INF_POINT, &INF_POINT)); + }); + } + + #[test] + fn eest_invalid_versioned_hash_version_0xff() { + new_test_ext().execute_with(|| { + let y = [0u8; 32]; + let vh = kzg_to_versioned_hash(&INF_POINT, 0xff); + assert_failure(precompile_input(Some(&vh), &Z, &y, &INF_POINT, &INF_POINT)); + }); + } + + // ── EEST `test_external_vectors` (go-kzg-4844 / consensus-specs) ───────── + + #[test] + fn eest_external_go_kzg_4844_verify_kzg_proof_vectors() { + new_test_ext().execute_with(|| { + let raw = include_str!("testdata/go_kzg_4844_verify_kzg_proof.json"); + let vectors: Vec = + serde_json::from_str(raw).expect("parse go_kzg_4844 vectors"); + assert_eq!( + vectors.len(), + 122, + "expected all well-known external vectors" + ); + + let mut success_count = 0usize; + let mut failure_count = 0usize; + + for vector in vectors { + let commitment = decode_hex(&vector.input.commitment); + let proof = decode_hex(&vector.input.proof); + let z = decode_hex(&vector.input.z); + let y = decode_hex(&vector.input.y); + let input = precompile_input(None, &z, &y, &commitment, &proof); + let result = execute_point_eval(input); + let expect_success = vector.output == Some(true); + if expect_success { + assert!( + result.is_ok(), + "vector {} should succeed, got {:?}", + vector.name, + result.err() + ); + assert_eq!( + result.unwrap(), + EXPECTED_OUTPUT, + "vector {} output mismatch", + vector.name + ); + success_count += 1; + } else { + assert!( + result.is_err(), + "vector {} should fail, got Ok", + vector.name + ); + failure_count += 1; + } + } + + assert_eq!(success_count, 54); + assert_eq!(failure_count, 68); + }); + } + + // ── Local synthetic vectors (pre-existing) ─────────────────────────────── + + #[test] + fn point_evaluation_success_identity() { + new_test_ext().execute_with(|| { + use ark_serialize::CanonicalSerialize; + + // Constant polynomial f(x) = 100. + // Commitment = 100 * G1, so C - y*G1 = 0. + // Proof = identity (G1 point at infinity). + let z_bytes = { + let mut buf = [0u8; 32]; + buf[31] = 42; + buf + }; + let y_bytes = { + let mut buf = [0u8; 32]; + buf[31] = 100; + buf + }; + + let y_fr = Fr::from_be_bytes_mod_order(&y_bytes); + let g1_gen = G1Affine::generator(); + let commitment = (G1Projective::from(g1_gen) * y_fr).into_affine(); + + let mut commitment_bytes = [0u8; 48]; + commitment + .serialize_compressed(&mut commitment_bytes[..]) + .unwrap(); + + let mut proof_bytes = [0u8; 48]; + G1Affine::identity() + .serialize_compressed(&mut proof_bytes[..]) + .unwrap(); + + assert_success(precompile_input( + None, + &z_bytes, + &y_bytes, + &commitment_bytes, + &proof_bytes, + )); + }); + } + + #[test] + fn point_evaluation_nontrivial() { + new_test_ext().execute_with(|| { + use ark_serialize::CanonicalSerialize; + + // Build a test-only SRS whose secret is derived from a public + // nothing-up-my-sleeve string. This is NOT the production + // G2_SRS. + let sk = Fr::from_be_bytes_mod_order(&Sha256::digest( + b"KZG test vector for subtensor point_evaluation", + )); + let a = Fr::from(7u64); + let b = Fr::from(42u64); + let z_fr = Fr::from(3u64); + let y_fr = a * z_fr + b; + + let g1_gen = G1Affine::generator(); + let g2_gen = G2Affine::generator(); + + let s_g1 = (G1Projective::from(g1_gen) * sk).into_affine(); + let s_g2 = (G2Projective::from(g2_gen) * sk).into_affine(); + + let commitment = + (G1Projective::from(s_g1) * a + G1Projective::from(g1_gen) * b).into_affine(); + let proof = (G1Projective::from(g1_gen) * a).into_affine(); + + let p_minus_y = + (G1Projective::from(commitment) - G1Projective::from(g1_gen) * y_fr).into_affine(); + let neg_g2 = -g2_gen; + let s_minus_z = + (G2Projective::from(s_g2) + G2Projective::from(g2_gen) * (-z_fr)).into_affine(); + assert!( + Bls12_381::multi_pairing([p_minus_y, proof], [neg_g2, s_minus_z]) + .0 + .is_one(), + "internal pairing equation must hold for the known-SRS vector" + ); + assert_ne!(p_minus_y, G1Affine::identity()); + assert_ne!(proof, G1Affine::identity()); + + let mut z_bytes = [0u8; 32]; + z_bytes[31] = 3; + let mut y_bytes = [0u8; 32]; + y_bytes[31] = 63; + + let mut commitment_bytes = [0u8; 48]; + commitment + .serialize_compressed(&mut commitment_bytes[..]) + .unwrap(); + let mut proof_bytes = [0u8; 48]; + proof.serialize_compressed(&mut proof_bytes[..]).unwrap(); + let mut srs_bytes = [0u8; 96]; + s_g2.serialize_compressed(&mut srs_bytes[..]).unwrap(); + + let input = precompile_input(None, &z_bytes, &y_bytes, &commitment_bytes, &proof_bytes); + + let result = PointEvaluation::execute_impl(&input, &srs_bytes); + assert!(result.is_ok(), "nontrivial vector must pass with known SRS"); + assert_eq!(result.unwrap().output, EXPECTED_OUTPUT); + + let real_reject = PointEvaluation::execute_impl(&input, &G2_SRS); + assert!(real_reject.is_err(), "must fail with wrong SRS"); + }); + } +} diff --git a/precompiles/src/testdata/go_kzg_4844_verify_kzg_proof.json b/precompiles/src/testdata/go_kzg_4844_verify_kzg_proof.json new file mode 100644 index 0000000000..5bb85902f6 --- /dev/null +++ b/precompiles/src/testdata/go_kzg_4844_verify_kzg_proof.json @@ -0,0 +1,1222 @@ +[ + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_02e696ada7d4631d" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_05c1f3685f3393f0" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_08f9e2f1cb3d39db" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_0cf79b17cb5f4ea2" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_177b58dc7a46b08f" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x92c51ff81dd71dab71cefecd79e8274b4b7ba36a0f40e2dc086bc4061c7f63249877db23297212991fd63e07b7ebc348" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_1ce8e4f69d5df899" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x73e66878b46ae3705eb6a46a89213de7d3686828bfce5c19400fffff00100001", + "proof": "0xb82ded761997f2c6f1bb3db1e1dada2ef06d936551667c82f659b75f99d2da2068b81340823ee4e829a93c9fbed7810d" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_26b753dec0560daa" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_2b76dc9e3abf42f3" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x1522a4a7f34e1ea350ae07c29c96c7e79655aa926122e95fe69fcbd932ca49e9", + "proof": "0xa62ad71d14c5719385c0686f1871430475bf3a00f0aa3f7b8dd99a9abc2160744faf0070725e00b60ad9a026a15b1a8c" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_31ebd010e6098750" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_3208425794224c3f" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_36817bfd67de97a8" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x304962b3598a0adf33189fdfd9789feab1096ff40006900400000003fffffffc", + "proof": "0xaa86c458b3065e7ec244033a2ade91a7499561f482419a3a372c42a636dad98262a2ce926d142fd7cfe26ca148efe8b4" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_392169c16a2e5ef6" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_395cf6d697d1a743" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_3ac8dc31e9aa6a70" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x50625ad853cc21ba40594f79591e5d35c445ecf9453014da6524c0cf6367c359", + "proof": "0xb72d80393dc39beea3857cb3719277138876b2b207f1d5e54dd62a14e3242d123b5a6db066181ff01a51c26c9d2f400b" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_3c1e8b38219e3e12" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x6d928e13fe443e957d82e3e71d48cb65d51028eb4483e719bf8efcdf12f7c321", + "proof": "0xa444d6bb5aadc3ceb615b50d6606bd54bfe529f59247987cd1ab848d19de599a9052f1835fb0d0d44cf70183e19a68c9" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_3c87ec986c2656c2" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_3cd183d0bab85fb7" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x2bf4e1f980eb94661a21affc4d7e6e56f214fe3e7dc4d20b98c66ffd43cabeb0", + "proof": "0x89012990b0ca02775bd9df8145f6c936444b83f54df1f5f274fb4312800a6505dd000ee8ec7b0ea6d72092a3daf0bffb" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_420f2a187ce77035" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x443e7af5274b52214ea6c775908c54519fea957eecd98069165a8b771082fd51", + "proof": "0xa060b350ad63d61979b80b25258e7cc6caf781080222e0209b4a0b074decca874afc5c41de3313d8ed217d905e6ada43" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_444b73ff54a19b44" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_53a9bdf4f75196da" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_585454b31673dd62" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x58cdc98c4c44791bb8ba7e58a80324ef8c021c79c68e253c430fa2663188f7f2", + "proof": "0x9506a8dc7f3f720a592a79a4e711e28d8596854bac66b9cb2d6d361704f1735442d47ea09fda5e0984f0928ce7d2f5f6" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_7db4f140a955dd1a" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0xb0c829a8d2d3405304fecbea193e6c67f7c3912a6adc7c3737ad3f8a3b750425c1531a7426f03033a3994bc82a10609f" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_83e53423a2dd93fe" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xb9241c6816af6388d1014cd4d7dd21662a6e3d47f96c0257bce642b70e8e375839a880864638669c6a709b414ab8bffc" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_9b24f8997145435c" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_9b754afb690c47e1" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_a0be66af9a97ea52" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x6c28d6edfea2f5e1638cb1a8be8197549d52e133fa9dae87e52abb45f7b192dd", + "proof": "0x8a46b67dcba4e3aa66f9952be69e1ecbc24e21d42b1df2bfe1c8e28431c6221a3f1d09808042f5624e857710cb24fb69" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_af669445747d2585" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x64d3b6baf69395bde2abd1d43f99be66bc64581234fd363e2ae3a0d419cfc3fc", + "proof": "0x893acd46552b81cc9e5ff6ca03dad873588f2c61031781367cfea2a2be4ef3090035623338711b3cf7eff4b4524df742" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_af8b75f664ed7d43" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x6a75e4fe63e5e148c853462a680c3e3ccedea34719d28f19bf1b35ae4eea37d6", + "proof": "0xa38758fca85407078c0a7e5fd6d38b34340c809baa0e1fed9deaabb11aa503062acbbe23fcbe620a21b40a83bfa71b89" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_b6cb6698327d9835" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xa256a681861974cdf6b116467044aa75c85b01076423a92c3335b93d10bf2fcb99b943a53adc1ab8feb6b475c4688948" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_b6ec3736f9ff2c62" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_becf2e1641bbd4e6" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_c3d4322ec17fe7cd" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x24d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a1", + "proof": "0x873033e038326e87ed3e1276fd140253fa08e9fc25fb2d9a98527fc22a2c9612fbeafdad446cbc7bcdbdcd780af2c16a" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_c5e1490d672d026d" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x2c9ae4f1d6d08558d7027df9cc6b248c21290075d2c0df8a4084d02090b3fa14", + "proof": "0xb059c60125debbbf29d041bac20fd853951b64b5f31bfe2fa825e18ff49a259953e734b3d57119ae66f7bd79de3027f6" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_cae5d3491190b777" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x4882cf0609af8c7cd4c256e63a35838c95a9ebbf6122540ab344b42fd66d32e1", + "proof": "0x987ea6df69bbe97c23e0dd948cf2d4490824ba7fea5af812721b2393354b0810a9dba2c231ea7ae30f26c412c7ea6e3a" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_d0992bc0387790a4" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x5fd58150b731b4facfcdd89c0e393ff842f5f2071303eff99b51e103161cd233", + "proof": "0x94425f5cf336685a6a4e806ad4601f4b0d3707a655718f968c57e225f0e4b8d5fd61878234f25ec59d090c07ea725cf4" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_d736268229bd87ec" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x549345dd3612e36fab0ab7baffe3faa5b820d56b71348c89ecaf63f7c4f85370", + "proof": "0xa35c4f136a09a33c6437c26dc0c617ce6548a14bc4af7127690a411f5e1cde2f73157365212dbcea6432e0e7869cb006" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_e68d7111a2364a49" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x5ee1e9a4a06a02ca6ea14b0ca73415a8ba0fba888f18dde56df499b480d4b9e0", + "proof": "0xa1fcd37a924af9ec04143b44853c26f6b0738f6e15a3e0755057e7d5460406c7e148adb0e2d608982140d0ae42fe0b3b" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_ed6b180ec759bcf6" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x1ed7d14d1b3fb1a1890d67b81715531553ad798df2009b4311d9fe2bea6cb964", + "proof": "0xa71f21ca51b443ad35bb8a26d274223a690d88d9629927dc80b0856093e08a372820248df5b8a43b6d98fd52a62fa376" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_f0ed3dc11cdeb130" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x60f840641ec0d0c0d2b77b2d5a393b329442721fad05ab78c7b98f2aa3c20ec9", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_f47eb9fc139f6bfd" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x61157104410181bdc6eac224aa9436ac268bdcfeecb6badf71d228adda820af3", + "proof": "0x809adfa8b078b0921cdb8696ca017a0cc2d5337109016f36a766886eade28d32f205311ff5def247c3ddba91896fae97" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_f7f44e1e864aa967" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_ffa6e97b97146517" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_twos_poly_05c1f3685f3393f0" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_twos_poly_177b58dc7a46b08f" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_twos_poly_2b76dc9e3abf42f3" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_twos_poly_395cf6d697d1a743" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_twos_poly_585454b31673dd62" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_twos_poly_a0be66af9a97ea52" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_zero_poly_02e696ada7d4631d" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_zero_poly_0cf79b17cb5f4ea2" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_zero_poly_3208425794224c3f" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_zero_poly_3ac8dc31e9aa6a70" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_zero_poly_c3d4322ec17fe7cd" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": true, + "name": "verify_kzg_proof_case_correct_proof_point_at_infinity_for_zero_poly_ffa6e97b97146517" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_02e696ada7d4631d" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_05c1f3685f3393f0" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_08f9e2f1cb3d39db" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_0cf79b17cb5f4ea2" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_177b58dc7a46b08f" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x9779b8337f00de6aeac881256198bd2db2fe95bc3127ad9e6440d9e4d1e785b455f55fcfe80a3434dc40f8e6df85be88" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_1ce8e4f69d5df899" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x73e66878b46ae3705eb6a46a89213de7d3686828bfce5c19400fffff00100001", + "proof": "0x90f53a4837bbde6ab0838fef0c0be5339ab03a78342c221cf6b2d6e465d01a3d47585a808c9d8d25dee885007deeb107" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_26b753dec0560daa" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_2b76dc9e3abf42f3" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x1522a4a7f34e1ea350ae07c29c96c7e79655aa926122e95fe69fcbd932ca49e9", + "proof": "0xb9b65c2ebc89e669cf19e82fb178f0d1e9c958edbebe9ead62e97e95e2dcdc4972729fb9661f0cae3532b71b2664a8c1" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_31ebd010e6098750" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_3208425794224c3f" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_36817bfd67de97a8" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x304962b3598a0adf33189fdfd9789feab1096ff40006900400000003fffffffc", + "proof": "0xb08a5afbb1717334e08e05576b07bff58e8851d8cfd9ea71da1ab4233ad4217cffabd669dfa89c3ebf4c44f91694a2f4" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_392169c16a2e5ef6" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_395cf6d697d1a743" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_3ac8dc31e9aa6a70" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x50625ad853cc21ba40594f79591e5d35c445ecf9453014da6524c0cf6367c359", + "proof": "0x90559bfd8e58f5d144588a1a959c93aba58607777e09893f088e404eb2dc47c0269ed8e47c1be79ea07ae726abd921a8" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_3c1e8b38219e3e12" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x6d928e13fe443e957d82e3e71d48cb65d51028eb4483e719bf8efcdf12f7c321", + "proof": "0x8d72dc4eec977090f452b412a6b0a3cdced2ea6b622ebb6e289c7e05d85cc715b93eca244123c84a60b3ecbf33373903" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_3c87ec986c2656c2" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_3cd183d0bab85fb7" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x2bf4e1f980eb94661a21affc4d7e6e56f214fe3e7dc4d20b98c66ffd43cabeb0", + "proof": "0x99c282db3a79a9ec1553306515e6a71dc43df1ddbd1dbd9d5b71f3c1798ef482f5e1fd84500b0e47c82f72a189ecd526" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_420f2a187ce77035" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x443e7af5274b52214ea6c775908c54519fea957eecd98069165a8b771082fd51", + "proof": "0xa7de1e32bb336b85e42ff5028167042188317299333f091dd88675e84a550577bfa564b2f57cd2498e2acf875e0aaa40" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_444b73ff54a19b44" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_53a9bdf4f75196da" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_585454b31673dd62" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x58cdc98c4c44791bb8ba7e58a80324ef8c021c79c68e253c430fa2663188f7f2", + "proof": "0xb0ac600174134691bf9d91fee448b4d58c127356567da1c456b9c38468909d4effe6b7faa11177e1f96ee5d2834df001" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_7db4f140a955dd1a" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0x8e3069b19e6e71aed9b7dc8fbba13e4217d91cfc59be47cfaa7d09ef626242517541992c0f76091ddabf271682cc7c2c" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_83e53423a2dd93fe" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xafc13cef6ed41f7abe142d32d7b5354e5664bd4b6d52080460dd404dc2cb26269c24826d2bcd0152d0b55ee0a9e90289" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_9b24f8997145435c" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_9b754afb690c47e1" + }, + { + "input": { + "commitment": "0xa572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x0000000000000000000000000000000000000000000000000000000000000002", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_a0be66af9a97ea52" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x6c28d6edfea2f5e1638cb1a8be8197549d52e133fa9dae87e52abb45f7b192dd", + "proof": "0xa88d68fe3ad0d09b07f4605b1364c8d4804bf7096dae003d821cc01c3b7d35c6d1fdae14e2db3c05e1cdcea7c7b7f262" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_af669445747d2585" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x64d3b6baf69395bde2abd1d43f99be66bc64581234fd363e2ae3a0d419cfc3fc", + "proof": "0xaf08cbca9deec336f2a56ca0b202995830f238fc3cb2ecdbdc0bbb6419e3e60507e823ff7dcbd17394cea55bc514716c" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_af8b75f664ed7d43" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x6a75e4fe63e5e148c853462a680c3e3ccedea34719d28f19bf1b35ae4eea37d6", + "proof": "0x861a2aef7aa82db033bfa125b9f756afecaf1db28384925d5007bcf7dff1a53b72bdf522610303075aeecab41685d720" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_b6cb6698327d9835" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x82f1cd05471ab6ff21bcfd5c3369cba05b03a872a10829236d184fe1872767c391c2aa7e3b85babb1e6093b7224e7732" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_b6ec3736f9ff2c62" + }, + { + "input": { + "commitment": "0xb7f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_becf2e1641bbd4e6" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_c3d4322ec17fe7cd" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x24d25032e67a7e6a4910df5834b8fe70e6bcfeeac0352434196bdf4b2485d5a1", + "proof": "0xacd56791e0ab0d1b3802021862013418993da2646e87140e12631e2914d9e6c676466aa3adfc91b61f84255544cab544" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_c5e1490d672d026d" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x2c9ae4f1d6d08558d7027df9cc6b248c21290075d2c0df8a4084d02090b3fa14", + "proof": "0xa4cc8c419ade0cf043cbf30f43c8f7ee6da3ab8d2c15070f323e5a13a8178fe07c8f89686e5fd16565247b520028251b" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_cae5d3491190b777" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x4882cf0609af8c7cd4c256e63a35838c95a9ebbf6122540ab344b42fd66d32e1", + "proof": "0xb8f731ba6a52e419ffc843c50d2947d30e933e3a881b208de54149714ece74a599503f84c6249b5fd8a7c70189882a6b" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_d0992bc0387790a4" + }, + { + "input": { + "commitment": "0x93efc82d2017e9c57834a1246463e64774e56183bb247c8fc9dd98c56817e878d97b05f5c8d900acf1fbbbca6f146556", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x5fd58150b731b4facfcdd89c0e393ff842f5f2071303eff99b51e103161cd233", + "proof": "0x84c349506215a2d55f9d06f475b8229c6dedc08fd467f41fabae6bb042c2d0dbdbcd5f7532c475e479588eec5820fd37" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_d736268229bd87ec" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x549345dd3612e36fab0ab7baffe3faa5b820d56b71348c89ecaf63f7c4f85370", + "proof": "0x94fce36bf7e9f0ed981728fcd829013de96f7d25f8b4fe885059ec24af36f801ffbf68ec4604ef6e5f5f800f5cf31238" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_e68d7111a2364a49" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x5ee1e9a4a06a02ca6ea14b0ca73415a8ba0fba888f18dde56df499b480d4b9e0", + "proof": "0xb3477fc9a5bfab5fdb5523251818ee5a6d52613c59502a3d2df58217f4e366cd9ef37dee55bf2c705a2b08e7808b6fa0" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_ed6b180ec759bcf6" + }, + { + "input": { + "commitment": "0xb49d88afcd7f6c61a8ea69eff5f609d2432b47e7e4cd50b02cdddb4e0c1460517e8df02e4e64dc55e3d8ca192d57193a", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x1ed7d14d1b3fb1a1890d67b81715531553ad798df2009b4311d9fe2bea6cb964", + "proof": "0x98e15cbf800b69b90bfcaf1d907a9889c7743f7e5a19ee4b557471c005600f56d78e3dd887b2f5b87d76405b80dd2115" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_f0ed3dc11cdeb130" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x60f840641ec0d0c0d2b77b2d5a393b329442721fad05ab78c7b98f2aa3c20ec9", + "proof": "0x98613e9e1b1ed52fc2fdc54e945b863ff52870e6565307ff9e32327196d7a03c428fc51a9abedc97de2a68daa1274b50" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_f47eb9fc139f6bfd" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x61157104410181bdc6eac224aa9436ac268bdcfeecb6badf71d228adda820af3", + "proof": "0xa1d8f2a5ab22acdfc1a9492ee2e1c2cbde681b51b312bf718821937e5088cd8ee002b718264027d10c5c5855dabe0353" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_f7f44e1e864aa967" + }, + { + "input": { + "commitment": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_ffa6e97b97146517" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000", + "y": "0x304962b3598a0adf33189fdfd9789feab1096ff40006900400000003fffffffc", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_point_at_infinity_392169c16a2e5ef6" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000000", + "y": "0x50625ad853cc21ba40594f79591e5d35c445ecf9453014da6524c0cf6367c359", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_point_at_infinity_3c1e8b38219e3e12" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x564c0a11a0f704f4fc3e8acfe0f8245f0ad1347b378fbf96e206da11a5d36306", + "y": "0x6d928e13fe443e957d82e3e71d48cb65d51028eb4483e719bf8efcdf12f7c321", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_point_at_infinity_3c87ec986c2656c2" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000002", + "y": "0x2bf4e1f980eb94661a21affc4d7e6e56f214fe3e7dc4d20b98c66ffd43cabeb0", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_point_at_infinity_420f2a187ce77035" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_point_at_infinity_83e53423a2dd93fe" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x5eb7004fe57383e6c88b99d839937fddf3f99279353aaf8d5c9a75f91ce33c62", + "y": "0x5ee1e9a4a06a02ca6ea14b0ca73415a8ba0fba888f18dde56df499b480d4b9e0", + "proof": "0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "output": false, + "name": "verify_kzg_proof_case_incorrect_proof_point_at_infinity_ed6b180ec759bcf6" + }, + { + "input": { + "commitment": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0xb0c829a8d2d3405304fecbea193e6c67f7c3912a6adc7c3737ad3f8a3b750425c1531a7426f03033a3994bc82a10609f" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_commitment_1b44e341d56c757d" + }, + { + "input": { + "commitment": "0x8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0xb0c829a8d2d3405304fecbea193e6c67f7c3912a6adc7c3737ad3f8a3b750425c1531a7426f03033a3994bc82a10609f" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_commitment_32afa9561a4b3b91" + }, + { + "input": { + "commitment": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb00", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0xb0c829a8d2d3405304fecbea193e6c67f7c3912a6adc7c3737ad3f8a3b750425c1531a7426f03033a3994bc82a10609f" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_commitment_3e55802a5ed3c757" + }, + { + "input": { + "commitment": "0x8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde0", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0xb0c829a8d2d3405304fecbea193e6c67f7c3912a6adc7c3737ad3f8a3b750425c1531a7426f03033a3994bc82a10609f" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_commitment_e9d3e9ec16fbc15f" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_proof_1b44e341d56c757d" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0x8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_proof_32afa9561a4b3b91" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0x97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb00" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_proof_3e55802a5ed3c757" + }, + { + "input": { + "commitment": "0xa421e229565952cfff4ef3517100a97da1d4fe57956fa50a442f92af03b1bf37adacc8ad4ed209b31287ea5bb94d9d06", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x1824b159acc5056f998c4fefecbc4ff55884b7fa0003480200000001fffffffe", + "proof": "0x8123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde0" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_proof_e9d3e9ec16fbc15f" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_y_35d08d612aad2197" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0xffffffffffffffffffffffffffffffff00000000000000000000000000000000", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_y_4aa6def8c35c9097" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x00000000000000000000000000000000000000000000000000000000000000", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_y_4e51cef08a61606f" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000002", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_y_64b9ff2b8f7dddee" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x000000000000000000000000000000000000000000000000000000000000000000", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_y_b358a2e763727b70" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x0000000000000000000000000000000000000000000000000000000000000001", + "y": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_y_eb0601fec84cc5e9" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "y": "0x60f840641ec0d0c0d2b77b2d5a393b329442721fad05ab78c7b98f2aa3c20ec9", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_z_35d08d612aad2197" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0xffffffffffffffffffffffffffffffff00000000000000000000000000000000", + "y": "0x60f840641ec0d0c0d2b77b2d5a393b329442721fad05ab78c7b98f2aa3c20ec9", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_z_4aa6def8c35c9097" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x00000000000000000000000000000000000000000000000000000000000000", + "y": "0x60f840641ec0d0c0d2b77b2d5a393b329442721fad05ab78c7b98f2aa3c20ec9", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_z_4e51cef08a61606f" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000002", + "y": "0x60f840641ec0d0c0d2b77b2d5a393b329442721fad05ab78c7b98f2aa3c20ec9", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_z_64b9ff2b8f7dddee" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x000000000000000000000000000000000000000000000000000000000000000000", + "y": "0x60f840641ec0d0c0d2b77b2d5a393b329442721fad05ab78c7b98f2aa3c20ec9", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_z_b358a2e763727b70" + }, + { + "input": { + "commitment": "0x8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7", + "z": "0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", + "y": "0x60f840641ec0d0c0d2b77b2d5a393b329442721fad05ab78c7b98f2aa3c20ec9", + "proof": "0xb30b3d1e4faccc380557792c9a0374d58fa286f5f75fea48870585393f890909cd3c53cfe4897e799fb211b4be531e43" + }, + "output": null, + "name": "verify_kzg_proof_case_invalid_z_eb0601fec84cc5e9" + } +] \ No newline at end of file