Contract 0x83809ab88743ecfa320163430d769fdf07278baf

Contract Overview

Balance:
0 FTM
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x79ece24b03f1691ea639a5df4db61f46938a44fa0463871d8a3e5d1d20c1f742Light_client_upd...164065692023-06-08 11:49:1256 secs ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000279163461
0x819c877d34a8b76912dd2805b189ae7985a40fc36c0b8818b7acf2ffdbef16c8Light_client_upd...164063892023-06-08 11:44:135 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000279138363
0x79b8daf771fa121902cc7b54dbfb16e208f98784a4672dfa06d052b42573be21Light_client_upd...164062182023-06-08 11:39:1110 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000279040578
0x54b272704c83b0ee77f61ee3529038296e57e31ebadb0e29ac6ec54d3f2c09b0Light_client_upd...164060472023-06-08 11:34:1915 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000279005325
0xd805b3755112798387cc841a237115a2871c8d7f5dc37730450278da930e1300Light_client_upd...164058732023-06-08 11:29:3120 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000279082549
0x4710942b8cb8d45ed6d1dbebb3bef84fa041769b6ec5cfa071c023828367ec89Light_client_upd...164057242023-06-08 11:24:3225 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000279065401
0x4cd0abf67055806c044d58fb2f099fd0bccfe79754f34cbca36581fe21f7e6eaLight_client_upd...163555872023-06-07 11:38:151 day 11 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278333598
0xe5784c8ba656cb4cb768aa36c71db04ec0a100e5d8f8aeed224ad22f08f12748Light_client_upd...163553962023-06-07 11:33:231 day 16 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278317414
0xfaacecabcf60d76905a0d1ceef322b26e6a780caa6c3d3bc861d6998b3c0381fLight_client_upd...163551932023-06-07 11:28:271 day 21 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278385107
0x19fe70e5a3fc5c72af935d4173a1846da6d17ed444b40894099a7b85cd2fb84dLight_client_upd...163550142023-06-07 11:23:241 day 26 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278376062
0xa9a70c14fd35deb8553ca14cfca1b01c20a53dd299f668a76008b61fcc602abcLight_client_upd...163548172023-06-07 11:18:141 day 31 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278321569
0x21ce48dc3586d02f0bc4771342fc0f8ff79f72469564ec95dbce3c87d86c59c8Light_client_upd...163546492023-06-07 11:12:581 day 37 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.00027830954
0xc58ab4c5ec3db384aed1bb3048056f443094471db96e3342f8d557ab96436818Light_client_upd...163544902023-06-07 11:07:561 day 42 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278351166
0x0ec63340282b0c7229d4ab0730e4c57dc1629528bf960f8fad851beed6900528Light_client_upd...163542892023-06-07 11:02:561 day 47 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278304028
0x9963045e0c18aad777652439173df68255a4de3a7ce2ce76e66173cd62464c49Light_client_upd...163540832023-06-07 10:58:011 day 52 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278346278
0x1a9dceed0476d8b495a3fdd4855aa74d5026f846a8b061d0f561dd4decb09915Light_client_upd...163539182023-06-07 10:52:591 day 57 mins ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278298326
0xd91d9e6133167d9bfd1ab4a71a98c61a030133f488e7fd747b2c84d8056ef560Light_client_upd...163537652023-06-07 10:47:501 day 1 hr ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.00027828684
0x94a0e684aacf9552eeb2502eaba82990e2accbaa8ae1bd1036386fe2af9f8e7cLight_client_upd...163535972023-06-07 10:42:471 day 1 hr ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278299412
0x0c9477b6fdc9605e3fffa5a7c966de7a7d02eececa40eec237f450bc021134c9Light_client_upd...163534362023-06-07 10:37:471 day 1 hr ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278320129
0x9f165271b2e33276b381a2b60f8a0d25caf5240f4b4cf0d4dc4780911bade5a5Light_client_upd...163532842023-06-07 10:32:481 day 1 hr ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278334684
0xca617892847edea228d4131b8f5a64848eba9384f8b5e741e2e467f44f3966d2Light_client_upd...163531322023-06-07 10:27:491 day 1 hr ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278328629
0x3fdcaa4fc222a45a75d977ea6d964b2975f695b5f10f81d2571ed61786fed9aeLight_client_upd...163529592023-06-07 10:22:511 day 1 hr ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278322112
0x412d771ccfc5db3151d4ec643961be1988c97ab50675ccc080069111abd6bb1bLight_client_upd...163527882023-06-07 10:18:001 day 1 hr ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278326728
0xb17ccd2cd84f6502f132f2731c7b746c01c49457c3de74ca9922da97e77c456fLight_client_upd...163526232023-06-07 10:13:011 day 1 hr ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278367186
0x25310bae4e577cc0ca6c4a4820fee6c17388ea60a4c1f8031dce97eeae8c5251Light_client_upd...163524672023-06-07 10:07:591 day 1 hr ago0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea IN  0x83809ab88743ecfa320163430d769fdf07278baf0 FTM0.000278287383
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x00f7dcedb0370d7b2f25262fe510ff619cece487ec4d5942757104dafd3aebc0154799442023-05-10 19:24:3928 days 16 hrs ago 0x86d9d510b8a8e6f6bcaa4c231a5b490956f16fea  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BeaconLightClient

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : BeaconLightClient.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import '../../utils/LightClientUpdateVerifier.sol';
import '../../interfaces/ILightClient.sol';

