ETH Price: $2,671.54 (-0.69%)

Contract

0x6af9dA8dB1925F8ef359274A59eF01e1c6Df7bE0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
160477292022-11-25 14:54:47805 days ago1669388087  Contract Creation0 ETH
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x950cB8dd...C33E28392
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Pile

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : pile.sol
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2018  Rain <[email protected]>, Centrifuge
pragma solidity >=0.7.6;

import "tinlake-math/interest.sol";
import "tinlake-auth/auth.sol";

/// @notice Pile Contract to manage different interest groups of debt
/// The following is one implementation of a debt module.
/// It keeps track of different buckets of interest rates and is optimized for many loans per interest bucket.
/// Each bucket holds it own rate accumulators (chi values). It calculates debt for each
/// loan according to its interest rate category and pie value.
contract Pile is Auth, Interest {
    /// @notice stores all needed information of an interest rate group
    struct Rate {
        // total debt of all loans with this rate
        uint256 pie;
        // accumlated rate index over time
        uint256 chi;
        // interest rate per second
        uint256 ratePerSecond;
        // last time the rate was accumulated
        uint48 lastUpdated;
        // fixed rate applied to each loan of the group
        uint256 fixedRate;
    }

    /// @notice Interest Rate Groups are identified by a `uint` and stored in a mapping
    mapping(uint256 => Rate) public rates;

    /// @notice mapping of all loan debts
    /// the debt is stored as pie
    /// pie is defined as pie = debt/chi therefore debt = pie * chi
    /// where chi is the accumulated interest rate index over time
    mapping(uint256 => uint256) public pie;

    /// @notice mapping from loan => rate
    mapping(uint256 => uint256) public loanRates;

    /// Events
    event IncreaseDebt(uint256 indexed loan, uint256 currencyAmount);
    event DecreaseDebt(uint256 indexed loan, uint256 currencyAmount);
    event SetRate(uint256 indexed loan, uint256 rate);
    event ChangeRate(uint256 indexed loan, uint256 newRate);
    event File(bytes32 indexed what, uint256 rate, uint256 value);

    constructor() {
        // pre-definition for loans without interest rates
        rates[0].chi = ONE;
        rates[0].ratePerSecond = ONE;

        wards[msg.sender] = 1;
        emit Rely(msg.sender);
    }

    /// @notice file manages different state configs for the pile
    /// only a ward can call this function
    /// @param what what config to change
    /// @param rate the interest rate group
    /// @param value the value to change
    function file(bytes32 what, uint256 rate, uint256 value) external auth {
        if (what == "rate") {
            require(value != 0, "rate-per-second-can-not-be-0");
            if (rates[rate].chi == 0) {
                rates[rate].chi = ONE;
                rates[rate].lastUpdated = uint48(block.timestamp);
            } else {
                drip(rate);
            }
            rates[rate].ratePerSecond = value;
        } else if (what == "fixedRate") {
            rates[rate].fixedRate = value;
        } else {
            revert("unknown parameter");
        }

        emit File(what, rate, value);
    }

    /// @notice increases the debt of a loan by a currencyAmount
    /// a change of the loan debt updates the rate debt and total debt
    /// @param loan the id of the loan
    /// @param currencyAmount the amount of currency to be added to the loan debt
    function incDebt(uint256 loan, uint256 currencyAmount) external auth {
        uint256 rate = loanRates[loan];
        require(block.timestamp == rates[rate].lastUpdated, "rate-group-not-updated");
        currencyAmount = safeAdd(currencyAmount, rmul(currencyAmount, rates[rate].fixedRate));
        uint256 pieAmount = toPie(rates[rate].chi, currencyAmount);

        pie[loan] = safeAdd(pie[loan], pieAmount);
        rates[rate].pie = safeAdd(rates[rate].pie, pieAmount);

        emit IncreaseDebt(loan, currencyAmount);
    }

    /// @notice decrease the loan's debt by a currencyAmount
    /// a change of the loan debt updates the rate debt and total debt
    /// @param loan the id of the loan
    /// @param currencyAmount the amount of currency to be removed from the loan debt
    function decDebt(uint256 loan, uint256 currencyAmount) external auth {
        uint256 rate = loanRates[loan];
        require(block.timestamp == rates[rate].lastUpdated, "rate-group-not-updated");
        uint256 pieAmount = toPie(rates[rate].chi, currencyAmount);

        pie[loan] = safeSub(pie[loan], pieAmount);
        rates[rate].pie = safeSub(rates[rate].pie, pieAmount);

        emit DecreaseDebt(loan, currencyAmount);
    }

    /// @notice returns the current debt based on actual block.timestamp (now)
    /// @param loan the id of the loan
    /// @return loanDebt debt of the loan
    function debt(uint256 loan) external view returns (uint256 loanDebt) {
        uint256 rate_ = loanRates[loan];
        uint256 chi_ = rates[rate_].chi;
        if (block.timestamp >= rates[rate_].lastUpdated) {
            chi_ = chargeInterest(rates[rate_].chi, rates[rate_].ratePerSecond, rates[rate_].lastUpdated);
        }
        return toAmount(chi_, pie[loan]);
    }

    /// @notice returns the total debt of a interest rate group
    /// @param rate the id of the interest rate group
    /// @return totalDebt total debt of the interest rate group
    function rateDebt(uint256 rate) external view returns (uint256 totalDebt) {
        uint256 chi_ = rates[rate].chi;
        uint256 pie_ = rates[rate].pie;

        if (block.timestamp >= rates[rate].lastUpdated) {
            chi_ = chargeInterest(rates[rate].chi, rates[rate].ratePerSecond, rates[rate].lastUpdated);
        }
        return toAmount(chi_, pie_);
    }

    /// @notice set rate loanRates for a loan
    /// @param loan the id of the loan
    /// @param rate the id of the interest rate group
    function setRate(uint256 loan, uint256 rate) external auth {
        require(pie[loan] == 0, "non-zero-debt");
        // rate category has to be initiated
        require(rates[rate].chi != 0, "rate-group-not-set");
        loanRates[loan] = rate;
        emit SetRate(loan, rate);
    }

    /// @notice change rate loanRates for a loan
    /// @param loan the id of the loan
    /// @param newRate the id ofthe new interest rate group
    function changeRate(uint256 loan, uint256 newRate) external auth {
        require(rates[newRate].chi != 0, "rate-group-not-set");
        uint256 currentRate = loanRates[loan];
        drip(currentRate);
        drip(newRate);
        uint256 pie_ = pie[loan];
        uint256 debt_ = toAmount(rates[currentRate].chi, pie_);
        rates[currentRate].pie = safeSub(rates[currentRate].pie, pie_);
        pie[loan] = toPie(rates[newRate].chi, debt_);
        rates[newRate].pie = safeAdd(rates[newRate].pie, pie[loan]);
        loanRates[loan] = newRate;
        emit ChangeRate(loan, newRate);
    }

    /// @notice calls drip on the given loan
    /// @param loan the id of the loan
    function accrue(uint256 loan) external {
        drip(loanRates[loan]);
    }

    /// @notice drip updates the chi of the rate category by compounding the interest
    /// @param rate the id of the interest rate group
    function drip(uint256 rate) public {
        if (block.timestamp >= rates[rate].lastUpdated) {
            (uint256 chi,) =
                compounding(rates[rate].chi, rates[rate].ratePerSecond, rates[rate].lastUpdated, rates[rate].pie);
            rates[rate].chi = chi;
            rates[rate].lastUpdated = uint48(block.timestamp);
        }
    }
}

