文件 1 的 6:Address.sol
pragma solidity 0.7.5;
library Address {
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly {
codehash := extcodehash(account)
}
return (codehash != accountHash && codehash != 0x0);
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, 'Address: insufficient balance');
(bool success, ) = recipient.call{value: amount}('');
require(success, 'Address: unable to send value, recipient may have reverted');
}
}
文件 2 的 6:IERC20.sol
pragma solidity 0.7.5;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 3 的 6:SM2Recovery.sol
pragma solidity 0.7.5;
pragma abicoder v2;
import { SafeERC20 } from '../../../dependencies/open-zeppelin/SafeERC20.sol';
import { IERC20 } from '../../../interfaces/IERC20.sol';
import { VersionedInitializable } from '../../../utils/VersionedInitializable.sol';
contract SM2Recovery is
VersionedInitializable
{
using SafeERC20 for IERC20;
event Claimed(
address staker,
uint256 amount
);
IERC20 public immutable TOKEN;
mapping(address => uint256) internal _OWED_AMOUNTS_;
constructor(
IERC20 token
) {
TOKEN = token;
}
function initialize()
external
initializer
{
_OWED_AMOUNTS_[0x8031EEC1118D1321387b1870F32984f72b447b04] = 64268082313114004568;
_OWED_AMOUNTS_[0x5AcABC3222A7b74884bEC8efe28A7A69A7920818] = 552458868361822400896;
_OWED_AMOUNTS_[0x5F5A46a8471F60b1E9F2eD0b8fc21Ba8b48887D8] = 235077596410469150;
_OWED_AMOUNTS_[0x0DB0f4506F5De744052D90f04E3fcA3D1dD3600d] = 384593000000000000000;
_OWED_AMOUNTS_[0x7457865bA58C4Fe72Fc43Ec8fDF61c818CAA93F4] = 1300887470344112802478;
_OWED_AMOUNTS_[0x9c4d592042F959254485d443bBc337d29572264F] = 3300000000000000000000;
_OWED_AMOUNTS_[0x80D0d54050C15971b21e877D95441800f5AA9ee8] = 11000000000000000000000;
_OWED_AMOUNTS_[0x5B53d310c73Afd70f03b7a373b3e2451983228c1] = 1280981223066754379678;
_OWED_AMOUNTS_[0x3286188FeA86932334F566E03722EEFd432a0E02] = 1317109351284421555527;
_OWED_AMOUNTS_[0xE3666187c7Fbd30ea514a00747f27BeF2Df27d69] = 1477556477490299423613;
_OWED_AMOUNTS_[0xDf6Db53933ebca389eC348fF1959C01364071144] = 7095256507486694584870;
_OWED_AMOUNTS_[0xd6137678698f5304bEf86262332Be671618d5d08] = 7055301000000000000000;
_OWED_AMOUNTS_[0xc4a69B137d22b52A36328F3ac6d5Aa9984fAab8E] = 4784593000000000000000;
_OWED_AMOUNTS_[0x302240E264d6CA3d83E7567f8A9150AacaB735bc] = 5674396523298561944146;
_OWED_AMOUNTS_[0x429f13e4ec5E57c9AE2388c5020E372F73fe168A] = 1286368590769499516847;
_OWED_AMOUNTS_[0xe70949032907349A132E6793140679b43072F1E6] = 1718241113998470540361;
_OWED_AMOUNTS_[0x57e2D81A82ACCCfaD9133929805CFf7f6dFc3bF4] = 181238687144559973685;
_OWED_AMOUNTS_[0xC1AB8632e3f7fF2b62BcFC5c5DEba3aAA21799c9] = 2365000000000000000000;
_OWED_AMOUNTS_[0x4F56A59804D464f44A3efc336FDf18A442fA8a72] = 1279861000000000000000;
_OWED_AMOUNTS_[0x8C5bA8D0017C92527Daa77b145919A77614dfd9e] = 1281509901429422484117;
_OWED_AMOUNTS_[0x7baf9864ecb3cEc21523508C86a1a3EFcE2408be] = 342338041811379508166;
_OWED_AMOUNTS_[0x88cE8A4b8896Fab3556Cf23308F3387C55b0d0B7] = 4785681587877185155372;
_OWED_AMOUNTS_[0xaCe95175B107f0d6A7A2949F7Af83d7A3528fB4e] = 1298458905663869980155;
_OWED_AMOUNTS_[0x2e10104bD7B3e7C659f6F802166Be3FCdCd0C097] = 885095539863312510574;
_OWED_AMOUNTS_[0x190fdb62971A2B0Ec9f037D4a0DaC1B062CCeaBD] = 4513484494342160884;
_OWED_AMOUNTS_[0x0485A925b92F64D195B5f65D0B4C3B72004e98A4] = 4113076000000000000000;
_OWED_AMOUNTS_[0x1b90B46F9Bd6BDcF0adDc4D0601dFAD832FDB1bD] = 1100000000000000000000;
_OWED_AMOUNTS_[0x4CAe5BED586f6E73Ae54EbD40A4AC4eD2c477C34] = 5500000000000000000000;
_OWED_AMOUNTS_[0x2245bE89Fc8faB94ed982e859Aa3212A4e4eB7e5] = 1282856631838285955062;
_OWED_AMOUNTS_[0x0Dd6a8de365b2800F828E95feEf637027ceBfDc6] = 588558977171078055937;
_OWED_AMOUNTS_[0xFF3f61fC642612D7799535132f5B7c5C0855d428] = 1433114383428671659805;
_OWED_AMOUNTS_[0xb97d9350F32C1366016e2C0a55E4A210D1158b22] = 550000000000000000000;
_OWED_AMOUNTS_[0xE629E1F7d250d39AF4d704B486B094A4bA91Ef3b] = 1287201041172069164377;
_OWED_AMOUNTS_[0xaEaB8114f8920A0522F422618c5b9a2c618527c3] = 17835682575238615124669;
_OWED_AMOUNTS_[0x0772C1EfC61Ff9cC902730d92B90403792edFC31] = 10790308971643820273711;
_OWED_AMOUNTS_[0x961f4A36510cbB4ee58EE8FEaf65DC7E36A8e892] = 550000000000000000000;
_OWED_AMOUNTS_[0x0F70c8C6236F4335B791637B8603F711F9829a27] = 10607091128313405834737;
_OWED_AMOUNTS_[0x54276623b82377Ff9cD0a2a9CCB3e5b7430dDc66] = 342603963320765173769;
_OWED_AMOUNTS_[0xb92667E34cB6753449ADF464f18ce1833Caf26e0] = 3474416779777843867269;
_OWED_AMOUNTS_[0x89Cffe1B398FBF0Eb64BE9C08ebcE777Cec47500] = 7055765746048851547169;
_OWED_AMOUNTS_[0x431c7CA252ba1c41ac11E67b2593e930608A60ed] = 732600000000000000000;
_OWED_AMOUNTS_[0x34Fa1d4cc23735f72e38A44C6bEb4bf066862720] = 1279861000000000000000;
_OWED_AMOUNTS_[0x5ef5a01b069dDf4B71d1fe8C1b23064Ffc3Cda92] = 3300000000000000000000;
_OWED_AMOUNTS_[0xFd920E06Db76196987d94f2904D9467B9BE01ccd] = 1288537049417628862842;
_OWED_AMOUNTS_[0xbc113aC29567eE89363E4d07462823F60b8B5528] = 2640000000000000000000;
_OWED_AMOUNTS_[0xD70A24Be28cFAe9Dba87e7eB580B53Cc8Ae4Fe58] = 342533776463304204728;
_OWED_AMOUNTS_[0x3B7b41F27b89F07269A0599F15fBa723f21f2442] = 546879927158663152683;
_OWED_AMOUNTS_[0x9cd4b3F7f05240B5e07F0512ED7976ad4de81467] = 3814116914721288096590;
_OWED_AMOUNTS_[0x19B003465B3b310463f8b925663F746a67c0DB95] = 1279948951048054429868;
_OWED_AMOUNTS_[0x482AbC7795CcfB657DD09c9F0b67312F4ECCFD07] = 3724793551879978926290;
_OWED_AMOUNTS_[0xcD1d9B792B3F8e19E742DC4f49a24e5637D72786] = 10484148886716091999320;
_OWED_AMOUNTS_[0x51447CE0A502366658168Bf5AAf96f51d22AdcEE] = 1282928920964317728794;
_OWED_AMOUNTS_[0xE3939654Deae5f54fD3e6B84b3A7F75f245062d8] = 11029668754351092393909;
_OWED_AMOUNTS_[0x6649371d9236eCcDD7aF96fBA9435D78502354C1] = 1317091832283544853303;
_OWED_AMOUNTS_[0x405B0C43d66D3406FaB0abc0eCee2359CeCe1c4B] = 715032626619900552466;
_OWED_AMOUNTS_[0xE8b67eBf4825FEC2AB6c010A01064f5fa54672a5] = 2200000000000000000000;
}
function claim()
external
returns (uint256)
{
address staker = msg.sender;
uint256 owedAmount = _OWED_AMOUNTS_[staker];
_OWED_AMOUNTS_[staker] = 0;
TOKEN.safeTransfer(staker, owedAmount);
emit Claimed(staker, owedAmount);
return owedAmount;
}
function getOwedAmount(
address staker
)
external
view
returns (uint256)
{
return _OWED_AMOUNTS_[staker];
}
function getRevision()
internal
pure
override
returns (uint256)
{
return 1;
}
}
文件 4 的 6:SafeERC20.sol
pragma solidity 0.7.5;
import { IERC20 } from '../../interfaces/IERC20.sol';
import { SafeMath } from './SafeMath.sol';
import { Address } from './Address.sol';
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
'SafeERC20: approve from non-zero to non-zero allowance'
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function callOptionalReturn(IERC20 token, bytes memory data) private {
require(address(token).isContract(), 'SafeERC20: call to non-contract');
(bool success, bytes memory returndata) = address(token).call(data);
require(success, 'SafeERC20: low-level call failed');
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed');
}
}
}
文件 5 的 6:SafeMath.sol
pragma solidity 0.7.5;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, 'SafeMath: addition overflow');
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, 'SafeMath: subtraction overflow');
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, 'SafeMath: multiplication overflow');
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, 'SafeMath: division by zero');
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, 'SafeMath: modulo by zero');
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
文件 6 的 6:VersionedInitializable.sol
pragma solidity 0.7.5;
abstract contract VersionedInitializable {
uint256 internal lastInitializedRevision = 0;
modifier initializer() {
uint256 revision = getRevision();
require(revision > lastInitializedRevision, "Contract instance has already been initialized");
lastInitializedRevision = revision;
_;
}
function getRevision() internal pure virtual returns(uint256);
uint256[50] private ______gap;
}
{
"compilationTarget": {
"contracts/safety/v2/helpers/SM2Recovery.sol": "SM2Recovery"
},
"evmVersion": "berlin",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getOwedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"}]