uint256 constant BUFER_SIZE = 32;

contract BeaconLightClient is LightClientUpdateVerifier, ILightClient {
  struct LightClientUpdate {
    bytes32 attestedHeaderRoot;
    uint256 attestedHeaderSlot;
    bytes32 finalizedHeaderRoot;
    bytes32 finalizedExecutionStateRoot;
    uint256[2] a;
    uint256[2][2] b;
    uint256[2] c;
  }

  bytes32[BUFER_SIZE] public optimisticHeaders;

  uint256[BUFER_SIZE] public optimisticSlots;

  bytes32[BUFER_SIZE] public finalizedHeaders;

  bytes32[BUFER_SIZE] public executionStateRoots;

  uint256 public currentIndex;

  bytes32 domain;

  constructor(
    bytes32 _optimisticHeaderRoot,
    uint256 _optimisticHeaderSlot,
    bytes32 _finalizedHeaderRoot,
    bytes32 _executionStateRoot,
    bytes32 _domain
  ) {
    currentIndex = 0;

    optimisticHeaders[currentIndex] = _optimisticHeaderRoot;
    optimisticSlots[currentIndex] = _optimisticHeaderSlot;
    finalizedHeaders[currentIndex] = _finalizedHeaderRoot;
    executionStateRoots[currentIndex] = _executionStateRoot;
    domain = _domain;
  }

  function optimisticHeaderRoot() public view returns (bytes32) {
    return optimisticHeaders[currentIndex];
  }

  function optimisticHeaderSlot() public view returns (uint256) {
    return optimisticSlots[currentIndex];
  }

  function finalizedHeaderRoot() public view returns (bytes32) {
    return finalizedHeaders[currentIndex];
  }

  function executionStateRoot() public view returns (bytes32) {
    return executionStateRoots[currentIndex];
  }

  // TODO: fix
  function light_client_update(LightClientUpdate calldata update)
    external
    payable
  {
    require(
      verifyUpdate(
        update.a,
        update.b,
        update.c,
        optimisticHeaderRoot(),
        update.attestedHeaderRoot,
        update.attestedHeaderSlot,
        update.finalizedHeaderRoot,
        update.finalizedExecutionStateRoot,
        domain
      ),
      '!proof'
    );

    currentIndex = (currentIndex + 1) % BUFER_SIZE;

    optimisticHeaders[currentIndex] = update.attestedHeaderRoot;
    optimisticSlots[currentIndex] = update.attestedHeaderSlot;
    finalizedHeaders[currentIndex] = update.finalizedHeaderRoot;
    executionStateRoots[currentIndex] = update.finalizedExecutionStateRoot;
  }
}

File 2 of 4 : LightClientUpdateVerifier.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

import './Verifier.sol';

contract LightClientUpdateVerifier is Verifier {
  function verifyUpdate(
    uint256[2] memory a,
    uint256[2][2] memory b,
    uint256[2] memory c,
    bytes32 prevHeaderHash,
    bytes32 nextHeaderHash,
    uint256 nextHeaderSlot,
    bytes32 finalizedHeaderRoot,
    bytes32 executionStateRoot,
    bytes32 domain
  ) internal view returns (bool) {
    bytes memory concatenated = abi.encodePacked(prevHeaderHash, nextHeaderHash, finalizedHeaderRoot, executionStateRoot, nextHeaderSlot, domain);
    bytes32 commitment = sha256(concatenated);

    uint256[2] memory input;

    input[0] = (uint256(commitment) & (((1 << 253) - 1) << 3)) >> 3;
    input[1] = (uint256(commitment) & ((1 << 3) - 1));

    return verifyProof(a, b, c, input);
  }
}

