编译器
0.8.15+commit.e14f2714
文件 1 的 5:ComponentRegistry.sol
pragma solidity ^0.8.15;
import "./UnitRegistry.sol";
contract ComponentRegistry is UnitRegistry {
string public constant VERSION = "1.0.0";
constructor(string memory _name, string memory _symbol, string memory _baseURI)
UnitRegistry(UnitType.Component)
ERC721(_name, _symbol)
{
baseURI = _baseURI;
owner = msg.sender;
}
function _checkDependencies(uint32[] memory dependencies, uint32 maxComponentId) internal virtual override {
uint32 lastId;
for (uint256 iDep = 0; iDep < dependencies.length; ++iDep) {
if (dependencies[iDep] < (lastId + 1) || dependencies[iDep] > maxComponentId) {
revert ComponentNotFound(dependencies[iDep]);
}
lastId = dependencies[iDep];
}
}
function _getSubComponents(UnitType, uint32 componentId) internal view virtual override
returns (uint32[] memory subComponentIds)
{
subComponentIds = mapSubComponents[uint256(componentId)];
}
}
文件 2 的 5:ERC721.sol
pragma solidity >=0.8.0;
abstract contract ERC721 {
event Transfer(address indexed from, address indexed to, uint256 indexed id);
event Approval(address indexed owner, address indexed spender, uint256 indexed id);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
string public name;
string public symbol;
function tokenURI(uint256 id) public view virtual returns (string memory);
mapping(uint256 => address) internal _ownerOf;
mapping(address => uint256) internal _balanceOf;
function ownerOf(uint256 id) public view virtual returns (address owner) {
require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
}
function balanceOf(address owner) public view virtual returns (uint256) {
require(owner != address(0), "ZERO_ADDRESS");
return _balanceOf[owner];
}
mapping(uint256 => address) public getApproved;
mapping(address => mapping(address => bool)) public isApprovedForAll;
constructor(string memory _name, string memory _symbol) {
name = _name;
symbol = _symbol;
}
function approve(address spender, uint256 id) public virtual {
address owner = _ownerOf[id];
require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");
getApproved[id] = spender;
emit Approval(owner, spender, id);
}
function setApprovalForAll(address operator, bool approved) public virtual {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function transferFrom(
address from,
address to,
uint256 id
) public virtual {
require(from == _ownerOf[id], "WRONG_FROM");
require(to != address(0), "INVALID_RECIPIENT");
require(
msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
"NOT_AUTHORIZED"
);
unchecked {
_balanceOf[from]--;
_balanceOf[to]++;
}
_ownerOf[id] = to;
delete getApproved[id];
emit Transfer(from, to, id);
}
function safeTransferFrom(
address from,
address to,
uint256 id
) public virtual {
transferFrom(from, to, id);
if (to.code.length != 0)
require(
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function safeTransferFrom(
address from,
address to,
uint256 id,
bytes calldata data
) public virtual {
transferFrom(from, to, id);
if (to.code.length != 0)
require(
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 ||
interfaceId == 0x80ac58cd ||
interfaceId == 0x5b5e139f;
}
function _mint(address to, uint256 id) internal virtual {
require(to != address(0), "INVALID_RECIPIENT");
require(_ownerOf[id] == address(0), "ALREADY_MINTED");
unchecked {
_balanceOf[to]++;
}
_ownerOf[id] = to;
emit Transfer(address(0), to, id);
}
function _burn(uint256 id) internal virtual {
address owner = _ownerOf[id];
require(owner != address(0), "NOT_MINTED");
unchecked {
_balanceOf[owner]--;
}
delete _ownerOf[id];
delete getApproved[id];
emit Transfer(owner, address(0), id);
}
function _safeMint(address to, uint256 id) internal virtual {
_mint(to, id);
if (to.code.length != 0)
require(
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function _safeMint(
address to,
uint256 id,
bytes memory data
) internal virtual {
_mint(to, id);
if (to.code.length != 0)
require(
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
}
abstract contract ERC721TokenReceiver {
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return ERC721TokenReceiver.onERC721Received.selector;
}
}
文件 3 的 5:GenericRegistry.sol
pragma solidity ^0.8.15;
import "../lib/solmate/src/tokens/ERC721.sol";
import "./interfaces/IErrorsRegistries.sol";
abstract contract GenericRegistry is IErrorsRegistries, ERC721 {
event OwnerUpdated(address indexed owner);
event ManagerUpdated(address indexed manager);
event BaseURIChanged(string baseURI);
address public owner;
address public manager;
string public baseURI;
uint256 public totalSupply;
uint256 internal _locked = 1;
string public constant CID_PREFIX = "f01701220";
function changeOwner(address newOwner) external virtual {
if (msg.sender != owner) {
revert OwnerOnly(msg.sender, owner);
}
if (newOwner == address(0)) {
revert ZeroAddress();
}
owner = newOwner;
emit OwnerUpdated(newOwner);
}
function changeManager(address newManager) external virtual {
if (msg.sender != owner) {
revert OwnerOnly(msg.sender, owner);
}
if (newManager == address(0)) {
revert ZeroAddress();
}
manager = newManager;
emit ManagerUpdated(newManager);
}
function exists(uint256 unitId) external view virtual returns (bool) {
return unitId > 0 && unitId < (totalSupply + 1);
}
function setBaseURI(string memory bURI) external virtual {
if (msg.sender != owner) {
revert OwnerOnly(msg.sender, owner);
}
if (bytes(bURI).length == 0) {
revert ZeroValue();
}
baseURI = bURI;
emit BaseURIChanged(bURI);
}
function tokenByIndex(uint256 id) external view virtual returns (uint256 unitId) {
unitId = id + 1;
if (unitId > totalSupply) {
revert Overflow(unitId, totalSupply);
}
}
function _toHex16(bytes16 data) internal pure returns (bytes32 result) {
result = bytes32 (data) & 0xFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000 |
(bytes32 (data) & 0x0000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000) >> 64;
result = result & 0xFFFFFFFF000000000000000000000000FFFFFFFF000000000000000000000000 |
(result & 0x00000000FFFFFFFF000000000000000000000000FFFFFFFF0000000000000000) >> 32;
result = result & 0xFFFF000000000000FFFF000000000000FFFF000000000000FFFF000000000000 |
(result & 0x0000FFFF000000000000FFFF000000000000FFFF000000000000FFFF00000000) >> 16;
result = result & 0xFF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000 |
(result & 0x00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000) >> 8;
result = (result & 0xF000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000) >> 4 |
(result & 0x0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00) >> 8;
result = bytes32 (0x3030303030303030303030303030303030303030303030303030303030303030 +
uint256 (result) +
(uint256 (result) + 0x0606060606060606060606060606060606060606060606060606060606060606 >> 4 &
0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F) * 39);
}
function _getUnitHash(uint256 unitId) internal view virtual returns (bytes32);
function tokenURI(uint256 unitId) public view virtual override returns (string memory) {
bytes32 unitHash = _getUnitHash(unitId);
return string(abi.encodePacked(baseURI, CID_PREFIX, _toHex16(bytes16(unitHash)),
_toHex16(bytes16(unitHash << 128))));
}
}
文件 4 的 5:IErrorsRegistries.sol
pragma solidity ^0.8.15;
interface IErrorsRegistries {
error ManagerOnly(address sender, address manager);
error OwnerOnly(address sender, address owner);
error HashExists();
error ZeroAddress();
error WrongAgentId(uint256 agentId);
error WrongArrayLength(uint256 numValues1, uint256 numValues2);
error AgentNotFound(uint256 agentId);
error ComponentNotFound(uint256 componentId);
error WrongThreshold(uint256 currentThreshold, uint256 minThreshold, uint256 maxThreshold);
error AgentInstanceRegistered(address operator);
error WrongOperator(uint256 serviceId);
error OperatorHasNoInstances(address operator, uint256 serviceId);
error AgentNotInService(uint256 agentId, uint256 serviceId);
error Paused();
error ZeroValue();
error Overflow(uint256 provided, uint256 max);
error ServiceMustBeInactive(uint256 serviceId);
error AgentInstancesSlotsFilled(uint256 serviceId);
error WrongServiceState(uint256 state, uint256 serviceId);
error OnlyOwnServiceMultisig(address provided, address expected, uint256 serviceId);
error UnauthorizedMultisig(address multisig);
error IncorrectRegistrationDepositValue(uint256 sent, uint256 expected, uint256 serviceId);
error IncorrectAgentBondingValue(uint256 sent, uint256 expected, uint256 serviceId);
error TransferFailed(address token, address from, address to, uint256 value);
error ReentrancyGuard();
}
文件 5 的 5:UnitRegistry.sol
pragma solidity ^0.8.15;
import "./GenericRegistry.sol";
abstract contract UnitRegistry is GenericRegistry {
event CreateUnit(uint256 unitId, UnitType uType, bytes32 unitHash);
event UpdateUnitHash(uint256 unitId, UnitType uType, bytes32 unitHash);
enum UnitType {
Component,
Agent
}
struct Unit {
bytes32 unitHash;
uint32[] dependencies;
}
UnitType public immutable unitType;
mapping(uint256 => bytes32[]) public mapUnitIdHashes;
mapping(uint256 => uint32[]) public mapSubComponents;
mapping(uint256 => Unit) public mapUnits;
constructor(UnitType _unitType) {
unitType = _unitType;
}
function _checkDependencies(uint32[] memory dependencies, uint32 maxUnitId) internal virtual;
function create(address unitOwner, bytes32 unitHash, uint32[] memory dependencies)
external virtual returns (uint256 unitId)
{
if (_locked > 1) {
revert ReentrancyGuard();
}
_locked = 2;
if (manager != msg.sender) {
revert ManagerOnly(msg.sender, manager);
}
if(unitOwner == address(0)) {
revert ZeroAddress();
}
if (unitHash == 0) {
revert ZeroValue();
}
unitId = totalSupply;
_checkDependencies(dependencies, uint32(unitId));
unitId++;
Unit storage unit = mapUnits[unitId];
unit.unitHash = unitHash;
unit.dependencies = dependencies;
uint32[] memory subComponentIds = _calculateSubComponents(UnitType.Component, dependencies);
if (unitType == UnitType.Component) {
uint256 numSubComponents = subComponentIds.length;
uint32[] memory addSubComponentIds = new uint32[](numSubComponents + 1);
for (uint256 i = 0; i < numSubComponents; ++i) {
addSubComponentIds[i] = subComponentIds[i];
}
addSubComponentIds[numSubComponents] = uint32(unitId);
subComponentIds = addSubComponentIds;
}
mapSubComponents[unitId] = subComponentIds;
totalSupply = unitId;
_safeMint(unitOwner, unitId);
emit CreateUnit(unitId, unitType, unitHash);
_locked = 1;
}
function updateHash(address unitOwner, uint256 unitId, bytes32 unitHash) external virtual
returns (bool success)
{
if (manager != msg.sender) {
revert ManagerOnly(msg.sender, manager);
}
if (ownerOf(unitId) != unitOwner) {
if (unitType == UnitType.Component) {
revert ComponentNotFound(unitId);
} else {
revert AgentNotFound(unitId);
}
}
if (unitHash == 0) {
revert ZeroValue();
}
mapUnitIdHashes[unitId].push(unitHash);
success = true;
emit UpdateUnitHash(unitId, unitType, unitHash);
}
function getUnit(uint256 unitId) external view virtual returns (Unit memory unit) {
unit = mapUnits[unitId];
}
function getDependencies(uint256 unitId) external view virtual
returns (uint256 numDependencies, uint32[] memory dependencies)
{
Unit memory unit = mapUnits[unitId];
return (unit.dependencies.length, unit.dependencies);
}
function getUpdatedHashes(uint256 unitId) external view virtual
returns (uint256 numHashes, bytes32[] memory unitHashes)
{
unitHashes = mapUnitIdHashes[unitId];
return (unitHashes.length, unitHashes);
}
function getLocalSubComponents(uint256 unitId) external view
returns (uint32[] memory subComponentIds, uint256 numSubComponents)
{
subComponentIds = mapSubComponents[uint256(unitId)];
numSubComponents = subComponentIds.length;
}
function _getSubComponents(UnitType subcomponentsFromType, uint32 unitId) internal view virtual
returns (uint32[] memory subComponentIds);
function _calculateSubComponents(UnitType subcomponentsFromType, uint32[] memory unitIds) internal view virtual
returns (uint32[] memory subComponentIds)
{
uint32 numUnits = uint32(unitIds.length);
uint32[] memory numComponents = new uint32[](numUnits);
uint32[][] memory components = new uint32[][](numUnits);
uint32 maxNumComponents;
for (uint32 i = 0; i < numUnits; ++i) {
components[i] = _getSubComponents(subcomponentsFromType, unitIds[i]);
numComponents[i] = uint32(components[i].length);
maxNumComponents += numComponents[i];
}
uint32[] memory allComponents = new uint32[](maxNumComponents);
uint32[] memory processedComponents = new uint32[](numUnits);
uint32 minComponent;
uint32 counter;
for (counter = 0; counter < maxNumComponents; ++counter) {
uint32 minIdxComponent;
uint32 numComponentsCheck;
uint32 tryMinComponent = type(uint32).max;
for (uint32 i = 0; i < numUnits; ++i) {
for (; processedComponents[i] < numComponents[i]; ++processedComponents[i]) {
if (minComponent < components[i][processedComponents[i]]) {
if (components[i][processedComponents[i]] < tryMinComponent) {
tryMinComponent = components[i][processedComponents[i]];
minIdxComponent = i;
}
numComponentsCheck++;
break;
}
}
}
minComponent = tryMinComponent;
if (numComponentsCheck > 0) {
allComponents[counter] = minComponent;
processedComponents[minIdxComponent]++;
} else {
break;
}
}
subComponentIds = new uint32[](counter);
for (uint32 i = 0; i < counter; ++i) {
subComponentIds[i] = allComponents[i];
}
}
function _getUnitHash(uint256 unitId) internal view override returns (bytes32) {
return mapUnits[unitId].unitHash;
}
}
{
"compilationTarget": {
"contracts/ComponentRegistry.sol": "ComponentRegistry"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 750
},
"remappings": []
}
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"AgentInstanceRegistered","type":"error"},{"inputs":[{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"AgentInstancesSlotsFilled","type":"error"},{"inputs":[{"internalType":"uint256","name":"agentId","type":"uint256"}],"name":"AgentNotFound","type":"error"},{"inputs":[{"internalType":"uint256","name":"agentId","type":"uint256"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"AgentNotInService","type":"error"},{"inputs":[{"internalType":"uint256","name":"componentId","type":"uint256"}],"name":"ComponentNotFound","type":"error"},{"inputs":[],"name":"HashExists","type":"error"},{"inputs":[{"internalType":"uint256","name":"sent","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"IncorrectAgentBondingValue","type":"error"},{"inputs":[{"internalType":"uint256","name":"sent","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"IncorrectRegistrationDepositValue","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"manager","type":"address"}],"name":"ManagerOnly","type":"error"},{"inputs":[{"internalType":"address","name":"provided","type":"address"},{"internalType":"address","name":"expected","type":"address"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"OnlyOwnServiceMultisig","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"OperatorHasNoInstances","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"Overflow","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"OwnerOnly","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"ReentrancyGuard","type":"error"},{"inputs":[{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"ServiceMustBeInactive","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferFailed","type":"error"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"UnauthorizedMultisig","type":"error"},{"inputs":[{"internalType":"uint256","name":"agentId","type":"uint256"}],"name":"WrongAgentId","type":"error"},{"inputs":[{"internalType":"uint256","name":"numValues1","type":"uint256"},{"internalType":"uint256","name":"numValues2","type":"uint256"}],"name":"WrongArrayLength","type":"error"},{"inputs":[{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"WrongOperator","type":"error"},{"inputs":[{"internalType":"uint256","name":"state","type":"uint256"},{"internalType":"uint256","name":"serviceId","type":"uint256"}],"name":"WrongServiceState","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentThreshold","type":"uint256"},{"internalType":"uint256","name":"minThreshold","type":"uint256"},{"internalType":"uint256","name":"maxThreshold","type":"uint256"}],"name":"WrongThreshold","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroValue","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"unitId","type":"uint256"},{"indexed":false,"internalType":"enum UnitRegistry.UnitType","name":"uType","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"unitHash","type":"bytes32"}],"name":"CreateUnit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"unitId","type":"uint256"},{"indexed":false,"internalType":"enum UnitRegistry.UnitType","name":"uType","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"unitHash","type":"bytes32"}],"name":"UpdateUnitHash","type":"event"},{"inputs":[],"name":"CID_PREFIX","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newManager","type":"address"}],"name":"changeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"unitOwner","type":"address"},{"internalType":"bytes32","name":"unitHash","type":"bytes32"},{"internalType":"uint32[]","name":"dependencies","type":"uint32[]"}],"name":"create","outputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"getDependencies","outputs":[{"internalType":"uint256","name":"numDependencies","type":"uint256"},{"internalType":"uint32[]","name":"dependencies","type":"uint32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"getLocalSubComponents","outputs":[{"internalType":"uint32[]","name":"subComponentIds","type":"uint32[]"},{"internalType":"uint256","name":"numSubComponents","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"getUnit","outputs":[{"components":[{"internalType":"bytes32","name":"unitHash","type":"bytes32"},{"internalType":"uint32[]","name":"dependencies","type":"uint32[]"}],"internalType":"struct UnitRegistry.Unit","name":"unit","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"getUpdatedHashes","outputs":[{"internalType":"uint256","name":"numHashes","type":"uint256"},{"internalType":"bytes32[]","name":"unitHashes","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mapSubComponents","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mapUnitIdHashes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mapUnits","outputs":[{"internalType":"bytes32","name":"unitHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"bURI","type":"string"}],"name":"setBaseURI","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unitType","outputs":[{"internalType":"enum UnitRegistry.UnitType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"unitOwner","type":"address"},{"internalType":"uint256","name":"unitId","type":"uint256"},{"internalType":"bytes32","name":"unitHash","type":"bytes32"}],"name":"updateHash","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]