@ohgeez/fsushi
Version:
fSUSHI is a protocol built on top of [FlashStake](http://flashstake.io/) and [SushiSwap](https://sushi.com) that enables stakers to get instant, upfront yield without waiting for it to accrue.
458 lines • 41.5 kB
JSON
{
"address": "0x99cf6EA7bCCCc53B11209Dc32432a7427DA906E9",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_flashStrategyFactory",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "InvalidPid",
"type": "error"
},
{
"inputs": [],
"name": "InvalidTimestamp",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "pid",
"type": "uint256"
}
],
"name": "AddPool",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "pid",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "weightPoints",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "totalWeightPoints",
"type": "uint256"
}
],
"name": "UpdateWeight",
"type": "event"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "pid",
"type": "uint256"
}
],
"name": "addPool",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "checkpoint",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "flashStrategyFactory",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "pid",
"type": "uint256"
}
],
"name": "relativeWeight",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "pid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "timestamp",
"type": "uint256"
}
],
"name": "relativeWeightAt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "totalWeightPoints",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "timestamp",
"type": "uint256"
}
],
"name": "totalWeightPointsAt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalWeightPointsLength",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "pid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "points",
"type": "uint256"
}
],
"name": "updateWeight",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "pid",
"type": "uint256"
}
],
"name": "weightPoints",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "pid",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "timestamp",
"type": "uint256"
}
],
"name": "weightPointsAt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "pid",
"type": "uint256"
}
],
"name": "weightPointsLength",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
}
],
"transactionHash": "0x2a9a5d632f484cf05bce53036befc63cc4db467b119b596c948ce16023887dcb",
"receipt": {
"to": null,
"from": "0x612ef87bfcd858687160294b0eFFACA0CBA342E2",
"contractAddress": "0x99cf6EA7bCCCc53B11209Dc32432a7427DA906E9",
"transactionIndex": 124,
"gasUsed": "710734",
"logsBloom": "0x00000000000000000000000040010000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000001000000000800000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000100000000000000000000000000000000000000000000",
"blockHash": "0x2dd522fa5884d15a3be24aaf9ab0ef1bab4f637e26bd48ee4c8601f9c0da0350",
"transactionHash": "0x2a9a5d632f484cf05bce53036befc63cc4db467b119b596c948ce16023887dcb",
"logs": [
{
"transactionIndex": 124,
"blockNumber": 16377385,
"transactionHash": "0x2a9a5d632f484cf05bce53036befc63cc4db467b119b596c948ce16023887dcb",
"address": "0x99cf6EA7bCCCc53B11209Dc32432a7427DA906E9",
"topics": [
"0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
"0x0000000000000000000000000000000000000000000000000000000000000000",
"0x000000000000000000000000612ef87bfcd858687160294b0effaca0cba342e2"
],
"data": "0x",
"logIndex": 298,
"blockHash": "0x2dd522fa5884d15a3be24aaf9ab0ef1bab4f637e26bd48ee4c8601f9c0da0350"
}
],
"blockNumber": 16377385,
"cumulativeGasUsed": "11267982",
"status": 1,
"byzantium": true
},
"args": [
"0x77b8E6e577fd3e90553dbF205D3854a649414741"
],
"numDeployments": 2,
"solcInputHash": "faf6ddc5e64ced0d96f36629aee337fd",
"metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_flashStrategyFactory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidPid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTimestamp\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"AddPool\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"weightPoints\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"totalWeightPoints\",\"type\":\"uint256\"}],\"name\":\"UpdateWeight\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"addPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"checkpoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"flashStrategyFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"relativeWeight\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"relativeWeightAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalWeightPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"totalWeightPointsAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalWeightPointsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"points\",\"type\":\"uint256\"}],\"name\":\"updateWeight\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"weightPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"weightPointsAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"weightPointsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FSushiKitchen.sol\":\"FSushiKitchen\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/FSushiKitchen.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.17;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"./interfaces/IFSushiKitchen.sol\\\";\\nimport \\\"./interfaces/IFlashStrategySushiSwapFactory.sol\\\";\\nimport \\\"./libraries/Snapshots.sol\\\";\\n\\ncontract FSushiKitchen is Ownable, IFSushiKitchen {\\n using Snapshots for Snapshots.Snapshot[];\\n\\n uint256 internal constant BASE = 1e18;\\n\\n address public immutable override flashStrategyFactory;\\n\\n Snapshots.Snapshot[] internal _totalWeightPoints;\\n mapping(uint256 => Snapshots.Snapshot[]) internal _weightPoints; // pid -> snapshots\\n\\n constructor(address _flashStrategyFactory) {\\n flashStrategyFactory = _flashStrategyFactory;\\n }\\n\\n function totalWeightPointsLength() external view override returns (uint256) {\\n return _totalWeightPoints.size();\\n }\\n\\n function weightPointsLength(uint256 pid) external view override returns (uint256) {\\n return _weightPoints[pid].size();\\n }\\n\\n function totalWeightPoints() external view override returns (uint256) {\\n return _totalWeightPoints.lastValue();\\n }\\n\\n function weightPoints(uint256 pid) external view override returns (uint256) {\\n return _weightPoints[pid].lastValue();\\n }\\n\\n function totalWeightPointsAt(uint256 timestamp) external view override returns (uint256) {\\n return _totalWeightPoints.valueAt(timestamp);\\n }\\n\\n function weightPointsAt(uint256 pid, uint256 timestamp) external view override returns (uint256) {\\n return _weightPoints[pid].valueAt(timestamp);\\n }\\n\\n function relativeWeight(uint256 pid) external view override returns (uint256) {\\n uint256 totalPoints = _totalWeightPoints.lastValue();\\n if (totalPoints == 0) return 0;\\n\\n uint256 points = _weightPoints[pid].lastValue();\\n return (points * BASE) / totalPoints;\\n }\\n\\n function relativeWeightAt(uint256 pid, uint256 timestamp) external view override returns (uint256) {\\n uint256 totalPoints = _totalWeightPoints.valueAt(timestamp);\\n if (totalPoints == 0) return 0;\\n\\n uint256 points = _weightPoints[pid].valueAt(timestamp);\\n return (points * BASE) / totalPoints;\\n }\\n\\n function addPool(uint256 pid) external override {\\n address strategy = IFlashStrategySushiSwapFactory(flashStrategyFactory).getFlashStrategySushiSwap(pid);\\n if (strategy == address(0)) revert InvalidPid();\\n\\n emit AddPool(pid);\\n\\n _updateWeight(pid, 100e18);\\n }\\n\\n function updateWeight(uint256 pid, uint256 points) external override onlyOwner {\\n if (_weightPoints[pid].size() == 0) revert InvalidPid();\\n\\n _updateWeight(pid, points);\\n }\\n\\n function _updateWeight(uint256 pid, uint256 points) internal {\\n uint256 prev = _weightPoints[pid].lastValue();\\n _weightPoints[pid].append(points);\\n uint256 totalPoints = _totalWeightPoints.lastValue() + points - prev;\\n _totalWeightPoints.append(totalPoints);\\n\\n emit UpdateWeight(pid, points, totalPoints);\\n }\\n\\n function checkpoint(uint256) external override {\\n // Empty: for future compatibility\\n }\\n}\\n\",\"keccak256\":\"0x6f91069853590add666b026db510292d7a2a3edc287faf13b1825fb64b842f2d\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/IFSushiKitchen.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\ninterface IFSushiKitchen {\\n error InvalidPid();\\n\\n event AddPool(uint256 indexed pid);\\n event UpdateWeight(uint256 indexed pid, uint256 weightPoints, uint256 totalWeightPoints);\\n\\n function flashStrategyFactory() external view returns (address);\\n\\n function totalWeightPointsLength() external view returns (uint256);\\n\\n function weightPointsLength(uint256 pid) external view returns (uint256);\\n\\n function totalWeightPoints() external view returns (uint256);\\n\\n function weightPoints(uint256 pid) external view returns (uint256);\\n\\n function totalWeightPointsAt(uint256 timestamp) external view returns (uint256);\\n\\n function weightPointsAt(uint256 pid, uint256 timestamp) external view returns (uint256);\\n\\n function relativeWeight(uint256 pid) external view returns (uint256);\\n\\n function relativeWeightAt(uint256 pid, uint256 timestamp) external view returns (uint256);\\n\\n function addPool(uint256 pid) external;\\n\\n function updateWeight(uint256 pid, uint256 points) external;\\n\\n function checkpoint(uint256 pid) external;\\n}\\n\",\"keccak256\":\"0x602da4746016dea892573a29a51d473deaf6789e2a464b2f6dbe98c7faf361a1\",\"license\":\"BUSL-1.1\"},\"contracts/interfaces/IFlashStrategySushiSwapFactory.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\ninterface IFlashStrategySushiSwapFactory {\\n error InvalidFee();\\n error InvalidFeeRecipient();\\n error FlashStrategySushiSwapCreated();\\n\\n event UpdateStakeFeeBPS(uint256 fee);\\n event UpdateFlashStakeFeeBPS(uint256 fee);\\n event UpdateFeeRecipient(address feeRecipient);\\n event CreateFlashStrategySushiSwap(uint256 pid, address strategy);\\n\\n function flashProtocol() external view returns (address);\\n\\n function flpTokenFactory() external view returns (address);\\n\\n function feeRecipient() external view returns (address);\\n\\n function getFlashStrategySushiSwap(uint256 pid) external view returns (address);\\n\\n function predictFlashStrategySushiSwapAddress(uint256 pid) external view returns (address strategy);\\n\\n function updateFeeRecipient(address _feeRecipient) external;\\n\\n function createFlashStrategySushiSwap(uint256 pid) external returns (address strategy);\\n}\\n\",\"keccak256\":\"0xfa2ca9ab0537cf4b0cf915100d292d48201e905162c4ace0d552d3e5c1cec3f1\",\"license\":\"BUSL-1.1\"},\"contracts/libraries/Snapshots.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.17;\\n\\nlibrary Snapshots {\\n error InvalidTimestamp();\\n\\n struct Snapshot {\\n uint256 value;\\n uint256 timestamp;\\n }\\n\\n function size(Snapshot[] storage snapshots) internal view returns (uint256) {\\n return snapshots.length;\\n }\\n\\n function lastValue(Snapshot[] storage snapshots) internal view returns (uint256) {\\n uint256 _length = snapshots.length;\\n return _length > 0 ? snapshots[_length - 1].value : 0;\\n }\\n\\n function valueAt(Snapshot[] storage snapshots, uint256 timestamp) internal view returns (uint256) {\\n uint256 _now = block.timestamp;\\n if (_now < timestamp) revert InvalidTimestamp();\\n\\n uint256 _length = snapshots.length;\\n if (_length == 0) {\\n return 0;\\n }\\n\\n // First check most recent balance\\n if (snapshots[_length - 1].timestamp <= timestamp) {\\n return snapshots[_length - 1].value;\\n }\\n\\n // Next check implicit zero balance\\n if (timestamp < snapshots[0].timestamp) {\\n return 0;\\n }\\n\\n unchecked {\\n uint256 lower = 0;\\n uint256 upper = _length - 1;\\n while (upper > lower) {\\n uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow\\n Snapshot memory snapshot = snapshots[center];\\n if (snapshot.timestamp == _now) {\\n return snapshot.value;\\n } else if (snapshot.timestamp < _now) {\\n lower = center;\\n } else {\\n upper = center - 1;\\n }\\n }\\n return snapshots[lower].value;\\n }\\n }\\n\\n function append(Snapshot[] storage snapshots, uint256 value) internal {\\n snapshots.push(Snapshot(value, block.timestamp));\\n }\\n}\\n\",\"keccak256\":\"0xdc8a865eed08331c7e1f3eed6473c85e197b37e06017c6c02c268958feaf6454\",\"license\":\"BUSL-1.1\"}},\"version\":1}",
"bytecode": "0x60a0346100ae57601f610c3438819003918201601f19168301916001600160401b038311848410176100b3578084926020946040528339810103126100ae57516001600160a01b039081811681036100ae576000543360018060a01b0319821617600055604051923391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3608052610b6a90816100ca82396080518181816103e901526106200152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60406080815260048036101561001457600080fd5b600091823560e01c80631067c6701461069c5780631270091514610677578063332c14531461064f578063654e6d771461060b578063715018a6146105b15780637769ea0a146103ad5780638da5cb5b14610385578063af62147e14610254578063b90732261461022c578063c2972baf1461020c578063db528784146101f0578063e1573573146101cc578063e98e88e2146101a9578063ed64bab2146101915763f2fde38b146100c557600080fd5b3461018d57602036600319011261018d576001600160a01b03823581811693919290849003610189576100f66106d7565b831561013757505082546001600160a01b0319811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b8480fd5b8280fd5b83346101a65760203660031901126101a65780f35b80fd5b8382346101c857816003193601126101c8576020906001549051908152f35b5080fd5b8382346101c857816003193601126101c8576020906101e9610890565b9051908152f35b8382346101c8576020906101e9610206366106bc565b906107b7565b5082346101a65760203660031901126101a657506101e96020923561074f565b50903461018d57602036600319011261018d57816020936101e99235815260028552206108bb565b508290346101c857610265366106bc565b6102709291926106d7565b828452600260205281842054156103755782845260026020526102948285206108bb565b83855260026020528285208351906102ab826107e5565b8382526020820190428252805490600160401b82101561036257906102d591600182018155610874565b9290926103505790600191518355519101556102ef610890565b82810180911161033d577f513245e08b45fcbe5e7a55e76c2457005348de0847518a9b772e4a01dca11a3a93929161032691610817565b61032f81610ad5565b82519182526020820152a280f35b634e487b7160e01b865260118752602486fd5b634e487b7160e01b8852878952602488fd5b634e487b7160e01b895260418a52602489fd5b81516387e8068360e01b81528590fd5b8382346101c857816003193601126101c857905490516001600160a01b039091168152602090f35b508290346101c8576020908160031936011261018d578051633750db2960e21b8152843581860181905292906001600160a01b039082816024817f000000000000000000000000000000000000000000000000000000000000000086165afa9081156105a7578691610543575b50161561037557827f6f92874181ba07c8e988c53b7d3c2fdcff7154a3500137bf6a350ebac65c08708580a2828452600281526104588285206108bb565b908385526002815282852091835161046f816107e5565b68056bc75e2d631000009384825283820190428252805490600160401b82101561053057906104a391600182018155610874565b92909261051e5790600191518355519101556104bd610890565b83810180911161050b577f513245e08b45fcbe5e7a55e76c2457005348de0847518a9b772e4a01dca11a3a949392916104f591610817565b906104ff82610ad5565b8351928352820152a280f35b634e487b7160e01b875260118852602487fd5b634e487b7160e01b8952888a52602489fd5b634e487b7160e01b8a5260418b5260248afd5b9050823d84116105a0575b601f8101601f1916820167ffffffffffffffff81118382101761058d578491839187528101031261058957518181168103610589578761041a565b8580fd5b634e487b7160e01b885260418952602488fd5b503d61054e565b84513d88823e3d90fd5b83346101a657806003193601126101a6576105ca6106d7565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b8382346101c857816003193601126101c857517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50903461018d57602036600319011261018d5760209282913581526002845220549051908152f35b8382346101c8576101e96020928261068e366106bc565b9290815260028652206109e4565b5082346101a65760203660031901126101a657506101e9602092356108e1565b60409060031901126106d2576004359060243590565b600080fd5b6000546001600160a01b031633036106eb57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b8115610739570490565b634e487b7160e01b600052601260045260246000fd5b610757610890565b9081156107b057600052600260205261077360406000206108bb565b90670de0b6b3a76400009182810292818404149015171561079a576107979161072f565b90565b634e487b7160e01b600052601160045260246000fd5b5050600090565b6107c0826108e1565b9182156107dd5761077391600052600260205260406000206109e4565b505050600090565b6040810190811067ffffffffffffffff82111761080157604052565b634e487b7160e01b600052604160045260246000fd5b9190820391821161079a57565b60015481101561085e57600160005260011b7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b634e487b7160e01b600052603260045260246000fd5b805482101561085e5760005260206000209060011b0190600090565b600154600081156108b65750600019810190811161079a576108b190610824565b505490565b905090565b8054600081156108db5750600019810190811161079a576108b191610874565b91505090565b8042106109d25760019081549081156107dd576000199081830192831161079a57808461090d85610824565b50015411156109c657836000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf754116107dd5760009291905b83821161095a575050506108b190610824565b838203831c820393849061096d86610824565b5095602060405161097d816107e5565b885480825298880154910181905242810361099c575050505050505090565b909192939495965042116000146109ba575050915b90929192610947565b909350829150016109b1565b50506108b19150610824565b60405163b7d0949760e01b8152600490fd5b8142106109d25780549081156107dd5760001982810192831161079a57610a0b8383610874565b5093806001809601541115610ac957826000526020908582600020015411610abf57906000949293915b858311610a4a5750505050906108b191610874565b858394959303851c8403958690610a618886610874565b509783604051610a70816107e5565b8a548082529a8a01549101819052428103610a915750505050505050505090565b909192939495969798504211600014610ab3575050935b919094929394610a35565b90955083915001610aa8565b5050505050600090565b50506108b19250610874565b60405190610ae2826107e5565b81526020810190428252600154600160401b81101561080157806001610b0b9201600155610824565b929092610b1e5760019151835551910155565b634e487b7160e01b600052600060045260246000fdfea26469706673582212203d024c4f1900fa3edde48cc56e801807046e901903bdd182ffe71723eec9fd7464736f6c63430008110033",
"deployedBytecode": "0x60406080815260048036101561001457600080fd5b600091823560e01c80631067c6701461069c5780631270091514610677578063332c14531461064f578063654e6d771461060b578063715018a6146105b15780637769ea0a146103ad5780638da5cb5b14610385578063af62147e14610254578063b90732261461022c578063c2972baf1461020c578063db528784146101f0578063e1573573146101cc578063e98e88e2146101a9578063ed64bab2146101915763f2fde38b146100c557600080fd5b3461018d57602036600319011261018d576001600160a01b03823581811693919290849003610189576100f66106d7565b831561013757505082546001600160a01b0319811683178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152fd5b8480fd5b8280fd5b83346101a65760203660031901126101a65780f35b80fd5b8382346101c857816003193601126101c8576020906001549051908152f35b5080fd5b8382346101c857816003193601126101c8576020906101e9610890565b9051908152f35b8382346101c8576020906101e9610206366106bc565b906107b7565b5082346101a65760203660031901126101a657506101e96020923561074f565b50903461018d57602036600319011261018d57816020936101e99235815260028552206108bb565b508290346101c857610265366106bc565b6102709291926106d7565b828452600260205281842054156103755782845260026020526102948285206108bb565b83855260026020528285208351906102ab826107e5565b8382526020820190428252805490600160401b82101561036257906102d591600182018155610874565b9290926103505790600191518355519101556102ef610890565b82810180911161033d577f513245e08b45fcbe5e7a55e76c2457005348de0847518a9b772e4a01dca11a3a93929161032691610817565b61032f81610ad5565b82519182526020820152a280f35b634e487b7160e01b865260118752602486fd5b634e487b7160e01b8852878952602488fd5b634e487b7160e01b895260418a52602489fd5b81516387e8068360e01b81528590fd5b8382346101c857816003193601126101c857905490516001600160a01b039091168152602090f35b508290346101c8576020908160031936011261018d578051633750db2960e21b8152843581860181905292906001600160a01b039082816024817f000000000000000000000000000000000000000000000000000000000000000086165afa9081156105a7578691610543575b50161561037557827f6f92874181ba07c8e988c53b7d3c2fdcff7154a3500137bf6a350ebac65c08708580a2828452600281526104588285206108bb565b908385526002815282852091835161046f816107e5565b68056bc75e2d631000009384825283820190428252805490600160401b82101561053057906104a391600182018155610874565b92909261051e5790600191518355519101556104bd610890565b83810180911161050b577f513245e08b45fcbe5e7a55e76c2457005348de0847518a9b772e4a01dca11a3a949392916104f591610817565b906104ff82610ad5565b8351928352820152a280f35b634e487b7160e01b875260118852602487fd5b634e487b7160e01b8952888a52602489fd5b634e487b7160e01b8a5260418b5260248afd5b9050823d84116105a0575b601f8101601f1916820167ffffffffffffffff81118382101761058d578491839187528101031261058957518181168103610589578761041a565b8580fd5b634e487b7160e01b885260418952602488fd5b503d61054e565b84513d88823e3d90fd5b83346101a657806003193601126101a6576105ca6106d7565b80546001600160a01b03198116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b8382346101c857816003193601126101c857517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50903461018d57602036600319011261018d5760209282913581526002845220549051908152f35b8382346101c8576101e96020928261068e366106bc565b9290815260028652206109e4565b5082346101a65760203660031901126101a657506101e9602092356108e1565b60409060031901126106d2576004359060243590565b600080fd5b6000546001600160a01b031633036106eb57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b8115610739570490565b634e487b7160e01b600052601260045260246000fd5b610757610890565b9081156107b057600052600260205261077360406000206108bb565b90670de0b6b3a76400009182810292818404149015171561079a576107979161072f565b90565b634e487b7160e01b600052601160045260246000fd5b5050600090565b6107c0826108e1565b9182156107dd5761077391600052600260205260406000206109e4565b505050600090565b6040810190811067ffffffffffffffff82111761080157604052565b634e487b7160e01b600052604160045260246000fd5b9190820391821161079a57565b60015481101561085e57600160005260011b7fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60190600090565b634e487b7160e01b600052603260045260246000fd5b805482101561085e5760005260206000209060011b0190600090565b600154600081156108b65750600019810190811161079a576108b190610824565b505490565b905090565b8054600081156108db5750600019810190811161079a576108b191610874565b91505090565b8042106109d25760019081549081156107dd576000199081830192831161079a57808461090d85610824565b50015411156109c657836000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf754116107dd5760009291905b83821161095a575050506108b190610824565b838203831c820393849061096d86610824565b5095602060405161097d816107e5565b885480825298880154910181905242810361099c575050505050505090565b909192939495965042116000146109ba575050915b90929192610947565b909350829150016109b1565b50506108b19150610824565b60405163b7d0949760e01b8152600490fd5b8142106109d25780549081156107dd5760001982810192831161079a57610a0b8383610874565b5093806001809601541115610ac957826000526020908582600020015411610abf57906000949293915b858311610a4a5750505050906108b191610874565b858394959303851c8403958690610a618886610874565b509783604051610a70816107e5565b8a548082529a8a01549101819052428103610a915750505050505050505090565b909192939495969798504211600014610ab3575050935b919094929394610a35565b90955083915001610aa8565b5050505050600090565b50506108b19250610874565b60405190610ae2826107e5565b81526020810190428252600154600160401b81101561080157806001610b0b9201600155610824565b929092610b1e5760019151835551910155565b634e487b7160e01b600052600060045260246000fdfea26469706673582212203d024c4f1900fa3edde48cc56e801807046e901903bdd182ffe71723eec9fd7464736f6c63430008110033",
"devdoc": {
"kind": "dev",
"methods": {
"owner()": {
"details": "Returns the address of the current owner."
},
"renounceOwnership()": {
"details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
},
"transferOwnership(address)": {
"details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
}
},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
},
"storageLayout": {
"storage": [
{
"astId": 7,
"contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
"label": "_owner",
"offset": 0,
"slot": "0",
"type": "t_address"
},
{
"astId": 10821,
"contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
"label": "_totalWeightPoints",
"offset": 0,
"slot": "1",
"type": "t_array(t_struct(Snapshot)17180_storage)dyn_storage"
},
{
"astId": 10827,
"contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
"label": "_weightPoints",
"offset": 0,
"slot": "2",
"type": "t_mapping(t_uint256,t_array(t_struct(Snapshot)17180_storage)dyn_storage)"
}
],
"types": {
"t_address": {
"encoding": "inplace",
"label": "address",
"numberOfBytes": "20"
},
"t_array(t_struct(Snapshot)17180_storage)dyn_storage": {
"base": "t_struct(Snapshot)17180_storage",
"encoding": "dynamic_array",
"label": "struct Snapshots.Snapshot[]",
"numberOfBytes": "32"
},
"t_mapping(t_uint256,t_array(t_struct(Snapshot)17180_storage)dyn_storage)": {
"encoding": "mapping",
"key": "t_uint256",
"label": "mapping(uint256 => struct Snapshots.Snapshot[])",
"numberOfBytes": "32",
"value": "t_array(t_struct(Snapshot)17180_storage)dyn_storage"
},
"t_struct(Snapshot)17180_storage": {
"encoding": "inplace",
"label": "struct Snapshots.Snapshot",
"members": [
{
"astId": 17177,
"contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
"label": "value",
"offset": 0,
"slot": "0",
"type": "t_uint256"
},
{
"astId": 17179,
"contract": "contracts/FSushiKitchen.sol:FSushiKitchen",
"label": "timestamp",
"offset": 0,
"slot": "1",
"type": "t_uint256"
}
],
"numberOfBytes": "64"
},
"t_uint256": {
"encoding": "inplace",
"label": "uint256",
"numberOfBytes": "32"
}
}
}
}