File 2 of 4 : auth.sol
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) Centrifuge 2020, based on MakerDAO dss https://github.com/makerdao/dss
pragma solidity >=0.5.15;

contract Auth {
    mapping (address => uint256) public wards;
    
    event Rely(address indexed usr);
    event Deny(address indexed usr);

    function rely(address usr) external auth {
        wards[usr] = 1;
        emit Rely(usr);
    }
    function deny(address usr) external auth {
        wards[usr] = 0;
        emit Deny(usr);
    }

    modifier auth {
        require(wards[msg.sender] == 1, "not-authorized");
        _;
    }

}

File 3 of 4 : interest.sol
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2018 Rain <[email protected]> and Centrifuge, referencing MakerDAO dss => https://github.com/makerdao/dss/blob/master/src/pot.sol
pragma solidity >=0.5.15;

import "./math.sol";

contract Interest is Math {
    // @notice This function provides compounding in seconds
    // @param chi Accumulated interest rate over time
    // @param ratePerSecond Interest rate accumulation per second in RAD(10ˆ27)
    // @param lastUpdated When the interest rate was last updated
    // @param pie Total sum of all amounts accumulating under one interest rate, divided by that rate
    // @return The new accumulated rate, as well as the difference between the debt calculated with the old and new accumulated rates.
    function compounding(uint chi, uint ratePerSecond, uint lastUpdated, uint pie) public view returns (uint, uint) {
        require(block.timestamp >= lastUpdated, "tinlake-math/invalid-timestamp");
        require(chi != 0);
        // instead of a interestBearingAmount we use a accumulated interest rate index (chi)
        uint updatedChi = _chargeInterest(chi ,ratePerSecond, lastUpdated, block.timestamp);
        return (updatedChi, safeSub(rmul(updatedChi, pie), rmul(chi, pie)));
    }

    // @notice This function charge interest on a interestBearingAmount
    // @param interestBearingAmount is the interest bearing amount
    // @param ratePerSecond Interest rate accumulation per second in RAD(10ˆ27)
    // @param lastUpdated last time the interest has been charged
    // @return interestBearingAmount + interest
    function chargeInterest(uint interestBearingAmount, uint ratePerSecond, uint lastUpdated) public view returns (uint) {
        if (block.timestamp >= lastUpdated) {
            interestBearingAmount = _chargeInterest(interestBearingAmount, ratePerSecond, lastUpdated, block.timestamp);
        }
        return interestBearingAmount;
    }

    function _chargeInterest(uint interestBearingAmount, uint ratePerSecond, uint lastUpdated, uint current) internal pure returns (uint) {
        return rmul(rpow(ratePerSecond, current - lastUpdated, ONE), interestBearingAmount);
    }


    // convert pie to debt/savings amount
    function toAmount(uint chi, uint pie) public pure returns (uint) {
        return rmul(pie, chi);
    }

    // convert debt/savings amount to pie
    function toPie(uint chi, uint amount) public pure returns (uint) {
        return rdivup(amount, chi);
    }

    function rpow(uint x, uint n, uint base) public pure returns (uint z) {
        assembly {
            switch x case 0 {switch n case 0 {z := base} default {z := 0}}
            default {
                switch mod(n, 2) case 0 { z := base } default { z := x }
                let half := div(base, 2)  // for rounding.
                for { n := div(n, 2) } n { n := div(n,2) } {
                let xx := mul(x, x)
                if iszero(eq(div(xx, x), x)) { revert(0,0) }
                let xxRound := add(xx, half)
                if lt(xxRound, xx) { revert(0,0) }
                x := div(xxRound, base)
                if mod(n,2) {
                    let zx := mul(z, x)
                    if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0,0) }
                    let zxRound := add(zx, half)
                    if lt(zxRound, zx) { revert(0,0) }
                    z := div(zxRound, base)
                }
            }
            }
        }
    }
}

