编译器
0.8.20+commit.a1b79de6
文件 1 的 6: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;
}
}
}
文件 2 的 6:ChickenData.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/AccessControl.sol";
contract ChickenData is AccessControl {
bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE");
enum OptionSide {
CALL,
PUT
}
enum Asset {
BTC,
ETH,
BNB,
SOL,
AVAX,
OP,
MATIC
}
struct FeedingSchedule {
uint256 amount;
uint256 dueOn;
bool fed;
}
enum FeedCurrency {
COIN,
TOKEN
}
struct Chicken {
address creator;
Asset asset;
uint256 spotPrice;
uint256 strikePrice;
uint256 tokenId;
uint256 size;
uint256 upfrontPayment;
uint256[] commissionSchedule;
OptionSide side;
uint256 maturityTimestamp;
uint256 lastFeedTime;
uint256 valuation;
bool isClaimed;
uint256 totalFeeds;
uint256 hatchTimestamp;
uint256 lastUpdateTime;
FeedCurrency feedCurrency;
address issuer;
bool settled;
}
mapping(uint256 => Chicken) private chickens;
mapping(address => uint256[]) private ownedChickens;
mapping(uint256 => FeedingSchedule[]) public feedingSchedules;
uint256 private totalChickens;
event ChickenAdded(uint256 chickenId, address indexed creator);
event ChickenUpdated(uint256 chickenId);
event ChickenRemoved(uint256 chickenId);
event AllChickensReplaced();
event ChickenTransferred(uint256 chickenId, address indexed from, address indexed to);
error ChickenDoesNotExist();
error CallerNotManager();
error NotChickenOwner();
error InvalidRecipientAddress();
error InputArraysLengthMismatch();
error InvalidFeedingSchedule();
error ChickenAlreadyExists();
constructor() {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(MANAGER_ROLE, msg.sender);
}
modifier onlyManager() {
if (!hasRole(MANAGER_ROLE, msg.sender)) revert CallerNotManager();
_;
}
modifier chickenExists(uint256 _tokenId) {
if (chickens[_tokenId].strikePrice == 0) revert ChickenDoesNotExist();
_;
}
modifier validFeedingSchedule(FeedingSchedule[] memory schedules) {
for (uint256 i = 0; i < schedules.length; i++) {
if (schedules[i].dueOn == 0) revert InvalidFeedingSchedule();
}
_;
}
function addChicken(Chicken calldata _chicken) external onlyManager returns (uint256) {
uint256 tokenId = _chicken.tokenId;
if (chickens[tokenId].strikePrice != 0) revert ChickenAlreadyExists();
chickens[tokenId] = _chicken;
chickens[tokenId].hatchTimestamp = uint64(block.timestamp);
chickens[tokenId].lastUpdateTime = uint64(block.timestamp);
ownedChickens[_chicken.creator].push(tokenId);
unchecked {
++totalChickens;
}
emit ChickenAdded(tokenId, _chicken.creator);
return tokenId;
}
function updateChicken(uint256 _tokenId, Chicken calldata _updatedChicken) external onlyManager chickenExists(_tokenId) {
chickens[_tokenId] = _updatedChicken;
chickens[_tokenId].lastUpdateTime = block.timestamp;
emit ChickenUpdated(_tokenId);
}
function removeChicken(uint256 _tokenId) external onlyManager chickenExists(_tokenId) {
delete chickens[_tokenId];
delete feedingSchedules[_tokenId];
unchecked {
--totalChickens;
}
emit ChickenRemoved(_tokenId);
}
function getChicken(uint256 _tokenId) public view chickenExists(_tokenId) returns (Chicken memory) {
return chickens[_tokenId];
}
function getChickensBatch(uint256 startIndex, uint256 count) external view returns (Chicken[] memory) {
uint256 endIndex = startIndex + count;
if (endIndex > totalChickens) {
endIndex = totalChickens;
}
uint256 resultCount = endIndex - startIndex;
Chicken[] memory chickensList = new Chicken[](resultCount);
for (uint256 i = 0; i < resultCount; i++) {
chickensList[i] = chickens[startIndex + i];
}
return chickensList;
}
function getChickensByIds(uint256[] calldata _tokenIds) external view returns (Chicken[] memory) {
uint256 length = _tokenIds.length;
Chicken[] memory result = new Chicken[](length);
uint256 count;
for (uint256 i = 0; i < length; ) {
Chicken storage chicken = chickens[_tokenIds[i]];
if (chicken.spotPrice != 0) {
result[count] = chicken;
count++;
}
unchecked {
++i;
}
}
assembly {
mstore(result, count)
}
return result;
}
function getOwnedChickens(address _owner) external view returns (uint256[] memory) {
return ownedChickens[_owner];
}
function getChickenHistory(uint256 _tokenId) external view chickenExists(_tokenId) returns (uint256 hatchTimestamp, uint256 lastUpdateTime) {
Chicken storage chicken = chickens[_tokenId];
return (chicken.hatchTimestamp, chicken.lastUpdateTime);
}
function getFeedingSchedule(uint256 _tokenId) public view chickenExists(_tokenId) returns (FeedingSchedule[] memory) {
return feedingSchedules[_tokenId];
}
function getBatchFeedingSchedules(uint256[] memory tokenIds) public view returns (FeedingSchedule[][] memory) {
FeedingSchedule[][] memory schedules = new FeedingSchedule[][](tokenIds.length);
for (uint256 i = 0; i < tokenIds.length; i++) {
schedules[i] = feedingSchedules[tokenIds[i]];
}
return schedules;
}
function updateFeedingSchedule(
uint256 _tokenId,
FeedingSchedule[] calldata _newSchedules
) external onlyManager chickenExists(_tokenId) validFeedingSchedule(_newSchedules) {
delete feedingSchedules[_tokenId];
FeedingSchedule[] storage schedules = feedingSchedules[_tokenId];
uint256 length = _newSchedules.length;
for (uint256 i = 0; i < length; ) {
schedules.push(_newSchedules[i]);
unchecked {
++i;
}
}
emit ChickenUpdated(_tokenId);
}
function addFeedingSchedule(uint256 _tokenId, FeedingSchedule calldata feedingSchedule) external onlyManager {
if (feedingSchedule.dueOn <= block.timestamp) revert InvalidFeedingSchedule();
feedingSchedules[_tokenId].push(feedingSchedule);
}
function batchUpdateChickens(Chicken[] calldata _updatedChickens, FeedingSchedule[][] calldata _feedingSchedules) external onlyManager {
uint256 length = _updatedChickens.length;
if (length != _feedingSchedules.length) revert InputArraysLengthMismatch();
for (uint256 i = 0; i < length; ) {
Chicken calldata updatedChicken = _updatedChickens[i];
uint256 tokenId = updatedChicken.tokenId;
if (chickens[tokenId].strikePrice == 0) revert ChickenDoesNotExist();
chickens[tokenId] = updatedChicken;
delete feedingSchedules[tokenId];
FeedingSchedule[] calldata schedules = _feedingSchedules[i];
for (uint256 j = 0; j < schedules.length; ) {
feedingSchedules[tokenId].push(schedules[j]);
unchecked {
++j;
}
}
emit ChickenUpdated(tokenId);
unchecked {
++i;
}
}
}
function batchChickenSettlement(uint256[] calldata _tokenIds, uint256[] calldata _settlements) external onlyManager {
uint256 length = _tokenIds.length;
if (length != _settlements.length) revert InputArraysLengthMismatch();
for (uint256 i = 0; i < length; ) {
Chicken storage chicken = chickens[_tokenIds[i]];
chicken.settled = true;
chicken.valuation = _settlements[i];
chicken.lastUpdateTime = block.timestamp;
emit ChickenUpdated(_tokenIds[i]);
unchecked {
++i;
}
}
}
function batchChickenEvaluation(uint256[] calldata _tokenIds, uint256[] calldata _valuations) external onlyManager {
uint256 length = _tokenIds.length;
if (length != _valuations.length) revert InputArraysLengthMismatch();
for (uint256 i = 0; i < length; ) {
Chicken storage chicken = chickens[_tokenIds[i]];
chicken.spotPrice = _valuations[i];
chicken.lastUpdateTime = block.timestamp;
emit ChickenUpdated(_tokenIds[i]);
unchecked {
++i;
}
}
}
function addBatchChickens(Chicken[] calldata _newChickens, FeedingSchedule[][] calldata _feedingSchedules) external onlyManager {
if (_newChickens.length != _feedingSchedules.length) revert InputArraysLengthMismatch();
for (uint256 i = 0; i < _newChickens.length; ) {
uint256 newChickenId = _newChickens[i].tokenId;
if (chickens[newChickenId].strikePrice != 0) revert ChickenAlreadyExists();
chickens[newChickenId] = _newChickens[i];
chickens[newChickenId].hatchTimestamp = uint64(block.timestamp);
chickens[newChickenId].lastUpdateTime = uint64(block.timestamp);
for (uint256 j = 0; j < _feedingSchedules[i].length; ) {
feedingSchedules[newChickenId].push(_feedingSchedules[i][j]);
unchecked {
++j;
}
}
unchecked {
++totalChickens;
}
emit ChickenAdded(newChickenId, _newChickens[i].creator);
unchecked {
++i;
}
}
}
function getTotalChickens() external view returns (uint256) {
return totalChickens;
}
function addManager(address _newManager) external onlyRole(DEFAULT_ADMIN_ROLE) {
grantRole(MANAGER_ROLE, _newManager);
}
function removeManager(address _manager) external onlyRole(DEFAULT_ADMIN_ROLE) {
revokeRole(MANAGER_ROLE, _manager);
}
}
文件 3 的 6: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 的 6: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 的 6: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;
}
文件 6 的 6:IERC165.sol
pragma solidity ^0.8.20;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
{
"compilationTarget": {
"contracts/ChickenData.sol": "ChickenData"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"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":[],"name":"CallerNotManager","type":"error"},{"inputs":[],"name":"ChickenAlreadyExists","type":"error"},{"inputs":[],"name":"ChickenDoesNotExist","type":"error"},{"inputs":[],"name":"InputArraysLengthMismatch","type":"error"},{"inputs":[],"name":"InvalidFeedingSchedule","type":"error"},{"inputs":[],"name":"InvalidRecipientAddress","type":"error"},{"inputs":[],"name":"NotChickenOwner","type":"error"},{"anonymous":false,"inputs":[],"name":"AllChickensReplaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"chickenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"creator","type":"address"}],"name":"ChickenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"chickenId","type":"uint256"}],"name":"ChickenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"chickenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ChickenTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"chickenId","type":"uint256"}],"name":"ChickenUpdated","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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"enum ChickenData.Asset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"spotPrice","type":"uint256"},{"internalType":"uint256","name":"strikePrice","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"upfrontPayment","type":"uint256"},{"internalType":"uint256[]","name":"commissionSchedule","type":"uint256[]"},{"internalType":"enum ChickenData.OptionSide","name":"side","type":"uint8"},{"internalType":"uint256","name":"maturityTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastFeedTime","type":"uint256"},{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"uint256","name":"totalFeeds","type":"uint256"},{"internalType":"uint256","name":"hatchTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"enum ChickenData.FeedCurrency","name":"feedCurrency","type":"uint8"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"bool","name":"settled","type":"bool"}],"internalType":"struct ChickenData.Chicken[]","name":"_newChickens","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"dueOn","type":"uint256"},{"internalType":"bool","name":"fed","type":"bool"}],"internalType":"struct ChickenData.FeedingSchedule[][]","name":"_feedingSchedules","type":"tuple[][]"}],"name":"addBatchChickens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"enum ChickenData.Asset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"spotPrice","type":"uint256"},{"internalType":"uint256","name":"strikePrice","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"upfrontPayment","type":"uint256"},{"internalType":"uint256[]","name":"commissionSchedule","type":"uint256[]"},{"internalType":"enum ChickenData.OptionSide","name":"side","type":"uint8"},{"internalType":"uint256","name":"maturityTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastFeedTime","type":"uint256"},{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"uint256","name":"totalFeeds","type":"uint256"},{"internalType":"uint256","name":"hatchTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"enum ChickenData.FeedCurrency","name":"feedCurrency","type":"uint8"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"bool","name":"settled","type":"bool"}],"internalType":"struct ChickenData.Chicken","name":"_chicken","type":"tuple"}],"name":"addChicken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"dueOn","type":"uint256"},{"internalType":"bool","name":"fed","type":"bool"}],"internalType":"struct ChickenData.FeedingSchedule","name":"feedingSchedule","type":"tuple"}],"name":"addFeedingSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newManager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_valuations","type":"uint256[]"}],"name":"batchChickenEvaluation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_settlements","type":"uint256[]"}],"name":"batchChickenSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"enum ChickenData.Asset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"spotPrice","type":"uint256"},{"internalType":"uint256","name":"strikePrice","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"upfrontPayment","type":"uint256"},{"internalType":"uint256[]","name":"commissionSchedule","type":"uint256[]"},{"internalType":"enum ChickenData.OptionSide","name":"side","type":"uint8"},{"internalType":"uint256","name":"maturityTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastFeedTime","type":"uint256"},{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"uint256","name":"totalFeeds","type":"uint256"},{"internalType":"uint256","name":"hatchTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"enum ChickenData.FeedCurrency","name":"feedCurrency","type":"uint8"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"bool","name":"settled","type":"bool"}],"internalType":"struct ChickenData.Chicken[]","name":"_updatedChickens","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"dueOn","type":"uint256"},{"internalType":"bool","name":"fed","type":"bool"}],"internalType":"struct ChickenData.FeedingSchedule[][]","name":"_feedingSchedules","type":"tuple[][]"}],"name":"batchUpdateChickens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"feedingSchedules","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"dueOn","type":"uint256"},{"internalType":"bool","name":"fed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getBatchFeedingSchedules","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"dueOn","type":"uint256"},{"internalType":"bool","name":"fed","type":"bool"}],"internalType":"struct ChickenData.FeedingSchedule[][]","name":"","type":"tuple[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getChicken","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"enum ChickenData.Asset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"spotPrice","type":"uint256"},{"internalType":"uint256","name":"strikePrice","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"upfrontPayment","type":"uint256"},{"internalType":"uint256[]","name":"commissionSchedule","type":"uint256[]"},{"internalType":"enum ChickenData.OptionSide","name":"side","type":"uint8"},{"internalType":"uint256","name":"maturityTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastFeedTime","type":"uint256"},{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"uint256","name":"totalFeeds","type":"uint256"},{"internalType":"uint256","name":"hatchTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"enum ChickenData.FeedCurrency","name":"feedCurrency","type":"uint8"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"bool","name":"settled","type":"bool"}],"internalType":"struct ChickenData.Chicken","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getChickenHistory","outputs":[{"internalType":"uint256","name":"hatchTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getChickensBatch","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"enum ChickenData.Asset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"spotPrice","type":"uint256"},{"internalType":"uint256","name":"strikePrice","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"upfrontPayment","type":"uint256"},{"internalType":"uint256[]","name":"commissionSchedule","type":"uint256[]"},{"internalType":"enum ChickenData.OptionSide","name":"side","type":"uint8"},{"internalType":"uint256","name":"maturityTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastFeedTime","type":"uint256"},{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"uint256","name":"totalFeeds","type":"uint256"},{"internalType":"uint256","name":"hatchTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"enum ChickenData.FeedCurrency","name":"feedCurrency","type":"uint8"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"bool","name":"settled","type":"bool"}],"internalType":"struct ChickenData.Chicken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getChickensByIds","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"enum ChickenData.Asset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"spotPrice","type":"uint256"},{"internalType":"uint256","name":"strikePrice","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"upfrontPayment","type":"uint256"},{"internalType":"uint256[]","name":"commissionSchedule","type":"uint256[]"},{"internalType":"enum ChickenData.OptionSide","name":"side","type":"uint8"},{"internalType":"uint256","name":"maturityTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastFeedTime","type":"uint256"},{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"uint256","name":"totalFeeds","type":"uint256"},{"internalType":"uint256","name":"hatchTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"enum ChickenData.FeedCurrency","name":"feedCurrency","type":"uint8"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"bool","name":"settled","type":"bool"}],"internalType":"struct ChickenData.Chicken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFeedingSchedule","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"dueOn","type":"uint256"},{"internalType":"bool","name":"fed","type":"bool"}],"internalType":"struct ChickenData.FeedingSchedule[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getOwnedChickens","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":[],"name":"getTotalChickens","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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"removeChicken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"enum ChickenData.Asset","name":"asset","type":"uint8"},{"internalType":"uint256","name":"spotPrice","type":"uint256"},{"internalType":"uint256","name":"strikePrice","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"upfrontPayment","type":"uint256"},{"internalType":"uint256[]","name":"commissionSchedule","type":"uint256[]"},{"internalType":"enum ChickenData.OptionSide","name":"side","type":"uint8"},{"internalType":"uint256","name":"maturityTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastFeedTime","type":"uint256"},{"internalType":"uint256","name":"valuation","type":"uint256"},{"internalType":"bool","name":"isClaimed","type":"bool"},{"internalType":"uint256","name":"totalFeeds","type":"uint256"},{"internalType":"uint256","name":"hatchTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"enum ChickenData.FeedCurrency","name":"feedCurrency","type":"uint8"},{"internalType":"address","name":"issuer","type":"address"},{"internalType":"bool","name":"settled","type":"bool"}],"internalType":"struct ChickenData.Chicken","name":"_updatedChicken","type":"tuple"}],"name":"updateChicken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"dueOn","type":"uint256"},{"internalType":"bool","name":"fed","type":"bool"}],"internalType":"struct ChickenData.FeedingSchedule[]","name":"_newSchedules","type":"tuple[]"}],"name":"updateFeedingSchedule","outputs":[],"stateMutability":"nonpayable","type":"function"}]