// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "./libraries/SafeMath.sol"; contract SushiBar is ERC20("SushiBar", "xSUSHI") { using SafeMath for uint256; IERC20 public sushi; constructor(IERC20 _sushi) { sushi = _sushi; } // Enter the bar. Pay some SUSHIs. Earn some shares. function enter(uint256 _amount) public { uint256 totalSushi = sushi.balanceOf(address(this)); uint256 totalShares = totalSupply(); if (totalShares == 0 || totalSushi == 0) { _mint(msg.sender, _amount); } else { uint256 what = _amount.mul(totalShares).div(totalSushi); _mint(msg.sender, what); } sushi.transferFrom(msg.sender, address(this), _amount); } // Leave the bar. Claim back your SUSHIs. function leave(uint256 _share) public { uint256 totalShares = totalSupply(); uint256 what = _share.mul(sushi.balanceOf(address(this))).div(totalShares); _burn(msg.sender, _share); sushi.transfer(msg.sender, what); } }