File 4 of 4 : math.sol
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2018 Rain <[email protected]>
pragma solidity >=0.5.15;

contract Math {
    uint256 constant ONE = 10 ** 27;

    function safeAdd(uint x, uint y) public pure returns (uint z) {
        require((z = x + y) >= x, "safe-add-failed");
    }

    function safeSub(uint x, uint y) public pure returns (uint z) {
        require((z = x - y) <= x, "safe-sub-failed");
    }

    function safeMul(uint x, uint y) public pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, "safe-mul-failed");
    }

    function safeDiv(uint x, uint y) public pure returns (uint z) {
        z = x / y;
    }

    function rmul(uint x, uint y) public pure returns (uint z) {
        z = safeMul(x, y) / ONE;
    }

    function rdiv(uint x, uint y) public pure returns (uint z) {
        require(y > 0, "division by zero");
        z = safeAdd(safeMul(x, ONE), y / 2) / y;
    }

    function rdivup(uint x, uint y) internal pure returns (uint z) {
        require(y > 0, "division by zero");
        // always rounds up
        z = safeAdd(safeMul(x, ONE), safeSub(y, 1)) / y;
    }


}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "tinlake-auth/=lib/tinlake-auth/src/",
    "tinlake-erc20/=lib/tinlake-erc20/src/",
    "tinlake-math/=lib/tinlake-math/src/",
    "tinlake-title/=lib/tinlake-title/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "istanbul",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"loan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"ChangeRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"loan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currencyAmount","type":"uint256"}],"name":"DecreaseDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"what","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"File","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"loan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currencyAmount","type":"uint256"}],"name":"IncreaseDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"loan","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"SetRate","type":"event"},{"inputs":[{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"accrue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"changeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interestBearingAmount","type":"uint256"},{"internalType":"uint256","name":"ratePerSecond","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"name":"chargeInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chi","type":"uint256"},{"internalType":"uint256","name":"ratePerSecond","type":"uint256"},{"internalType":"uint256","name":"lastUpdated","type":"uint256"},{"internalType":"uint256","name":"pie","type":"uint256"}],"name":"compounding","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"loan","type":"uint256"}],"name":"debt","outputs":[{"internalType":"uint256","name":"loanDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"currencyAmount","type":"uint256"}],"name":"decDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"drip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"file","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"currencyAmount","type":"uint256"}],"name":"incDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pie","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"rateDebt","outputs":[{"internalType":"uint256","name":"totalDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rates","outputs":[{"internalType":"uint256","name":"pie","type":"uint256"},{"internalType":"uint256","name":"chi","type":"uint256"},{"internalType":"uint256","name":"ratePerSecond","type":"uint256"},{"internalType":"uint48","name":"lastUpdated","type":"uint48"},{"internalType":"uint256","name":"fixedRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rdiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rmul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"},{"internalType":"uint256","name":"base","type":"uint256"}],"name":"rpow","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"safeAdd","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"safeDiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"safeMul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"safeSub","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"setRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chi","type":"uint256"},{"internalType":"uint256","name":"pie","type":"uint256"}],"name":"toAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"chi","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"toPie","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806386c1762a116100de578063b5931f7c11610097578063d7affae311610071578063d7affae31461049a578063dd418ae2146104c3578063e4064a7714610513578063e6cb90131461055b5761018e565b8063b5931f7c1461042e578063bf353dbb14610451578063d05c78da146104775761018e565b806386c1762a146103655780639717411d146103825780639c52a7f11461039f5780639e1aaae6146103c5578063a293d1e8146103e8578063a883b0c41461040b5761018e565b806329a8f4f81161014b57806365fae35e1161012557806365fae35e146102d657806367457022146102fc57806367b870af1461031f578063744f4cf6146103485761018e565b806329a8f4f81461026d57806346df2ccb1461029657806358326b7a146102b95761018e565b806301aa8a6e14610193578063071ffb3c146101c25780630e2286d3146101e75780631e0029c81461020a5780632047a2671461022757806328a7996f1461024a575b600080fd5b6101b0600480360360208110156101a957600080fd5b503561057e565b60408051918252519081900360200190f35b6101e5600480360360408110156101d857600080fd5b5080359060200135610590565b005b6101b0600480360360408110156101fd57600080fd5b5080359060200135610732565b6101b06004803603602081101561022057600080fd5b50356107ad565b6101e56004803603604081101561023d57600080fd5b5080359060200135610839565b6101b06004803603604081101561026057600080fd5b50803590602001356109ae565b6101b06004803603606081101561028357600080fd5b50803590602081013590604001356109c3565b6101e5600480360360408110156102ac57600080fd5b50803590602001356109e3565b6101e5600480360360208110156102cf57600080fd5b5035610b2d565b6101e5600480360360208110156102ec57600080fd5b50356001600160a01b0316610bb7565b6101b06004803603604081101561031257600080fd5b5080359060200135610c51565b6101b06004803603606081101561033557600080fd5b5080359060208101359060400135610c6a565b6101e56004803603602081101561035e57600080fd5b5035610d28565b6101b06004803603602081101561037b57600080fd5b5035610d40565b6101b06004803603602081101561039857600080fd5b5035610dac565b6101e5600480360360208110156103b557600080fd5b50356001600160a01b0316610dbe565b6101b0600480360360408110156103db57600080fd5b5080359060200135610e57565b6101b0600480360360408110156103fe57600080fd5b5080359060200135610e63565b6101e56004803603604081101561042157600080fd5b5080359060200135610ead565b6101b06004803603604081101561044457600080fd5b5080359060200135611076565b6101b06004803603602081101561046757600080fd5b50356001600160a01b0316611081565b6101b06004803603604081101561048d57600080fd5b5080359060200135611093565b6101e5600480360360608110156104b057600080fd5b50803590602081013590604001356110f1565b6104e0600480360360208110156104d957600080fd5b50356112d1565b6040805195865260208601949094528484019290925265ffffffffffff1660608401526080830152519081900360a00190f35b6105426004803603608081101561052957600080fd5b508035906020810135906040810135906060013561130a565b6040805192835260208301919091528051918290030190f35b6101b06004803603604081101561057157600080fd5b50803590602001356113a7565b60036020526000908152604090205481565b336000908152602081905260409020546001146105e5576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd0b585d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b6000828152600360208181526040808420548085526001909252909220015465ffffffffffff164214610658576040805162461bcd60e51b81526020600482015260166024820152751c985d194b59dc9bdd5c0b5b9bdd0b5d5c19185d195960521b604482015290519081900360640190fd5b6106818261067c846001600086815260200190815260200160002060040154610c51565b6113a7565b600082815260016020819052604082200154919350906106a190846109ae565b6000858152600260205260409020549091506106bd90826113a7565b6000858152600260209081526040808320939093558482526001905220546106e590826113a7565b600083815260016020908152604091829020929092558051858152905186927f4656f63d6d86ffd6679877563f6832dff83d72eb09acf31f29018beaad47ef0e928290030190a250505050565b600080821161077b576040805162461bcd60e51b815260206004820152601060248201526f6469766973696f6e206279207a65726f60801b604482015290519081900360640190fd5b8161079e610795856b033b2e3c9fd0803ce8000000611093565b600285046113a7565b816107a557fe5b049392505050565b60008181526003602081815260408084205480855260019283905290842091820154919092015465ffffffffffff164210610817576000828152600160208190526040909120908101546002820154600390920154610814929065ffffffffffff166109c3565b90505b600084815260026020526040902054610831908290610e57565b949350505050565b3360009081526020819052604090205460011461088e576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd0b585d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b6000828152600360208181526040808420548085526001909252909220015465ffffffffffff164214610901576040805162461bcd60e51b81526020600482015260166024820152751c985d194b59dc9bdd5c0b5b9bdd0b5d5c19185d195960521b604482015290519081900360640190fd5b60008181526001602081905260408220015461091d90846109ae565b6000858152600260205260409020549091506109399082610e63565b6000858152600260209081526040808320939093558482526001905220546109619082610e63565b600083815260016020908152604091829020929092558051858152905186927fb8b26d9635bdf66575907fb44682641f476b48fb70ad5c2a630908bfcddf2143928290030190a250505050565b60006109ba82846113f1565b90505b92915050565b60008142106109db576109d88484844261145f565b93505b509192915050565b33600090815260208190526040902054600114610a38576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd0b585d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b60008281526002602052604090205415610a89576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdb8b5e995c9bcb5919589d609a1b604482015290519081900360640190fd5b60008181526001602081905260409091200154610ae2576040805162461bcd60e51b81526020600482015260126024820152711c985d194b59dc9bdd5c0b5b9bdd0b5cd95d60721b604482015290519081900360640190fd5b6000828152600360209081526040918290208390558151838152915184927f3a8f7e78fe36c54b4f888a309efa91eba128acb04cc1c2ffa0e5c4db7b4a878592908290030190a25050565b60008181526001602052604090206003015465ffffffffffff164210610bb4576000818152600160208190526040822090810154600282015460038301549254610b7f9365ffffffffffff169061130a565b50600083815260016020819052604090912090810191909155600301805465ffffffffffff19164265ffffffffffff16179055505b50565b33600090815260208190526040902054600114610c0c576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd0b585d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b6001600160a01b03811660008181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b60006b033b2e3c9fd0803ce800000061079e8484611093565b6000838015610d0a57600184168015610c8557859250610c89565b8392505b50600283046002850494505b8415610d04578586028687820414610cac57600080fd5b81810181811015610cbc57600080fd5b8590049650506001851615610cf9578583028387820414158715151615610ce257600080fd5b81810181811015610cf257600080fd5b8590049350505b600285049450610c95565b50610d20565b838015610d1a5760009250610d1e565b8392505b505b509392505050565b600081815260036020526040902054610bb490610b2d565b6000818152600160208190526040822090810154815460039092015490919065ffffffffffff164210610da2576000848152600160208190526040909120908101546002820154600390920154610d9f929065ffffffffffff166109c3565b91505b6108318282610e57565b60026020526000908152604090205481565b33600090815260208190526040902054600114610e13576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd0b585d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b6001600160a01b038116600081815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b60006109ba8284610c51565b808203828111156109bd576040805162461bcd60e51b815260206004820152600f60248201526e1cd859994b5cdd588b59985a5b1959608a1b604482015290519081900360640190fd5b33600090815260208190526040902054600114610f02576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd0b585d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b60008181526001602081905260409091200154610f5b576040805162461bcd60e51b81526020600482015260126024820152711c985d194b59dc9bdd5c0b5b9bdd0b5cd95d60721b604482015290519081900360640190fd5b600082815260036020526040902054610f7381610b2d565b610f7c82610b2d565b60008381526002602090815260408083205484845260019283905290832090910154909190610fab9083610e57565b600084815260016020526040902054909150610fc79083610e63565b6000848152600160208190526040808320939093558682529190200154610fee90826109ae565b600086815260026020818152604080842085905588845260018252832054928990525261101a916113a7565b60008581526001602090815260408083209390935587825260038152908290208690558151868152915187927fe1033ddc4775544ccda3ab7eb50208593822f29f4e10be3f6b4616eeae5d810c92908290030190a25050505050565b60008183816107a557fe5b60006020819052908152604090205481565b60008115806110ae575050808202828282816110ab57fe5b04145b6109bd576040805162461bcd60e51b815260206004820152600f60248201526e1cd859994b5b5d5b0b59985a5b1959608a1b604482015290519081900360640190fd5b33600090815260208190526040902054600114611146576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd0b585d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b82637261746560e01b141561122457806111a7576040805162461bcd60e51b815260206004820152601c60248201527f726174652d7065722d7365636f6e642d63616e2d6e6f742d62652d3000000000604482015290519081900360640190fd5b600082815260016020819052604090912001546112025760008281526001602081905260409091206b033b2e3c9fd0803ce800000091810191909155600301805465ffffffffffff19164265ffffffffffff1617905561120b565b61120b82610b2d565b6000828152600160205260409020600201819055611292565b826866697865645261746560b81b1415611251576000828152600160205260409020600401819055611292565b6040805162461bcd60e51b81526020600482015260116024820152703ab735b737bbb7103830b930b6b2ba32b960791b604482015290519081900360640190fd5b6040805183815260208101839052815185927f52e8bd81e873a93db0176f662695e3c80268d53323abc4a4d0fd0676be459d17928290030190a2505050565b6001602081905260009182526040909120805491810154600282015460038301546004909301549192909165ffffffffffff9091169085565b60008083421015611362576040805162461bcd60e51b815260206004820152601e60248201527f74696e6c616b652d6d6174682f696e76616c69642d74696d657374616d700000604482015290519081900360640190fd5b8561136c57600080fd5b600061137a8787874261145f565b90508061139961138a8387610c51565b6113948a88610c51565b610e63565b925092505094509492505050565b808201828110156109bd576040805162461bcd60e51b815260206004820152600f60248201526e1cd859994b5859190b59985a5b1959608a1b604482015290519081900360640190fd5b600080821161143a576040805162461bcd60e51b815260206004820152601060248201526f6469766973696f6e206279207a65726f60801b604482015290519081900360640190fd5b8161079e611454856b033b2e3c9fd0803ce8000000611093565b61067c856001610e63565b600061148361147d858585036b033b2e3c9fd0803ce8000000610c6a565b86610c51565b9594505050505056fea26469706673582212205af54e5dbc1067192ec1cec90c10ff7a953dc4d5364c37b2f16564d2118e4c4664736f6c63430007060033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.