编译器
0.8.17+commit.8df45f5f
文件 1 的 67:AccessControl.sol
文件 2 的 67:AccessControlEnumerable.sol
文件 3 的 67:AccessControlPausable.sol
文件 5 的 67:BaseRedeemableToken.sol
文件 6 的 67:BaseSellable.sol
文件 7 的 67:BaseTokenURI.sol
文件 8 的 67:BytecodeStorage.sol
文件 9 的 67:Bytes32Strings.sol
文件 10 的 67:CallbackerWithAccessControl.sol
文件 13 的 67:DefaultOperatorFilterer.sol
文件 14 的 67:DiamondExhibition.sol
pragma solidity ^0.8.15;
import {Strings} from "openzeppelin-contracts/utils/Strings.sol";
import {GenArt721CoreV3_Engine_Flex_PROOF} from "artblocks-contracts/GenArt721CoreV3_Engine_Flex_PROOF.sol";
import {ERC721A, ERC721ACommon, BaseTokenURI, ERC721ACommonBaseTokenURI} from "ethier/erc721/BaseTokenURI.sol";
import {OperatorFilterOS} from "ethier/erc721/OperatorFilterOS.sol";
import {artblocksTokenID} from "proof/artblocks/TokenIDMapping.sol";
import {IGenArt721CoreContractV3_Mintable} from "proof/artblocks/IGenArt721CoreContractV3_Mintable.sol";
import {SellableERC721ACommon} from "proof/sellers/sellable/SellableERC721ACommon.sol";
import {ProjectsConfig} from "./ProjectsConfig.sol";
import {TokenInfoManager} from "./TokenInfoManager.sol";
library DiamondExhibitionLib {
function encodePurchaseData(uint8[] memory projectIds) internal pure returns (bytes memory) {
return abi.encode(projectIds);
}
function dencodePurchaseData(bytes memory data) internal pure returns (uint8[] memory) {
return abi.decode(data, (uint8[]));
}
}
contract DiamondExhibition is
ERC721ACommonBaseTokenURI,
OperatorFilterOS,
SellableERC721ACommon,
ProjectsConfig,
TokenInfoManager
{
error ExceedingMaxTotalSupply(uint256 num, uint256 numLeft);
error ProjectExhausted(uint8 projectId);
error InvalidProject(uint8 projectId);
GenArt721CoreV3_Engine_Flex_PROOF public immutable flex;
IGenArt721CoreContractV3_Mintable public immutable flexMintGateway;
uint256 public immutable maxTotalSupply;
uint16[NUM_PROJECTS] internal _numPurchasedPerProject;
struct ConstructorParams {
address admin;
address steerer;
address payable secondaryReceiver;
GenArt721CoreV3_Engine_Flex_PROOF flex;
IGenArt721CoreContractV3_Mintable flexMintGateway;
}
constructor(ConstructorParams memory params)
ERC721ACommon(params.admin, params.steerer, "Diamond Exhibition", "DIAMOND", params.secondaryReceiver, 500)
BaseTokenURI("https://metadata.proof.xyz/diamond-exhibition/")
{
uint256 total;
uint256[NUM_PROJECTS] memory maxNumPerProject_ = _maxNumPerProject();
for (uint256 i = 0; i < NUM_PROJECTS; i++) {
total += maxNumPerProject_[i];
}
maxTotalSupply = total;
flex = params.flex;
flexMintGateway = params.flexMintGateway;
}
function _assignProject(uint256 tokenId, uint8 projectId, uint256[NUM_PROJECTS] memory maxNumPerProject_)
internal
{
if (projectId >= NUM_PROJECTS) {
revert InvalidProject(projectId);
}
uint16 numPurchased = _numPurchasedPerProject[projectId];
if (numPurchased >= maxNumPerProject_[projectId]) {
revert ProjectExhausted(projectId);
}
_numPurchasedPerProject[projectId] = numPurchased + 1;
if (_isLongformProject(projectId)) {
flexMintGateway.mint_Ecf(address(this), _artblocksProjectId(projectId), address(this));
}
_setTokenInfo(tokenId, projectId, numPurchased );
}
function _handleSale(address to, uint64 num, bytes calldata data) internal virtual override {
if (num + _totalMinted() > maxTotalSupply) {
revert ExceedingMaxTotalSupply(num, maxTotalSupply - _totalMinted());
}
uint8[] memory projectIds = DiamondExhibitionLib.dencodePurchaseData(data);
assert(projectIds.length == num);
uint256 tokenId = _nextTokenId();
uint256[NUM_PROJECTS] memory maxNumPerProject_ = _maxNumPerProject();
for (uint256 i = 0; i < num; ++i) {
_assignProject(tokenId++, projectIds[i], maxNumPerProject_);
}
SellableERC721ACommon._handleSale(to, num, data);
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
TokenInfo memory info = _tokenInfo(tokenId);
if (projectType(info.projectId) == ProjectType.Curated) {
return string.concat(_baseURI(), Strings.toString(tokenId));
}
return flex.tokenURI(artblocksTokenID(_artblocksProjectId(info.projectId), info.edition));
}
function tokenIdsByProjectId(uint8 projectId) external view returns (uint256[] memory) {
uint256[] memory tokenIds = new uint256[](_numPurchasedPerProject[projectId]);
uint256 cursor;
uint256 supply = totalSupply();
for (uint256 tokenId = 0; tokenId < supply; ++tokenId) {
if (_tokenInfo(tokenId).projectId == projectId) {
tokenIds[cursor++] = tokenId;
}
}
return tokenIds;
}
function numPurchasedPerProject() external view returns (uint16[NUM_PROJECTS] memory) {
return _numPurchasedPerProject;
}
function _isLongformToken(uint256 tokenId) internal view virtual returns (bool) {
return _isLongformProject(_tokenInfo(tokenId).projectId);
}
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(ERC721ACommon, ERC721ACommonBaseTokenURI, SellableERC721ACommon)
returns (bool)
{
return ERC721ACommonBaseTokenURI.supportsInterface(interfaceId);
}
function _baseURI() internal view virtual override(ERC721A, ERC721ACommonBaseTokenURI) returns (string memory) {
return ERC721ACommonBaseTokenURI._baseURI();
}
function setApprovalForAll(address operator, bool approved) public virtual override(ERC721A, OperatorFilterOS) {
ERC721A.setApprovalForAll(operator, approved);
}
function approve(address operator, uint256 tokenId) public payable virtual override(ERC721A, OperatorFilterOS) {
if (_isLongformToken(tokenId)) {
ERC721A.approve(operator, tokenId);
} else {
OperatorFilterOS.approve(operator, tokenId);
}
}
function transferFrom(address from, address to, uint256 tokenId)
public
payable
virtual
override(ERC721A, OperatorFilterOS)
{
if (_isLongformToken(tokenId)) {
ERC721A.transferFrom(from, to, tokenId);
} else {
OperatorFilterOS.transferFrom(from, to, tokenId);
}
}
function safeTransferFrom(address from, address to, uint256 tokenId)
public
payable
virtual
override(ERC721A, OperatorFilterOS)
{
if (_isLongformToken(tokenId)) {
ERC721A.safeTransferFrom(from, to, tokenId);
} else {
OperatorFilterOS.safeTransferFrom(from, to, tokenId);
}
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
public
payable
virtual
override(ERC721A, OperatorFilterOS)
{
if (_isLongformToken(tokenId)) {
ERC721A.safeTransferFrom(from, to, tokenId, data);
} else {
OperatorFilterOS.safeTransferFrom(from, to, tokenId, data);
}
}
}
文件 15 的 67:DiamondExhibitionChoicePass.sol
pragma solidity ^0.8.15;
import {ERC721ACommon, BaseTokenURI} from "ethier/erc721/BaseTokenURI.sol";
import {RoleGatedFreeOfCharge} from "proof/sellers/presets/RoleGatedFreeOfCharge.sol";
import {SellableRedeemableRestrictableERC721} from "./SellableRedeemableRestrictableERC721.sol";
contract DiamondExhibitionChoicePass is SellableRedeemableRestrictableERC721 {
RoleGatedFreeOfCharge public airdropper;
constructor(address admin, address steerer, address payable secondaryReceiver, uint64 numDayOneBirds)
ERC721ACommon(admin, steerer, "Diamond Exhibition: Day One Pass", "DAY1PASS", secondaryReceiver, 500)
BaseTokenURI("https://metadata.proof.xyz/diamond-exhibition-pass/day-one/")
{
airdropper = new RoleGatedFreeOfCharge(admin , steerer, this, numDayOneBirds);
_grantRole(AUTHORISED_SELLER_ROLE, address(airdropper));
}
}
文件 16 的 67:DiamondExhibitionRegularPass.sol
pragma solidity ^0.8.15;
import {ERC721ACommon, BaseTokenURI} from "ethier/erc721/BaseTokenURI.sol";
import {SellableRedeemableRestrictableERC721} from "./SellableRedeemableRestrictableERC721.sol";
contract DiamondExhibitionRegularPass is SellableRedeemableRestrictableERC721 {
constructor(address admin, address steerer, address payable secondaryReceiver)
ERC721ACommon(admin, steerer, "Diamond Exhibition: Regular Pass", "REGULAR", secondaryReceiver, 500)
BaseTokenURI("https://metadata.proof.xyz/diamond-exhibition-pass/regular/")
{}
}
文件 17 的 67:DiamondExhibitionSeller.sol
pragma solidity >=0.8.0 <0.9.0;
import {SellableCallbacker} from "proof/sellers/base/SellableCallbacker.sol";
import {Seller} from "proof/sellers/base/Seller.sol";
import {DiamondExhibitionLib, DiamondExhibition} from "../exhibition/DiamondExhibition.sol";
abstract contract DiamondExhibitionSeller is Seller, SellableCallbacker {
constructor(DiamondExhibition exhibition) SellableCallbacker(exhibition) {}
function _purchase(address to, uint8[] memory projectIds) internal {
_purchase(
to, uint64(projectIds.length), 0, DiamondExhibitionLib.encodePurchaseData(projectIds)
);
}
}
文件 18 的 67:DiamondPassRedeemer.sol
pragma solidity >=0.8.0 <0.9.0;
import {IRedeemableToken} from "proof/redemption/interfaces/IRedeemableToken.sol";
import {DiamondExhibition} from "../exhibition/DiamondExhibition.sol";
import {DiamondExhibitionRegularPass} from "../passes/DiamondExhibitionRegularPass.sol";
import {DiamondExhibitionChoicePass} from "../passes/DiamondExhibitionChoicePass.sol";
import {DiamondExhibitionSeller} from "./DiamondExhibitionSeller.sol";
contract DiamondPassRedeemer is DiamondExhibitionSeller {
error RedeemableCallbackFailed(IRedeemableToken token, bytes reason);
error InvalidRedeemableToken(IRedeemableToken token);
DiamondExhibitionRegularPass public immutable regularPass;
DiamondExhibitionChoicePass public immutable dayOnePass;
constructor(
DiamondExhibition exhibition,
DiamondExhibitionRegularPass regularPass_,
DiamondExhibitionChoicePass dayOnePass_
) DiamondExhibitionSeller(exhibition) {
dayOnePass = dayOnePass_;
regularPass = regularPass_;
}
struct Purchase {
IRedeemableToken redeemable;
uint256 passId;
uint8 projectId;
}
function purchase(Purchase[] calldata purchases) external {
uint8[] memory projectIds = new uint8[](purchases.length);
for (uint256 i = 0; i < purchases.length; ++i) {
if (purchases[i].redeemable != regularPass && purchases[i].redeemable != dayOnePass) {
revert InvalidRedeemableToken(purchases[i].redeemable);
}
try purchases[i].redeemable.redeem(msg.sender, purchases[i].passId) {}
catch (bytes memory reason) {
revert RedeemableCallbackFailed(purchases[i].redeemable, reason);
}
projectIds[i] = purchases[i].projectId;
}
_purchase(msg.sender, projectIds);
}
}
文件 23 的 67:ERC721ACommon.sol
文件 24 的 67:ERC721ATransferRestricted.sol
文件 25 的 67:ERC721ATransferRestrictedBase.sol
文件 26 的 67:ERC721_PackedHashSeed.sol
文件 27 的 67:EnumerableSet.sol
文件 28 的 67:GenArt721CoreV3_Engine_Flex_PROOF.sol
文件 29 的 67:IAccessControl.sol
文件 30 的 67:IAccessControlEnumerable.sol
文件 31 的 67:IAdminACLV0.sol
文件 32 的 67:IDependencyRegistryCompatibleV0.sol
文件 37 的 67:IERC721Metadata.sol
文件 38 的 67:IERC721Receiver.sol
文件 39 的 67:IEngineRegistryV0.sol
文件 40 的 67:IGenArt721CoreContractV3_Base.sol
文件 41 的 67:IGenArt721CoreContractV3_Engine.sol
文件 42 的 67:IGenArt721CoreContractV3_Engine_Flex.sol
文件 43 的 67:IGenArt721CoreContractV3_Mintable.sol
文件 45 的 67:IOperatorFilterRegistry.sol
文件 46 的 67:IRandomizerV2.sol
文件 47 的 67:IRedeemableToken.sol
文件 50 的 67:OperatorFilterOS.sol
文件 51 的 67:OperatorFilterer.sol
文件 54 的 67:ProjectsConfig.sol
pragma solidity >=0.8.17;
contract ProjectsConfig {
uint8 internal constant _NUM_LONGFORM_PROJECTS = 11;
uint8 internal constant _NUM_CURATED_PROJECTS = 10;
uint8 public constant NUM_PROJECTS = _NUM_LONGFORM_PROJECTS + _NUM_CURATED_PROJECTS;
function _maxNumPerProject() internal pure virtual returns (uint256[NUM_PROJECTS] memory sizes) {
return [
uint256(600),
600,
600,
800,
1000,
600,
450,
1000,
256,
1000,
1000,
100,
100,
100,
1127,
77,
100,
100,
200,
100,
100
];
}
function maxNumPerProject() external pure returns (uint256[NUM_PROJECTS] memory) {
return _maxNumPerProject();
}
enum ProjectType {
Longform,
Curated
}
function projectType(uint8 projectId) public pure returns (ProjectType) {
return projectId < _NUM_LONGFORM_PROJECTS ? ProjectType.Longform : ProjectType.Curated;
}
function _isLongformProject(uint8 projectId) internal pure virtual returns (bool) {
return projectType(projectId) == ProjectType.Longform;
}
function _artblocksProjectIds() internal pure virtual returns (uint8[_NUM_LONGFORM_PROJECTS] memory) {
return [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
}
function artblocksProjectIds() external pure returns (uint8[_NUM_LONGFORM_PROJECTS] memory) {
return _artblocksProjectIds();
}
function _artblocksProjectId(uint8 projectId) internal pure returns (uint256) {
assert(_isLongformProject(projectId));
return _artblocksProjectIds()[projectId];
}
}
文件 55 的 67:PurchaseExecuter.sol
文件 56 的 67:RedeemableERC721ACommon.sol
文件 57 的 67:ReentrancyGuard.sol
文件 58 的 67:RoleGatedFreeOfCharge.sol
文件 59 的 67:SellableCallbacker.sol
文件 60 的 67:SellableERC721ACommon.sol
文件 61 的 67:SellableRedeemableRestrictableERC721.sol
pragma solidity ^0.8.15;
import {ERC721A, ERC721ACommon, BaseTokenURI, ERC721ACommonBaseTokenURI} from "ethier/erc721/BaseTokenURI.sol";
import {OperatorFilterOS} from "ethier/erc721/OperatorFilterOS.sol";
import {
TransferRestrictedRedeemableERC721ACommon,
TransferRestriction
} from "proof/redemption/voucher/TransferRestrictedRedeemableERC721ACommon.sol";
import {SellableERC721ACommon} from "proof/sellers/sellable/SellableERC721ACommon.sol";
abstract contract SellableRedeemableRestrictableERC721 is
ERC721ACommonBaseTokenURI,
OperatorFilterOS,
SellableERC721ACommon,
TransferRestrictedRedeemableERC721ACommon
{
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(ERC721ACommon, ERC721ACommonBaseTokenURI, SellableERC721ACommon, TransferRestrictedRedeemableERC721ACommon)
returns (bool)
{
return TransferRestrictedRedeemableERC721ACommon.supportsInterface(interfaceId)
|| SellableERC721ACommon.supportsInterface(interfaceId)
|| ERC721ACommonBaseTokenURI.supportsInterface(interfaceId);
}
function _beforeTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity)
internal
virtual
override(ERC721ACommon, TransferRestrictedRedeemableERC721ACommon)
{
TransferRestrictedRedeemableERC721ACommon._beforeTokenTransfers(from, to, startTokenId, quantity);
}
function _baseURI() internal view virtual override(ERC721A, ERC721ACommonBaseTokenURI) returns (string memory) {
return ERC721ACommonBaseTokenURI._baseURI();
}
function setApprovalForAll(address operator, bool approved) public virtual override(ERC721A, OperatorFilterOS) {
OperatorFilterOS.setApprovalForAll(operator, approved);
}
function approve(address operator, uint256 tokenId) public payable virtual override(ERC721A, OperatorFilterOS) {
OperatorFilterOS.approve(operator, tokenId);
}
function transferFrom(address from, address to, uint256 tokenId)
public
payable
virtual
override(ERC721A, OperatorFilterOS)
{
OperatorFilterOS.transferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId)
public
payable
virtual
override(ERC721A, OperatorFilterOS)
{
OperatorFilterOS.safeTransferFrom(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
public
payable
virtual
override(ERC721A, OperatorFilterOS)
{
OperatorFilterOS.safeTransferFrom(from, to, tokenId, data);
}
}
文件 64 的 67:SupplyLimited.sol
文件 65 的 67:TokenIDMapping.sol
文件 66 的 67:TokenInfoManager.sol
pragma solidity >=0.8.17;
contract TokenInfoManager {
struct TokenInfo {
uint8 projectId;
uint16 edition;
}
uint256 internal constant _NUM_MAX_TOKEN_INFO = (1 << 32);
TokenInfo[_NUM_MAX_TOKEN_INFO] private _infos;
function tokenInfos(uint256[] calldata tokenIds) external view returns (TokenInfo[] memory) {
TokenInfo[] memory infos = new TokenInfo[](tokenIds.length);
for (uint256 i = 0; i < tokenIds.length; ++i) {
infos[i] = _tokenInfo(tokenIds[i]);
}
return infos;
}
function _tokenInfo(uint256 tokenId) internal view returns (TokenInfo memory) {
return _infos[tokenId];
}
function _setTokenInfo(uint256 tokenId, uint8 projectId, uint16 edition) internal {
_infos[tokenId] = TokenInfo({projectId: projectId, edition: edition});
}
}
文件 67 的 67:TransferRestrictedRedeemableERC721ACommon.sol
{
"compilationTarget": {
"src/sellers/DiamondPassRedeemer.sol": "DiamondPassRedeemer"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 9999
},
"remappings": [
":@divergencetech/ethier/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/",
":@openzeppelin-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
":@openzeppelin-4.7/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
":@openzeppelin/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/",
":ERC721A/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/contracts/",
":ERC721A_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/",
":artblocks-contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/artblocks-contracts_fa1dc466/contracts/",
":artblocks-contracts_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/artblocks-contracts_fa1dc466/",
":delegation-registry/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/delegation-registry_2d1a158b/src/",
":delegation-registry_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/delegation-registry_2d1a158b/",
":ds-test/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ds-test_013e6c64/src/",
":ds-test_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ds-test_013e6c64/",
":erc721a/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/",
":ethier/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/contracts/",
":ethier_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/",
":forge-std/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/forge-std_1-4-0/src/",
":openzeppelin-contracts-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/contracts/",
":openzeppelin-contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/contracts/",
":openzeppelin-contracts/contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/contracts/",
":openzeppelin-contracts_root-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
":openzeppelin-contracts_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/",
":operator-filter-registry/src/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/operator-filter-registry_1-4-1/src/",
":operator-filter-registry_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/operator-filter-registry_1-4-1/",
":proof/artblocks/=/home/dave/proof/proof-seller/contracts/artblocks/src/",
":proof/constants/=/home/dave/proof/proof-seller/contracts/constants/src/",
":proof/redemption/=/home/dave/proof/proof-seller/contracts/redemption/src/",
":proof/sellers/=/home/dave/proof/proof-seller/contracts/sellers/src/"
]
}
[{"inputs":[{"internalType":"contract DiamondExhibition","name":"exhibition","type":"address"},{"internalType":"contract DiamondExhibitionRegularPass","name":"regularPass_","type":"address"},{"internalType":"contract DiamondExhibitionChoicePass","name":"dayOnePass_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes","name":"reason","type":"bytes"}],"name":"CallbackFailed","type":"error"},{"inputs":[{"internalType":"contract IRedeemableToken","name":"token","type":"address"}],"name":"InvalidRedeemableToken","type":"error"},{"inputs":[{"internalType":"contract IRedeemableToken","name":"token","type":"address"},{"internalType":"bytes","name":"reason","type":"bytes"}],"name":"RedeemableCallbackFailed","type":"error"},{"inputs":[],"name":"dayOnePass","outputs":[{"internalType":"contract DiamondExhibitionChoicePass","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IRedeemableToken","name":"redeemable","type":"address"},{"internalType":"uint256","name":"passId","type":"uint256"},{"internalType":"uint8","name":"projectId","type":"uint8"}],"internalType":"struct DiamondPassRedeemer.Purchase[]","name":"purchases","type":"tuple[]"}],"name":"purchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"regularPass","outputs":[{"internalType":"contract DiamondExhibitionRegularPass","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellable","outputs":[{"internalType":"contract ISellable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]