Contract 0xBD477956Ad74329664f45978A3876B024E3da73d 2

 

Txn Hash Method
Block
From
To
Value
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x936ff48c4aceed06751e207839f094de3ef00c04bb8a9e54272cd9d709948f7a1075403152023-07-30 1:10:0760 days 13 hrs ago 0x1c3d0020f1ecca8a931b219b490dfb41499ca1520xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x936ff48c4aceed06751e207839f094de3ef00c04bb8a9e54272cd9d709948f7a1075403152023-07-30 1:10:0760 days 13 hrs ago 0xd193873e6d9c6ba76e60f7e430aa74d02032e44d0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x936ff48c4aceed06751e207839f094de3ef00c04bb8a9e54272cd9d709948f7a1075403152023-07-30 1:10:0760 days 13 hrs ago 0x57296e9ad47cd5dd4a2237cb4b9df23c7e6fd1200xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x936ff48c4aceed06751e207839f094de3ef00c04bb8a9e54272cd9d709948f7a1075403152023-07-30 1:10:0760 days 13 hrs ago 0x44a924b7669f96d0df5444051145564ec63db7f60xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x936ff48c4aceed06751e207839f094de3ef00c04bb8a9e54272cd9d709948f7a1075403152023-07-30 1:10:0760 days 13 hrs ago 0x7f28a4afcba2d9588ed6209c1544cf933cd240ba0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x936ff48c4aceed06751e207839f094de3ef00c04bb8a9e54272cd9d709948f7a1075403152023-07-30 1:10:0760 days 13 hrs ago 0x878928ad2c58187258919e32c4a4cd51b208211e0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x936ff48c4aceed06751e207839f094de3ef00c04bb8a9e54272cd9d709948f7a1075403152023-07-30 1:10:0760 days 13 hrs ago 0xde5aab4ceb875ac8406c506bae07c715a0d004c20xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x84aecde2e40e7895a1e6b2a72e3377e460d47457cd46b61da8ac577c22c318a61072379842023-07-23 1:12:2567 days 13 hrs ago 0x1c3d0020f1ecca8a931b219b490dfb41499ca1520xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x84aecde2e40e7895a1e6b2a72e3377e460d47457cd46b61da8ac577c22c318a61072379842023-07-23 1:12:2567 days 13 hrs ago 0xd193873e6d9c6ba76e60f7e430aa74d02032e44d0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x84aecde2e40e7895a1e6b2a72e3377e460d47457cd46b61da8ac577c22c318a61072379842023-07-23 1:12:2567 days 13 hrs ago 0x57296e9ad47cd5dd4a2237cb4b9df23c7e6fd1200xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x84aecde2e40e7895a1e6b2a72e3377e460d47457cd46b61da8ac577c22c318a61072379842023-07-23 1:12:2567 days 13 hrs ago 0x44a924b7669f96d0df5444051145564ec63db7f60xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x84aecde2e40e7895a1e6b2a72e3377e460d47457cd46b61da8ac577c22c318a61072379842023-07-23 1:12:2567 days 13 hrs ago 0x7f28a4afcba2d9588ed6209c1544cf933cd240ba0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x84aecde2e40e7895a1e6b2a72e3377e460d47457cd46b61da8ac577c22c318a61072379842023-07-23 1:12:2567 days 13 hrs ago 0x878928ad2c58187258919e32c4a4cd51b208211e0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x84aecde2e40e7895a1e6b2a72e3377e460d47457cd46b61da8ac577c22c318a61072379842023-07-23 1:12:2567 days 13 hrs ago 0xde5aab4ceb875ac8406c506bae07c715a0d004c20xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x6a690ded9a25e360c31b72887ac5299301ad0fc6e1f73fd3738e281ebf47fa341071574612023-07-21 4:28:1969 days 10 hrs ago 0xde5aab4ceb875ac8406c506bae07c715a0d004c20xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0xb57dd599f353f1e3144e7bc67171a0f778e2c808715233b2c001002418d69c531071160632023-07-20 5:28:2370 days 9 hrs ago 0x7f28a4afcba2d9588ed6209c1544cf933cd240ba0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x1d63700325307d9bdae360a90f0e8b56f9a209828a4ce9ddee9a5712f08004791071160492023-07-20 5:27:5570 days 9 hrs ago 0x878928ad2c58187258919e32c4a4cd51b208211e0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0xd506358294cb8715f92621d2d8023159fc703246091ba6ec5eec3b8f9c236e4e1071081742023-07-20 1:05:2570 days 13 hrs ago 0xde5aab4ceb875ac8406c506bae07c715a0d004c20xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0x588f2767cd6c9b9c0cded7cee349560b9019475226b211b443d69af9283d67c61069650152023-07-16 17:33:2773 days 21 hrs ago 0x7f28a4afcba2d9588ed6209c1544cf933cd240ba0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0xb63da079c32b3becdc8ab745ffef1d2dc71b1666a4f7b01c9f6537bc9ba61b891069355702023-07-16 1:11:5774 days 13 hrs ago 0x1c3d0020f1ecca8a931b219b490dfb41499ca1520xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0xb63da079c32b3becdc8ab745ffef1d2dc71b1666a4f7b01c9f6537bc9ba61b891069355702023-07-16 1:11:5774 days 13 hrs ago 0xd193873e6d9c6ba76e60f7e430aa74d02032e44d0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0xb63da079c32b3becdc8ab745ffef1d2dc71b1666a4f7b01c9f6537bc9ba61b891069355702023-07-16 1:11:5774 days 13 hrs ago 0x57296e9ad47cd5dd4a2237cb4b9df23c7e6fd1200xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0xb63da079c32b3becdc8ab745ffef1d2dc71b1666a4f7b01c9f6537bc9ba61b891069355702023-07-16 1:11:5774 days 13 hrs ago 0x44a924b7669f96d0df5444051145564ec63db7f60xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0xb63da079c32b3becdc8ab745ffef1d2dc71b1666a4f7b01c9f6537bc9ba61b891069355702023-07-16 1:11:5774 days 13 hrs ago 0x7f28a4afcba2d9588ed6209c1544cf933cd240ba0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
0xb63da079c32b3becdc8ab745ffef1d2dc71b1666a4f7b01c9f6537bc9ba61b891069355702023-07-16 1:11:5774 days 13 hrs ago 0x878928ad2c58187258919e32c4a4cd51b208211e0xbd477956ad74329664f45978a3876b024e3da73d0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RateModel

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 2 : FixedPointMathLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
                    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant MAX_UINT256 = 2**256 - 1;

    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.

    function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
    }

    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
    }

    function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
    }

    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up.
    }

    /*//////////////////////////////////////////////////////////////
                    LOW LEVEL FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function mulDivDown(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // Divide x * y by the denominator.
            z := div(mul(x, y), denominator)
        }
    }

    function mulDivUp(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // If x * y modulo the denominator is strictly greater than 0,
            // 1 is added to round up the division of x * y by the denominator.
            z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator))
        }
    }

    function rpow(
        uint256 x,
        uint256 n,
        uint256 scalar
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := scalar
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store scalar in z for now.
                    z := scalar
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, scalar)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, scalar)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, scalar)
                    }
                }
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            let y := x // We start y at x, which will help us make our initial estimate.

            z := 181 // The "correct" value is 1, but this saves a multiplication later.

            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.

            // We check y >= 2^(k + 8) but shift right by k bits
            // each branch to ensure that if x >= 256, then y >= 256.
            if iszero(lt(y, 0x10000000000000000000000000000000000)) {
                y := shr(128, y)
                z := shl(64, z)
            }
            if iszero(lt(y, 0x1000000000000000000)) {
                y := shr(64, y)
                z := shl(32, z)
            }
            if iszero(lt(y, 0x10000000000)) {
                y := shr(32, y)
                z := shl(16, z)
            }
            if iszero(lt(y, 0x1000000)) {
                y := shr(16, y)
                z := shl(8, z)
            }

            // Goal was to get z*z*y within a small factor of x. More iterations could
            // get y in a tighter range. Currently, we will have y in [256, 256*2^16).
            // We ensured y >= 256 so that the relative difference between y and y+1 is small.
            // That's not possible if x < 256 but we can just verify those cases exhaustively.

            // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256.
            // Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
            // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps.

            // For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range
            // (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256.

            // Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate
            // sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18.

            // There is no overflow risk here since y < 2^136 after the first branch above.
            z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181.

            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // If x+1 is a perfect square, the Babylonian method cycles between
            // floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor.
            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
            // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case.
            // If you don't care whether the floor or ceil square root is returned, you can remove this statement.
            z := sub(z, lt(div(x, z), z))
        }
    }

    function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Mod x by y. Note this will return
            // 0 instead of reverting if y is zero.
            z := mod(x, y)
        }
    }

    function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            // Divide x by y. Note this will return
            // 0 instead of reverting if y is zero.
            r := div(x, y)
        }
    }

    function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Add 1 to x * y if x % y > 0. Note this will
            // return 0 instead of reverting if y is zero.
            z := add(gt(mod(x, y), 0), div(x, y))
        }
    }
}

File 2 of 2 : RateModel.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.17;

import {FixedPointMathLib} from "solmate/utils/FixedPointMathLib.sol";

/// @title RateModel
/// @author Aloe Labs, Inc.
/// @dev "Test everything; hold fast what is good." - 1 Thessalonians 5:21
contract RateModel {
    uint256 private constant A = 6.1010463348e20;

    uint256 private constant B = 1e12 - A / 1e18;

    function getAccrualFactor(uint256 elapsedTime, uint256 utilization) external pure returns (uint256) {
        unchecked {
            uint256 rate = computeYieldPerSecond(utilization);

            if (elapsedTime > 1 weeks) elapsedTime = 1 weeks;

            return FixedPointMathLib.rpow(rate, elapsedTime, 1e12);
        }
    }

    function computeYieldPerSecond(uint256 utilization) public pure returns (uint256) {
        unchecked {
            return (utilization < 0.99e18) ? B + A / (1e18 - utilization) : 1000000060400;
        }
    }
}

Settings
{
  "remappings": [
    "clones-with-immutable-args/=lib/clones-with-immutable-args/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "solmate/=lib/solmate/src/",
    "v3-core/=lib/v3-core/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"utilization","type":"uint256"}],"name":"computeYieldPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"elapsedTime","type":"uint256"},{"internalType":"uint256","name":"utilization","type":"uint256"}],"name":"getAccrualFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}]

6080806040523461001657610239908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c80635e5553531461007a5763b66ce1931461003357600080fd5b346100775760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007757602061006f600435610194565b604051908152f35b80fd5b50346100775760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610077576004356100b8602435610194565b62093a8080831161018c575b5080928160001461016e576001918383161561016157925b821c93845b6100f45750505060209150604051908152f35b8060801c61015d5780029364746a5288009485810190811061014f5764e8d4a510008091049584831661012d575b5050821c93846100e1565b8686929396029187830403610153575b810190811061014f5704923880610122565b8280fd5b861561013d578380fd5b5080fd5b5064e8d4a51000926100dc565b9250501561017e5760209061006f565b50602064e8d4a5100061006f565b9150386100c4565b670dbd2fc137a300008110156101f957670de0b6b3a76400008181146101ca5703682112e713ad5b4b50000464e8d4a50d9e0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b5064e8d4a5fbf09056fea2646970667358221220134feaa19f77fa637509604579c5edbbb2597f2ecec30abb2a709fe4dfafdb6664736f6c63430008110033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.