File 3 of 4 : ILightClient.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface ILightClient {
    function currentIndex() external view returns (uint256);

    function optimisticHeaderRoot() external view returns (bytes32);

    function optimisticHeaderSlot() external view returns (uint256);

    function finalizedHeaderRoot() external view returns (bytes32);

    function executionStateRoot() external view returns (bytes32);

    function optimisticHeaders(uint256 index) external view returns (bytes32);

    function optimisticSlots(uint256 index) external view returns (uint256);

    function finalizedHeaders(uint256 index) external view returns (bytes32);

    function executionStateRoots(uint256 index) external view returns (bytes32);
}

File 4 of 4 : Verifier.sol
//
// Copyright 2017 Christian Reitwiessner
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// 2019 OKIMS
//      ported to solidity 0.6
//      fixed linter warnings
//      added requiere error messages
//
//
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.9;

library Pairing {
  struct G1Point {
    uint256 X;
    uint256 Y;
  }
  // Encoding of field elements is: X[0] * z + X[1]
  struct G2Point {
    uint256[2] X;
    uint256[2] Y;
  }

  /// @return the generator of G1
  function P1() internal pure returns (G1Point memory) {
    return G1Point(1, 2);
  }

  /// @return the generator of G2
  function P2() internal pure returns (G2Point memory) {
    // Original code point
    return
      G2Point(
        [
          11559732032986387107991004021392285783925812861821192530917403151452391805634,
          10857046999023057135944570762232829481370756359578518086990519993285655852781
        ],
        [
          4082367875863433681332203403145435568316851327593401208105741076214120093531,
          8495653923123431417604973247489272438418190587263600148770280649306958101930
        ]
      );

    /*
        // Changed by Jordi point
        return G2Point(
            [10857046999023057135944570762232829481370756359578518086990519993285655852781,
             11559732032986387107991004021392285783925812861821192530917403151452391805634],
            [8495653923123431417604973247489272438418190587263600148770280649306958101930,
             4082367875863433681332203403145435568316851327593401208105741076214120093531]
        );
*/
  }

  /// @return r the negation of p, i.e. p.addition(p.negate()) should be zero.
  function negate(G1Point memory p) internal pure returns (G1Point memory r) {
    // The prime q in the base field F_q for G1
    uint256 q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
    if (p.X == 0 && p.Y == 0) return G1Point(0, 0);
    return G1Point(p.X, q - (p.Y % q));
  }

  /// @return r the sum of two points of G1
  function addition(G1Point memory p1, G1Point memory p2)
    internal
    view
    returns (G1Point memory r)
  {
    uint256[4] memory input;
    input[0] = p1.X;
    input[1] = p1.Y;
    input[2] = p2.X;
    input[3] = p2.Y;
    bool success;
    // solium-disable-next-line security/no-inline-assembly
    assembly {
      success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60)
      // Use "invalid" to make gas estimation work
      switch success
      case 0 {
        invalid()
      }
    }
    require(success, 'pairing-add-failed');
  }

  /// @return r the product of a point on G1 and a scalar, i.e.
  /// p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p.
  function scalar_mul(G1Point memory p, uint256 s)
    internal
    view
    returns (G1Point memory r)
  {
    uint256[3] memory input;
    input[0] = p.X;
    input[1] = p.Y;
    input[2] = s;
    bool success;
    // solium-disable-next-line security/no-inline-assembly
    assembly {
      success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60)
      // Use "invalid" to make gas estimation work
      switch success
      case 0 {
        invalid()
      }
    }
    require(success, 'pairing-mul-failed');
  }

  /// @return the result of computing the pairing check
  /// e(p1[0], p2[0]) *  .... * e(p1[n], p2[n]) == 1
  /// For example pairing([P1(), P1().negate()], [P2(), P2()]) should
  /// return true.
  function pairing(G1Point[] memory p1, G2Point[] memory p2)
    internal
    view
    returns (bool)
  {
    require(p1.length == p2.length, 'pairing-lengths-failed');
    uint256 elements = p1.length;
    uint256 inputSize = elements * 6;
    uint256[] memory input = new uint256[](inputSize);
    for (uint256 i = 0; i < elements; i++) {
      input[i * 6 + 0] = p1[i].X;
      input[i * 6 + 1] = p1[i].Y;
      input[i * 6 + 2] = p2[i].X[0];
      input[i * 6 + 3] = p2[i].X[1];
      input[i * 6 + 4] = p2[i].Y[0];
      input[i * 6 + 5] = p2[i].Y[1];
    }
    uint256[1] memory out;
    bool success;
    // solium-disable-next-line security/no-inline-assembly
    assembly {
      success := staticcall(
        sub(gas(), 2000),
        8,
        add(input, 0x20),
        mul(inputSize, 0x20),
        out,
        0x20
      )
      // Use "invalid" to make gas estimation work
      switch success
      case 0 {
        invalid()
      }
    }
    require(success, 'pairing-opcode-failed');
    return out[0] != 0;
  }

  /// Convenience method for a pairing check for two pairs.
  function pairingProd2(
    G1Point memory a1,
    G2Point memory a2,
    G1Point memory b1,
    G2Point memory b2
  ) internal view returns (bool) {
    G1Point[] memory p1 = new G1Point[](2);
    G2Point[] memory p2 = new G2Point[](2);
    p1[0] = a1;
    p1[1] = b1;
    p2[0] = a2;
    p2[1] = b2;
    return pairing(p1, p2);
  }

  /// Convenience method for a pairing check for three pairs.
  function pairingProd3(
    G1Point memory a1,
    G2Point memory a2,
    G1Point memory b1,
    G2Point memory b2,
    G1Point memory c1,
    G2Point memory c2
  ) internal view returns (bool) {
    G1Point[] memory p1 = new G1Point[](3);
    G2Point[] memory p2 = new G2Point[](3);
    p1[0] = a1;
    p1[1] = b1;
    p1[2] = c1;
    p2[0] = a2;
    p2[1] = b2;
    p2[2] = c2;
    return pairing(p1, p2);
  }

  /// Convenience method for a pairing check for four pairs.
  function pairingProd4(
    G1Point memory a1,
    G2Point memory a2,
    G1Point memory b1,
    G2Point memory b2,
    G1Point memory c1,
    G2Point memory c2,
    G1Point memory d1,
    G2Point memory d2
  ) internal view returns (bool) {
    G1Point[] memory p1 = new G1Point[](4);
    G2Point[] memory p2 = new G2Point[](4);
    p1[0] = a1;
    p1[1] = b1;
    p1[2] = c1;
    p1[3] = d1;
    p2[0] = a2;
    p2[1] = b2;
    p2[2] = c2;
    p2[3] = d2;
    return pairing(p1, p2);
  }
}

