编译器
0.8.13+commit.abaa5c0e
文件 1 的 6:Bech32.sol
pragma solidity >=0.5.15;
import {BytesLib} from "./BytesLib.sol";
library Bech32 {
using BytesLib for bytes;
bytes constant CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
function polymod(uint256[] memory values) internal pure returns (uint256) {
uint32[5] memory GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
uint256 chk = 1;
for (uint256 p = 0; p < values.length; p++) {
uint256 top = chk >> 25;
chk = ((chk & 0x1ffffff) << 5) ^ values[p];
for (uint256 i = 0; i < 5; i++) {
if ((top >> i) & 1 == 1) {
chk ^= GENERATOR[i];
}
}
}
return chk;
}
function hrpExpand(uint256[] memory hrp) internal pure returns (uint256[] memory) {
uint256[] memory ret = new uint256[](hrp.length + hrp.length + 1);
for (uint256 p = 0; p < hrp.length; p++) {
ret[p] = hrp[p] >> 5;
}
ret[hrp.length] = 0;
for (uint256 p = 0; p < hrp.length; p++) {
ret[p + hrp.length + 1] = hrp[p] & 31;
}
return ret;
}
function concat(uint256[] memory left, uint256[] memory right) internal pure returns (uint256[] memory) {
uint256[] memory ret = new uint256[](left.length + right.length);
uint256 i = 0;
for (; i < left.length; i++) {
ret[i] = left[i];
}
uint256 j = 0;
while (j < right.length) {
ret[i++] = right[j++];
}
return ret;
}
function extend(
uint256[] memory array,
uint256 val,
uint256 num
) internal pure returns (uint256[] memory) {
uint256[] memory ret = new uint256[](array.length + num);
uint256 i = 0;
for (; i < array.length; i++) {
ret[i] = array[i];
}
uint256 j = 0;
while (j < num) {
ret[i++] = val;
j++;
}
return ret;
}
function createChecksum(uint256[] memory hrp, uint256[] memory data) internal pure returns (uint256[] memory) {
uint256[] memory values = extend(concat(hrpExpand(hrp), data), 0, 6);
uint256 mod = polymod(values) ^ 1;
uint256[] memory ret = new uint256[](6);
for (uint256 p = 0; p < 6; p++) {
ret[p] = (mod >> (5 * (5 - p))) & 31;
}
return ret;
}
function encode(uint256[] memory hrp, uint256[] memory data) internal pure returns (bytes memory) {
uint256[] memory combined = concat(data, createChecksum(hrp, data));
bytes memory ret = new bytes(combined.length);
for (uint256 p = 0; p < combined.length; p++) {
ret[p] = CHARSET[combined[p]];
}
return ret;
}
function convert(
uint256[] memory data,
uint256 inBits,
uint256 outBits
) internal pure returns (uint256[] memory) {
uint256 value = 0;
uint256 bits = 0;
uint256 maxV = (1 << outBits) - 1;
uint256[] memory ret = new uint256[](32);
uint256 j = 0;
for (uint256 i = 0; i < data.length; ++i) {
value = (value << inBits) | data[i];
bits += inBits;
while (bits >= outBits) {
bits -= outBits;
ret[j] = (value >> bits) & maxV;
j += 1;
}
}
return ret;
}
}
文件 2 的 6:BytesLib.sol
pragma solidity >=0.5.10;
library BytesLib {
function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) {
bytes memory tempBytes;
assembly {
tempBytes := mload(0x40)
let length := mload(_preBytes)
mstore(tempBytes, length)
let mc := add(tempBytes, 0x20)
let end := add(mc, length)
for {
let cc := add(_preBytes, 0x20)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
mstore(mc, mload(cc))
}
length := mload(_postBytes)
mstore(tempBytes, add(length, mload(tempBytes)))
mc := end
end := add(mc, length)
for {
let cc := add(_postBytes, 0x20)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
mstore(mc, mload(cc))
}
mstore(
0x40,
and(
add(add(end, iszero(add(length, mload(_preBytes)))), 31),
not(31)
)
)
}
return tempBytes;
}
function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {
assembly {
let fslot := sload(_preBytes.slot)
let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
let mlength := mload(_postBytes)
let newlength := add(slength, mlength)
switch add(lt(slength, 32), lt(newlength, 32))
case 2 {
sstore(
_preBytes.slot,
add(
fslot,
add(
mul(
div(
mload(add(_postBytes, 0x20)),
exp(0x100, sub(32, mlength))
),
exp(0x100, sub(32, newlength))
),
mul(mlength, 2)
)
)
)
}
case 1 {
mstore(0x0, _preBytes.slot)
let sc := add(keccak256(0x0, 0x20), div(slength, 32))
sstore(_preBytes.slot, add(mul(newlength, 2), 1))
let submod := sub(32, slength)
let mc := add(_postBytes, submod)
let end := add(_postBytes, mlength)
let mask := sub(exp(0x100, submod), 1)
sstore(
sc,
add(
and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00),
and(mload(mc), mask)
)
)
for {
mc := add(mc, 0x20)
sc := add(sc, 1)
} lt(mc, end) {
sc := add(sc, 1)
mc := add(mc, 0x20)
} {
sstore(sc, mload(mc))
}
mask := exp(0x100, sub(mc, end))
sstore(sc, mul(div(mload(mc), mask), mask))
}
default {
mstore(0x0, _preBytes.slot)
let sc := add(keccak256(0x0, 0x20), div(slength, 32))
sstore(_preBytes.slot, add(mul(newlength, 2), 1))
let slengthmod := mod(slength, 32)
let mlengthmod := mod(mlength, 32)
let submod := sub(32, slengthmod)
let mc := add(_postBytes, submod)
let end := add(_postBytes, mlength)
let mask := sub(exp(0x100, submod), 1)
sstore(sc, add(sload(sc), and(mload(mc), mask)))
for {
sc := add(sc, 1)
mc := add(mc, 0x20)
} lt(mc, end) {
sc := add(sc, 1)
mc := add(mc, 0x20)
} {
sstore(sc, mload(mc))
}
mask := exp(0x100, sub(mc, end))
sstore(sc, mul(div(mload(mc), mask), mask))
}
}
}
function slice(
bytes memory _bytes,
uint256 _start,
uint256 _length
) internal pure returns (bytes memory res) {
if (_length == 0) {
return hex"";
}
uint256 _end = _start + _length;
require(_end > _start && _bytes.length >= _end, "Slice out of bounds");
assembly {
res := mload(0x40)
mstore(0x40, add(add(res, 64), _length))
mstore(res, _length)
let diff := sub(res, add(_bytes, _start))
for {
let src := add(add(_bytes, 32), _start)
let end := add(src, _length)
} lt(src, end) {
src := add(src, 32)
} {
mstore(add(src, diff), mload(src))
}
}
}
function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
uint256 _totalLen = _start + 20;
require(_totalLen > _start && _bytes.length >= _totalLen, "Address conversion out of bounds.");
address tempAddress;
assembly {
tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
}
return tempAddress;
}
function toUint(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {
uint256 _totalLen = _start + 32;
require(_totalLen > _start && _bytes.length >= _totalLen, "Uint conversion out of bounds.");
uint256 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x20), _start))
}
return tempUint;
}
function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {
bool success = true;
assembly {
let length := mload(_preBytes)
switch eq(length, mload(_postBytes))
case 1 {
let cb := 1
let mc := add(_preBytes, 0x20)
let end := add(mc, length)
for {
let cc := add(_postBytes, 0x20)
} eq(add(lt(mc, end), cb), 2) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
if iszero(eq(mload(mc), mload(cc))) {
success := 0
cb := 0
}
}
}
default {
success := 0
}
}
return success;
}
function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {
bool success = true;
assembly {
let fslot := sload(_preBytes.slot)
let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
let mlength := mload(_postBytes)
switch eq(slength, mlength)
case 1 {
if iszero(iszero(slength)) {
switch lt(slength, 32)
case 1 {
fslot := mul(div(fslot, 0x100), 0x100)
if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
success := 0
}
}
default {
let cb := 1
mstore(0x0, _preBytes.slot)
let sc := keccak256(0x0, 0x20)
let mc := add(_postBytes, 0x20)
let end := add(mc, mlength)
for {
} eq(add(lt(mc, end), cb), 2) {
sc := add(sc, 1)
mc := add(mc, 0x20)
} {
if iszero(eq(sload(sc), mload(mc))) {
success := 0
cb := 0
}
}
}
}
}
default {
success := 0
}
}
return success;
}
function toBytes32(bytes memory _source) internal pure returns (bytes32 result) {
if (_source.length == 0) {
return 0x0;
}
assembly {
result := mload(add(_source, 32))
}
}
function keccak256Slice(
bytes memory _bytes,
uint256 _start,
uint256 _length
) internal pure returns (bytes32 result) {
uint256 _end = _start + _length;
require(_end > _start && _bytes.length >= _end, "Slice out of bounds");
assembly {
result := keccak256(add(add(_bytes, 32), _start), _length)
}
}
}
文件 3 的 6: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 的 6:LunacyDAO.sol
pragma solidity ^0.8.13;
import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";
import {TerraClaimable} from "./TerraClaimable.sol";
contract LunacyDAO is ERC20, TerraClaimable {
address immutable minter;
mapping(string => bool) public hasClaimed;
mapping(address => uint256) public leftToClaim;
mapping(address => uint256) public initiallyClaimed;
bool public claiming;
error Unauthorized();
error ClaimingNotEnabled();
error TooEarlyToClaimRemainder();
error NothingLeftToClaim();
error AlreadyClaimed();
error CannotClaim();
event Claim(address indexed to, uint256 amount);
constructor(address _minter) ERC20("LunacyDAO", "LUNAC", 18) {
minter = _minter;
_mint(msg.sender, 420_000_000_000e18);
}
function enableClaiming() external {
if (msg.sender != minter) revert Unauthorized();
claiming = true;
}
function claim(
uint256 amount,
bytes memory _minterSignature,
bytes memory _terraSignature,
bytes memory _terraPubKey
) external {
if (!claiming) revert ClaimingNotEnabled();
string memory terraAddress = addressFromPublicKey(_terraPubKey);
if (hasClaimed[terraAddress]) revert AlreadyClaimed();
if (!canClaim(_terraSignature, _terraPubKey)) revert CannotClaim();
bytes32 hashedMessage = sha256(abi.encodePacked(msg.sender, amount, terraAddress));
(uint8 v, bytes32 r, bytes32 s) = splitSignature(_minterSignature);
address recoveredAddress = ecrecover(hashedMessage, v, r, s);
if (recoveredAddress == address(0)) revert InvalidSignature();
if (recoveredAddress != minter) revert InvalidAddress();
uint256 mintAmount = (amount * 33) / 100;
hasClaimed[terraAddress] = true;
leftToClaim[msg.sender] = amount - mintAmount;
initiallyClaimed[msg.sender] = block.timestamp;
_mint(msg.sender, mintAmount);
emit Claim(msg.sender, mintAmount);
}
function claimRemainder() external {
uint256 mintAmount = leftToClaim[msg.sender];
if (mintAmount == 0) revert NothingLeftToClaim();
if (block.timestamp - initiallyClaimed[msg.sender] < 7 days) revert TooEarlyToClaimRemainder();
leftToClaim[msg.sender] = 0;
_mint(msg.sender, mintAmount);
emit Claim(msg.sender, mintAmount);
}
}
文件 5 的 6:Secp256k1.sol
pragma solidity ^0.8.13;
library EllipticCurve {
uint256 private constant U255_MAX_PLUS_1 =
57896044618658097711785492504343953926634992332820282019728792003956564819968;
uint256 public constant AA = 0;
uint256 public constant BB = 7;
uint256 public constant PP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F;
function expMod(
uint256 _base,
uint256 _exp
) internal pure returns (uint256) {
require(PP != 0, "Modulus is zero");
if (_base == 0) return 0;
if (_exp == 0) return 1;
uint256 r = 1;
uint256 bit = U255_MAX_PLUS_1;
assembly {
for {
} gt(bit, 0) {
} {
r := mulmod(mulmod(r, r, PP), exp(_base, iszero(iszero(and(_exp, bit)))), PP)
r := mulmod(mulmod(r, r, PP), exp(_base, iszero(iszero(and(_exp, div(bit, 2))))), PP)
r := mulmod(mulmod(r, r, PP), exp(_base, iszero(iszero(and(_exp, div(bit, 4))))), PP)
r := mulmod(mulmod(r, r, PP), exp(_base, iszero(iszero(and(_exp, div(bit, 8))))), PP)
bit := div(bit, 16)
}
}
return r;
}
function deriveY(uint8 _prefix, uint256 _x) internal pure returns (uint256) {
require(_prefix == 0x02 || _prefix == 0x03, "Invalid compressed EC point prefix");
uint256 y2 = addmod(mulmod(_x, mulmod(_x, _x, PP), PP), addmod(mulmod(_x, AA, PP), BB, PP), PP);
y2 = expMod(y2, (PP + 1) / 4);
uint256 y = (y2 + _prefix) % 2 == 0 ? y2 : PP - y2;
return y;
}
}
文件 6 的 6:TerraClaimable.sol
pragma solidity ^0.8.13;
import {Bech32} from "./lib/Bech32.sol";
import {EllipticCurve} from "./lib/Secp256k1.sol";
contract TerraClaimable {
error InvalidSignatureLength();
error InvalidSignature();
error InvalidAddress();
function canClaim(bytes memory _signature, bytes memory _compPubKey) public view returns (bool) {
bytes32 hashedAddress = sha256(abi.encodePacked(msg.sender));
(uint8 v, bytes32 r, bytes32 s) = splitSignature(_signature);
address recoveredAddress = ecrecover(hashedAddress, v, r, s);
if (recoveredAddress == address(0)) revert InvalidSignature();
bytes memory _pubKey = decompressPubKey(_compPubKey);
address computedAddress = address(uint160(uint256(keccak256(_pubKey))));
if (recoveredAddress != computedAddress) revert InvalidAddress();
return true;
}
function convertToArray(bytes memory _data) internal pure returns (uint256[] memory output) {
output = new uint256[](_data.length);
for (uint256 i = 0; i < _data.length; i++) {
output[i] = uint256(uint8(_data[i]));
}
}
function addressFromPublicKey(bytes memory _compPubKey) public pure returns (string memory result) {
bytes memory pubKeyHash = abi.encodePacked(ripemd160(abi.encodePacked(sha256(abi.encodePacked(_compPubKey)))));
uint256[] memory pubKeyNumbers = convertToArray(pubKeyHash);
uint256[] memory pubKey5BitBase = Bech32.convert(pubKeyNumbers, 8, 5);
result = string.concat("terra1", string(Bech32.encode(convertToArray(bytes("terra")), pubKey5BitBase)));
}
function splitSignature(bytes memory _sig)
internal
pure
returns (
uint8 v,
bytes32 r,
bytes32 s
)
{
if (_sig.length != 65) revert InvalidSignatureLength();
assembly {
r := mload(add(_sig, 32))
s := mload(add(_sig, 64))
v := byte(0, mload(add(_sig, 96)))
}
}
function decompressPubKey(bytes memory _compPubKey) internal pure returns (bytes memory pubKey) {
uint8 prefix;
uint256 x;
assembly {
prefix := byte(0, mload(add(_compPubKey, 32)))
x := mload(add(_compPubKey, 33))
}
uint256 y = EllipticCurve.deriveY(prefix, x);
pubKey = bytes.concat(bytes32(x), bytes32(y));
}
}
{
"compilationTarget": {
"src/LunacyDAO.sol": "LunacyDAO"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"CannotClaim","type":"error"},{"inputs":[],"name":"ClaimingNotEnabled","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"InvalidSignatureLength","type":"error"},{"inputs":[],"name":"NothingLeftToClaim","type":"error"},{"inputs":[],"name":"TooEarlyToClaimRemainder","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_compPubKey","type":"bytes"}],"name":"addressFromPublicKey","outputs":[{"internalType":"string","name":"result","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"bytes","name":"_compPubKey","type":"bytes"}],"name":"canClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"_minterSignature","type":"bytes"},{"internalType":"bytes","name":"_terraSignature","type":"bytes"},{"internalType":"bytes","name":"_terraPubKey","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRemainder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claiming","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableClaiming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"initiallyClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"leftToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]