编译器
0.8.24+commit.e11b9ed9
文件 1 的 17:AIOracleCallbackReceiver.sol
pragma solidity ^0.8.9;
import "./interfaces/IAIOracle.sol";
abstract contract AIOracleCallbackReceiver {
IAIOracle public immutable aiOracle;
error UnauthorizedCallbackSource(IAIOracle expected, IAIOracle found);
constructor(IAIOracle _aiOracle) {
aiOracle = _aiOracle;
}
modifier onlyAIOracleCallback() {
IAIOracle foundRelayAddress = IAIOracle(msg.sender);
if (foundRelayAddress != aiOracle) {
revert UnauthorizedCallbackSource(aiOracle, foundRelayAddress);
}
_;
}
function aiOracleCallback(uint256 requestId, bytes calldata output, bytes calldata callbackData) external virtual;
function isFinalized(uint256 requestId) external view returns (bool) {
return aiOracle.isFinalized(requestId);
}
}
文件 2 的 17:AccessControl.sol
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}
文件 3 的 17:Context.sol
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 4 的 17:ERC165.sol
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 5 的 17:ERC20.sol
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual returns (string memory) {
return _name;
}
function symbol() public view virtual returns (string memory) {
return _symbol;
}
function decimals() public view virtual returns (uint8) {
return 18;
}
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
_totalSupply -= value;
}
} else {
unchecked {
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}
文件 6 的 17:ERC20Burnable.sol
pragma solidity ^0.8.20;
import {ERC20} from "../ERC20.sol";
import {Context} from "../../../utils/Context.sol";
abstract contract ERC20Burnable is Context, ERC20 {
function burn(uint256 value) public virtual {
_burn(_msgSender(), value);
}
function burnFrom(address account, uint256 value) public virtual {
_spendAllowance(account, _msgSender(), value);
_burn(account, value);
}
}
文件 7 的 17:IAIOracle.sol
pragma solidity ^0.8.9;
interface IAIOracle {
event AICallbackRequest(
address indexed account,
uint256 indexed requestId,
uint256 modelId,
bytes input,
address callbackContract,
uint64 gasLimit,
bytes callbackData
);
event AICallbackResult(
address indexed account,
uint256 indexed requestId,
address invoker,
bytes output
);
function requestCallback(
uint256 modelId,
bytes memory input,
address callbackContract,
uint64 gasLimit,
bytes memory callbackData
) external payable returns (uint256);
function estimateFee(uint256 modelId, uint256 gasLimit) external view returns (uint256);
function isFinalized(uint256 requestId) external view returns (bool);
}
文件 8 的 17:IAccessControl.sol
pragma solidity ^0.8.20;
interface IAccessControl {
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
error AccessControlBadConfirmation();
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address callerConfirmation) external;
}
文件 9 的 17:IERC165.sol
pragma solidity ^0.8.20;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 10 的 17:IERC20.sol
pragma solidity ^0.8.20;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 11 的 17:IERC20Metadata.sol
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 12 的 17:Math.sol
pragma solidity ^0.8.20;
library Math {
error MathOverflowedMulDiv();
enum Rounding {
Floor,
Ceil,
Trunc,
Expand
}
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
function average(uint256 a, uint256 b) internal pure returns (uint256) {
return (a & b) + (a ^ b) / 2;
}
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
return a / b;
}
return a == 0 ? 0 : (a - 1) / b + 1;
}
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
uint256 prod0 = x * y;
uint256 prod1;
assembly {
let mm := mulmod(x, y, not(0))
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
return prod0 / denominator;
}
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
uint256 remainder;
assembly {
remainder := mulmod(x, y, denominator)
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = denominator & (0 - denominator);
assembly {
denominator := div(denominator, twos)
prod0 := div(prod0, twos)
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
uint256 inverse = (3 * denominator) ^ 2;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
inverse *= 2 - denominator * inverse;
result = prod0 * inverse;
return result;
}
}
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 result = 1 << (log2(a) >> 1);
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
文件 13 的 17:MerkleProof.sol
pragma solidity ^0.8.20;
library MerkleProof {
error MerkleProofInvalidMultiproof();
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
if (leavesLen + proofLen != totalHashes + 1) {
revert MerkleProofInvalidMultiproof();
}
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
if (proofPos != proofLen) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
if (leavesLen + proofLen != totalHashes + 1) {
revert MerkleProofInvalidMultiproof();
}
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
if (proofPos != proofLen) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
文件 14 的 17:Pausable.sol
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
abstract contract Pausable is Context {
bool private _paused;
event Paused(address account);
event Unpaused(address account);
error EnforcedPause();
error ExpectedPause();
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
if (paused()) {
revert EnforcedPause();
}
}
function _requirePaused() internal view virtual {
if (!paused()) {
revert ExpectedPause();
}
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 15 的 17:Prompt.sol
pragma solidity ^0.8.13;
import {IAIOracle} from "OAO/contracts/interfaces/IAIOracle.sol";
import {AIOracleCallbackReceiver} from "OAO/contracts/AIOracleCallbackReceiver.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
contract Prompt is AIOracleCallbackReceiver, Pausable {
event promptsUpdated(
uint256 requestId,
uint256 modelId,
string input,
string output,
bytes callbackData
);
event ScoreUpdated(address indexed user, uint8 newScore);
event promptRequest(
uint256 requestId,
address sender,
uint256 modelId,
string prompt
);
struct AIOracleRequest {
address sender;
uint256 modelId;
bytes input;
bytes output;
}
address public owner;
string private systemPrompt =
"7007 protocol tokenizes AI outputs as unique inference assets, each representing a specific AI-generated data piece. This protocol makes AI inferences verifiable, immutable, and non-fungible, securing data and computation integrity on the blockchain. You are rating community members engagement with and potential to improve a crypto project. Rate replies based on: 0-10: The reply does not contribute value or is unclear/incomplete/short. 20-50: The member only wants financial incentive only but provides insufficient details to introduce their potential contribution. 60-90: The member could potentially improve the project and explains their plans and contribution convincingly. 90-100: The reply shows special passion and benefits for the project. You must output only the score in the format: ";
modifier onlyOwner() {
require(msg.sender == owner, "Only owner");
_;
}
mapping(uint256 => AIOracleRequest) public requests;
mapping(uint256 => uint64) public callbackGasLimit;
mapping(address => uint8) public addressScore;
address[] public scoredAddresses;
mapping(address => bool) public isAddressScored;
constructor(IAIOracle _aiOracle) AIOracleCallbackReceiver(_aiOracle) {
owner = msg.sender;
callbackGasLimit[14] = 2_500_000;
}
function setCallbackGasLimit(
uint256 modelId,
uint64 gasLimit
) external onlyOwner {
callbackGasLimit[modelId] = gasLimit;
}
mapping(uint256 => mapping(string => string)) public prompts;
function getAIResult(
uint256 modelId,
string calldata prompt
) external view returns (string memory) {
string memory input = string(
abi.encodePacked(
'{"instruction":"',
systemPrompt,
'",',
'"input": "',
prompt,
'"}'
)
);
return prompts[modelId][input];
}
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
function aiOracleCallback(
uint256 requestId,
bytes calldata output,
bytes calldata callbackData
) external override onlyAIOracleCallback {
AIOracleRequest storage request = requests[requestId];
require(request.sender != address(0), "request does not exist");
request.output = output;
prompts[request.modelId][string(request.input)] = string(output);
uint8 outputScore = safelyConvertToScore(output);
address sender = request.sender;
addressScore[sender] = outputScore;
emit ScoreUpdated(sender, outputScore);
if (!isAddressScored[sender]) {
scoredAddresses.push(sender);
isAddressScored[sender] = true;
}
emit promptsUpdated(
requestId,
request.modelId,
string(request.input),
string(output),
callbackData
);
}
function safelyConvertToScore(bytes memory b) public pure returns (uint8) {
if (b.length == 0) return 50;
uint16 score = 0;
bool hasValidDigit = false;
for (uint i = 0; i < b.length; i++) {
uint8 currentByte = uint8(b[i]);
if (currentByte >= 48 && currentByte <= 57) {
if (score == 0 && currentByte == 48 && !hasValidDigit) {
continue;
}
hasValidDigit = true;
score = score * 10 + (currentByte - 48);
if (score > 100) {
return 50;
}
} else if (hasValidDigit) {
break;
}
}
if (!hasValidDigit) {
return 50;
}
return uint8(score);
}
function getWhitelist() public view returns (address[] memory) {
return scoredAddresses;
}
function getWhitelistLength() public view returns (uint256) {
return scoredAddresses.length;
}
function estimateFee(uint256 modelId) public view returns (uint256) {
return aiOracle.estimateFee(modelId, callbackGasLimit[modelId]);
}
function setSystemPrompt(string calldata _systemPrompt) external onlyOwner {
systemPrompt = _systemPrompt;
}
uint256 public startTime = 1725879600;
uint256 public endTime = 1726052400;
function getStartTime() public view returns (uint256) {
return startTime;
}
function getEndTime() public view returns (uint256) {
return endTime;
}
function getStartRemainingTime() public view returns (uint256) {
require(block.timestamp >= startTime, "Claim Token Phase Not Open");
return startTime - block.timestamp;
}
function getEndRemainingTime() public view returns (uint256) {
require(block.timestamp <= endTime, "Claim Token Phase Ended");
return endTime - block.timestamp;
}
function setStartTime(uint256 _startTime) public onlyOwner {
startTime = _startTime;
}
function setEndTime(uint256 _endTime) public onlyOwner {
endTime = _endTime;
}
function calculateAIResult(
uint256 modelId,
string calldata prompt
) external payable whenNotPaused returns (uint256) {
require(block.timestamp >= startTime, "Phase Not Open");
require(block.timestamp <= endTime, "Phase Ended");
bytes memory input = bytes(
abi.encodePacked(
'{"instruction":"',
systemPrompt,
'",',
'"input": "',
prompt,
'"}'
)
);
uint256 requestId = aiOracle.requestCallback{value: msg.value}(
modelId,
input,
address(this),
callbackGasLimit[modelId],
""
);
AIOracleRequest storage request = requests[requestId];
request.input = input;
request.sender = msg.sender;
request.modelId = modelId;
emit promptRequest(requestId, msg.sender, modelId, prompt);
return requestId;
}
}
文件 16 的 17:Token7007.sol
pragma solidity ^0.8.13;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "./Prompt.sol";
contract Token7007 is ERC20, ERC20Burnable, Pausable, AccessControl {
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
bytes32 public constant AIRDROPPER_ROLE = keccak256("AIRDROPPER_ROLE");
using Math for uint256;
IERC20 public stoneToken;
address public treasury;
address public keeper;
uint256 public baseAirdropAmount;
mapping(address => bool) public hasAirdropped;
mapping(address => bool) public hasClaimed;
uint256 public totalTokenByScoreSupply;
uint256 public fundPoolValueInUSD;
uint256 public ethPriceInUSD;
event FundPoolValueUpdated(uint256 newValue);
event EthPriceUpdated(uint256 newPrice);
event NFTAirdropMultipliersUpdated(
uint256 nft1001Multiplier,
uint256 nft7007Multiplier
);
bytes32 public NFT1001burnCountMerkleRoot;
bytes32 public NFT7007burnCountMerkleRoot;
Prompt public promptContract;
constructor(
address _stoneToken,
uint256 _totalTokenByScoreSupply,
uint256 _initialFundPoolValueInUSD,
uint256 _initialEthPriceInUSD
) ERC20("Token7007", "7007") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_grantRole(MINTER_ROLE, msg.sender);
_grantRole(ADMIN_ROLE, msg.sender);
_grantRole(AIRDROPPER_ROLE, msg.sender);
stoneToken = IERC20(_stoneToken);
totalTokenByScoreSupply = _totalTokenByScoreSupply;
fundPoolValueInUSD = _initialFundPoolValueInUSD;
ethPriceInUSD = _initialEthPriceInUSD;
}
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function setNFT1001BurnCountMerkleRoot(
bytes32 _merkleRoot
) public onlyRole(ADMIN_ROLE) {
NFT1001burnCountMerkleRoot = _merkleRoot;
}
function setNFT7007BurnCountMerkleRoot(
bytes32 _merkleRoot
) public onlyRole(ADMIN_ROLE) {
NFT7007burnCountMerkleRoot = _merkleRoot;
}
function updateFundPoolValue(
uint256 _newFundPoolValueInUSD
) public onlyRole(ADMIN_ROLE) {
fundPoolValueInUSD = _newFundPoolValueInUSD;
emit FundPoolValueUpdated(_newFundPoolValueInUSD);
}
function updateEthPrice(
uint256 _newEthPriceInUSD
) public onlyRole(ADMIN_ROLE) {
ethPriceInUSD = _newEthPriceInUSD;
emit EthPriceUpdated(_newEthPriceInUSD);
}
function getAllTokenSupply() public view returns (uint256) {
return (totalTokenByScoreSupply * 10000) / 7007;
}
function getTokenPrice() public view returns (uint256) {
return Math.mulDiv(fundPoolValueInUSD, 1e18, totalTokenByScoreSupply);
}
function calculateTokenAmount(
uint256 paymentAmount
) public view returns (uint256) {
uint256 paymentValueInUSD = (paymentAmount * ethPriceInUSD) / 1e18;
uint256 tokenPrice = getTokenPrice();
return Math.mulDiv(paymentValueInUSD, 1e18, tokenPrice);
}
function setPromptContract(
address _promptContractAddress
) public onlyRole(ADMIN_ROLE) {
promptContract = Prompt(_promptContractAddress);
}
function getScore(address user) public view returns (uint8) {
require(
address(promptContract) != address(0),
"Prompt contract not set"
);
uint8 score = promptContract.addressScore(user);
require(score > 0, "User has no valid score");
return score;
}
function calculateRequiredPayment(
address user
) public view returns (uint256) {
getScore(user);
require(!hasClaimed[user], "Address has already claimed");
uint256 maxMintAmount = getMintableAmount(user);
uint256 tokenPrice = getTokenPrice();
uint256 usdValue = Math.mulDiv(maxMintAmount, tokenPrice, 1e18);
return Math.mulDiv(usdValue, 1e18, ethPriceInUSD);
}
uint256 public startTime = 1726075800;
uint256 public endTime = 1726228800;
function getStartTime() public view returns (uint256) {
return startTime;
}
function getEndTime() public view returns (uint256) {
return endTime;
}
function getStartRemainingTime() public view returns (uint256) {
require(block.timestamp >= startTime, "Claim Token Phase Not Open");
return startTime - block.timestamp;
}
function getEndRemainingTime() public view returns (uint256) {
require(block.timestamp <= endTime, "Claim Token Phase Ended");
return endTime - block.timestamp;
}
function setStartTime(uint256 _startTime) public onlyRole(ADMIN_ROLE) {
startTime = _startTime;
}
function setEndTime(uint256 _endTime) public onlyRole(ADMIN_ROLE) {
endTime = _endTime;
}
function userMint(
bool useETH,
uint256 NFT1001BurnAmount,
uint256 NFT7007BurnAmount,
bytes32[] calldata NFT1001merkleProof,
bytes32[] calldata NFT7007merkleProof
) public payable whenNotPaused {
require(block.timestamp >= startTime, "Claim Token Phase Not Open");
require(block.timestamp <= endTime, "Claim Token Phase Ended");
require(!hasClaimed[msg.sender], "Address has already claimed");
getScore(msg.sender);
uint256 totalAmount = getMintableAmount(msg.sender) +
getAirdropAmount(
msg.sender,
NFT1001BurnAmount,
NFT7007BurnAmount,
NFT1001merkleProof,
NFT7007merkleProof
);
uint256 requiredPayment = calculateRequiredPayment(msg.sender);
if (useETH) {
require(msg.value >= requiredPayment, "Insufficient ETH sent");
} else {
require(
stoneToken.allowance(msg.sender, address(this)) >=
requiredPayment,
"Insufficient STONE allowance"
);
require(
stoneToken.transferFrom(
msg.sender,
address(this),
requiredPayment
),
"STONE transfer failed"
);
}
require(
totalSupply() + totalAmount <= getAllTokenSupply(),
"Mint would overflow total supply"
);
_mint(msg.sender, totalAmount);
hasClaimed[msg.sender] = true;
}
function getAirdropAmount(
address user,
uint256 NFT1001BurnAmount,
uint256 NFT7007BurnAmount,
bytes32[] calldata NFT1001merkleProof,
bytes32[] calldata NFT7007merkleProof
) public view returns (uint256) {
uint8 score = getScore(user);
if (score == 0 || hasClaimed[user]) {
return 0;
}
if (NFT1001BurnAmount == 0 && NFT7007BurnAmount == 0) {
return 0;
}
bytes32 NFT1001leaf = keccak256(
abi.encodePacked(user, NFT1001BurnAmount)
);
bytes32 NFT7007leaf = keccak256(
abi.encodePacked(user, NFT7007BurnAmount)
);
require(
MerkleProof.verify(
NFT1001merkleProof,
NFT1001burnCountMerkleRoot,
NFT1001leaf
),
"Invalid NFT1001 burn count proof"
);
require(
MerkleProof.verify(
NFT7007merkleProof,
NFT7007burnCountMerkleRoot,
NFT7007leaf
),
"Invalid NFT7007 burn count proof"
);
uint256 airdropAmount = NFT1001BurnAmount * Math.mulDiv(getAllTokenSupply(), 1, 100100) + NFT7007BurnAmount * Math.mulDiv(getAllTokenSupply(), 5, 700700);
return airdropAmount;
}
function getMintableAmount(address user) public view returns (uint256) {
uint8 score = getScore(user);
if (score == 0 || hasClaimed[user]) {
return 0;
}
uint256 maxMintAmount = uint256(score) * 70070000000000000000;
return maxMintAmount;
}
function setHasClaimed(
address minter,
bool claimStatus
) public onlyRole(ADMIN_ROLE) {
hasClaimed[minter] = claimStatus;
}
function setTreasury(address _treasury) public onlyRole(ADMIN_ROLE) {
treasury = _treasury;
}
function setKeeper(address _keeper) public onlyRole(ADMIN_ROLE) {
keeper = _keeper;
}
function mintToKeeperByAmount(uint256 amount) public onlyRole(ADMIN_ROLE) {
require(keeper != address(0), "Keeper not set");
require(amount > 0, "Amount must be greater than 0");
require(totalSupply() + amount <= getAllTokenSupply(), "Mint would overflow total supply");
_mint(keeper, amount);
}
function mintToKeeper() public onlyRole(ADMIN_ROLE) {
uint256 total = getAllTokenSupply() - totalSupply();
_mint(keeper, total);
}
function readAmountMintToKeeper() public view returns (uint256) {
return getAllTokenSupply() - totalSupply();
}
function withdrawToTreasury() public onlyRole(ADMIN_ROLE) {
require(treasury != address(0), "Treasury not set");
uint256 balance = address(this).balance;
(bool success, ) = payable(treasury).call{value: balance}("");
require(success, "ETH transfer to treasury failed");
uint256 stoneBalance = stoneToken.balanceOf(address(this));
require(
stoneToken.transfer(treasury, stoneBalance),
"STONE transfer to treasury failed"
);
}
}
文件 17 的 17:draft-IERC6093.sol
pragma solidity ^0.8.20;
interface IERC20Errors {
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
error ERC20InvalidSender(address sender);
error ERC20InvalidReceiver(address receiver);
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
error ERC20InvalidApprover(address approver);
error ERC20InvalidSpender(address spender);
}
interface IERC721Errors {
error ERC721InvalidOwner(address owner);
error ERC721NonexistentToken(uint256 tokenId);
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
error ERC721InvalidSender(address sender);
error ERC721InvalidReceiver(address receiver);
error ERC721InsufficientApproval(address operator, uint256 tokenId);
error ERC721InvalidApprover(address approver);
error ERC721InvalidOperator(address operator);
}
interface IERC1155Errors {
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
error ERC1155InvalidSender(address sender);
error ERC1155InvalidReceiver(address receiver);
error ERC1155MissingApprovalForAll(address operator, address owner);
error ERC1155InvalidApprover(address approver);
error ERC1155InvalidOperator(address operator);
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
{
"compilationTarget": {
"src/Token7007.sol": "Token7007"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
":@prb-math/=lib/prb-math/src/",
":@prb/math/=lib/prb-math/src/",
":@prb/test/=lib/prb-math/lib/prb-test/src/",
":OAO/=lib/OAO/",
":ds-test/=lib/prb-math/lib/forge-std/lib/ds-test/src/",
":forge-std/=lib/forge-std/src/",
":prb-math/=lib/prb-math/src/",
":prb-test/=lib/prb-math/lib/prb-test/src/",
":src/=src/"
]
}
[{"inputs":[{"internalType":"address","name":"_stoneToken","type":"address"},{"internalType":"uint256","name":"_totalTokenByScoreSupply","type":"uint256"},{"internalType":"uint256","name":"_initialFundPoolValueInUSD","type":"uint256"},{"internalType":"uint256","name":"_initialEthPriceInUSD","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"MathOverflowedMulDiv","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":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"EthPriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"FundPoolValueUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nft1001Multiplier","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nft7007Multiplier","type":"uint256"}],"name":"NFTAirdropMultipliersUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AIRDROPPER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT1001burnCountMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT7007burnCountMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseAirdropAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calculateRequiredPayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"paymentAmount","type":"uint256"}],"name":"calculateTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethPriceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundPoolValueInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"NFT1001BurnAmount","type":"uint256"},{"internalType":"uint256","name":"NFT7007BurnAmount","type":"uint256"},{"internalType":"bytes32[]","name":"NFT1001merkleProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"NFT7007merkleProof","type":"bytes32[]"}],"name":"getAirdropAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEndRemainingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMintableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getScore","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStartRemainingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasAirdropped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintToKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintToKeeperByAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"promptContract","outputs":[{"internalType":"contract Prompt","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readAmountMintToKeeper","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"bool","name":"claimStatus","type":"bool"}],"name":"setHasClaimed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setNFT1001BurnCountMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setNFT7007BurnCountMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_promptContractAddress","type":"address"}],"name":"setPromptContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stoneToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"totalTokenByScoreSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newEthPriceInUSD","type":"uint256"}],"name":"updateEthPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFundPoolValueInUSD","type":"uint256"}],"name":"updateFundPoolValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"useETH","type":"bool"},{"internalType":"uint256","name":"NFT1001BurnAmount","type":"uint256"},{"internalType":"uint256","name":"NFT7007BurnAmount","type":"uint256"},{"internalType":"bytes32[]","name":"NFT1001merkleProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"NFT7007merkleProof","type":"bytes32[]"}],"name":"userMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"}]