contract Verifier {
  using Pairing for *;
  struct VerifyingKey {
    Pairing.G1Point alfa1;
    Pairing.G2Point beta2;
    Pairing.G2Point gamma2;
    Pairing.G2Point delta2;
    Pairing.G1Point[] IC;
  }
  struct Proof {
    Pairing.G1Point A;
    Pairing.G2Point B;
    Pairing.G1Point C;
  }

  function verifyingKey() internal pure returns (VerifyingKey memory vk) {
    vk.alfa1 = Pairing.G1Point(
      20491192805390485299153009773594534940189261866228447918068658471970481763042,
      9383485363053290200918347156157836566562967994039712273449902621266178545958
    );

    vk.beta2 = Pairing.G2Point(
      [
        4252822878758300859123897981450591353533073413197771768651442665752259397132,
        6375614351688725206403948262868962793625744043794305715222011528459656738731
      ],
      [
        21847035105528745403288232691147584728191162732299865338377159692350059136679,
        10505242626370262277552901082094356697409835680220590971873171140371331206856
      ]
    );
    vk.gamma2 = Pairing.G2Point(
      [
        11559732032986387107991004021392285783925812861821192530917403151452391805634,
        10857046999023057135944570762232829481370756359578518086990519993285655852781
      ],
      [
        4082367875863433681332203403145435568316851327593401208105741076214120093531,
        8495653923123431417604973247489272438418190587263600148770280649306958101930
      ]
    );
    vk.delta2 = Pairing.G2Point(
      [
        11559732032986387107991004021392285783925812861821192530917403151452391805634,
        10857046999023057135944570762232829481370756359578518086990519993285655852781
      ],
      [
        4082367875863433681332203403145435568316851327593401208105741076214120093531,
        8495653923123431417604973247489272438418190587263600148770280649306958101930
      ]
    );
    vk.IC = new Pairing.G1Point[](3);

    vk.IC[0] = Pairing.G1Point(
      20004883944256250047321685149432671934510545249914403823372028914040419216628,
      9829719558996052619104116135968954687943126817342793525502638721816288942737
    );

    vk.IC[1] = Pairing.G1Point(
      12524654079854760261433626118711633924054011908641596429649477192297223535673,
      464211107506850774766774094205124150720916370839589172364389644844898733802
    );

    vk.IC[2] = Pairing.G1Point(
      19654286967694023280639030882760547852785357147734317805871288034678812473574,
      8991704363361830920618645611922396926132900683799278153803280889986260608085
    );
  }

  function verify(uint256[] memory input, Proof memory proof)
    internal
    view
    returns (uint256)
  {
    uint256 snark_scalar_field = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
    VerifyingKey memory vk = verifyingKey();
    require(input.length + 1 == vk.IC.length, 'verifier-bad-input');
    // Compute the linear combination vk_x
    Pairing.G1Point memory vk_x = Pairing.G1Point(0, 0);
    for (uint256 i = 0; i < input.length; i++) {
      require(input[i] < snark_scalar_field, 'verifier-gte-snark-scalar-field');
      vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.IC[i + 1], input[i]));
    }
    vk_x = Pairing.addition(vk_x, vk.IC[0]);
    if (
      !Pairing.pairingProd4(
        Pairing.negate(proof.A),
        proof.B,
        vk.alfa1,
        vk.beta2,
        vk_x,
        vk.gamma2,
        proof.C,
        vk.delta2
      )
    ) return 1;
    return 0;
  }

  /// @return r  bool true if proof is valid
  function verifyProof(
    uint256[2] memory a,
    uint256[2][2] memory b,
    uint256[2] memory c,
    uint256[2] memory input
  ) public view returns (bool r) {
    Proof memory proof;
    proof.A = Pairing.G1Point(a[0], a[1]);
    proof.B = Pairing.G2Point([b[0][0], b[0][1]], [b[1][0], b[1][1]]);
    proof.C = Pairing.G1Point(c[0], c[1]);
    uint256[] memory inputValues = new uint256[](input.length);
    for (uint256 i = 0; i < input.length; i++) {
      inputValues[i] = input[i];
    }
    if (verify(inputValues, proof) == 0) {
      return true;
    } else {
      return false;
    }
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_optimisticHeaderRoot","type":"bytes32"},{"internalType":"uint256","name":"_optimisticHeaderSlot","type":"uint256"},{"internalType":"bytes32","name":"_finalizedHeaderRoot","type":"bytes32"},{"internalType":"bytes32","name":"_executionStateRoot","type":"bytes32"},{"internalType":"bytes32","name":"_domain","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"executionStateRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"executionStateRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalizedHeaderRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"finalizedHeaders","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"attestedHeaderRoot","type":"bytes32"},{"internalType":"uint256","name":"attestedHeaderSlot","type":"uint256"},{"internalType":"bytes32","name":"finalizedHeaderRoot","type":"bytes32"},{"internalType":"bytes32","name":"finalizedExecutionStateRoot","type":"bytes32"},{"internalType":"uint256[2]","name":"a","type":"uint256[2]"},{"internalType":"uint256[2][2]","name":"b","type":"uint256[2][2]"},{"internalType":"uint256[2]","name":"c","type":"uint256[2]"}],"internalType":"struct BeaconLightClient.LightClientUpdate","name":"update","type":"tuple"}],"name":"light_client_update","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"optimisticHeaderRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"optimisticHeaderSlot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"optimisticHeaders","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"optimisticSlots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"a","type":"uint256[2]"},{"internalType":"uint256[2][2]","name":"b","type":"uint256[2][2]"},{"internalType":"uint256[2]","name":"c","type":"uint256[2]"},{"internalType":"uint256[2]","name":"input","type":"uint256[2]"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"r","type":"bool"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b506040516116d73803806116d783398101604081905261002f9161004e565b600060808190559490945560209290925560405560605560815561008e565b600080600080600060a0868803121561006657600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b61163a8061009d6000396000f3fe60806040526004361061009c5760003560e01c80638ee4d0fc116100645780638ee4d0fc1461013f5780639e92a5a714610154578063e6120c7e14610169578063f2b0e33d1461017e578063f37e347114610193578063f5c9d69e146101b357600080fd5b806303fdd5fa146100a15780631d9b307e146100d457806326987b60146100e9578063692265fe146100ff5780637623ee291461011f575b600080fd5b3480156100ad57600080fd5b506100c16100bc36600461138a565b6101e3565b6040519081526020015b60405180910390f35b3480156100e057600080fd5b506100c16101fa565b3480156100f557600080fd5b506100c160805481565b34801561010b57600080fd5b506100c161011a36600461138a565b610218565b34801561012b57600080fd5b506100c161013a36600461138a565b610228565b34801561014b57600080fd5b506100c1610238565b34801561016057600080fd5b506100c161024f565b34801561017557600080fd5b506100c1610265565b61019161018c3660046113a3565b61027c565b005b34801561019f57600080fd5b506100c16101ae36600461138a565b61040e565b3480156101bf57600080fd5b506101d36101ce366004611459565b61041e565b60405190151581526020016100cb565b604081602081106101f357600080fd5b0154905081565b6000604060805460208110610211576102116114f9565b0154905090565b602081602081106101f357600080fd5b606081602081106101f357600080fd5b6000602060805460208110610211576102116114f9565b60008060805460208110610211576102116114f9565b6000606060805460208110610211576102116114f9565b6040805180820182526103469160808401906002908390839080828437600092018290525060408051808201909152925060c086019150600290835b828210156102f657604080518082018252908084028601906002908390839080828437600092019190915250505081526001909101906020016102b8565b5050604080518082018252925061014087019150600290839083908082843760009201919091525061032a915061024f9050565b8560000135866020013587604001358860600135608154610536565b6103805760405162461bcd60e51b815260206004820152600660248201526510b83937b7b360d11b60448201526064015b60405180910390fd5b602060805460016103919190611525565b61039b919061153d565b6080819055813590600090602081106103b6576103b66114f9565b0155608054602080830135918181106103d1576103d16114f9565b015560805460408083013591602081106103ed576103ed6114f9565b01556080546060808301359160208110610409576104096114f9565b015550565b600081602081106101f357600080fd5b6000610428611250565b60408051808201825287518152602080890151818301529083528151608081018352875151818401908152885183015160608084019190915290825283518085018552898401805151825251840151818501528284015284830191909152825180840184528751815287830151818401528484015282516002808252918101845260009390928301908036833701905050905060005b600281101561050d578481600281106104d9576104d96114f9565b60200201518282815181106104f0576104f06114f9565b6020908102919091010152806105058161155f565b9150506104be565b506105188183610605565b6105275760019250505061052e565b6000925050505b949350505050565b6040805160208101889052908101869052606081018490526080810183905260a0810185905260c08101829052600090819060e0016040516020818303038152906040529050600060028260405161058e919061157a565b602060405180830381855afa1580156105ab573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906105ce91906115b5565b90506105d86112a1565b600382901c81526007821660208201526105f48d8d8d8461041e565b9d9c50505050505050505050505050565b60007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816106316107f7565b9050806080015151855160016106479190611525565b146106895760405162461bcd60e51b81526020600482015260126024820152711d995c9a599a595c8b5898590b5a5b9c1d5d60721b6044820152606401610377565b604080518082019091526000808252602082018190525b865181101561077a57838782815181106106bc576106bc6114f9565b6020026020010151106107115760405162461bcd60e51b815260206004820152601f60248201527f76657269666965722d6774652d736e61726b2d7363616c61722d6669656c64006044820152606401610377565b61076682610761856080015184600161072a9190611525565b8151811061073a5761073a6114f9565b60200260200101518a8581518110610754576107546114f9565b6020026020010151610b9b565b610c37565b9150806107728161155f565b9150506106a0565b506107a3818360800151600081518110610796576107966114f9565b6020026020010151610c37565b90506107d96107b58660000151610ccf565b8660200151846000015185602001518587604001518b604001518960600151610d6e565b6107e957600193505050506107f1565b600093505050505b92915050565b6107ff6112bf565b6040805180820182527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e281527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d19266020808301919091529083528151608080820184527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c8285019081527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab606080850191909152908352845180860186527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a781527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8818601528385015285840192909252835180820185527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28186018181527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed838601819052908352865180880188527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b8082527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa828901819052858901929092528989019490945287518086018952808901938452808701929092529181528651808801885292835282860191909152938401529084019190915281516003808252918101909252816020015b6040805180820190915260008082526020820152815260200190600190039081610a0c57505060808201908152604080518082019091527f2c3a5cf1b2bf6a092b6ffac3599edca0c6761158369126e4946a9ee398e56cf481527f15bb6c927a4463f8a82dbfaaa2498b238fd1a0fef743acf2c668bf974f69da91602082015290518051600090610a9f57610a9f6114f9565b602002602001018190525060405180604001604052807f1bb0b3f77b77bd4debc67dbe19d919856b1bd59e4765bdd75604934be033bc3981526020017f0106bbf2f3aa5d547527f86cd9eeb010591dfba19c9624316b8ad2ffe3704eea8152508160800151600181518110610b1657610b166114f9565b602002602001018190525060405180604001604052807f2b73eea51457afdb5e4157a74fc9d2a27dab043e4c9e36207ece2bdd88f878e681526020017f13e11fd34c2570744efa207539894d052d4cb86e61c2ca4b8cd24b42165324558152508160800151600281518110610b8d57610b8d6114f9565b602002602001018190525090565b6040805180820190915260008082526020820152610bb7611310565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa9050808015610bea57610bec565bfe5b5080610c2f5760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5b5d5b0b59985a5b195960721b6044820152606401610377565b505092915050565b6040805180820190915260008082526020820152610c5361132e565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808015610bea575080610c2f5760405162461bcd60e51b81526020600482015260126024820152711c185a5c9a5b99cb5859190b59985a5b195960721b6044820152606401610377565b604080518082019091526000808252602082015281517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4790158015610d1657506020830151155b15610d365750506040805180820190915260008082526020820152919050565b604051806040016040528084600001518152602001828560200151610d5b919061153d565b610d6590846115ce565b90529392505050565b60408051600480825260a08201909252600091829190816020015b6040805180820190915260008082526020820152815260200190600190039081610d8957505060408051600480825260a0820190925291925060009190602082015b610dd361134c565b815260200190600190039081610dcb5790505090508a82600081518110610dfc57610dfc6114f9565b60200260200101819052508882600181518110610e1b57610e1b6114f9565b60200260200101819052508682600281518110610e3a57610e3a6114f9565b60200260200101819052508482600381518110610e5957610e596114f9565b60200260200101819052508981600081518110610e7857610e786114f9565b60200260200101819052508781600181518110610e9757610e976114f9565b60200260200101819052508581600281518110610eb657610eb66114f9565b60200260200101819052508381600381518110610ed557610ed56114f9565b6020026020010181905250610eea8282610ef9565b9b9a5050505050505050505050565b60008151835114610f455760405162461bcd60e51b81526020600482015260166024820152751c185a5c9a5b99cb5b195b99dd1a1ccb59985a5b195960521b6044820152606401610377565b82516000610f548260066115e5565b905060008167ffffffffffffffff811115610f7157610f716113bc565b604051908082528060200260200182016040528015610f9a578160200160208202803683370190505b50905060005b838110156111d557868181518110610fba57610fba6114f9565b60200260200101516000015182826006610fd491906115e5565b610fdf906000611525565b81518110610fef57610fef6114f9565b60200260200101818152505086818151811061100d5761100d6114f9565b6020026020010151602001518282600661102791906115e5565b611032906001611525565b81518110611042576110426114f9565b602002602001018181525050858181518110611060576110606114f9565b60209081029190910101515151826110798360066115e5565b611084906002611525565b81518110611094576110946114f9565b6020026020010181815250508581815181106110b2576110b26114f9565b602090810291909101810151510151826110cd8360066115e5565b6110d8906003611525565b815181106110e8576110e86114f9565b602002602001018181525050858181518110611106576111066114f9565b602002602001015160200151600060028110611124576111246114f9565b6020020151826111358360066115e5565b611140906004611525565b81518110611150576111506114f9565b60200260200101818152505085818151811061116e5761116e6114f9565b60200260200101516020015160016002811061118c5761118c6114f9565b60200201518261119d8360066115e5565b6111a8906005611525565b815181106111b8576111b86114f9565b6020908102919091010152806111cd8161155f565b915050610fa0565b506111de61136c565b6000602082602086026020860160086107d05a03fa9050808015610bea5750806112425760405162461bcd60e51b81526020600482015260156024820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b6044820152606401610377565b505115159695505050505050565b6040805160a08101909152600060608201818152608083019190915281526020810161127a61134c565b815260200161129c604051806040016040528060008152602001600081525090565b905290565b60405180604001604052806002906020820280368337509192915050565b6040805160e08101909152600060a0820181815260c08301919091528152602081016112e961134c565b81526020016112f661134c565b815260200161130361134c565b8152602001606081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806040016040528061135f6112a1565b815260200161129c6112a1565b60405180602001604052806001906020820280368337509192915050565b60006020828403121561139c57600080fd5b5035919050565b600061018082840312156113b657600080fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561140357634e487b7160e01b600052604160045260246000fd5b60405290565b600082601f83011261141a57600080fd5b6114226113d2565b80604084018581111561143457600080fd5b845b8181101561144e578035845260209384019301611436565b509095945050505050565b600080600080610140858703121561147057600080fd5b61147a8686611409565b9350604086605f87011261148d57600080fd5b6114956113d2565b8060c08801898111156114a757600080fd5b8389015b818110156114cc576114bd8b82611409565b845260209093019284016114ab565b508196506114da8a82611409565b9550505050506114ee866101008701611409565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156115385761153861150f565b500190565b60008261155a57634e487b7160e01b600052601260045260246000fd5b500690565b60006000198214156115735761157361150f565b5060010190565b6000825160005b8181101561159b5760208186018101518583015201611581565b818111156115aa576000828501525b509190910192915050565b6000602082840312156115c757600080fd5b5051919050565b6000828210156115e0576115e061150f565b500390565b60008160001904831182151516156115ff576115ff61150f565b50029056fea264697066735822122040fa257e593a968851c0d23fd1f7c68ec631a022d6535c66097d719680a553c164736f6c63430008090033ae6e82dcc37757827a7a110833767582030e8a9adadb246b3453833868c322290000000000000000000000000000000000000000000000000000000000557a1fae6e82dcc37757827a7a110833767582030e8a9adadb246b3453833868c32229875038947038407084a49d684cb53c10cffb163e0e3e3a6f8637d9d309d7332107000000628941ef21d1fe8c7134720add10bb91e3b02c007e0046d2472c6695

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

ae6e82dcc37757827a7a110833767582030e8a9adadb246b3453833868c322290000000000000000000000000000000000000000000000000000000000557a1fae6e82dcc37757827a7a110833767582030e8a9adadb246b3453833868c32229875038947038407084a49d684cb53c10cffb163e0e3e3a6f8637d9d309d7332107000000628941ef21d1fe8c7134720add10bb91e3b02c007e0046d2472c6695

-----Decoded View---------------
Arg [0] : _optimisticHeaderRoot (bytes32): 0xae6e82dcc37757827a7a110833767582030e8a9adadb246b3453833868c32229
Arg [1] : _optimisticHeaderSlot (uint256): 5601823
Arg [2] : _finalizedHeaderRoot (bytes32): 0xae6e82dcc37757827a7a110833767582030e8a9adadb246b3453833868c32229
Arg [3] : _executionStateRoot (bytes32): 0x875038947038407084a49d684cb53c10cffb163e0e3e3a6f8637d9d309d73321
Arg [4] : _domain (bytes32): 0x07000000628941ef21d1fe8c7134720add10bb91e3b02c007e0046d2472c6695

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : ae6e82dcc37757827a7a110833767582030e8a9adadb246b3453833868c32229
Arg [1] : 0000000000000000000000000000000000000000000000000000000000557a1f
Arg [2] : ae6e82dcc37757827a7a110833767582030e8a9adadb246b3453833868c32229
Arg [3] : 875038947038407084a49d684cb53c10cffb163e0e3e3a6f8637d9d309d73321
Arg [4] : 07000000628941ef21d1fe8c7134720add10bb91e3b02c007e0046d2472c6695


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading