Mining.sol 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.17;
  3. import "./Base.sol";
  4. contract A_Mining is Ownable, Base {
  5. address private _thisAddress;
  6. address private _sendAwardAddress;
  7. address private _lpAddress;
  8. address private _usdtAddress;
  9. address private _okcAddress;
  10. address private _marketingAddress;
  11. IUniswapV2Pair private _lPToken;
  12. IERC20 private _usdtToken;
  13. IERC20 private _okcToken;
  14. uint256 private userId;
  15. uint256 private randKey;
  16. struct User {
  17. uint256 userId;
  18. uint256 code;
  19. uint256 regTime;
  20. }
  21. struct StakeOrderInfo {
  22. address sender;
  23. uint256 amount;
  24. uint256 lPAmount;
  25. uint256 receiveAmount;
  26. uint256 status;
  27. }
  28. struct UnStakeOrderInfo {
  29. address sender;
  30. uint256 stakeOrderId;
  31. }
  32. struct ReceiveOrderInfo {
  33. address sender;
  34. uint256 stakeOrderId;
  35. uint256 amount;
  36. }
  37. mapping (address => User) private user;
  38. mapping (uint256 => StakeOrderInfo) private stakeOrder;
  39. mapping (uint256 => UnStakeOrderInfo) private unStakeOrderInfo;
  40. mapping (uint256 => ReceiveOrderInfo) private receiveOrderInfo;
  41. constructor() {
  42. _thisAddress = address(this);
  43. //_sendAwardAddress = address(0xA12CC19e68741327b9AD03D3cb6BD0B4e8Dd2a9B); //发放奖励钱包地址
  44. _marketingAddress = address(0x8A5eA893a78b7248eC14e980b5568496A0baBA03); //营销地址
  45. _okcAddress = address(0xF8d6D3Ae255094FA7db192956A4B2A3F5bd8e6e6);
  46. _lpAddress = address(0xf73D5c07624EA2AE3E8245eaE6A1D98767e1A488);
  47. _usdtAddress = address(0x55d398326f99059fF775485246999027B3197955);
  48. /*_marketingAddress = address(0x831fb743F7CB4Cbde0B3fd6B75FC972FD29da7A3); //营销地址
  49. _okcAddress = address(0xc8328808813B66B34eD485f1ED56DB74943dDa80);
  50. _lpAddress = address(0xb8717a3BA362dbB0CFa36aF23B4eB771e9a085f1);
  51. _usdtAddress = address(0xf1D777aa525643a707916DDE263c694EA93996aD);*/
  52. _lPToken = IUniswapV2Pair(_lpAddress);
  53. _usdtToken = IERC20(_usdtAddress);
  54. _okcToken = IERC20(_okcAddress);
  55. }
  56. function getUserCode() view public returns(uint256) {
  57. return user[msg.sender].code;
  58. }
  59. function getCode(address sender) view public onlyOwner returns(uint256) {
  60. return user[sender].code;
  61. }
  62. event RegisterEvent(uint256 userId, uint256 userCode);
  63. function register() public {
  64. address sender = msg.sender;
  65. require(user[sender].userId == 0, "Account already exists");
  66. userId++;
  67. user[sender].userId = userId;
  68. user[sender].code = uint(keccak256(abi.encode(sender, block.timestamp, block.number, userId, randKey))) % 1000000000;
  69. randKey = user[sender].code;
  70. emit RegisterEvent(userId, user[sender].code);
  71. }
  72. event StakeEvent(uint256 orderId, address sender, uint256 amount, uint256 lpAmount);
  73. function stake(uint256 orderId, uint256 amount) public {
  74. require(stakeOrder[orderId].amount == 0, "Order number already exists");
  75. uint256 lPAmount = getUsdtToLp(amount * 100 * 1e18);
  76. address sender = _msgSender();
  77. stakeOrder[orderId].sender = sender;
  78. stakeOrder[orderId].amount = amount;
  79. stakeOrder[orderId].lPAmount = lPAmount;
  80. _lPToken.transferFrom(sender, _thisAddress, lPAmount);
  81. emit StakeEvent(orderId, sender, amount, lPAmount);
  82. }
  83. event UnStakeEvent(uint256 orderId, address sender, uint256 stakeOrderId, uint256 lPAmount);
  84. function unstake(uint256 orderId, uint256 stakeOrderId) public {
  85. require(unStakeOrderInfo[orderId].stakeOrderId == 0, "Order Id number already exists");
  86. require(stakeOrder[stakeOrderId].amount > 0, "Stake Order Id number does not exist");
  87. require(stakeOrder[stakeOrderId].status == 0, "The order has been unpacked");
  88. address sender = _msgSender();
  89. require(stakeOrder[stakeOrderId].sender == sender, "error");
  90. uint256 lPAmount = getStakeLpAmount(stakeOrderId);
  91. _lPToken.approve(_thisAddress, lPAmount);
  92. _lPToken.transferFrom(_thisAddress, sender, lPAmount);
  93. unStakeOrderInfo[orderId].sender = sender;
  94. unStakeOrderInfo[orderId].stakeOrderId = stakeOrderId;
  95. stakeOrder[stakeOrderId].status = 1;
  96. emit UnStakeEvent(orderId, sender, stakeOrderId, lPAmount);
  97. }
  98. event GiveReceive(uint256 orderId, address sender, uint256 stakeOrderId, uint256 amount);
  99. function giveReceive(uint256 orderId, address sender, uint256 stakeOrderId, uint256 amount) public onlyOwner {
  100. require(receiveOrderInfo[orderId].stakeOrderId == 0, "Order Id number already exists");
  101. require(stakeOrder[stakeOrderId].amount > 0, "Stake Order Id number does not exist");
  102. uint256 destoryAmount = getProportion(amount, 3);
  103. uint256 marketingAmount = getProportion(amount, 2);
  104. _okcToken.approve(_thisAddress, amount);
  105. _okcToken.transferFrom(_thisAddress, address(0x000000000000000000000000000000000000dEaD), destoryAmount);
  106. _okcToken.transferFrom(_thisAddress, _marketingAddress, marketingAmount);
  107. _okcToken.transferFrom(_thisAddress, sender, amount - destoryAmount - marketingAmount);
  108. receiveOrderInfo[orderId].stakeOrderId = stakeOrderId;
  109. receiveOrderInfo[orderId].amount = amount;
  110. receiveOrderInfo[orderId].sender = sender;
  111. stakeOrder[stakeOrderId].receiveAmount += amount;
  112. emit GiveReceive(orderId, sender, stakeOrderId, amount);
  113. }
  114. function getStakeLpAmount(uint256 orderId) view public returns(uint256) {
  115. return stakeOrder[orderId].lPAmount;
  116. }
  117. function checkReceiveOrder(uint256 orderId, uint256 stakeOrderId, uint256 amount, address sender) view public returns(uint256) {
  118. if (receiveOrderInfo[orderId].amount == amount && receiveOrderInfo[orderId].sender == sender && receiveOrderInfo[orderId].stakeOrderId == stakeOrderId) {
  119. return 1;
  120. }
  121. return 0;
  122. }
  123. function checkStakeOrder(uint256 orderId, uint256 amount, address sender) view public returns(uint256) {
  124. if (stakeOrder[orderId].amount == amount && stakeOrder[orderId].sender == sender) {
  125. return 1;
  126. }
  127. return 0;
  128. }
  129. function checkUnStakeOrder(uint256 orderId, uint256 stakeOrderId, address sender) view public returns(uint256) {
  130. if (unStakeOrderInfo[orderId].stakeOrderId == stakeOrderId && unStakeOrderInfo[orderId].sender == sender) {
  131. return 1;
  132. }
  133. return 0;
  134. }
  135. function getUsdtToLp(uint256 amount) view public returns(uint256) {
  136. uint256 total_lp = _lPToken.totalSupply();
  137. uint256 total_Usdt = _usdtToken.balanceOf(_lpAddress);
  138. return (total_lp * 1e18 / total_Usdt) * amount / 1e18;
  139. //return (amount / (total_Usdt * 1e18 / total_lp)) * 1e18;
  140. }
  141. function getUsdtToOkc(uint256 amount) view public returns(uint256) {
  142. (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(_lpAddress).getReserves();
  143. address token0 = IUniswapV2Pair(_lpAddress).token0();
  144. uint256 usdtBalance = 0;
  145. uint256 thisBalance = 0;
  146. if(_okcAddress == token0) {
  147. usdtBalance = reserve1;
  148. thisBalance = reserve0;
  149. }
  150. else {
  151. usdtBalance = reserve0;
  152. thisBalance = reserve1;
  153. }
  154. return ((thisBalance * 1e18 / usdtBalance) * amount) / 1e18;
  155. }
  156. function getProportion(uint256 amount, uint per) private pure returns(uint256) {
  157. return (amount * per) / 100;
  158. }
  159. }