false
false
0

Contract Address Details

0x1000000000000000000000000000000000000001

Contract Name
StateConnector
Creator
Balance
0 CFLR
Tokens
Fetching tokens...
Transactions
2 Transactions
Transfers
0 Transfers
Gas Used
696,777
Last Balance Update
14048270
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
StateConnector




Optimization enabled
false
Compiler version
v0.7.6+commit.7338295f




EVM Version
default




Verified at
2022-02-21T04:53:00.815364Z

Contract source code

// Sources flattened with hardhat v2.3.0 https://hardhat.org

// File contracts/genesis/implementation/StateConnector.sol

// (c) 2021, Flare Networks Limited. All rights reserved.
// Please see the file LICENSE for licensing terms.

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;

contract StateConnector {

    enum DataAvailabilityPeriodFinalityType {
        PROPOSED,
        LOW_FINALISED_CLAIM_PERIOD_INDEX,
        REWARDED,
        BANNED
    }

//====================================================================
// Data Structures
//====================================================================

    struct Chain {
        bool        exists;
        uint64      genesisLedger;
        // Range of ledgers below finalisedLedgerIndex that can be searched when proving a payment
        uint64      ledgerHistorySize;
        // Number of ledgers in a dataAvailabilityPeriod
        uint16      dataAvailabilityPeriodLength; 
        // Number of confirmations required to consider this dataAvailabilityPeriod finalised
        uint16      numConfirmations; 
        uint64      finalisedDataAvailabilityPeriodIndex;
        uint64      finalisedLedgerIndex;
        uint256     finalisedTimestamp;
        uint256     timeDiffExpected;
        uint256     timeDiffAvg;
    }

    struct HashExists {
        bool        exists;
        bytes32     dataAvailabilityPeriodHash;
        bytes32     commitHash;
        uint256     commitTime;
        uint256     permittedRevealTime;
        bytes32     revealHash;
        uint64      index;
        uint64      indexSearchRegion;
        bool        proven;
        address     provenBy;
    }

    address internal constant GENESIS_COINBASE = address(0x0100000000000000000000000000000000000000);
    bool public initialised;
    uint32 public numChains;
    uint256 public initialiseTime;
    uint256 public commitRevealLowerBound;
    uint256 public commitRevealUpperBound;
    uint64 public rewardPeriodTimespan;

    // Chain ID mapping to Chain struct
    mapping(uint32 => Chain) public chains;
    // msg.sender => Location hash => dataAvailabilityPeriod
    mapping(address => mapping(bytes32 => HashExists)) public proposedDataAvailabilityProofs;
    // Location hash => dataAvailabilityPeriod
    mapping(bytes32 => HashExists) public finalisedDataAvailabilityPeriods;
    // Location hash => ledger => paymentProof
    mapping(bytes32 => mapping(uint64 => HashExists)) public proposedPaymentProofs;
    // Location hash => ledger => nonPaymentProof
    mapping(bytes32 => mapping(uint64 => HashExists)) public proposedNonPaymentProofs;
    // Finalised payment hashes
    mapping(bytes32 => HashExists) public finalisedPayments;
    // Mapping of how many dataAvailabilityPeriods an address has successfully mined
    mapping(address => mapping(uint256 => uint64)) public dataAvailabilityPeriodsMined;
    // Mapping of how many dataAvailabilityPeriods were successfully mined
    mapping(uint256 => uint64) public totalDataAvailabilityPeriodsMined;
    // Data avail provers are banned temporarily for submitting chainTipHash values that do not ultimately
    // become accepted, if their submitted chainTipHash value is accepted then they will earn a reward
    mapping(address => uint256) public senderBannedUntil;

//====================================================================
// Events
//====================================================================

    event DataAvailabilityPeriodFinalityProved(uint32 chainId, uint64 ledger, DataAvailabilityPeriodFinalityType finType, address sender);
    event PaymentFinalityProved(uint32 chainId, uint64 ledger, string txId, bytes32 paymentHash, address sender);
    event PaymentFinalityDisproved(uint32 chainId, uint64 ledger, string txId, bytes32 paymentHash, address sender);

//====================================================================
// Modifiers
//====================================================================

    modifier isInitialised() {
        require(initialised, "state connector is not initialised, run initialiseChains()");
        _;
    }
    
    modifier chainExists(uint32 chainId) {
        require(chains[chainId].exists, "chainId does not exist");
        _;
    }

    modifier senderNotBanned() {
        require(block.timestamp > senderBannedUntil[msg.sender], 
            "msg.sender is currently banned for sending an unaccepted chainTipHash");
        _;
    }

//====================================================================
// Constructor for genesis-deployed code
//====================================================================

    constructor() {
    }

    function initialiseChains() external returns (bool success) {
        require(!initialised, "initialised != false");
        chains[0] = Chain(true, 689300, 0, 1, 4, 0, 689300, block.timestamp, 900, 30); //BTC
        chains[1] = Chain(true, 2086110, 0, 1, 12, 0, 2086110, block.timestamp, 150, 30); //LTC
        chains[2] = Chain(true, 3768500, 0, 2, 40, 0, 3768500, block.timestamp, 120, 30); //DOGE
        chains[3] = Chain(true, 62880000, 0, 30, 1, 0, 62880000, block.timestamp, 120, 30); //XRP
        chains[4] = Chain(true, 16169600, 0, 26, 1, 0, 16169600, block.timestamp, 120, 30); //ALGO
        numChains = 5;
        commitRevealLowerBound = 30;
        commitRevealUpperBound = 1 days;
        rewardPeriodTimespan = 7 days; //604800
        initialiseTime = block.timestamp;
        initialised = true;
        return true;
    }

//====================================================================
// Functions
//====================================================================  

    function proveDataAvailabilityPeriodFinality(
        uint32 chainId,
        uint64 ledger,
        bytes32 dataAvailabilityPeriodHash,
        bytes32 chainTipHash
    ) external isInitialised chainExists(chainId) senderNotBanned returns (
        uint32 _chainId,
        uint64 _ledger,
        uint16 _numConfirmations,
        bytes32 _dataAvailabilityPeriodHash
    ) {
        require(dataAvailabilityPeriodHash > 0x0, "dataAvailabilityPeriodHash == 0x0");
        require(chainTipHash > 0x0, "chainTipHash == 0x0");
        require(chains[chainId].numConfirmations > 0, "chains[chainId].numConfirmations > 0");
        require(block.coinbase == msg.sender || block.coinbase == GENESIS_COINBASE, "invalid block.coinbase value");
        require(ledger == chains[chainId].finalisedLedgerIndex + chains[chainId].dataAvailabilityPeriodLength, "invalid ledger");
        require(block.timestamp > chains[chainId].finalisedTimestamp, 
            "block.timestamp <= chains[chainId].finalisedTimestamp");
        if (2 * chains[chainId].timeDiffAvg < chains[chainId].timeDiffExpected) {
            require(3 * (block.timestamp - chains[chainId].finalisedTimestamp) >= 2 * chains[chainId].timeDiffAvg, 
                "not enough time elapsed since prior finality");
        } else {
            require(block.timestamp - chains[chainId].finalisedTimestamp + 15 >= chains[chainId].timeDiffAvg, 
                "not enough time elapsed since prior finality");
        }

        bytes32 locationHash = keccak256(abi.encodePacked(chainId, chains[chainId].finalisedDataAvailabilityPeriodIndex));
        require(!finalisedDataAvailabilityPeriods[locationHash].proven, "locationHash already finalised");

        if (chains[chainId].finalisedDataAvailabilityPeriodIndex > 0) {
            bytes32 prevLocationHash = keccak256(abi.encodePacked(
                    chainId, chains[chainId].finalisedDataAvailabilityPeriodIndex - 1));
            require(finalisedDataAvailabilityPeriods[prevLocationHash].proven, "previous dataAvailabilityPeriod not yet finalised");
        }
        uint16 numConfirmations;
        if (proposedDataAvailabilityProofs[msg.sender][locationHash].exists) {
            require(block.timestamp >= proposedDataAvailabilityProofs[msg.sender][locationHash].permittedRevealTime, 
                "block.timestamp < proposedDataAvailabilityProofs[msg.sender][locationHash].permittedRevealTime");
            require(proposedDataAvailabilityProofs[msg.sender][locationHash].commitHash == 
                keccak256(abi.encodePacked(msg.sender, chainTipHash)), 
                "invalid chainTipHash");
            require(proposedDataAvailabilityProofs[msg.sender][locationHash].commitTime + commitRevealUpperBound > block.timestamp,
                "reveal is too late");
        } else if (block.coinbase != msg.sender && block.coinbase == GENESIS_COINBASE) {
            numConfirmations = chains[chainId].numConfirmations;
        }

        if (block.coinbase == msg.sender && block.coinbase != GENESIS_COINBASE) {
            if (!proposedDataAvailabilityProofs[msg.sender][locationHash].exists) {
                uint256 permittedRevealTime = chains[chainId].timeDiffAvg / 2;
                if (permittedRevealTime < commitRevealLowerBound) {
                    permittedRevealTime = commitRevealLowerBound;
                }
                proposedDataAvailabilityProofs[msg.sender][locationHash] = HashExists(
                    true,
                    dataAvailabilityPeriodHash,
                    chainTipHash,
                    block.timestamp,
                    block.timestamp + permittedRevealTime,
                    0x0,
                    ledger,
                    0,
                    false,
                    address(0x0)
                );
                emit DataAvailabilityPeriodFinalityProved(chainId, ledger, DataAvailabilityPeriodFinalityType.PROPOSED, msg.sender);
            } else {
                // Node checked dataAvailabilityPeriodHash, and it was valid
                // Now determine whether to reward or ban the sender of the suggested chainTipHash
                // from 'numConfirmations' dataAvailabilityPeriodIndexes ago
                if (chains[chainId].finalisedDataAvailabilityPeriodIndex > chains[chainId].numConfirmations) {
                    bytes32 prevLocationHash = keccak256(abi.encodePacked(
                        chainId, chains[chainId].finalisedDataAvailabilityPeriodIndex - chains[chainId].numConfirmations));
                    if (finalisedDataAvailabilityPeriods[prevLocationHash].revealHash == dataAvailabilityPeriodHash) {
                        // Reward
                        uint256 currentRewardPeriod = getRewardPeriod();
                        dataAvailabilityPeriodsMined[finalisedDataAvailabilityPeriods[prevLocationHash].provenBy][currentRewardPeriod]
                            += 1;
                        totalDataAvailabilityPeriodsMined[currentRewardPeriod] += 1;
                        emit DataAvailabilityPeriodFinalityProved(chainId, ledger, DataAvailabilityPeriodFinalityType.REWARDED, 
                            finalisedDataAvailabilityPeriods[prevLocationHash].provenBy);
                    } else {
                        // Temporarily ban
                        senderBannedUntil[finalisedDataAvailabilityPeriods[prevLocationHash].provenBy] = 
                            block.timestamp + chains[chainId].numConfirmations * chains[chainId].timeDiffExpected;
                        emit DataAvailabilityPeriodFinalityProved(chainId, ledger, DataAvailabilityPeriodFinalityType.BANNED, 
                            finalisedDataAvailabilityPeriods[prevLocationHash].provenBy);
                    }
                } else {
                    // this is only true for the first few method calls 
                    emit DataAvailabilityPeriodFinalityProved(chainId, ledger, 
                        DataAvailabilityPeriodFinalityType.LOW_FINALISED_CLAIM_PERIOD_INDEX, msg.sender);
                }

                finalisedDataAvailabilityPeriods[locationHash] = HashExists(
                    true,
                    dataAvailabilityPeriodHash,
                    0x0,
                    proposedDataAvailabilityProofs[msg.sender][locationHash].commitTime,
                    block.timestamp,
                    chainTipHash,
                    ledger,
                    0,
                    true,
                    msg.sender
                );

                chains[chainId].finalisedDataAvailabilityPeriodIndex += 1;
                chains[chainId].finalisedLedgerIndex = ledger;

                uint256 timeDiffAvgUpdate = (proposedDataAvailabilityProofs[msg.sender][locationHash].commitTime -
                    chains[chainId].finalisedTimestamp + chains[chainId].timeDiffAvg) / 2;
                if (timeDiffAvgUpdate > 2 * chains[chainId].timeDiffExpected) {
                    chains[chainId].timeDiffAvg = 2 * chains[chainId].timeDiffExpected;
                } else {
                    chains[chainId].timeDiffAvg = timeDiffAvgUpdate;
                }

                chains[chainId].finalisedTimestamp = proposedDataAvailabilityProofs[msg.sender][locationHash].commitTime;
            }
        }
        return (chainId, ledger - 1, numConfirmations, dataAvailabilityPeriodHash);
    }

    // If ledger == payment's ledger -> return true
    function provePaymentFinality(
        uint32 chainId,
        bytes32 paymentHash,
        uint64 ledger,
        string memory txId
    ) external isInitialised chainExists(chainId) returns (
        uint32 _chainId,
        uint64 _ledger,
        uint64 _finalisedLedgerIndex,
        bytes32 _paymentHash,
        string memory _txId
    ) {
        require(paymentHash > 0x0, "paymentHash == 0x0");
        require(chains[chainId].finalisedLedgerIndex > 0, "chains[chainId].finalisedLedgerIndex == 0");
        require(block.coinbase == msg.sender || block.coinbase == GENESIS_COINBASE, "invalid block.coinbase value");
        bytes32 locationHash = keccak256(abi.encodePacked(chainId, paymentHash));
        require(!finalisedPayments[locationHash].proven, "payment already proven");
        require(ledger < chains[chainId].finalisedLedgerIndex, "ledger >= chains[chainId].finalisedLedgerIndex");

        uint64 indexSearchRegion = chains[chainId].genesisLedger;
        if (chains[chainId].ledgerHistorySize > 0) {
            require(chains[chainId].finalisedLedgerIndex - chains[chainId].genesisLedger > 
                chains[chainId].ledgerHistorySize, 
                "finalisedLedgerIndex - genesisLedger <= ledgerHistorySize");
            indexSearchRegion = chains[chainId].finalisedLedgerIndex - chains[chainId].ledgerHistorySize;
        }
        require(ledger >= indexSearchRegion, "ledger < indexSearchRegion");
        
        uint64 finalisedLedgerIndex;
        if (proposedPaymentProofs[locationHash][ledger].exists) {
            require(block.timestamp >= proposedPaymentProofs[locationHash][ledger].permittedRevealTime, 
                "block.timestamp < proposedPaymentProofs[locationHash].permittedRevealTime");
            require(proposedPaymentProofs[locationHash][ledger].revealHash == paymentHash, 
                "invalid paymentHash");
            require(proposedPaymentProofs[locationHash][ledger].commitTime + commitRevealUpperBound > block.timestamp,
                "reveal is too late");
        } else if (block.coinbase != msg.sender && block.coinbase == GENESIS_COINBASE) {
            finalisedLedgerIndex = chains[chainId].finalisedLedgerIndex;
        }

        if (block.coinbase == msg.sender && block.coinbase != GENESIS_COINBASE) {
            if (!proposedPaymentProofs[locationHash][ledger].exists) {
                proposedPaymentProofs[locationHash][ledger] = HashExists(
                    true, 
                    0x0, 
                    0x0,
                    block.timestamp, 
                    block.timestamp + commitRevealLowerBound, 
                    paymentHash, 
                    ledger, 
                    indexSearchRegion, 
                    false,
                    msg.sender
                );
            } else {
                finalisedPayments[locationHash] = HashExists(
                    true, 
                    0x0, 
                    0x0,
                    0, 
                    block.timestamp, 
                    paymentHash, 
                    ledger, 
                    indexSearchRegion, 
                    true,
                    msg.sender
                );
                emit PaymentFinalityProved(chainId, ledger, txId, paymentHash, msg.sender);
            }
        }
        return (chainId, ledger, finalisedLedgerIndex, paymentHash, txId);
    }

    // If ledger < payment's ledger or payment does not exist within data-available region -> return true
    function disprovePaymentFinality(
        uint32 chainId,
        bytes32 paymentHash,
        uint64 ledger,
        string memory txId
    ) external isInitialised chainExists(chainId) returns (
        uint32 _chainId,
        uint64 _ledger,
        uint64 _finalisedLedgerIndex,
        bytes32 _paymentHash,
        string memory _txId
    ) {
        require(paymentHash > 0x0, "paymentHash == 0x0");
        require(chains[chainId].finalisedLedgerIndex > 0, "chains[chainId].finalisedLedgerIndex == 0");
        require(block.coinbase == msg.sender || block.coinbase == GENESIS_COINBASE, "invalid block.coinbase value");
        bytes32 locationHash = keccak256(abi.encodePacked(chainId, paymentHash));
        require(!finalisedPayments[locationHash].proven, "txId already proven");
        require(finalisedPayments[locationHash].index < ledger,
            "finalisedPayments[locationHash].index >= ledger");
        require(ledger < chains[chainId].finalisedLedgerIndex, "ledger >= chains[chainId].finalisedLedgerIndex");

        uint64 indexSearchRegion = chains[chainId].genesisLedger;
        if (chains[chainId].ledgerHistorySize > 0) {
            require(chains[chainId].finalisedLedgerIndex - chains[chainId].genesisLedger > 
                chains[chainId].ledgerHistorySize,
                "finalisedLedgerIndex - genesisLedger <= ledgerHistorySize");
            indexSearchRegion = chains[chainId].finalisedLedgerIndex - chains[chainId].ledgerHistorySize;
        }
        require(ledger >= indexSearchRegion, "ledger < indexSearchRegion");

        uint64 finalisedLedgerIndex;
        if (proposedNonPaymentProofs[locationHash][ledger].exists) {
            require(block.timestamp >= proposedNonPaymentProofs[locationHash][ledger].permittedRevealTime, 
                "block.timestamp < proposedNonPaymentProofs[locationHash][ledger].permittedRevealTime");
            require(proposedNonPaymentProofs[locationHash][ledger].revealHash == paymentHash, 
                "invalid paymentHash");
            require(proposedNonPaymentProofs[locationHash][ledger].commitTime + commitRevealUpperBound > block.timestamp,
                "reveal is too late");
        } else if (block.coinbase != msg.sender && block.coinbase == GENESIS_COINBASE) {
            finalisedLedgerIndex = chains[chainId].finalisedLedgerIndex;
        }

        if (block.coinbase == msg.sender && block.coinbase != GENESIS_COINBASE) {
            if (!proposedNonPaymentProofs[locationHash][ledger].exists) {
                proposedNonPaymentProofs[locationHash][ledger] = HashExists(
                    true, 
                    0x0, 
                    0x0,
                    block.timestamp, 
                    block.timestamp + commitRevealLowerBound, 
                    paymentHash, 
                    ledger, 
                    indexSearchRegion, 
                    false,
                    msg.sender
                );
            } else {
                finalisedPayments[locationHash] = HashExists(
                    true, 
                    0x0, 
                    0x0,
                    0, 
                    block.timestamp, 
                    paymentHash, 
                    ledger, 
                    indexSearchRegion, 
                    false,
                    msg.sender
                );
                emit PaymentFinalityProved(chainId, ledger, txId, paymentHash, msg.sender);
            }
        }
        return (chainId, ledger, finalisedLedgerIndex, paymentHash, txId);
    }
    
    function getDataAvailabilityPeriodsMined(
        address miner,
        uint256 rewardSchedule
    ) external view isInitialised returns (uint64 numMined) {
        return dataAvailabilityPeriodsMined[miner][rewardSchedule];
    }

    function getTotalDataAvailabilityPeriodsMined(
        uint256 rewardSchedule
    ) external view isInitialised returns (uint64 numMined) {
        return totalDataAvailabilityPeriodsMined[rewardSchedule];
    }

    function getLatestIndex(uint32 chainId) external view isInitialised chainExists(chainId) returns (
        uint64 genesisLedger,
        uint64 finalisedDataAvailabilityPeriodIndex,
        uint16 dataAvailabilityPeriodLength,
        uint64 finalisedLedgerIndex,
        uint256 finalisedTimestamp,
        uint256 timeDiffAvg
    ) {
        finalisedTimestamp = chains[chainId].finalisedTimestamp;
        timeDiffAvg = chains[chainId].timeDiffAvg;

        bytes32 locationHash = keccak256(abi.encodePacked(chainId, chains[chainId].finalisedDataAvailabilityPeriodIndex));
        if (proposedDataAvailabilityProofs[msg.sender][locationHash].exists) {
            finalisedTimestamp = 0;
            timeDiffAvg = proposedDataAvailabilityProofs[msg.sender][locationHash].permittedRevealTime;
        }

        return (
            chains[chainId].genesisLedger,
            chains[chainId].finalisedDataAvailabilityPeriodIndex,
            chains[chainId].dataAvailabilityPeriodLength,
            chains[chainId].finalisedLedgerIndex,
            finalisedTimestamp,
            timeDiffAvg
        );
    }

    function getDataAvailabilityPeriodIndexFinality(
        uint32 chainId,
        uint64 dataAvailabilityPeriodIndex
    ) external view isInitialised chainExists(chainId) returns (bool finality) {
        bytes32 locationHash = keccak256(abi.encodePacked(chainId, dataAvailabilityPeriodIndex));
        return (finalisedDataAvailabilityPeriods[locationHash].exists);
    }

    function getPaymentFinality(
        uint32 chainId,
        bytes32 txId,
        bytes32 destinationHash,
        uint64 amount,
        bytes32 currencyHash
    ) external view isInitialised chainExists(chainId) returns (
        uint64 ledger,
        uint64 indexSearchRegion,
        bool finality
    ) {
        bytes32 paymentHash = keccak256(abi.encodePacked(
            txId,
            destinationHash,
            keccak256(abi.encode(amount)),
            currencyHash));
        bytes32 locationHash = keccak256(abi.encodePacked(chainId, paymentHash));
        require(finalisedPayments[locationHash].exists, "payment does not exist");
        require(finalisedPayments[locationHash].revealHash == paymentHash, "invalid paymentHash");

        return (
            finalisedPayments[locationHash].index,
            finalisedPayments[locationHash].indexSearchRegion,
            finalisedPayments[locationHash].proven
        );
    }

    function getRewardPeriod() public view isInitialised returns (uint256 rewardSchedule) {
        require(block.timestamp > initialiseTime, "block.timestamp <= initialiseTime");
        return (block.timestamp - initialiseTime) / rewardPeriodTimespan;
    }
    
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"DataAvailabilityPeriodFinalityProved","inputs":[{"type":"uint32","name":"chainId","internalType":"uint32","indexed":false},{"type":"uint64","name":"ledger","internalType":"uint64","indexed":false},{"type":"uint8","name":"finType","internalType":"enum StateConnector.DataAvailabilityPeriodFinalityType","indexed":false},{"type":"address","name":"sender","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"PaymentFinalityDisproved","inputs":[{"type":"uint32","name":"chainId","internalType":"uint32","indexed":false},{"type":"uint64","name":"ledger","internalType":"uint64","indexed":false},{"type":"string","name":"txId","internalType":"string","indexed":false},{"type":"bytes32","name":"paymentHash","internalType":"bytes32","indexed":false},{"type":"address","name":"sender","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"PaymentFinalityProved","inputs":[{"type":"uint32","name":"chainId","internalType":"uint32","indexed":false},{"type":"uint64","name":"ledger","internalType":"uint64","indexed":false},{"type":"string","name":"txId","internalType":"string","indexed":false},{"type":"bytes32","name":"paymentHash","internalType":"bytes32","indexed":false},{"type":"address","name":"sender","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"exists","internalType":"bool"},{"type":"uint64","name":"genesisLedger","internalType":"uint64"},{"type":"uint64","name":"ledgerHistorySize","internalType":"uint64"},{"type":"uint16","name":"dataAvailabilityPeriodLength","internalType":"uint16"},{"type":"uint16","name":"numConfirmations","internalType":"uint16"},{"type":"uint64","name":"finalisedDataAvailabilityPeriodIndex","internalType":"uint64"},{"type":"uint64","name":"finalisedLedgerIndex","internalType":"uint64"},{"type":"uint256","name":"finalisedTimestamp","internalType":"uint256"},{"type":"uint256","name":"timeDiffExpected","internalType":"uint256"},{"type":"uint256","name":"timeDiffAvg","internalType":"uint256"}],"name":"chains","inputs":[{"type":"uint32","name":"","internalType":"uint32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"commitRevealLowerBound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"commitRevealUpperBound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"dataAvailabilityPeriodsMined","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint32","name":"_chainId","internalType":"uint32"},{"type":"uint64","name":"_ledger","internalType":"uint64"},{"type":"uint64","name":"_finalisedLedgerIndex","internalType":"uint64"},{"type":"bytes32","name":"_paymentHash","internalType":"bytes32"},{"type":"string","name":"_txId","internalType":"string"}],"name":"disprovePaymentFinality","inputs":[{"type":"uint32","name":"chainId","internalType":"uint32"},{"type":"bytes32","name":"paymentHash","internalType":"bytes32"},{"type":"uint64","name":"ledger","internalType":"uint64"},{"type":"string","name":"txId","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"exists","internalType":"bool"},{"type":"bytes32","name":"dataAvailabilityPeriodHash","internalType":"bytes32"},{"type":"bytes32","name":"commitHash","internalType":"bytes32"},{"type":"uint256","name":"commitTime","internalType":"uint256"},{"type":"uint256","name":"permittedRevealTime","internalType":"uint256"},{"type":"bytes32","name":"revealHash","internalType":"bytes32"},{"type":"uint64","name":"index","internalType":"uint64"},{"type":"uint64","name":"indexSearchRegion","internalType":"uint64"},{"type":"bool","name":"proven","internalType":"bool"},{"type":"address","name":"provenBy","internalType":"address"}],"name":"finalisedDataAvailabilityPeriods","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"exists","internalType":"bool"},{"type":"bytes32","name":"dataAvailabilityPeriodHash","internalType":"bytes32"},{"type":"bytes32","name":"commitHash","internalType":"bytes32"},{"type":"uint256","name":"commitTime","internalType":"uint256"},{"type":"uint256","name":"permittedRevealTime","internalType":"uint256"},{"type":"bytes32","name":"revealHash","internalType":"bytes32"},{"type":"uint64","name":"index","internalType":"uint64"},{"type":"uint64","name":"indexSearchRegion","internalType":"uint64"},{"type":"bool","name":"proven","internalType":"bool"},{"type":"address","name":"provenBy","internalType":"address"}],"name":"finalisedPayments","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"finality","internalType":"bool"}],"name":"getDataAvailabilityPeriodIndexFinality","inputs":[{"type":"uint32","name":"chainId","internalType":"uint32"},{"type":"uint64","name":"dataAvailabilityPeriodIndex","internalType":"uint64"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"numMined","internalType":"uint64"}],"name":"getDataAvailabilityPeriodsMined","inputs":[{"type":"address","name":"miner","internalType":"address"},{"type":"uint256","name":"rewardSchedule","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"genesisLedger","internalType":"uint64"},{"type":"uint64","name":"finalisedDataAvailabilityPeriodIndex","internalType":"uint64"},{"type":"uint16","name":"dataAvailabilityPeriodLength","internalType":"uint16"},{"type":"uint64","name":"finalisedLedgerIndex","internalType":"uint64"},{"type":"uint256","name":"finalisedTimestamp","internalType":"uint256"},{"type":"uint256","name":"timeDiffAvg","internalType":"uint256"}],"name":"getLatestIndex","inputs":[{"type":"uint32","name":"chainId","internalType":"uint32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"ledger","internalType":"uint64"},{"type":"uint64","name":"indexSearchRegion","internalType":"uint64"},{"type":"bool","name":"finality","internalType":"bool"}],"name":"getPaymentFinality","inputs":[{"type":"uint32","name":"chainId","internalType":"uint32"},{"type":"bytes32","name":"txId","internalType":"bytes32"},{"type":"bytes32","name":"destinationHash","internalType":"bytes32"},{"type":"uint64","name":"amount","internalType":"uint64"},{"type":"bytes32","name":"currencyHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"rewardSchedule","internalType":"uint256"}],"name":"getRewardPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"numMined","internalType":"uint64"}],"name":"getTotalDataAvailabilityPeriodsMined","inputs":[{"type":"uint256","name":"rewardSchedule","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"initialiseChains","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"initialiseTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"initialised","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"numChains","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"exists","internalType":"bool"},{"type":"bytes32","name":"dataAvailabilityPeriodHash","internalType":"bytes32"},{"type":"bytes32","name":"commitHash","internalType":"bytes32"},{"type":"uint256","name":"commitTime","internalType":"uint256"},{"type":"uint256","name":"permittedRevealTime","internalType":"uint256"},{"type":"bytes32","name":"revealHash","internalType":"bytes32"},{"type":"uint64","name":"index","internalType":"uint64"},{"type":"uint64","name":"indexSearchRegion","internalType":"uint64"},{"type":"bool","name":"proven","internalType":"bool"},{"type":"address","name":"provenBy","internalType":"address"}],"name":"proposedDataAvailabilityProofs","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"exists","internalType":"bool"},{"type":"bytes32","name":"dataAvailabilityPeriodHash","internalType":"bytes32"},{"type":"bytes32","name":"commitHash","internalType":"bytes32"},{"type":"uint256","name":"commitTime","internalType":"uint256"},{"type":"uint256","name":"permittedRevealTime","internalType":"uint256"},{"type":"bytes32","name":"revealHash","internalType":"bytes32"},{"type":"uint64","name":"index","internalType":"uint64"},{"type":"uint64","name":"indexSearchRegion","internalType":"uint64"},{"type":"bool","name":"proven","internalType":"bool"},{"type":"address","name":"provenBy","internalType":"address"}],"name":"proposedNonPaymentProofs","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"uint64","name":"","internalType":"uint64"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"exists","internalType":"bool"},{"type":"bytes32","name":"dataAvailabilityPeriodHash","internalType":"bytes32"},{"type":"bytes32","name":"commitHash","internalType":"bytes32"},{"type":"uint256","name":"commitTime","internalType":"uint256"},{"type":"uint256","name":"permittedRevealTime","internalType":"uint256"},{"type":"bytes32","name":"revealHash","internalType":"bytes32"},{"type":"uint64","name":"index","internalType":"uint64"},{"type":"uint64","name":"indexSearchRegion","internalType":"uint64"},{"type":"bool","name":"proven","internalType":"bool"},{"type":"address","name":"provenBy","internalType":"address"}],"name":"proposedPaymentProofs","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"uint64","name":"","internalType":"uint64"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint32","name":"_chainId","internalType":"uint32"},{"type":"uint64","name":"_ledger","internalType":"uint64"},{"type":"uint16","name":"_numConfirmations","internalType":"uint16"},{"type":"bytes32","name":"_dataAvailabilityPeriodHash","internalType":"bytes32"}],"name":"proveDataAvailabilityPeriodFinality","inputs":[{"type":"uint32","name":"chainId","internalType":"uint32"},{"type":"uint64","name":"ledger","internalType":"uint64"},{"type":"bytes32","name":"dataAvailabilityPeriodHash","internalType":"bytes32"},{"type":"bytes32","name":"chainTipHash","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint32","name":"_chainId","internalType":"uint32"},{"type":"uint64","name":"_ledger","internalType":"uint64"},{"type":"uint64","name":"_finalisedLedgerIndex","internalType":"uint64"},{"type":"bytes32","name":"_paymentHash","internalType":"bytes32"},{"type":"string","name":"_txId","internalType":"string"}],"name":"provePaymentFinality","inputs":[{"type":"uint32","name":"chainId","internalType":"uint32"},{"type":"bytes32","name":"paymentHash","internalType":"bytes32"},{"type":"uint64","name":"ledger","internalType":"uint64"},{"type":"string","name":"txId","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"rewardPeriodTimespan","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"senderBannedUntil","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"totalDataAvailabilityPeriodsMined","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]}]
              

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c80637ec93e9f116100de578063c5d64cd111610097578063dccb2d3211610071578063dccb2d32146107f2578063ee2d87371461081e578063ef4c169e1461083b578063f9c490ee1461084357610173565b8063c5d64cd11461073e578063d3b92926146107b4578063d3fb3e9f146107d157610173565b80637ec93e9f146105a85780637f582432146105d45780638abd90ae1461069c5780638b203dd4146106a45780639c531f8c1461072e578063adc890321461073657610173565b806347453f371161013057806347453f37146104355780634bdc9c8f1461045257806355d14c15146104d857806371e8d61a14610504578063741d3cb41461057457806379fd4e1a1461057c57610173565b806307003bb41461017857806322ce7387146101945780632a2434a2146101cc5780632bec6f8714610247578063388492dd1461028f5780633f57987d14610403575b600080fd5b61018061084b565b604080519115158252519081900360200190f35b6101ba600480360360208110156101aa57600080fd5b50356001600160a01b0316610854565b60408051918252519081900360200190f35b6101ef600480360360208110156101e257600080fd5b503563ffffffff16610866565b60405180876001600160401b03168152602001866001600160401b031681526020018561ffff168152602001846001600160401b03168152602001838152602001828152602001965050505050505060405180910390f35b6102736004803603604081101561025d57600080fd5b506001600160a01b038135169060200135610a98565b604080516001600160401b039092168252519081900360200190f35b610357600480360360808110156102a557600080fd5b63ffffffff823516916020810135916001600160401b0360408301351691908101906080810160608201356401000000008111156102e257600080fd5b8201836020820111156102f457600080fd5b8035906020019184600183028401116401000000008311171561031657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610abe945050505050565b604051808663ffffffff168152602001856001600160401b03168152602001846001600160401b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103c45781810151838201526020016103ac565b50505050905090810190601f1680156103f15780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6101806004803603604081101561041957600080fd5b50803563ffffffff1690602001356001600160401b03166114cb565b6102736004803603602081101561044b57600080fd5b50356115c7565b61046f6004803603602081101561046857600080fd5b5035611625565b604080519a15158b5260208b0199909952898901979097526060890195909552608088019390935260a08701919091526001600160401b0390811660c08701521660e085015215156101008401526001600160a01b031661012083015251908190036101400190f35b61046f600480360360408110156104ee57600080fd5b50803590602001356001600160401b031661169a565b610548600480360360a081101561051a57600080fd5b5063ffffffff813516906020810135906040810135906001600160401b036060820135169060800135611718565b604080516001600160401b03948516815292909316602083015215158183015290519081900360600190f35b6101ba61194b565b61046f6004803603604081101561059257600080fd5b50803590602001356001600160401b0316611951565b61046f600480360360408110156105be57600080fd5b506001600160a01b0381351690602001356119cf565b610357600480360360808110156105ea57600080fd5b63ffffffff823516916020810135916001600160401b03604083013516919081019060808101606082013564010000000081111561062757600080fd5b82018360208201111561063957600080fd5b8035906020019184600183028401116401000000008311171561065b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a4c945050505050565b6101ba612460565b6106c7600480360360208110156106ba57600080fd5b503563ffffffff16612466565b604080519a15158b526001600160401b03998a1660208c01529789168a89015261ffff96871660608b015294909516608089015291861660a088015290941660c086015260e085019390935261010084015261012083019190915251908190036101400190f35b6102736124d6565b6101ba6124e5565b61077c6004803603608081101561075457600080fd5b5063ffffffff813516906001600160401b036020820135169060408101359060600135612588565b6040805163ffffffff90951685526001600160401b03909316602085015261ffff909116838301526060830152519081900360800190f35b610273600480360360208110156107ca57600080fd5b503561375d565b6107d9613778565b6040805163ffffffff9092168252519081900360200190f35b6102736004803603604081101561080857600080fd5b506001600160a01b038135169060200135613789565b61046f6004803603602081101561083457600080fd5b50356137fd565b610180613870565b6101ba614280565b60005460ff1681565b600d6020526000908152604090205481565b600080548190819081908190819060ff166108b25760405162461bcd60e51b815260040180806020018281038252603a8152602001806144ee603a913960400191505060405180910390fd5b63ffffffff8716600090815260056020526040902054879060ff1661090c576040805162461bcd60e51b815260206004820152601660248201526000805160206145b7833981519152604482015290519081900360640190fd5b600560008963ffffffff1663ffffffff168152602001908152602001600020600201549250600560008963ffffffff1663ffffffff168152602001908152602001600020600401549150600088600560008b63ffffffff1663ffffffff16815260200190815260200160002060000160159054906101000a90046001600160401b0316604051602001808363ffffffff1660e01b8152600401826001600160401b031660c01b81526008019250505060405160208183030381529060405280519060200120905060066000336001600160a01b03166001600160a01b03168152602001908152602001600020600082815260200190815260200160002060000160009054906101000a900460ff1615610a435733600090815260066020908152604080832084845290915281206004015490945092505b505063ffffffff969096166000908152600560205260409020805460019091015461010082046001600160401b0390811699600160a81b8404821699600160881b90940461ffff169850911695509193509150565b600b6020908152600092835260408084209091529082529020546001600160401b031681565b6000805481908190819060609060ff16610b095760405162461bcd60e51b815260040180806020018281038252603a8152602001806144ee603a913960400191505060405180910390fd5b63ffffffff8916600090815260056020526040902054899060ff16610b63576040805162461bcd60e51b815260206004820152601660248201526000805160206145b7833981519152604482015290519081900360640190fd5b88610baa576040805162461bcd60e51b815260206004820152601260248201527107061796d656e7448617368203d3d203078360741b604482015290519081900360640190fd5b63ffffffff8a166000908152600560205260409020600101546001600160401b0316610c075760405162461bcd60e51b81526004018080602001828103825260298152602001806144706029913960400191505060405180910390fd5b41331480610c18575041600160981b145b610c69576040805162461bcd60e51b815260206004820152601c60248201527f696e76616c696420626c6f636b2e636f696e626173652076616c756500000000604482015290519081900360640190fd5b6040805160e08c901b6001600160e01b03191660208083019190915260248083018d905283518084039091018152604490920183528151918101919091206000818152600a90925291902060060154600160801b900460ff1615610d0d576040805162461bcd60e51b81526020600482015260166024820152753830bcb6b2b73a1030b63932b0b23c90383937bb32b760511b604482015290519081900360640190fd5b63ffffffff8b166000908152600560205260409020600101546001600160401b03908116908a1610610d705760405162461bcd60e51b815260040180806020018281038252602e815260200180614442602e913960400191505060405180910390fd5b63ffffffff8b166000908152600560205260409020546001600160401b036101008204811691600160481b90041615610e515763ffffffff8c16600090815260056020526040902080546001909101546001600160401b03600160481b830481166101009093048116918116919091031611610e1d5760405162461bcd60e51b815260040180806020018281038252603981526020018061457e6039913960400191505060405180910390fd5b5063ffffffff8b16600090815260056020526040902080546001909101546001600160401b03600160481b90920482169116035b806001600160401b03168a6001600160401b03161015610eb8576040805162461bcd60e51b815260206004820152601a60248201527f6c6564676572203c20696e646578536561726368526567696f6e000000000000604482015290519081900360640190fd5b60008281526008602090815260408083206001600160401b038e16845290915281205460ff16156110415760008381526008602090815260408083206001600160401b038f168452909152902060040154421015610f475760405162461bcd60e51b81526004018080602001828103825260498152602001806143656049913960600191505060405180910390fd5b60008381526008602090815260408083206001600160401b038f1684529091529020600501548c14610fb6576040805162461bcd60e51b81526020600482015260136024820152720d2dcecc2d8d2c840e0c2f2dacadce890c2e6d606b1b604482015290519081900360640190fd5b426003546008600086815260200190815260200160002060008e6001600160401b03166001600160401b0316815260200190815260200160002060030154011161103c576040805162461bcd60e51b815260206004820152601260248201527172657665616c20697320746f6f206c61746560701b604482015290519081900360640190fd5b61107d565b413314801590611054575041600160981b145b1561107d575063ffffffff8c166000908152600560205260409020600101546001600160401b03165b4133148015611090575041600160981b14155b156114ba5760008381526008602090815260408083206001600160401b038f16845290915290205460ff16611269576040518061014001604052806001151581526020016000801b81526020016000801b8152602001428152602001600254420181526020018d81526020018c6001600160401b03168152602001836001600160401b03168152602001600015158152602001336001600160a01b03168152506008600085815260200190815260200160002060008d6001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160060160086101000a8154816001600160401b0302191690836001600160401b031602179055506101008201518160060160106101000a81548160ff0219169083151502179055506101208201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506114ba565b6040518061014001604052806001151581526020016000801b81526020016000801b8152602001600081526020014281526020018d81526020018c6001600160401b03168152602001836001600160401b03168152602001600115158152602001336001600160a01b0316815250600a600085815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160060160086101000a8154816001600160401b0302191690836001600160401b031602179055506101008201518160060160106101000a81548160ff0219169083151502179055506101208201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507ff794f5b9b6791b3ab0eb97342cf2efbb7e710a478d4512a2505ea60c93fd85d38d8c8c8f33604051808663ffffffff168152602001856001600160401b0316815260200180602001848152602001836001600160a01b03168152602001828103825285818151815260200191508051906020019080838360005b8381101561147b578181015183820152602001611463565b50505050905090810190601f1680156114a85780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a15b9b9c999b9a99975050505050505050565b6000805460ff1661150d5760405162461bcd60e51b815260040180806020018281038252603a8152602001806144ee603a913960400191505060405180910390fd5b63ffffffff8316600090815260056020526040902054839060ff16611567576040805162461bcd60e51b815260206004820152601660248201526000805160206145b7833981519152604482015290519081900360640190fd5b50506040805160e09390931b6001600160e01b03191660208085019190915260c09290921b6001600160c01b03191660248401528051808403600c018152602c909301815282519282019290922060009081526007909152205460ff1690565b6000805460ff166116095760405162461bcd60e51b815260040180806020018281038252603a8152602001806144ee603a913960400191505060405180910390fd5b506000908152600c60205260409020546001600160401b031690565b60076020819052600091825260409091208054600182015460028301546003840154600485015460058601546006870154969097015460ff95861697949693959294919391926001600160401b0380841693600160401b810490911692600160801b909104909116906001600160a01b03168a565b60086020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460079097015460ff96871697959694959394929391926001600160401b0380841693600160401b810490911692600160801b909104909116906001600160a01b03168a565b600080548190819060ff1661175e5760405162461bcd60e51b815260040180806020018281038252603a8152602001806144ee603a913960400191505060405180910390fd5b63ffffffff8816600090815260056020526040902054889060ff166117b8576040805162461bcd60e51b815260206004820152601660248201526000805160206145b7833981519152604482015290519081900360640190fd5b604080516001600160401b0388166020808301919091528251808303820181528284018452805190820120606083018c9052608083018b905260a083015260c08083018990528351808403909101815260e08084018552815191830191909120908d901b6001600160e01b0319166101008401526101048084018290528451808503909101815261012490930184528251928201929092206000818152600a9092529290205490919060ff166118ae576040805162461bcd60e51b81526020600482015260166024820152751c185e5b595b9d08191bd95cc81b9bdd08195e1a5cdd60521b604482015290519081900360640190fd5b6000818152600a60205260409020600501548214611909576040805162461bcd60e51b81526020600482015260136024820152720d2dcecc2d8d2c840e0c2f2dacadce890c2e6d606b1b604482015290519081900360640190fd5b6000908152600a60205260409020600601546001600160401b038082169c600160401b83049091169b50600160801b90910460ff169950975050505050505050565b60025481565b60096020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460079097015460ff96871697959694959394929391926001600160401b0380841693600160401b810490911692600160801b909104909116906001600160a01b03168a565b600660208181526000938452604080852090915291835291208054600182015460028301546003840154600485015460058601549686015460079096015460ff95861697949693959294919391926001600160401b0380841693600160401b810490911692600160801b909104909116906001600160a01b03168a565b6000805481908190819060609060ff16611a975760405162461bcd60e51b815260040180806020018281038252603a8152602001806144ee603a913960400191505060405180910390fd5b63ffffffff8916600090815260056020526040902054899060ff16611af1576040805162461bcd60e51b815260206004820152601660248201526000805160206145b7833981519152604482015290519081900360640190fd5b88611b38576040805162461bcd60e51b815260206004820152601260248201527107061796d656e7448617368203d3d203078360741b604482015290519081900360640190fd5b63ffffffff8a166000908152600560205260409020600101546001600160401b0316611b955760405162461bcd60e51b81526004018080602001828103825260298152602001806144706029913960400191505060405180910390fd5b41331480611ba6575041600160981b145b611bf7576040805162461bcd60e51b815260206004820152601c60248201527f696e76616c696420626c6f636b2e636f696e626173652076616c756500000000604482015290519081900360640190fd5b6040805160e08c901b6001600160e01b03191660208083019190915260248083018d905283518084039091018152604490920183528151918101919091206000818152600a90925291902060060154600160801b900460ff1615611c98576040805162461bcd60e51b81526020600482015260136024820152723a3c24b21030b63932b0b23c90383937bb32b760691b604482015290519081900360640190fd5b6000818152600a60205260409020600601546001600160401b03808b16911610611cf35760405162461bcd60e51b815260040180806020018281038252602f8152602001806143ae602f913960400191505060405180910390fd5b63ffffffff8b166000908152600560205260409020600101546001600160401b03908116908a1610611d565760405162461bcd60e51b815260040180806020018281038252602e815260200180614442602e913960400191505060405180910390fd5b63ffffffff8b166000908152600560205260409020546001600160401b036101008204811691600160481b90041615611e375763ffffffff8c16600090815260056020526040902080546001909101546001600160401b03600160481b830481166101009093048116918116919091031611611e035760405162461bcd60e51b815260040180806020018281038252603981526020018061457e6039913960400191505060405180910390fd5b5063ffffffff8b16600090815260056020526040902080546001909101546001600160401b03600160481b90920482169116035b806001600160401b03168a6001600160401b03161015611e9e576040805162461bcd60e51b815260206004820152601a60248201527f6c6564676572203c20696e646578536561726368526567696f6e000000000000604482015290519081900360640190fd5b60008281526009602090815260408083206001600160401b038e16845290915281205460ff16156120275760008381526009602090815260408083206001600160401b038f168452909152902060040154421015611f2d5760405162461bcd60e51b81526004018080602001828103825260548152602001806142876054913960600191505060405180910390fd5b60008381526009602090815260408083206001600160401b038f1684529091529020600501548c14611f9c576040805162461bcd60e51b81526020600482015260136024820152720d2dcecc2d8d2c840e0c2f2dacadce890c2e6d606b1b604482015290519081900360640190fd5b426003546009600086815260200190815260200160002060008e6001600160401b03166001600160401b03168152602001908152602001600020600301540111612022576040805162461bcd60e51b815260206004820152601260248201527172657665616c20697320746f6f206c61746560701b604482015290519081900360640190fd5b612063565b41331480159061203a575041600160981b145b15612063575063ffffffff8c166000908152600560205260409020600101546001600160401b03165b4133148015612076575041600160981b14155b156114ba5760008381526009602090815260408083206001600160401b038f16845290915290205460ff1661224f576040518061014001604052806001151581526020016000801b81526020016000801b8152602001428152602001600254420181526020018d81526020018c6001600160401b03168152602001836001600160401b03168152602001600015158152602001336001600160a01b03168152506009600085815260200190815260200160002060008d6001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160060160086101000a8154816001600160401b0302191690836001600160401b031602179055506101008201518160060160106101000a81548160ff0219169083151502179055506101208201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506114ba565b6040518061014001604052806001151581526020016000801b81526020016000801b8152602001600081526020014281526020018d81526020018c6001600160401b03168152602001836001600160401b03168152602001600015158152602001336001600160a01b0316815250600a600085815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160060160086101000a8154816001600160401b0302191690836001600160401b031602179055506101008201518160060160106101000a81548160ff0219169083151502179055506101208201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507ff794f5b9b6791b3ab0eb97342cf2efbb7e710a478d4512a2505ea60c93fd85d38d8c8c8f33604051808663ffffffff168152602001856001600160401b0316815260200180602001848152602001836001600160a01b03168152602001828103825285818151815260200191508051906020019080838360008381101561147b578181015183820152602001611463565b60035481565b6005602052600090815260409020805460018201546002830154600384015460049094015460ff8416946001600160401b036101008604811695600160481b810482169561ffff600160881b8304811696600160981b840490911695600160a81b9093048416949190931692918a565b6004546001600160401b031681565b6000805460ff166125275760405162461bcd60e51b815260040180806020018281038252603a8152602001806144ee603a913960400191505060405180910390fd5b60015442116125675760405162461bcd60e51b81526004018080602001828103825260218152602001806145286021913960400191505060405180910390fd5b6004546001546001600160401b039091169042038161258257fe5b04905090565b6000805481908190819060ff166125d05760405162461bcd60e51b815260040180806020018281038252603a8152602001806144ee603a913960400191505060405180910390fd5b63ffffffff8816600090815260056020526040902054889060ff1661262a576040805162461bcd60e51b815260206004820152601660248201526000805160206145b7833981519152604482015290519081900360640190fd5b336000908152600d602052604090205442116126775760405162461bcd60e51b81526004018080602001828103825260458152602001806143dd6045913960600191505060405180910390fd5b866126b35760405162461bcd60e51b81526004018080602001828103825260218152602001806145d76021913960400191505060405180910390fd5b856126fb576040805162461bcd60e51b81526020600482015260136024820152720636861696e54697048617368203d3d2030783606c1b604482015290519081900360640190fd5b63ffffffff8916600090815260056020526040902054600160981b900461ffff166127575760405162461bcd60e51b81526004018080602001828103825260248152602001806144ca6024913960400191505060405180910390fd5b41331480612768575041600160981b145b6127b9576040805162461bcd60e51b815260206004820152601c60248201527f696e76616c696420626c6f636b2e636f696e626173652076616c756500000000604482015290519081900360640190fd5b63ffffffff891660009081526005602052604090208054600190910154600160881b90910461ffff166001600160401b0391821601811690891614612836576040805162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b2103632b233b2b960911b604482015290519081900360640190fd5b63ffffffff8916600090815260056020526040902060020154421161288c5760405162461bcd60e51b81526004018080602001828103825260358152602001806145496035913960400191505060405180910390fd5b63ffffffff89166000908152600560205260409020600381015460049091015460020210156129215763ffffffff89166000908152600560205260409020600481015460029182015491024291909103600302101561291c5760405162461bcd60e51b815260040180806020018281038252602c815260200180614339602c913960400191505060405180910390fd5b612983565b63ffffffff8916600090815260056020526040902060048101546002909101544203600f0110156129835760405162461bcd60e51b815260040180806020018281038252602c815260200180614339602c913960400191505060405180910390fd5b63ffffffff8916600090815260056020908152604080832054815160e08e901b6001600160e01b03191681850152600160a81b90910460c01b6001600160c01b03191660248201528151808203600c018152602c9091018252805190830120808452600790925290912060060154600160801b900460ff1615612a4d576040805162461bcd60e51b815260206004820152601e60248201527f6c6f636174696f6e4861736820616c72656164792066696e616c697365640000604482015290519081900360640190fd5b63ffffffff8a16600090815260056020526040902054600160a81b90046001600160401b031615612b595760008a6001600560008e63ffffffff1663ffffffff16815260200190815260200160002060000160159054906101000a90046001600160401b031603604051602001808363ffffffff1660e01b8152600401826001600160401b031660c01b8152600801925050506040516020818303038152906040528051906020012090506007600082815260200190815260200160002060060160109054906101000a900460ff16612b575760405162461bcd60e51b81526004018080602001828103825260318152602001806144996031913960400191505060405180910390fd5b505b33600090815260066020908152604080832084845290915281205460ff1615612ce157336000908152600660209081526040808320858452909152902060040154421015612bd85760405162461bcd60e51b815260040180806020018281038252605e8152602001806142db605e913960600191505060405180910390fd5b6040805133606081901b60208084019190915260348084018d90528451808503909101815260549093018452825192810192909220600091825260068352838220868352909252919091206002015414612c70576040805162461bcd60e51b81526020600482015260146024820152730d2dcecc2d8d2c840c6d0c2d2dca8d2e090c2e6d60631b604482015290519081900360640190fd5b6003805433600090815260066020908152604080832087845290915290209091015442910111612cdc576040805162461bcd60e51b815260206004820152601260248201527172657665616c20697320746f6f206c61746560701b604482015290519081900360640190fd5b612d1c565b413314801590612cf4575041600160981b145b15612d1c575063ffffffff8a16600090815260056020526040902054600160981b900461ffff165b4133148015612d2f575041600160981b14155b156137485733600090815260066020908152604080832085845290915290205460ff16612f8b5763ffffffff8b1660009081526005602052604090206004015460028054910490811015612d8257506002545b6040518061014001604052806001151581526020018b81526020018a815260200142815260200182420181526020016000801b81526020018c6001600160401b0316815260200160006001600160401b0316815260200160001515815260200160006001600160a01b031681525060066000336001600160a01b03166001600160a01b03168152602001908152602001600020600085815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160060160086101000a8154816001600160401b0302191690836001600160401b031602179055506101008201518160060160106101000a81548160ff0219169083151502179055506101208201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506000805160206144228339815191528c8c600033604051808563ffffffff168152602001846001600160401b03168152602001836003811115612f6357fe5b8152602001826001600160a01b0316815260200194505050505060405180910390a150613748565b63ffffffff8b16600090815260056020526040902054600160981b810461ffff16600160a81b9091046001600160401b0316111561335c5760008b600560008e63ffffffff1663ffffffff16815260200190815260200160002060000160139054906101000a900461ffff1661ffff16600560008f63ffffffff1663ffffffff16815260200190815260200160002060000160159054906101000a90046001600160401b031603604051602001808363ffffffff1660e01b8152600401826001600160401b031660c01b815260080192505050604051602081830303815290604052805190602001209050896007600083815260200190815260200160002060050154141561321e57600061309e6124e5565b90506001600b60006007600086815260200190815260200160002060070160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020600083815260200190815260200160002060008282829054906101000a90046001600160401b03160192506101000a8154816001600160401b0302191690836001600160401b031602179055506001600c600083815260200190815260200160002060008282829054906101000a90046001600160401b03160192506101000a8154816001600160401b0302191690836001600160401b031602179055506000805160206144228339815191528d8d60026007600087815260200190815260200160002060070160009054906101000a90046001600160a01b0316604051808563ffffffff168152602001846001600160401b031681526020018360038111156131f657fe5b8152602001826001600160a01b0316815260200194505050505060405180910390a150613356565b600560008d63ffffffff1663ffffffff16815260200190815260200160002060030154600560008e63ffffffff1663ffffffff16815260200190815260200160002060000160139054906101000a900461ffff1661ffff16024201600d60006007600085815260200190815260200160002060070160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055506000805160206144228339815191528c8c60036007600086815260200190815260200160002060070160009054906101000a90046001600160a01b0316604051808563ffffffff168152602001846001600160401b0316815260200183600381111561333357fe5b8152602001826001600160a01b0316815260200194505050505060405180910390a15b506133be565b6000805160206144228339815191528b8b600133604051808563ffffffff168152602001846001600160401b0316815260200183600381111561339b57fe5b8152602001826001600160a01b0316815260200194505050505060405180910390a15b6040518061014001604052806001151581526020018a81526020016000801b815260200160066000336001600160a01b03166001600160a01b0316815260200190815260200160002060008581526020019081526020016000206003015481526020014281526020018981526020018b6001600160401b0316815260200160006001600160401b03168152602001600115158152602001336001600160a01b03168152506007600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160060160086101000a8154816001600160401b0302191690836001600160401b031602179055506101008201518160060160106101000a81548160ff0219169083151502179055506101208201518160070160006101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506001600560008d63ffffffff1663ffffffff16815260200190815260200160002060000160158282829054906101000a90046001600160401b03160192506101000a8154816001600160401b0302191690836001600160401b0316021790555089600560008d63ffffffff1663ffffffff16815260200190815260200160002060010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060006002600560008e63ffffffff1663ffffffff16815260200190815260200160002060040154600560008f63ffffffff1663ffffffff1681526020019081526020016000206002015460066000336001600160a01b03166001600160a01b031681526020019081526020016000206000878152602001908152602001600020600301540301816136a757fe5b63ffffffff8e1660009081526005602052604090206003015491900491506002028111156136f75763ffffffff8c1660009081526005602052604090206003810154600202600490910155613713565b63ffffffff8c1660009081526005602052604090206004018190555b5033600090815260066020908152604080832085845282528083206003015463ffffffff8f1684526005909252909120600201555b999a6000199990990199989650505050505050565b600c602052600090815260409020546001600160401b031681565b600054610100900463ffffffff1681565b6000805460ff166137cb5760405162461bcd60e51b815260040180806020018281038252603a8152602001806144ee603a913960400191505060405180910390fd5b506001600160a01b03919091166000908152600b6020908152604080832093835292905220546001600160401b031690565b600a602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff96871697959694959394929391926001600160401b0380841693600160401b810490911692600160801b909104909116906001600160a01b03168a565b6000805460ff16156138c0576040805162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b604482015290519081900360640190fd5b604051806101400160405280600115158152602001620a84946001600160401b0316815260200160006001600160401b03168152602001600161ffff168152602001600461ffff16815260200160006001600160401b03168152602001620a84946001600160401b031681526020014281526020016103848152602001601e815250600560008063ffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160096101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160116101000a81548161ffff021916908361ffff16021790555060808201518160000160136101000a81548161ffff021916908361ffff16021790555060a08201518160000160156101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e0820151816002015561010082015181600301556101208201518160040155905050604051806101400160405280600115158152602001621fd4de6001600160401b0316815260200160006001600160401b03168152602001600161ffff168152602001600c61ffff16815260200160006001600160401b03168152602001621fd4de6001600160401b0316815260200142815260200160968152602001601e81525060056000600163ffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160096101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160116101000a81548161ffff021916908361ffff16021790555060808201518160000160136101000a81548161ffff021916908361ffff16021790555060a08201518160000160156101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e0820151816002015561010082015181600301556101208201518160040155905050604051806101400160405280600115158152602001623980b46001600160401b0316815260200160006001600160401b03168152602001600261ffff168152602001602861ffff16815260200160006001600160401b03168152602001623980b46001600160401b0316815260200142815260200160788152602001601e81525060056000600263ffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160096101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160116101000a81548161ffff021916908361ffff16021790555060808201518160000160136101000a81548161ffff021916908361ffff16021790555060a08201518160000160156101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160020155610100820151816003015561012082015181600401559050506040518061014001604052806001151581526020016303bf79006001600160401b0316815260200160006001600160401b03168152602001601e61ffff168152602001600161ffff16815260200160006001600160401b031681526020016303bf79006001600160401b0316815260200142815260200160788152602001601e81525060056000600363ffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160096101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160116101000a81548161ffff021916908361ffff16021790555060808201518160000160136101000a81548161ffff021916908361ffff16021790555060a08201518160000160156101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e082015181600201556101008201518160030155610120820151816004015590505060405180610140016040528060011515815260200162f6ba806001600160401b0316815260200160006001600160401b03168152602001601a61ffff168152602001600161ffff16815260200160006001600160401b0316815260200162f6ba806001600160401b0316815260200142815260200160788152602001601e81525060056000600463ffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160000160096101000a8154816001600160401b0302191690836001600160401b0316021790555060608201518160000160116101000a81548161ffff021916908361ffff16021790555060808201518160000160136101000a81548161ffff021916908361ffff16021790555060a08201518160000160156101000a8154816001600160401b0302191690836001600160401b0316021790555060c08201518160010160006101000a8154816001600160401b0302191690836001600160401b0316021790555060e08201518160020155610100820151816003015561012082015181600401559050506005600060016101000a81548163ffffffff021916908363ffffffff160217905550601e6002819055506201518060038190555062093a80600460006101000a8154816001600160401b0302191690836001600160401b031602179055504260018190555060016000806101000a81548160ff0219169083151502179055506001905090565b6001548156fe626c6f636b2e74696d657374616d70203c2070726f706f7365644e6f6e5061796d656e7450726f6f66735b6c6f636174696f6e486173685d5b6c65646765725d2e7065726d697474656452657665616c54696d65626c6f636b2e74696d657374616d70203c2070726f706f73656444617461417661696c6162696c69747950726f6f66735b6d73672e73656e6465725d5b6c6f636174696f6e486173685d2e7065726d697474656452657665616c54696d656e6f7420656e6f7567682074696d6520656c61707365642073696e6365207072696f722066696e616c697479626c6f636b2e74696d657374616d70203c2070726f706f7365645061796d656e7450726f6f66735b6c6f636174696f6e486173685d2e7065726d697474656452657665616c54696d6566696e616c697365645061796d656e74735b6c6f636174696f6e486173685d2e696e646578203e3d206c65646765726d73672e73656e6465722069732063757272656e746c792062616e6e656420666f722073656e64696e6720616e20756e616363657074656420636861696e546970486173685d63f7a167c8b58acdc7fe63a4a0972032b67a76b50a2d5fd8d64061f44952316c6564676572203e3d20636861696e735b636861696e49645d2e66696e616c697365644c6564676572496e646578636861696e735b636861696e49645d2e66696e616c697365644c6564676572496e646578203d3d203070726576696f75732064617461417661696c6162696c697479506572696f64206e6f74207965742066696e616c69736564636861696e735b636861696e49645d2e6e756d436f6e6669726d6174696f6e73203e2030737461746520636f6e6e6563746f72206973206e6f7420696e697469616c697365642c2072756e20696e697469616c697365436861696e732829626c6f636b2e74696d657374616d70203c3d20696e697469616c69736554696d65626c6f636b2e74696d657374616d70203c3d20636861696e735b636861696e49645d2e66696e616c6973656454696d657374616d7066696e616c697365644c6564676572496e646578202d2067656e657369734c6564676572203c3d206c6564676572486973746f727953697a65636861696e496420646f6573206e6f742065786973740000000000000000000064617461417661696c6162696c697479506572696f6448617368203d3d20307830a26469706673582212209aec6c293dc2b1ff65eed9d71736d7da7ca3d806bfbd209f092ee91d3612309464736f6c63430007060033