编译器
0.8.20+commit.a1b79de6
文件 1 的 7:IGlobals.sol
pragma solidity 0.8.20;
import "../utils/Implementation.sol";
interface IGlobals {
function multiSig() external view returns (address);
function getBytes32(uint256 key) external view returns (bytes32);
function getUint256(uint256 key) external view returns (uint256);
function getBool(uint256 key) external view returns (bool);
function getAddress(uint256 key) external view returns (address);
function getImplementation(uint256 key) external view returns (Implementation);
function getIncludesBytes32(uint256 key, bytes32 value) external view returns (bool);
function getIncludesUint256(uint256 key, uint256 value) external view returns (bool);
function getIncludesAddress(uint256 key, address value) external view returns (bool);
function setBytes32(uint256 key, bytes32 value) external;
function setUint256(uint256 key, uint256 value) external;
function setBool(uint256 key, bool value) external;
function setAddress(uint256 key, address value) external;
function setIncludesBytes32(uint256 key, bytes32 value, bool isIncluded) external;
function setIncludesUint256(uint256 key, uint256 value, bool isIncluded) external;
function setIncludesAddress(uint256 key, address value, bool isIncluded) external;
}
文件 2 的 7:IMetadataProvider.sol
pragma solidity ^0.8;
interface IMetadataProvider {
function supportsRegistrars() external view returns (bool);
function getMetadata(
address instance,
uint256 tokenId
) external view returns (bytes memory metadata);
}
文件 3 的 7:Implementation.sol
pragma solidity 0.8.20;
abstract contract Implementation {
error OnlyDelegateCallError();
error OnlyConstructorError();
address public immutable IMPL;
constructor() {
IMPL = address(this);
}
modifier onlyDelegateCall() virtual {
if (address(this) == IMPL) {
revert OnlyDelegateCallError();
}
_;
}
modifier onlyConstructor() {
if (address(this).code.length != 0) {
revert OnlyConstructorError();
}
_;
}
}
文件 4 的 7:LibGlobals.sol
pragma solidity 0.8.20;
library LibGlobals {
uint256 internal constant GLOBAL_PARTY_IMPL = 1;
uint256 internal constant GLOBAL_PROPOSAL_ENGINE_IMPL = 2;
uint256 internal constant GLOBAL_PARTY_FACTORY = 3;
uint256 internal constant GLOBAL_GOVERNANCE_NFT_RENDER_IMPL = 4;
uint256 internal constant GLOBAL_CF_NFT_RENDER_IMPL = 5;
uint256 internal constant GLOBAL_OS_ZORA_AUCTION_TIMEOUT = 6;
uint256 internal constant GLOBAL_OS_ZORA_AUCTION_DURATION = 7;
uint256 internal constant GLOBAL_DAO_WALLET = 11;
uint256 internal constant GLOBAL_TOKEN_DISTRIBUTOR = 12;
uint256 internal constant GLOBAL_OPENSEA_CONDUIT_KEY = 13;
uint256 internal constant GLOBAL_OPENSEA_ZONE = 14;
uint256 internal constant GLOBAL_PROPOSAL_MAX_CANCEL_DURATION = 15;
uint256 internal constant GLOBAL_ZORA_MIN_AUCTION_DURATION = 16;
uint256 internal constant GLOBAL_ZORA_MAX_AUCTION_DURATION = 17;
uint256 internal constant GLOBAL_ZORA_MAX_AUCTION_TIMEOUT = 18;
uint256 internal constant GLOBAL_OS_MIN_ORDER_DURATION = 19;
uint256 internal constant GLOBAL_OS_MAX_ORDER_DURATION = 20;
uint256 internal constant GLOBAL_DISABLE_PARTY_ACTIONS = 21;
uint256 internal constant GLOBAL_RENDERER_STORAGE = 22;
uint256 internal constant GLOBAL_PROPOSAL_MIN_CANCEL_DURATION = 23;
uint256 internal constant GLOBAL_METADATA_REGISTRY = 26;
uint256 internal constant GLOBAL_SEAPORT = 30;
uint256 internal constant GLOBAL_CONDUIT_CONTROLLER = 31;
}
文件 5 的 7:LibRawResult.sol
pragma solidity 0.8.20;
library LibRawResult {
function rawRevert(bytes memory b) internal pure {
assembly {
revert(add(b, 32), mload(b))
}
}
function rawReturn(bytes memory b) internal pure {
assembly {
return(add(b, 32), mload(b))
}
}
}
文件 6 的 7:MetadataRegistry.sol
pragma solidity 0.8.20;
import { IGlobals } from "../globals/IGlobals.sol";
import { LibGlobals } from "../globals/LibGlobals.sol";
import { IMetadataProvider } from "./IMetadataProvider.sol";
import { Multicall } from "../utils/Multicall.sol";
contract MetadataRegistry is Multicall {
event ProviderSet(address indexed instance, IMetadataProvider indexed provider);
event RegistrarSet(address indexed registrar, address indexed instance, bool canSetData);
error NotAuthorized(address caller, address instance);
IGlobals private immutable _GLOBALS;
mapping(address instance => IMetadataProvider provider) public getProvider;
mapping(address registrar => mapping(address instance => bool canSetData)) private _isRegistrar;
constructor(IGlobals globals, address[] memory registrars) {
_GLOBALS = globals;
for (uint256 i = 0; i < registrars.length; i++) {
_isRegistrar[registrars[i]][address(1)] = true;
}
}
function setProvider(address instance, IMetadataProvider provider) external {
if (!isRegistrar(msg.sender, instance)) revert NotAuthorized(msg.sender, instance);
getProvider[instance] = provider;
emit ProviderSet(instance, provider);
}
function setRegistrar(address registrar, address instance, bool canSetData) external {
if (
msg.sender != instance &&
msg.sender != _GLOBALS.getAddress(LibGlobals.GLOBAL_DAO_WALLET)
) {
revert NotAuthorized(msg.sender, instance);
}
_isRegistrar[registrar][instance] = canSetData;
emit RegistrarSet(registrar, instance, canSetData);
}
function isRegistrar(address registrar, address instance) public view returns (bool) {
return
registrar == instance ||
_isRegistrar[registrar][address(1)] ||
_isRegistrar[registrar][instance];
}
function getMetadata(address instance, uint256 tokenId) external view returns (bytes memory) {
IMetadataProvider provider = getProvider[instance];
return
address(provider) != address(0) ? provider.getMetadata(instance, tokenId) : bytes("");
}
}
文件 7 的 7:Multicall.sol
pragma solidity 0.8.20;
import "../utils/LibRawResult.sol";
abstract contract Multicall {
using LibRawResult for bytes;
function multicall(bytes[] calldata multicallData) external {
for (uint256 i; i < multicallData.length; ++i) {
(bool s, bytes memory r) = address(this).delegatecall(multicallData[i]);
if (!s) {
r.rawRevert();
}
}
}
}
{
"compilationTarget": {
"contracts/renderers/MetadataRegistry.sol": "MetadataRegistry"
},
"evmVersion": "paris",
"libraries": {
"contracts/utils/LibRenderer.sol:LibRenderer": "0xe475e2cb3967e145e6f3eed2f97d5b8b6e48a220"
},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 0
},
"remappings": [
":ds-test/=lib/forge-std/lib/ds-test/src/",
":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":openzeppelin/=lib/openzeppelin-contracts/",
":party-addresses/=lib/party-addresses/",
":solmate/=lib/solmate/src/"
],
"viaIR": true
}
[{"inputs":[{"internalType":"contract IGlobals","name":"globals","type":"address"},{"internalType":"address[]","name":"registrars","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"instance","type":"address"}],"name":"NotAuthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"instance","type":"address"},{"indexed":true,"internalType":"contract IMetadataProvider","name":"provider","type":"address"}],"name":"ProviderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registrar","type":"address"},{"indexed":true,"internalType":"address","name":"instance","type":"address"},{"indexed":false,"internalType":"bool","name":"canSetData","type":"bool"}],"name":"RegistrarSet","type":"event"},{"inputs":[{"internalType":"address","name":"instance","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMetadata","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"instance","type":"address"}],"name":"getProvider","outputs":[{"internalType":"contract IMetadataProvider","name":"provider","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registrar","type":"address"},{"internalType":"address","name":"instance","type":"address"}],"name":"isRegistrar","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"multicallData","type":"bytes[]"}],"name":"multicall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"instance","type":"address"},{"internalType":"contract IMetadataProvider","name":"provider","type":"address"}],"name":"setProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrar","type":"address"},{"internalType":"address","name":"instance","type":"address"},{"internalType":"bool","name":"canSetData","type":"bool"}],"name":"setRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"}]