编译器
0.8.17+commit.8df45f5f
文件 1 的 10:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 10:IERC1155.sol
pragma solidity ^0.8.0;
import "../token/ERC1155/IERC1155.sol";
文件 3 的 10:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 4 的 10:IProductComicV2.sol
pragma solidity 0.8.17;
interface IProductComic {
error InvalidWeights();
error TotalSupplyOverMaxSupply();
error ParamLengthMissMatch();
error InvalidInvoker();
error SupplyOverflow();
error CardBackSUpplyOverflow();
error EmptyRequestFulfillment();
error RequestAlreadyFulfilled();
event SubscriptionIdSet(uint64 subscriptionId);
event KeyHashSet(bytes32 keyHash);
event VrfCoordinatorSet(address vrfCoordinator);
event PullFromAddressSet(address pullFromAddress);
event ComicAddressSet(address comicAddress);
event ShardAddressSet(address shardAddress);
event ParallelAlphaAddressSet(address parallelAlphaAddress);
event ShopContractSet(address shopAddress);
event ComicSupplySet(uint256[2] comicTokenIds, uint256[2] comicSupply);
event CardBackSupplySet(
uint256[] cardBackTokenIds,
uint256[] cardBackSupply
);
event CardBackDisabledSet(bool isCardBackDisabled);
event ComicPurchased(
address to,
uint256 amount,
uint256 requestId,
uint256 transactionId
);
event RequestRecovered(
address to,
uint256 amount,
uint256 requestId,
uint256 transactionId
);
event ComicTransferred(
address to,
uint256 amount,
uint256 requestId,
uint256 transactionId,
uint256[] comicTokenId,
uint256[] cardBackTokenIds
);
}
文件 5 的 10:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 6 的 10:ProductComicLib.sol
pragma solidity 0.8.17;
library ProductComicLib {
struct Request {
address owner;
bool isAssigned;
uint256 numComicsToSend;
uint256 transactionId;
}
}
文件 7 的 10:ProductComicV2.sol
pragma solidity 0.8.17;
import { IERC1155 } from "@openzeppelin/contracts/interfaces/IERC1155.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { VRFCoordinatorV2Interface } from "@chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol";
import { VRFConsumerBaseV2 } from "@chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol";
import { ProductComicLib } from "./libraries/ProductComicLib.sol";
import { IProductComic } from "./interface/IProductComicV2.sol";
contract ProductComicV2 is
VRFConsumerBaseV2,
Ownable,
IProductComic,
ReentrancyGuard
{
VRFCoordinatorV2Interface public vrfCoordinator;
uint64 public subscriptionId;
bytes32 public keyHash;
uint32 public callbackGasLimit = 2000000;
uint32 public numWords = 1;
uint16 public requestConfirmations = 3;
address public pullFromAddress = 0x716E6b6873038a8243F5EB44e2b09D85DEFf45Ec;
address public comicAddress = 0x6A82872743217A0988E4d72975D74432CfDeF9D7;
address public parallelAlphaAddress =
0x76BE3b62873462d2142405439777e971754E8E77;
address public shopAddress = 0xd32034B5502910e5B56f5AC94ACb4198315c2Da2;
uint256 public comicSupplyRemaining;
uint256 public cardBackSupplyRemaining;
uint256 public numRequestsRemaining;
uint256[] public comicTokenIds;
uint256[] public cardBackTokenIds;
bool public isCardBackDisabled;
mapping(uint256 => ProductComicLib.Request) public vrfRequestIdToRequest;
mapping(uint256 => uint256) public comicMaxSupply;
mapping(uint256 => uint256) public comicPurchased;
mapping(uint256 => uint256) public cardBackMaxSupply;
mapping(uint256 => uint256) public cardBackPurchased;
constructor(
uint64 _subscriptionId,
address _coordinator,
bytes32 _keyHash
) VRFConsumerBaseV2(_coordinator) {
vrfCoordinator = VRFCoordinatorV2Interface(_coordinator);
subscriptionId = _subscriptionId;
keyHash = _keyHash;
}
function setSubscriptionId(uint64 _subscriptionId) public onlyOwner {
subscriptionId = _subscriptionId;
emit SubscriptionIdSet(subscriptionId);
}
function setKeyHash(bytes32 _keyHash) public onlyOwner {
keyHash = _keyHash;
emit KeyHashSet(keyHash);
}
function setVrfCoordinator(address _vrfCoordinator) public onlyOwner {
vrfCoordinator = VRFCoordinatorV2Interface(_vrfCoordinator);
emit VrfCoordinatorSet(_vrfCoordinator);
}
function setPullFromAddress(address _pullFromAddress) external onlyOwner {
pullFromAddress = _pullFromAddress;
emit PullFromAddressSet(pullFromAddress);
}
function setComicAddress(address _comicAddress) external onlyOwner {
comicAddress = _comicAddress;
emit ComicAddressSet(comicAddress);
}
function setParallelAlphaAddress(
address _parallelAlphaAddress
) external onlyOwner {
parallelAlphaAddress = _parallelAlphaAddress;
emit ParallelAlphaAddressSet(parallelAlphaAddress);
}
function setShopAddress(address _shopAddress) external onlyOwner {
shopAddress = _shopAddress;
emit ShopContractSet(shopAddress);
}
function setComicMaxSupply(
uint256[2] memory _comicTokenIds,
uint256[2] memory _comicSupply
) external onlyOwner {
if (_comicTokenIds.length != _comicSupply.length) {
revert ParamLengthMissMatch();
}
comicSupplyRemaining = 0;
numRequestsRemaining = 0;
comicTokenIds = _comicTokenIds;
for (uint256 i = 0; i < comicTokenIds.length; i++) {
comicPurchased[comicTokenIds[i]] = 0;
comicMaxSupply[comicTokenIds[i]] = _comicSupply[i];
comicSupplyRemaining += _comicSupply[i];
numRequestsRemaining += _comicSupply[i];
}
emit ComicSupplySet(_comicTokenIds, _comicSupply);
}
function setCardBackTokenIds(
uint256[] memory _cardBackTokenIds,
uint256[] memory _cardBackSupply
) external onlyOwner {
if (_cardBackTokenIds.length != _cardBackSupply.length) {
revert ParamLengthMissMatch();
}
cardBackSupplyRemaining = 0;
cardBackTokenIds = _cardBackTokenIds;
for (uint256 i = 0; i < _cardBackTokenIds.length; i++) {
cardBackPurchased[_cardBackTokenIds[i]] = 0;
cardBackMaxSupply[_cardBackTokenIds[i]] = _cardBackSupply[i];
cardBackSupplyRemaining += _cardBackSupply[i];
}
emit CardBackSupplySet(_cardBackTokenIds, _cardBackSupply);
}
function setCardBackDisabled(bool _isCardBackDisabled) external onlyOwner {
isCardBackDisabled = _isCardBackDisabled;
emit CardBackDisabledSet(isCardBackDisabled);
}
function getComics(
address _to,
uint256 _amount,
uint256 _transactionId
) external {
if (msg.sender != shopAddress) {
revert InvalidInvoker();
}
if (numRequestsRemaining < _amount) {
revert SupplyOverflow();
}
numRequestsRemaining -= _amount;
ProductComicLib.Request memory newRequest;
newRequest.owner = _to;
newRequest.numComicsToSend = _amount;
uint256 requestId = vrfCoordinator.requestRandomWords(
keyHash,
subscriptionId,
requestConfirmations,
callbackGasLimit,
numWords
);
vrfRequestIdToRequest[requestId] = newRequest;
emit ComicPurchased(_to, _amount, requestId, _transactionId);
}
function fulfillRandomWords(
uint256 _requestId,
uint256[] memory _randomWords
) internal override nonReentrant {
ProductComicLib.Request storage request = vrfRequestIdToRequest[
_requestId
];
if (request.owner == address(0)) {
revert EmptyRequestFulfillment();
}
if (request.isAssigned) {
revert RequestAlreadyFulfilled();
}
uint256 randomSeed;
uint256[] memory assignedComicTokenIds = new uint256[](
request.numComicsToSend
);
uint256[] memory assignedCardBackTokenIds = new uint256[](
request.numComicsToSend
);
for (uint256 i = 0; i < request.numComicsToSend; i++) {
randomSeed = uint256(
keccak256(abi.encodePacked(_randomWords[0], i))
);
assignedComicTokenIds[i] = _getComicTokenId(randomSeed);
IERC1155(comicAddress).safeTransferFrom(
pullFromAddress,
request.owner,
assignedComicTokenIds[i],
1,
bytes("")
);
if (!isCardBackDisabled) {
randomSeed = uint256(
keccak256(abi.encodePacked(randomSeed, i))
);
assignedCardBackTokenIds[i] = _getCardBackTokenId(randomSeed);
IERC1155(parallelAlphaAddress).safeTransferFrom(
pullFromAddress,
request.owner,
assignedCardBackTokenIds[i],
1,
bytes("")
);
}
}
request.isAssigned = true;
emit ComicTransferred(
request.owner,
request.numComicsToSend,
_requestId,
request.transactionId,
assignedComicTokenIds,
assignedCardBackTokenIds
);
}
function recoverRequestId(uint256 _oldRequestId) external onlyOwner {
ProductComicLib.Request memory oldRequest = vrfRequestIdToRequest[
_oldRequestId
];
if (oldRequest.isAssigned) {
revert RequestAlreadyFulfilled();
}
uint256 newRequestId = vrfCoordinator.requestRandomWords(
keyHash,
subscriptionId,
requestConfirmations,
callbackGasLimit,
numWords
);
ProductComicLib.Request memory newRequest;
newRequest.owner = oldRequest.owner;
newRequest.numComicsToSend = oldRequest.numComicsToSend;
newRequest.transactionId = oldRequest.transactionId;
vrfRequestIdToRequest[newRequestId] = newRequest;
delete vrfRequestIdToRequest[_oldRequestId];
emit RequestRecovered(
newRequest.owner,
newRequest.numComicsToSend,
newRequestId,
newRequest.transactionId
);
}
function _getComicTokenId(uint256 _randomSeed) internal returns (uint256) {
uint256 randomPercent = _randomSeed % 100;
uint256 silverPercent = ((comicMaxSupply[comicTokenIds[0]] -
comicPurchased[comicTokenIds[0]]) * 100) / comicSupplyRemaining;
comicSupplyRemaining -= 1;
if (randomPercent < silverPercent) {
comicPurchased[comicTokenIds[0]] += 1;
return comicTokenIds[0];
} else {
comicPurchased[comicTokenIds[1]] += 1;
return comicTokenIds[1];
}
}
function _getCardBackTokenId(
uint256 _randomSeed
) internal returns (uint256) {
uint256 randomPercent = _randomSeed % 100;
uint256 selectedIndex;
uint256 cardBackPercent;
while (selectedIndex != cardBackTokenIds.length - 1) {
cardBackPercent +=
((cardBackMaxSupply[cardBackTokenIds[selectedIndex]] -
cardBackPurchased[cardBackTokenIds[selectedIndex]]) * 100) /
cardBackSupplyRemaining;
if (randomPercent < cardBackPercent) {
break;
}
selectedIndex += 1;
}
uint256 selectedTokenId = cardBackTokenIds[selectedIndex];
if (
cardBackPurchased[selectedTokenId] ==
cardBackMaxSupply[selectedTokenId]
) {
revert CardBackSUpplyOverflow();
}
cardBackPurchased[selectedTokenId] += 1;
cardBackSupplyRemaining -= 1;
if (
cardBackPurchased[selectedTokenId] ==
cardBackMaxSupply[selectedTokenId]
) {
cardBackTokenIds[selectedIndex] = cardBackTokenIds[
cardBackTokenIds.length - 1
];
cardBackTokenIds.pop();
}
return selectedTokenId;
}
}
文件 8 的 10:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
}
文件 9 的 10:VRFConsumerBaseV2.sol
pragma solidity ^0.8.4;
abstract contract VRFConsumerBaseV2 {
error OnlyCoordinatorCanFulfill(address have, address want);
address private immutable vrfCoordinator;
constructor(address _vrfCoordinator) {
vrfCoordinator = _vrfCoordinator;
}
function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;
function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
if (msg.sender != vrfCoordinator) {
revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
}
fulfillRandomWords(requestId, randomWords);
}
}
文件 10 的 10:VRFCoordinatorV2Interface.sol
pragma solidity ^0.8.0;
interface VRFCoordinatorV2Interface {
function getRequestConfig()
external
view
returns (
uint16,
uint32,
bytes32[] memory
);
function requestRandomWords(
bytes32 keyHash,
uint64 subId,
uint16 minimumRequestConfirmations,
uint32 callbackGasLimit,
uint32 numWords
) external returns (uint256 requestId);
function createSubscription() external returns (uint64 subId);
function getSubscription(uint64 subId)
external
view
returns (
uint96 balance,
uint64 reqCount,
address owner,
address[] memory consumers
);
function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;
function acceptSubscriptionOwnerTransfer(uint64 subId) external;
function addConsumer(uint64 subId, address consumer) external;
function removeConsumer(uint64 subId, address consumer) external;
function cancelSubscription(uint64 subId, address to) external;
function pendingRequestExists(uint64 subId) external view returns (bool);
}
{
"compilationTarget": {
"contracts/shop/ProductComicV2.sol": "ProductComicV2"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"uint64","name":"_subscriptionId","type":"uint64"},{"internalType":"address","name":"_coordinator","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CardBackSUpplyOverflow","type":"error"},{"inputs":[],"name":"EmptyRequestFulfillment","type":"error"},{"inputs":[],"name":"InvalidInvoker","type":"error"},{"inputs":[],"name":"InvalidWeights","type":"error"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"inputs":[],"name":"ParamLengthMissMatch","type":"error"},{"inputs":[],"name":"RequestAlreadyFulfilled","type":"error"},{"inputs":[],"name":"SupplyOverflow","type":"error"},{"inputs":[],"name":"TotalSupplyOverMaxSupply","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isCardBackDisabled","type":"bool"}],"name":"CardBackDisabledSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"cardBackTokenIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"cardBackSupply","type":"uint256[]"}],"name":"CardBackSupplySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"comicAddress","type":"address"}],"name":"ComicAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"ComicPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[2]","name":"comicTokenIds","type":"uint256[2]"},{"indexed":false,"internalType":"uint256[2]","name":"comicSupply","type":"uint256[2]"}],"name":"ComicSupplySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transactionId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"comicTokenId","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"cardBackTokenIds","type":"uint256[]"}],"name":"ComicTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"keyHash","type":"bytes32"}],"name":"KeyHashSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"parallelAlphaAddress","type":"address"}],"name":"ParallelAlphaAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pullFromAddress","type":"address"}],"name":"PullFromAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"RequestRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"shardAddress","type":"address"}],"name":"ShardAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"shopAddress","type":"address"}],"name":"ShopContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"subscriptionId","type":"uint64"}],"name":"SubscriptionIdSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vrfCoordinator","type":"address"}],"name":"VrfCoordinatorSet","type":"event"},{"inputs":[],"name":"callbackGasLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardBackMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardBackPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cardBackSupplyRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardBackTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"comicAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"comicMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"comicPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"comicSupplyRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"comicTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_transactionId","type":"uint256"}],"name":"getComics","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isCardBackDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numRequestsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numWords","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parallelAlphaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullFromAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oldRequestId","type":"uint256"}],"name":"recoverRequestId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestConfirmations","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isCardBackDisabled","type":"bool"}],"name":"setCardBackDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_cardBackTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_cardBackSupply","type":"uint256[]"}],"name":"setCardBackTokenIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_comicAddress","type":"address"}],"name":"setComicAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[2]","name":"_comicTokenIds","type":"uint256[2]"},{"internalType":"uint256[2]","name":"_comicSupply","type":"uint256[2]"}],"name":"setComicMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_keyHash","type":"bytes32"}],"name":"setKeyHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_parallelAlphaAddress","type":"address"}],"name":"setParallelAlphaAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pullFromAddress","type":"address"}],"name":"setPullFromAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_shopAddress","type":"address"}],"name":"setShopAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_subscriptionId","type":"uint64"}],"name":"setSubscriptionId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vrfCoordinator","type":"address"}],"name":"setVrfCoordinator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shopAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subscriptionId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vrfCoordinator","outputs":[{"internalType":"contract VRFCoordinatorV2Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vrfRequestIdToRequest","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"isAssigned","type":"bool"},{"internalType":"uint256","name":"numComicsToSend","type":"uint256"},{"internalType":"uint256","name":"transactionId","type":"uint256"}],"stateMutability":"view","type":"function"}]