Transaction Hash:
Block:
15980834 at Nov-16-2022 06:35:59 AM +UTC
Transaction Fee:
0.001176602577179498 ETH
$3.01
Gas Used:
90,713 Gas / 12.970605946 Gwei
Emitted Events:
185 |
TokenikV1Rewards.ClaimAirdrop( user=[Sender] 0xaa7978335827e95f8e9db4973e6c39f6f11daa3f, amount=300000000000000000000, ref=0xbd662444...b1353B461, refAmount=50000000000000000000 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x086b6561...5Beffe54F | |||||
0x95222290...5CC4BAfe5
Miner
| (beaverbuild) | 8.910283922871038037 Eth | 8.910310697548307615 Eth | 0.000026774677269578 | |
0xAA797833...6F11Daa3F |
0.0100886 Eth
Nonce: 0
|
0.008911997422820502 Eth
Nonce: 1
| 0.001176602577179498 |
Execution Trace
TokenikV1Rewards.claimAirdrop( _ref=0xbd6624447b054b6aba2c302c6DE6f17b1353B461 )
claimAirdrop[TokenikV1Rewards (ln:100)]
ClaimAirdrop[TokenikV1Rewards (ln:112)]
ClaimAirdrop[TokenikV1Rewards (ln:117)]
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity >0.8.0; import './interfaces/ITokenikV1Rewards.sol'; contract TokenikV1Rewards is ITokenikV1Rewards{ event ClaimAirdrop( address user, uint256 amount, address ref, uint256 refAmount ); address public callerSetter; bool public addRewardPaused; //to be paused on Tokenik v2 launch bool public removeRewardPaused; //to be paused on Tokenik v2 launch bool public airdropEnabled; //false on contract launch uint256 public airdropAmount; //free airdrop amount uint256 public airdropRefBonus; //airdrop referral bonus uint256 public totalRewards; //total rewards supply uint256 public totalAirdropClaims; //number of individual addresses that claimed the airdrop uint256 public swapRewardPercentage; // 1 decimal, 10 is 1% mapping(address => uint256) public tradingRewards; //RNIK balance with 18 decimals mapping(address => bool) public approvedCallers; //approved callers list mapping(address => bool) public approvedTokens; //stable tokens approved to receive trading rewards mapping(address => bool) public claimedAirdrop; //track airdrop claims modifier onlySetter() { require(msg.sender == callerSetter, 'TokenikV1: FORBIDDEN'); _; } modifier onlyCaller() { require(approvedCallers[msg.sender], 'TokenikV1: Forbidden'); _; } constructor() { callerSetter = msg.sender; approvedCallers[msg.sender] = true; airdropAmount = 250 * 1e18; //250 RNIK airdropRefBonus = 50 * 1e18; //50 RNIK swapRewardPercentage = 10; //1% } function addReward(address _user, uint256 _amount) external override onlyCaller { if(!addRewardPaused){ tradingRewards[_user] += _amount; totalRewards += _amount; } } function addSwapReward(address _user, uint256 _amount, address _token) external override onlyCaller { //valid if pair is caller and token is approved if(!approvedTokens[_token]) return; //ensure the token is approved if(!addRewardPaused){ uint256 rewardOffer = _amount * swapRewardPercentage / 1000; tradingRewards[_user] += rewardOffer; totalRewards += rewardOffer; } } function addLiquidityReward(address _user, address _token0, address _token1, uint256 _amount0, uint256 _amount1) external override onlyCaller { //valid if pair is caller and token is approved if(addRewardPaused) return; //rewards is paused if(approvedTokens[_token0]){ tradingRewards[_user] += _amount0; totalRewards += _amount0; } else{ if(approvedTokens[_token1]){ tradingRewards[_user] += _amount1; totalRewards += _amount1; } } } function removeReward(address _user, uint256 _amount) external override onlyCaller returns(bool) { if(!removeRewardPaused){ //ensure the _amount is not greater than user balance if(_amount > tradingRewards[_user]){ return false; } else{ tradingRewards[_user] -= _amount; totalRewards -= _amount; return true; } } else{ return false; } } function removeSwapReward(address _user, uint256 _amount, address _token) external override onlyCaller returns(bool) { if(removeRewardPaused) return false; //rewards is paused if(!approvedTokens[_token]) return false; //token is not approved if(_amount > tradingRewards[_user]){ return false; } else{ tradingRewards[_user] -= _amount; totalRewards -= _amount; return true; } } function claimAirdrop(address _ref) external override { require(airdropEnabled, 'TokenikV1: Airdrop is disabled.'); require(!claimedAirdrop[msg.sender], 'TokenikV1: Already claimed airdrop.'); claimedAirdrop[msg.sender] = true; totalAirdropClaims +=1; uint256 amountToClaim = airdropAmount; if((_ref != address(0)) && (_ref != msg.sender)){ amountToClaim +=airdropRefBonus; tradingRewards[msg.sender] += amountToClaim; tradingRewards[_ref] += airdropRefBonus; uint256 mintedRewards = amountToClaim + airdropRefBonus; totalRewards += mintedRewards; emit ClaimAirdrop(msg.sender, amountToClaim, _ref, airdropRefBonus); } else{ tradingRewards[msg.sender] += amountToClaim; totalRewards += amountToClaim; emit ClaimAirdrop(msg.sender, amountToClaim, address(0), 0); } } //getter functions function getRewards(address _address) external view override returns(uint256){ return tradingRewards[_address]; } function getClaimedAirdrop(address _address) external view override returns(bool){ return claimedAirdrop[_address]; } function getApprovedCaller(address _address) override view external returns(bool){ return approvedCallers[_address]; } function getApprovedToken(address _address) external view override returns(bool){ return approvedTokens[_address]; } function getApprovedTokens(address _token0, address _token1) external view override returns(bool,bool){ return (approvedTokens[_token0], approvedTokens[_token1]); } //setter functions function setCallerSetter(address _callerSetter) external override onlySetter{ callerSetter = _callerSetter; //intentionally not checking against address(0) as callerSetter will be set to zero address once Tokenik v2 launches and rewards get paused } function setApprovedCaller(address _caller, bool _approved) external override onlySetter{ approvedCallers[_caller] = _approved; } function setApprovedTokens(address _token, bool _approved) external override onlySetter{ approvedTokens[_token] = _approved; } function setAddRewardPaused(bool _paused) external override onlySetter{ addRewardPaused = _paused; } function setRemoveRewardPaused(bool _paused) external override onlySetter{ removeRewardPaused = _paused; } function setAirdropAmounts(uint256 _amount, uint256 _refAmount) external override onlySetter{ airdropAmount = _amount; airdropRefBonus = _refAmount; } function enableAirdrop(bool _enabled) external override onlySetter{ airdropEnabled = _enabled; } }// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity >0.8.0; interface ITokenikV1Rewards { function addReward(address _user, uint256 _amount) external; function addSwapReward(address _user, uint256 _amount, address _token) external; function removeReward(address _user, uint256 _amount) external returns(bool); function claimAirdrop(address _ref) external; function getRewards(address _address) external view returns(uint256); function getClaimedAirdrop(address _address) external view returns(bool); function getApprovedCaller(address _address) external view returns(bool); function setCallerSetter(address _callerSetter) external; function setApprovedCaller(address _caller, bool _approved) external; function setAddRewardPaused(bool _paused) external; function setRemoveRewardPaused(bool _paused) external; function setAirdropAmounts(uint256 _amount, uint256 _refAmount) external; function enableAirdrop(bool _enabled) external; function addLiquidityReward(address _user, address _token0, address _token1, uint256 _amount0, uint256 _amount1) external; function removeSwapReward(address _user, uint256 _amount, address _token) external returns(bool); function getApprovedToken(address _address) external view returns(bool); function getApprovedTokens(address _token0, address _token1) external view returns(bool,bool); function setApprovedTokens(address _token, bool _approved) external; }