编译器
0.8.17+commit.8df45f5f
文件 1 的 8:ArbVaultGmx.sol
pragma solidity 0.8.17;
import { GlobalACL, Auth, VESTER } from "./Auth.sol";
import { SafeTransferLib } from "@solmate/utils/SafeTransferLib.sol";
import { ERC20 } from "@solmate/tokens/ERC20.sol";
import { ARB } from "./constants.sol";
contract ArbVaultGmx is GlobalACL {
using SafeTransferLib for ERC20;
constructor(Auth _auth) GlobalACL(_auth) { }
function vestArb(address account, uint256 amount) external onlyRole(VESTER) returns (uint256) {
uint256 arbBalance = ERC20(ARB).balanceOf(address(this));
if (amount > arbBalance) {
ERC20(ARB).safeTransfer(account, arbBalance);
return arbBalance;
} else {
ERC20(ARB).safeTransfer(account, amount);
return amount;
}
}
function transferToken(ERC20 token, address account, uint256 amount) external onlyConfigurator {
token.safeTransfer(account, amount);
}
}
文件 2 的 8:Auth.sol
pragma solidity 0.8.17;
bytes32 constant CONFIGURATOR_ROLE = keccak256("CONFIGURATOR");
bytes32 constant CONTROLLER = keccak256("CONTROLLER");
bytes32 constant VESTER = keccak256("VESTER");
contract Auth {
error NotAuthorized(bytes32 _role, address _user);
event RoleUpdated(bytes32 indexed role, address indexed user, bool authorized);
bytes32 public constant AUTH_MANAGER_ROLE = keccak256("AUTH_MANAGER");
mapping(bytes32 => mapping(address => bool)) public hasRole;
constructor() {
_updateRole(msg.sender, AUTH_MANAGER_ROLE, true);
}
function updateRole(address _user, bytes32 _role, bool _authorized) external {
onlyRole(AUTH_MANAGER_ROLE, msg.sender);
_updateRole(_user, _role, _authorized);
}
function onlyRole(bytes32 _role, address _user) public view {
if (!hasRole[_role][_user]) {
revert NotAuthorized(_role, _user);
}
}
function _updateRole(address _user, bytes32 _role, bool _authorized) internal {
hasRole[_role][_user] = _authorized;
emit RoleUpdated(_role, _user, _authorized);
}
}
abstract contract GlobalACL {
Auth public immutable AUTH;
constructor(Auth _auth) {
require(address(_auth) != address(0), "GlobalACL: zero address");
AUTH = _auth;
}
modifier onlyConfigurator() {
AUTH.onlyRole(CONFIGURATOR_ROLE, msg.sender);
_;
}
modifier onlyController() {
AUTH.onlyRole(CONTROLLER, msg.sender);
_;
}
modifier onlyRole(bytes32 _role) {
AUTH.onlyRole(_role, msg.sender);
_;
}
}
文件 3 的 8:ERC20.sol
pragma solidity >=0.8.0;
abstract contract ERC20 {
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
string public name;
string public symbol;
uint8 public immutable decimals;
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender];
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}
文件 4 的 8:EnumerableSet.sol
pragma solidity ^0.8.0;
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping(bytes32 => uint256) _indexes;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastValue = set._values[lastIndex];
set._values[toDeleteIndex] = lastValue;
set._indexes[lastValue] = valueIndex;
}
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
struct Bytes32Set {
Set _inner;
}
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
assembly {
result := store
}
return result;
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
文件 5 的 8:MasterChefLib.sol
pragma solidity 0.8.17;
library MasterChefLib {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
}
文件 6 的 8:MasterChefUmamiGmx.sol
pragma solidity 0.8.17;
import { SafeTransferLib } from "@solmate/utils/SafeTransferLib.sol";
import { ERC20 } from "@solmate/tokens/ERC20.sol";
import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import { GlobalACL, Auth } from "./Auth.sol";
import { MasterChefLib } from "./libraries/MasterChefLib.sol";
import { ArbVaultGmx } from "./ArbVaultGmx.sol";
interface IRewarder {
function onOArbReward(address user, uint256 newLpAmount) external;
function pendingTokens(address user) external view returns (uint256 pending);
function rewardToken() external view returns (address);
}
contract MasterChefUmamiGmx is GlobalACL {
using SafeTransferLib for ERC20;
using EnumerableSet for EnumerableSet.AddressSet;
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}
struct PoolInfo {
ERC20 lpToken;
uint256 allocPoint;
uint256 lastRewardTimestamp;
uint256 accOArbPerShare;
IRewarder rewarder;
}
ArbVaultGmx public arbVault;
ERC20 public ARB;
uint256 public arbPerSec;
PoolInfo[] public poolInfo;
EnumerableSet.AddressSet private lpTokens;
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
uint256 public totalAllocPoint;
uint256 public startTimestamp;
event Add(uint256 indexed pid, uint256 allocPoint, ERC20 indexed lpToken, IRewarder indexed rewarder);
event Set(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event UpdatePool(uint256 indexed pid, uint256 lastRewardTimestamp, uint256 lpSupply, uint256 accOArbPerShare);
event Harvest(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
event UpdateEmissionRate(address indexed user, uint256 _arbPerSec);
constructor(ERC20 _arb, ArbVaultGmx _arbVault, Auth _auth, uint256 _arbPerSec, uint256 _startTimestamp) GlobalACL(_auth) {
ARB = _arb;
arbVault = _arbVault;
arbPerSec = _arbPerSec;
startTimestamp = _startTimestamp;
totalAllocPoint = 0;
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
function getPIdFromLP(address lp) external view returns (uint256) {
for (uint256 index = 0; index < poolInfo.length; index++) {
if (address(poolInfo[index].lpToken) == lp) {
return index;
}
}
return poolInfo.length;
}
function add(uint256 _allocPoint, ERC20 _lpToken, IRewarder _rewarder) public onlyConfigurator {
require(MasterChefLib.isContract(address(_lpToken)), "add: LP token must be a valid contract");
require(
MasterChefLib.isContract(address(_rewarder)) || address(_rewarder) == address(0),
"add: rewarder must be contract or zero"
);
require(!lpTokens.contains(address(_lpToken)), "add: LP already added");
massUpdatePools();
uint256 lastRewardTimestamp = block.timestamp > startTimestamp ? block.timestamp : startTimestamp;
totalAllocPoint = totalAllocPoint + _allocPoint;
poolInfo.push(
PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardTimestamp: lastRewardTimestamp,
accOArbPerShare: 0,
rewarder: _rewarder
})
);
lpTokens.add(address(_lpToken));
emit Add(poolInfo.length - 1, _allocPoint, _lpToken, _rewarder);
}
function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyConfigurator {
require(
MasterChefLib.isContract(address(_rewarder)) || address(_rewarder) == address(0),
"set: rewarder must be contract or zero"
);
massUpdatePools();
totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint;
poolInfo[_pid].allocPoint = _allocPoint;
if (overwrite) {
poolInfo[_pid].rewarder = _rewarder;
}
emit Set(_pid, _allocPoint, overwrite ? _rewarder : poolInfo[_pid].rewarder, overwrite);
}
function pendingTokens(uint256 _pid, address _user)
external
view
returns (
uint256 pendingOArb,
address bonusTokenAddress,
string memory bonusTokenSymbol,
uint256 pendingBonusToken
)
{
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accOArbPerShare = pool.accOArbPerShare;
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) {
uint256 multiplier = block.timestamp - pool.lastRewardTimestamp;
uint256 oArbReward = (multiplier * arbPerSec * pool.allocPoint) / totalAllocPoint;
uint256 vaultBalance = ARB.balanceOf(address(arbVault));
if (oArbReward > vaultBalance) {
accOArbPerShare = accOArbPerShare + ((vaultBalance * 1e12) / lpSupply);
} else {
accOArbPerShare = accOArbPerShare + ((oArbReward * 1e12) / lpSupply);
}
}
pendingOArb = ((user.amount * accOArbPerShare) / 1e12) - user.rewardDebt;
if (address(pool.rewarder) != address(0)) {
(bonusTokenAddress, bonusTokenSymbol) = rewarderBonusTokenInfo(_pid);
pendingBonusToken = pool.rewarder.pendingTokens(_user);
}
}
function rewarderBonusTokenInfo(uint256 _pid)
public
view
returns (address bonusTokenAddress, string memory bonusTokenSymbol)
{
PoolInfo storage pool = poolInfo[_pid];
if (address(pool.rewarder) != address(0)) {
bonusTokenAddress = address(pool.rewarder.rewardToken());
bonusTokenSymbol = ERC20(pool.rewarder.rewardToken()).symbol();
}
}
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.timestamp <= pool.lastRewardTimestamp) {
return;
}
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (lpSupply == 0) {
pool.lastRewardTimestamp = block.timestamp;
return;
}
uint256 multiplier = block.timestamp - pool.lastRewardTimestamp;
uint256 oArbReward = (multiplier * arbPerSec * pool.allocPoint) / totalAllocPoint;
oArbReward = arbVault.vestArb(address(this), oArbReward);
pool.accOArbPerShare = pool.accOArbPerShare + ((oArbReward * 1e12) / lpSupply);
pool.lastRewardTimestamp = block.timestamp;
emit UpdatePool(_pid, pool.lastRewardTimestamp, lpSupply, pool.accOArbPerShare);
}
function deposit(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
updatePool(_pid);
if (user.amount > 0) {
uint256 pending = ((user.amount * pool.accOArbPerShare) / 1e12) - user.rewardDebt;
safeArbTransfer(msg.sender, pending);
emit Harvest(msg.sender, _pid, pending);
}
user.amount = user.amount + _amount;
user.rewardDebt = (user.amount * pool.accOArbPerShare) / 1e12;
IRewarder rewarder = poolInfo[_pid].rewarder;
if (address(rewarder) != address(0)) {
rewarder.onOArbReward(msg.sender, user.amount);
}
pool.lpToken.safeTransferFrom(msg.sender, address(this), _amount);
emit Deposit(msg.sender, _pid, _amount);
}
function withdraw(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(user.amount >= _amount, "withdraw: !_amount not available");
updatePool(_pid);
uint256 pending = ((user.amount * pool.accOArbPerShare) / 1e12) - user.rewardDebt;
safeArbTransfer(msg.sender, pending);
emit Harvest(msg.sender, _pid, pending);
user.amount = user.amount - _amount;
user.rewardDebt = (user.amount * pool.accOArbPerShare) / 1e12;
IRewarder rewarder = poolInfo[_pid].rewarder;
if (address(rewarder) != address(0)) {
rewarder.onOArbReward(msg.sender, user.amount);
}
pool.lpToken.safeTransfer(msg.sender, _amount);
emit Withdraw(msg.sender, _pid, _amount);
}
function emergencyWithdraw(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
uint256 amount = user.amount;
user.amount = 0;
user.rewardDebt = 0;
IRewarder _rewarder = pool.rewarder;
if (address(_rewarder) != address(0)) {
_rewarder.onOArbReward(msg.sender, 0);
}
pool.lpToken.safeTransfer(msg.sender, amount);
emit EmergencyWithdraw(msg.sender, _pid, amount);
}
function safeArbTransfer(address _to, uint256 _amount) internal {
uint256 oArbBal = ARB.balanceOf(address(this));
if (_amount > oArbBal) {
ARB.transfer(_to, oArbBal);
} else {
ARB.transfer(_to, _amount);
}
}
function updateEmissionRate(uint256 _arbPerSec) public onlyConfigurator {
massUpdatePools();
arbPerSec = _arbPerSec;
emit UpdateEmissionRate(msg.sender, _arbPerSec);
}
function collectAllPoolRewards() public {
for (uint256 _pid = 0; _pid < poolInfo.length; _pid++) {
updatePool(_pid);
PoolInfo memory pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
if (user.amount > 0) {
uint256 pending = ((user.amount * pool.accOArbPerShare) / 1e12) - user.rewardDebt;
safeArbTransfer(msg.sender, pending);
emit Harvest(msg.sender, _pid, pending);
}
user.rewardDebt = (user.amount * pool.accOArbPerShare) / 1e12;
IRewarder rewarder = poolInfo[_pid].rewarder;
if (address(rewarder) != address(0)) {
rewarder.onOArbReward(msg.sender, user.amount);
}
}
}
function retriveToken(ERC20 token, address account, uint256 amount) external onlyConfigurator {
token.safeTransfer(account, amount);
}
}
文件 7 的 8:SafeTransferLib.sol
pragma solidity >=0.8.0;
import {ERC20} from "../tokens/ERC20.sol";
library SafeTransferLib {
function safeTransferETH(address to, uint256 amount) internal {
bool success;
assembly {
success := call(gas(), to, amount, 0, 0, 0, 0)
}
require(success, "ETH_TRANSFER_FAILED");
}
function safeTransferFrom(
ERC20 token,
address from,
address to,
uint256 amount
) internal {
bool success;
assembly {
let freeMemoryPointer := mload(0x40)
mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff))
mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff))
mstore(add(freeMemoryPointer, 68), amount)
success := and(
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
)
}
require(success, "TRANSFER_FROM_FAILED");
}
function safeTransfer(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
let freeMemoryPointer := mload(0x40)
mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff))
mstore(add(freeMemoryPointer, 36), amount)
success := and(
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "TRANSFER_FAILED");
}
function safeApprove(
ERC20 token,
address to,
uint256 amount
) internal {
bool success;
assembly {
let freeMemoryPointer := mload(0x40)
mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff))
mstore(add(freeMemoryPointer, 36), amount)
success := and(
or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
)
}
require(success, "APPROVE_FAILED");
}
}
文件 8 的 8:constants.sol
pragma solidity 0.8.17;
import { ERC20 } from "@solmate/tokens/ERC20.sol";
address constant ARB = 0x912CE59144191C1204E64559FE8253a0e49E6548;
address constant WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1;
ERC20 constant glpUSDC = ERC20(0x727eD4eF04bB2a96Ec77e44C1a91dbB01B605e42);
ERC20 constant glpWETH = ERC20(0xbb84D79159D6bBE1DE148Dc82640CaA677e06126);
ERC20 constant glpWBTC = ERC20(0x6a89FaF99587a12E6bB0351F2fA9006c6Cd12257);
ERC20 constant glpLINK = ERC20(0xe0A21a475f8DA0ee7FA5af8C1809D8AC5257607d);
ERC20 constant glpUNI = ERC20(0x37c0705A65948EA5e0Ae1aDd13552BCaD7711A23);
ERC20 constant glpUSDCb = ERC20(0xdCa4e88C00a8800ebcebaD63aBDBAAaa755557f9);
ERC20 constant glpWETHb = ERC20(0xf2aD33E12A9780f1E42d878A29A3e0756008c838);
ERC20 constant glpWBTCb = ERC20(0x83C19EC75d649aeC7c99e2C6663cA055569da7C0);
ERC20 constant glpLINKb = ERC20(0xB0d9e1832BD973aBd8f3b4D710eAd21FcbEfcb7C);
ERC20 constant glpUNIb = ERC20(0xEE57E7E3776e4868976F315E07A883955c9225d5);
address constant TREASURY = 0x8E52cA5A7a9249431F03d60D79DDA5EAB4930178;
{
"compilationTarget": {
"src/MasterChefUmamiGmx.sol": "MasterChefUmamiGmx"
},
"evmVersion": "london",
"libraries": {
"gmx-synthetics/gas/GasUtils.sol:GasUtils": "0x3d0453036f3e39ff9384f0e1c8a59b17e05277d0",
"gmx-synthetics/market/MarketUtils.sol:MarketUtils": "0xecdf2ce74e19d4921cc89fefb963d35e0e5171d3"
},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 888
},
"remappings": [
":@openzeppelin/=lib/openzeppelin-contracts/",
":@solady/=lib/solady/src/",
":@solmate/=lib/solmate/src/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":openzeppelin/=lib/openzeppelin-contracts/contracts/",
":solady/=lib/solady/src/",
":solmate/=lib/solmate/src/"
]
}
[{"inputs":[{"internalType":"contract ERC20","name":"_arb","type":"address"},{"internalType":"contract ArbVaultGmx","name":"_arbVault","type":"address"},{"internalType":"contract Auth","name":"_auth","type":"address"},{"internalType":"uint256","name":"_arbPerSec","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract ERC20","name":"lpToken","type":"address"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"}],"name":"Add","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"overwrite","type":"bool"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_arbPerSec","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accOArbPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ARB","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AUTH","outputs":[{"internalType":"contract Auth","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract ERC20","name":"_lpToken","type":"address"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arbPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"arbVault","outputs":[{"internalType":"contract ArbVaultGmx","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectAllPoolRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lp","type":"address"}],"name":"getPIdFromLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"uint256","name":"pendingOArb","type":"uint256"},{"internalType":"address","name":"bonusTokenAddress","type":"address"},{"internalType":"string","name":"bonusTokenSymbol","type":"string"},{"internalType":"uint256","name":"pendingBonusToken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract ERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accOArbPerShare","type":"uint256"},{"internalType":"contract IRewarder","name":"rewarder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"retriveToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"rewarderBonusTokenInfo","outputs":[{"internalType":"address","name":"bonusTokenAddress","type":"address"},{"internalType":"string","name":"bonusTokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"bool","name":"overwrite","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arbPerSec","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]