@etherisc/gif-next 0.0.2-f2b0fa2-473 → 0.0.2-f63e99e-607
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +13 -0
- package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
- package/artifacts/contracts/components/Distribution.sol/Distribution.json +23 -15
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +13 -0
- package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.json +21 -13
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +39 -18
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
- package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
- package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
- package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +2 -2
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +2 -2
- package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
- package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
- package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
- package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +1 -1
- package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +1 -1
- package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.json +15 -2
- package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +403 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +59 -0
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +164 -84
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +34 -34
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +168 -37
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +229 -41
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
- package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +77 -9
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +29 -0
- package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
- package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
- package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +2 -2
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
- package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
- package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
- package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
- package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
- package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +18 -18
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +681 -0
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +436 -0
- package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +820 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
- package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +448 -0
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +309 -0
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +0 -19
- package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.json +258 -24
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +20 -44
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
- package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +49 -28
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
- package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +410 -0
- package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
- package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
- package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
- package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
- package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
- package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
- package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
- package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
- package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/shared/Registerable.sol/Registerable.json +4 -4
- package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
- package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
- package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
- package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
- package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
- package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
- package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
- package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
- package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
- package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
- package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
- package/artifacts/contracts/test/TestService.sol/TestService.json +11 -11
- package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
- package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
- package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +2 -2
- package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
- package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
- package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
- package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
- package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
- package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
- package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
- package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
- package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
- package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
- package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
- package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
- package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
- package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
- package/artifacts/contracts/types/Version.sol/VersionPartLib.json +22 -3
- package/contracts/components/BaseComponent.sol +8 -3
- package/contracts/components/Distribution.sol +10 -16
- package/contracts/components/IBaseComponent.sol +1 -0
- package/contracts/components/IDistributionComponent.sol +1 -0
- package/contracts/components/Pool.sol +4 -20
- package/contracts/components/Product.sol +1 -1
- package/contracts/instance/AccessManagedSimple.sol +5 -4
- package/contracts/instance/AccessManagerSimple.sol +10 -0
- package/contracts/instance/IInstance.sol +15 -4
- package/contracts/instance/IInstanceService.sol +14 -1
- package/contracts/instance/Instance.sol +28 -21
- package/contracts/instance/InstanceAccessManager.sol +1 -1
- package/contracts/instance/InstanceReader.sol +27 -1
- package/contracts/instance/InstanceService.sol +104 -24
- package/contracts/instance/base/ComponentServiceBase.sol +19 -8
- package/contracts/instance/module/IBundle.sol +1 -0
- package/contracts/instance/module/ISetup.sol +1 -0
- package/contracts/instance/service/DistributionService.sol +102 -0
- package/contracts/instance/service/DistributionServiceManager.sol +53 -0
- package/contracts/instance/service/PoolService.sol +208 -0
- package/contracts/instance/service/PoolServiceManager.sol +53 -0
- package/contracts/registry/IRegistry.sol +39 -2
- package/contracts/registry/IRegistryService.sol +0 -2
- package/contracts/registry/Registry.sol +94 -28
- package/contracts/registry/RegistryService.sol +9 -49
- package/contracts/registry/RegistryServiceManager.sol +21 -5
- package/contracts/registry/TokenRegistry.sol +111 -0
- package/contracts/shared/ERC165.sol +6 -2
- package/contracts/shared/Registerable.sol +1 -0
- package/contracts/types/RoleId.sol +7 -0
- package/contracts/types/StateId.sol +4 -0
- package/contracts/types/Version.sol +4 -1
- package/package.json +1 -1
@@ -10,10 +10,33 @@ import {VersionPart} from "../types/Version.sol";
|
|
10
10
|
|
11
11
|
interface IRegistry is IERC165 {
|
12
12
|
|
13
|
+
event LogInitialMajorVersionSet(VersionPart majorVersion);
|
14
|
+
event LogMajorVersionSet(VersionPart majorVersionMax);
|
13
15
|
event LogRegistration(ObjectInfo info);
|
14
|
-
|
16
|
+
event LogTokenStateSet(address token, VersionPart majorVersion, bool active);
|
15
17
|
event LogServiceNameRegistration(string serviceName, VersionPart majorVersion);
|
16
18
|
|
19
|
+
// supported versions
|
20
|
+
error MajorVersionMaxIncreaseInvalid(VersionPart newMajorVersionMax, VersionPart existingMaxMajorVersion);
|
21
|
+
|
22
|
+
// token whitelisting
|
23
|
+
error TokenNotRegistered(address token);
|
24
|
+
error NotToken(address token);
|
25
|
+
error TokenMajorVersionInvalid(VersionPart majorVersion);
|
26
|
+
|
27
|
+
// register
|
28
|
+
error NotRegistryService();
|
29
|
+
error ZeroParentAddress();
|
30
|
+
error ContractAlreadyRegistered(address objectAddress);
|
31
|
+
error InvalidServiceVersion(VersionPart majorVersion);
|
32
|
+
error ServiceNameAlreadyRegistered(string name, VersionPart majorVersion);
|
33
|
+
|
34
|
+
// approve
|
35
|
+
error NotOwner(address account);
|
36
|
+
error NotRegisteredContract(NftId registrarNftId);
|
37
|
+
error NotService(NftId registrarNftId);
|
38
|
+
error InvalidTypesCombination(ObjectType objectType, ObjectType parentType);
|
39
|
+
|
17
40
|
|
18
41
|
struct ObjectInfo {
|
19
42
|
NftId nftId;
|
@@ -24,12 +47,24 @@ interface IRegistry is IERC165 {
|
|
24
47
|
address initialOwner;
|
25
48
|
bytes data;
|
26
49
|
}// TODO delete nftId and initialOwner(if not used) from struct
|
50
|
+
// TODO strong disagree, keep nftId there (lets keep get object info return object consistent)
|
51
|
+
|
52
|
+
function setMajorVersion(VersionPart newMajorVersionMax) external;
|
27
53
|
|
28
54
|
function register(ObjectInfo memory info) external returns (NftId nftId);
|
29
|
-
|
55
|
+
|
56
|
+
function setTokenActive(address token, VersionPart majorVersion, bool active) external;
|
57
|
+
|
58
|
+
function getMajorVersionMin() external view returns (VersionPart);
|
59
|
+
|
60
|
+
function getMajorVersionMax() external view returns (VersionPart);
|
61
|
+
|
62
|
+
function getMajorVersion() external view returns (VersionPart);
|
30
63
|
|
31
64
|
function getObjectCount() external view returns (uint256);
|
32
65
|
|
66
|
+
function getNftId() external view returns (NftId nftId);
|
67
|
+
|
33
68
|
function getNftId(address objectAddress) external view returns (NftId nftId);
|
34
69
|
|
35
70
|
function ownerOf(NftId nftId) external view returns (address);
|
@@ -44,6 +79,8 @@ interface IRegistry is IERC165 {
|
|
44
79
|
|
45
80
|
function isRegistered(address contractAddress) external view returns (bool);
|
46
81
|
|
82
|
+
function isTokenActive(address token, VersionPart majorVersion) external view returns (bool);
|
83
|
+
|
47
84
|
function getServiceName(NftId nftId) external view returns (string memory name);
|
48
85
|
|
49
86
|
function getServiceAddress(
|
@@ -12,8 +12,6 @@ import {IBaseComponent} from "../components/IBaseComponent.sol";
|
|
12
12
|
|
13
13
|
interface IRegistryService is IService {
|
14
14
|
|
15
|
-
function registerToken(address tokenAddress) external returns(NftId nftId);
|
16
|
-
|
17
15
|
function registerService(IService service) external returns(IRegistry.ObjectInfo memory info, bytes memory data);
|
18
16
|
|
19
17
|
function registerInstance(IRegisterable instance)
|
@@ -7,7 +7,7 @@ import {IService} from "../shared/IService.sol";
|
|
7
7
|
import {ChainNft} from "./ChainNft.sol";
|
8
8
|
import {IRegistry} from "./IRegistry.sol";
|
9
9
|
import {NftId, toNftId, zeroNftId, NftIdLib} from "../types/NftId.sol";
|
10
|
-
import {Version, VersionPart, VersionLib} from "../types/Version.sol";
|
10
|
+
import {Version, VersionPart, VersionLib, VersionPartLib} from "../types/Version.sol";
|
11
11
|
import {ObjectType, PROTOCOL, REGISTRY, TOKEN, SERVICE, INSTANCE, STAKE, PRODUCT, DISTRIBUTION, ORACLE, POOL, POLICY, BUNDLE} from "../types/ObjectType.sol";
|
12
12
|
import {ITransferInterceptor} from "./ITransferInterceptor.sol";
|
13
13
|
|
@@ -28,24 +28,13 @@ contract Registry is
|
|
28
28
|
ERC165,
|
29
29
|
IRegistry
|
30
30
|
{
|
31
|
-
|
32
|
-
error NotRegistryService();
|
33
|
-
error ZeroParentAddress();
|
34
|
-
error ContractAlreadyRegistered(address objectAddress);
|
35
|
-
error InvalidServiceVersion(VersionPart majorVersion);
|
36
|
-
error ServiceNameAlreadyRegistered(string name, VersionPart majorVersion);
|
37
|
-
|
38
|
-
// approve
|
39
|
-
error NotOwner();
|
40
|
-
error NotRegisteredContract(NftId registrarNftId);
|
41
|
-
error NotService(NftId registrarNftId);
|
42
|
-
error InvalidTypesCombination(ObjectType objectType, ObjectType parentType);
|
43
|
-
|
44
|
-
uint256 public constant MAJOR_VERSION_MIN = 3;
|
31
|
+
uint256 public constant GIF_MAJOR_VERSION_AT_DEPLOYMENT = 3;
|
45
32
|
address public constant NFT_LOCK_ADDRESS = address(0x1);
|
46
33
|
uint256 public constant REGISTRY_SERVICE_TOKEN_SEQUENCE_ID = 3;
|
47
34
|
string public constant EMPTY_URI = "";
|
48
35
|
|
36
|
+
VersionPart internal _majorVersion;
|
37
|
+
|
49
38
|
mapping(NftId nftId => ObjectInfo info) internal _info;
|
50
39
|
mapping(address object => NftId nftId) internal _nftIdByAddress;
|
51
40
|
|
@@ -58,6 +47,9 @@ contract Registry is
|
|
58
47
|
mapping(ObjectType objectType => mapping(
|
59
48
|
ObjectType parentType => bool)) internal _isValidObjectCombination;
|
60
49
|
|
50
|
+
mapping(address token => mapping(
|
51
|
+
VersionPart majorVersion => bool isActive)) internal _tokenIsActive;
|
52
|
+
|
61
53
|
mapping(NftId nftId => string name) internal _string;
|
62
54
|
mapping(bytes32 serviceNameHash => mapping(
|
63
55
|
VersionPart majorVersion => address service)) internal _service;
|
@@ -69,7 +61,7 @@ contract Registry is
|
|
69
61
|
|
70
62
|
modifier onlyOwner() {
|
71
63
|
if(msg.sender != getOwner()) {
|
72
|
-
revert NotOwner();
|
64
|
+
revert NotOwner(msg.sender);
|
73
65
|
}
|
74
66
|
_;
|
75
67
|
}
|
@@ -85,7 +77,10 @@ contract Registry is
|
|
85
77
|
constructor(address registryOwner, VersionPart majorVersion)
|
86
78
|
{
|
87
79
|
require(registryOwner > address(0), "Registry: registry owner is 0");
|
88
|
-
|
80
|
+
|
81
|
+
// major version at constructor time
|
82
|
+
_majorVersion = VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
|
83
|
+
emit LogInitialMajorVersionSet(_majorVersion);
|
89
84
|
|
90
85
|
// deploy NFT
|
91
86
|
_chainNft = new ChainNft(address(this));// adds 10kb to deployment size
|
@@ -101,6 +96,24 @@ contract Registry is
|
|
101
96
|
_registerInterface(type(IRegistry).interfaceId);
|
102
97
|
}
|
103
98
|
|
99
|
+
// from IRegistry
|
100
|
+
|
101
|
+
/// @dev latest GIF release version
|
102
|
+
function setMajorVersion(VersionPart newMajorVersion)
|
103
|
+
external
|
104
|
+
onlyOwner
|
105
|
+
{
|
106
|
+
// ensure major version increments is one
|
107
|
+
uint256 oldMax = _majorVersion.toInt();
|
108
|
+
uint256 newMax = newMajorVersion.toInt();
|
109
|
+
if (newMax <= oldMax || newMax - oldMax != 1) {
|
110
|
+
revert MajorVersionMaxIncreaseInvalid(newMajorVersion, _majorVersion);
|
111
|
+
}
|
112
|
+
|
113
|
+
_majorVersion = newMajorVersion;
|
114
|
+
emit LogMajorVersionSet(_majorVersion);
|
115
|
+
}
|
116
|
+
|
104
117
|
/// @dev registry protects only against tampering existing records, registering with invalid types pairs and 0 parent address
|
105
118
|
// TODO service registration means its approval for some type?
|
106
119
|
// TODO registration of precompile addresses
|
@@ -169,12 +182,67 @@ contract Registry is
|
|
169
182
|
emit LogRegistration(info);
|
170
183
|
}
|
171
184
|
|
172
|
-
|
185
|
+
/// @dev token state is informative, registry have no clue about used tokens
|
186
|
+
// component owner is responsible for token selection and operations
|
187
|
+
// service MUST deny registration of component with inactive token
|
188
|
+
function setTokenActive(address token, VersionPart majorVersion, bool active)
|
189
|
+
external
|
190
|
+
onlyOwner
|
191
|
+
{
|
192
|
+
// verify that token is registered
|
193
|
+
ObjectInfo memory info = _info[_nftIdByAddress[token]];
|
194
|
+
if (info.nftId.eqz()) {
|
195
|
+
revert TokenNotRegistered(token);
|
196
|
+
}
|
197
|
+
|
198
|
+
// verify provided address is a registered token
|
199
|
+
if (info.objectType != TOKEN()) {
|
200
|
+
revert NotToken(token);
|
201
|
+
}
|
202
|
+
|
203
|
+
// verify valid major version
|
204
|
+
// ensure major version increments is one
|
205
|
+
uint256 version = majorVersion.toInt();
|
206
|
+
uint256 versionNow = _majorVersion.toInt();
|
207
|
+
if (version < GIF_MAJOR_VERSION_AT_DEPLOYMENT || version > versionNow) {
|
208
|
+
revert TokenMajorVersionInvalid(majorVersion);
|
209
|
+
}
|
210
|
+
|
211
|
+
_tokenIsActive[token][majorVersion] = active;
|
212
|
+
|
213
|
+
emit LogTokenStateSet(token, majorVersion, active);
|
214
|
+
}
|
215
|
+
|
216
|
+
/// @dev earliest GIF major version
|
217
|
+
function getMajorVersionMin() external view returns (VersionPart) {
|
218
|
+
return VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
|
219
|
+
}
|
220
|
+
|
221
|
+
// TODO make distinction between active an not yet active version
|
222
|
+
// need to be thought trough, not yet clear if necessary
|
223
|
+
// need to answer question: what is the latest version during the upgrade process?
|
224
|
+
// likely setting up a new gif version does not fit into a single tx
|
225
|
+
// in this case we might want to have a period where the latest version is
|
226
|
+
// in the process of being set up while the latest active version is 1 major release smaller
|
227
|
+
/// @dev latest GIF major version (might not yet be active)
|
228
|
+
function getMajorVersionMax() external view returns (VersionPart) {
|
229
|
+
return _majorVersion;
|
230
|
+
}
|
231
|
+
|
232
|
+
/// @dev latest active GIF release version
|
233
|
+
function getMajorVersion() external view returns (VersionPart) {
|
234
|
+
return _majorVersion;
|
235
|
+
}
|
236
|
+
|
237
|
+
|
173
238
|
function getObjectCount() external view override returns (uint256) {
|
174
|
-
|
175
239
|
return _chainNft.totalSupply();
|
176
240
|
}
|
177
241
|
|
242
|
+
function getNftId() external view returns (NftId nftId) {
|
243
|
+
return _registryNftId;
|
244
|
+
}
|
245
|
+
|
178
246
|
function getNftId(address object) external view override returns (NftId id) {
|
179
247
|
return _nftIdByAddress[object];
|
180
248
|
}
|
@@ -205,6 +273,10 @@ contract Registry is
|
|
205
273
|
return _nftIdByAddress[object].gtz();
|
206
274
|
}
|
207
275
|
|
276
|
+
function isTokenActive(address token, VersionPart majorVersion) external view returns (bool) {
|
277
|
+
return _tokenIsActive[token][majorVersion];
|
278
|
+
}
|
279
|
+
|
208
280
|
function getServiceName(NftId nftId) external view returns (string memory) {
|
209
281
|
return _string[nftId];
|
210
282
|
}
|
@@ -238,14 +310,8 @@ contract Registry is
|
|
238
310
|
) = abi.decode(info.data, (string, VersionPart));
|
239
311
|
bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
|
240
312
|
|
241
|
-
//
|
242
|
-
|
243
|
-
// TODO do not use names -> each object type is registered by corresponding service -> conflicting with approve()
|
244
|
-
if(
|
245
|
-
majorVersion.toInt() < MAJOR_VERSION_MIN ||
|
246
|
-
(majorVersion.toInt() > MAJOR_VERSION_MIN &&
|
247
|
-
_service[serviceNameHash][VersionLib.toVersionPart(majorVersion.toInt() - 1)] == address(0) )
|
248
|
-
) {
|
313
|
+
// ensures consistency of service.getVersion() and majorVersion here
|
314
|
+
if(majorVersion != _majorVersion) {
|
249
315
|
revert InvalidServiceVersion(majorVersion);
|
250
316
|
}
|
251
317
|
|
@@ -386,7 +452,7 @@ contract Registry is
|
|
386
452
|
|
387
453
|
string memory serviceName = "RegistryService";
|
388
454
|
bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
|
389
|
-
_service[serviceNameHash][VersionLib.toVersionPart(
|
455
|
+
_service[serviceNameHash][VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT)] = msg.sender;
|
390
456
|
_string[serviceNftId] = serviceName;
|
391
457
|
_serviceNftId = serviceNftId;
|
392
458
|
}
|
@@ -1,9 +1,7 @@
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
2
2
|
pragma solidity ^0.8.20;
|
3
3
|
|
4
|
-
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
|
5
4
|
import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
|
6
|
-
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
|
7
5
|
import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";
|
8
6
|
|
9
7
|
import {IRegistry} from "./IRegistry.sol";
|
@@ -22,7 +20,7 @@ import {Versionable} from "../../contracts/shared/Versionable.sol";
|
|
22
20
|
import {IRegisterable} from "../../contracts/shared/IRegisterable.sol";
|
23
21
|
|
24
22
|
import {RoleId, PRODUCT_OWNER_ROLE, POOL_OWNER_ROLE, ORACLE_OWNER_ROLE} from "../../contracts/types/RoleId.sol";
|
25
|
-
import {ObjectType, REGISTRY,
|
23
|
+
import {ObjectType, REGISTRY, SERVICE, PRODUCT, ORACLE, POOL, INSTANCE, DISTRIBUTION, POLICY, BUNDLE} from "../../contracts/types/ObjectType.sol";
|
26
24
|
import {StateId, ACTIVE, PAUSED} from "../../contracts/types/StateId.sol";
|
27
25
|
import {NftId, NftIdLib, zeroNftId} from "../../contracts/types/NftId.sol";
|
28
26
|
import {Fee, FeeLib} from "../../contracts/types/Fee.sol";
|
@@ -41,10 +39,10 @@ contract RegistryService is
|
|
41
39
|
{
|
42
40
|
using NftIdLib for NftId;
|
43
41
|
|
42
|
+
// TODO move errors to interface contract
|
44
43
|
error SelfRegistration();
|
45
44
|
error NotRegistryOwner();
|
46
45
|
|
47
|
-
error NotToken();
|
48
46
|
error NotService();
|
49
47
|
error NotInstance();
|
50
48
|
error NotProduct();
|
@@ -58,7 +56,6 @@ contract RegistryService is
|
|
58
56
|
error InvalidInitialOwner(address initialOwner);
|
59
57
|
error InvalidAddress(address registerableAddress);
|
60
58
|
|
61
|
-
|
62
59
|
// Initial value for constant variable has to be compile-time constant
|
63
60
|
// TODO define types as constants?
|
64
61
|
//ObjectType public constant SERVICE_TYPE = REGISTRY();
|
@@ -69,48 +66,6 @@ contract RegistryService is
|
|
69
66
|
|
70
67
|
address public constant NFT_LOCK_ADDRESS = address(0x1);
|
71
68
|
|
72
|
-
/// @dev
|
73
|
-
// msg.sender - ONLY registry owner
|
74
|
-
// CAN NOT register itself
|
75
|
-
// CAN NOT register IRegisterable address
|
76
|
-
// CAN register ONLY valid object-parent types combinations for TOKEN
|
77
|
-
// IMPORTANT: MUST NOT call untrusted contract inbetween calls to registry/instance (trusted contracts)
|
78
|
-
// motivation: registry/instance state may change during external call
|
79
|
-
// TODO it may be usefull to have transferable token nft in order to delist token, make it invalid for new beginings
|
80
|
-
// TODO: MUST prohibit registration of precompiles addresses
|
81
|
-
function registerToken(address tokenAddress)
|
82
|
-
external
|
83
|
-
returns(NftId nftId)
|
84
|
-
{
|
85
|
-
if(msg.sender == tokenAddress) {
|
86
|
-
revert SelfRegistration();
|
87
|
-
}
|
88
|
-
|
89
|
-
// MUST not revert if no ERC165 support
|
90
|
-
if(tokenAddress.code.length == 0 ||
|
91
|
-
ERC165Checker.supportsInterface(tokenAddress, type(IRegisterable).interfaceId)) {
|
92
|
-
revert NotToken();
|
93
|
-
}
|
94
|
-
|
95
|
-
NftId registryNftId = _registry.getNftId(address(_registry));
|
96
|
-
|
97
|
-
if(msg.sender != _registry.ownerOf(registryNftId)) {
|
98
|
-
revert NotRegistryOwner();
|
99
|
-
}
|
100
|
-
|
101
|
-
IRegistry.ObjectInfo memory info = IRegistry.ObjectInfo(
|
102
|
-
zeroNftId(), // any value
|
103
|
-
registryNftId, // parent nft id
|
104
|
-
TOKEN(),
|
105
|
-
false, // isInterceptor
|
106
|
-
tokenAddress,
|
107
|
-
NFT_LOCK_ADDRESS,
|
108
|
-
"" // any value
|
109
|
-
);
|
110
|
-
|
111
|
-
nftId = _registry.register(info);
|
112
|
-
}
|
113
|
-
|
114
69
|
/// @dev
|
115
70
|
// msg.sender - ONLY registry owner
|
116
71
|
// CAN NOT register itself
|
@@ -366,8 +321,13 @@ contract RegistryService is
|
|
366
321
|
|
367
322
|
address owner = info.initialOwner;
|
368
323
|
|
369
|
-
|
370
|
-
|
324
|
+
// solhint-disable-next-line
|
325
|
+
if(expectedType == INSTANCE()) {
|
326
|
+
// any address may create a new instance via instance service
|
327
|
+
} else {
|
328
|
+
if(owner != expectedOwner) { // registerable owner protection
|
329
|
+
revert NotRegisterableOwner(expectedOwner);
|
330
|
+
}
|
371
331
|
}
|
372
332
|
|
373
333
|
if(owner == address(registerable)) {
|
@@ -9,6 +9,7 @@ import {Registry} from "./Registry.sol";
|
|
9
9
|
import {IVersionable} from "../shared/IVersionable.sol";
|
10
10
|
import {ProxyManager} from "../shared/ProxyManager.sol";
|
11
11
|
import {RegistryService} from "./RegistryService.sol";
|
12
|
+
import {TokenRegistry} from "./TokenRegistry.sol";
|
12
13
|
|
13
14
|
|
14
15
|
contract RegistryServiceManager is
|
@@ -16,9 +17,9 @@ contract RegistryServiceManager is
|
|
16
17
|
{
|
17
18
|
bytes32 constant public ACCESS_MANAGER_CREATION_CODE_HASH = 0x0;
|
18
19
|
|
19
|
-
RegistryService private _registryService;
|
20
|
-
|
21
20
|
AccessManager private _accessManager;
|
21
|
+
RegistryService private _registryService;
|
22
|
+
TokenRegistry private _tokenRegistry;
|
22
23
|
|
23
24
|
/// @dev initializes proxy manager with registry service implementation and deploys registry
|
24
25
|
constructor(
|
@@ -41,11 +42,26 @@ contract RegistryServiceManager is
|
|
41
42
|
address(_registryService.getRegistry()),
|
42
43
|
address(_registryService));
|
43
44
|
|
45
|
+
// deploy token registry
|
46
|
+
|
47
|
+
// _tokenRegistry = new TokenRegistry(
|
48
|
+
// address(_registryService.getRegistry()),
|
49
|
+
// address(_registryService));
|
50
|
+
|
44
51
|
// implies that after this constructor call only upgrade functionality is available
|
45
52
|
_isDeployed = true;
|
46
53
|
}
|
47
54
|
|
48
55
|
//--- view functions ----------------------------------------------------//
|
56
|
+
|
57
|
+
function getAccessManager()
|
58
|
+
external
|
59
|
+
view
|
60
|
+
returns (AccessManager)
|
61
|
+
{
|
62
|
+
return _accessManager;
|
63
|
+
}
|
64
|
+
|
49
65
|
function getRegistryService()
|
50
66
|
external
|
51
67
|
view
|
@@ -54,11 +70,11 @@ contract RegistryServiceManager is
|
|
54
70
|
return _registryService;
|
55
71
|
}
|
56
72
|
|
57
|
-
function
|
73
|
+
function getTokenRegistry()
|
58
74
|
external
|
59
75
|
view
|
60
|
-
returns (
|
76
|
+
returns (TokenRegistry)
|
61
77
|
{
|
62
|
-
return
|
78
|
+
return _tokenRegistry;
|
63
79
|
}
|
64
80
|
}
|
@@ -0,0 +1,111 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.20;
|
3
|
+
|
4
|
+
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
|
5
|
+
import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
|
6
|
+
|
7
|
+
import {IRegisterable} from "../shared/IRegisterable.sol";
|
8
|
+
import {IRegistry} from "./IRegistry.sol";
|
9
|
+
import {Version, VersionPart, VersionLib, VersionPartLib} from "../types/Version.sol";
|
10
|
+
import {NftOwnable} from "../shared/NftOwnable.sol";
|
11
|
+
|
12
|
+
/// @title contract to register token per GIF major release.
|
13
|
+
contract TokenRegistry is
|
14
|
+
NftOwnable
|
15
|
+
{
|
16
|
+
|
17
|
+
string public constant REGISTRY_SERVICE_NAME = "RegistryService";
|
18
|
+
|
19
|
+
event LogRegistered(address token, string symbol, uint256 decimals);
|
20
|
+
event LogTokenStateSet(address token, VersionPart majorVersion, bool active);
|
21
|
+
|
22
|
+
error NotContract(address account);
|
23
|
+
error NotToken(address account);
|
24
|
+
error TokenDecimalsZero();
|
25
|
+
error TokenMajorVersionInvalid(VersionPart majorVersion);
|
26
|
+
|
27
|
+
address [] internal _token;
|
28
|
+
mapping(address token => bool registered) internal _registered;
|
29
|
+
mapping(address token => mapping(VersionPart majorVersion => bool isActive)) internal _active;
|
30
|
+
|
31
|
+
constructor()
|
32
|
+
NftOwnable()
|
33
|
+
{ }
|
34
|
+
|
35
|
+
|
36
|
+
/// @dev link ownership of token registry to nft owner of registry service
|
37
|
+
function linkToNftOwnable(address registryAddress)
|
38
|
+
external
|
39
|
+
onlyOwner
|
40
|
+
{
|
41
|
+
IRegistry registry = IRegistry(registryAddress);
|
42
|
+
address registryServiceAddress = registry.getServiceAddress(REGISTRY_SERVICE_NAME, registry.getMajorVersion());
|
43
|
+
|
44
|
+
_linkToNftOwnable(registryAddress, registryServiceAddress);
|
45
|
+
}
|
46
|
+
|
47
|
+
/// @dev token state is informative, registry have no clue about used tokens
|
48
|
+
// component owner is responsible for token selection and operations
|
49
|
+
// service MUST deny registration of component with inactive token
|
50
|
+
function setActive(address token, VersionPart majorVersion, bool active)
|
51
|
+
external
|
52
|
+
onlyOwner
|
53
|
+
{
|
54
|
+
// verify that token is registered
|
55
|
+
if (!_registered[token]) {
|
56
|
+
_registerToken(token);
|
57
|
+
}
|
58
|
+
|
59
|
+
// verify valid major version
|
60
|
+
// ensure major version increments is one
|
61
|
+
uint256 version = majorVersion.toInt();
|
62
|
+
if (version < _registry.getMajorVersionMin().toInt() || version > _registry.getMajorVersionMax().toInt()) {
|
63
|
+
revert TokenMajorVersionInvalid(majorVersion);
|
64
|
+
}
|
65
|
+
|
66
|
+
_active[token][majorVersion] = active;
|
67
|
+
|
68
|
+
emit LogTokenStateSet(token, majorVersion, active);
|
69
|
+
}
|
70
|
+
|
71
|
+
function tokens() external view returns (uint256) {
|
72
|
+
return _token.length;
|
73
|
+
}
|
74
|
+
|
75
|
+
function getToken(uint256 idx) external view returns (IERC20Metadata token) {
|
76
|
+
return IERC20Metadata(_token[idx]);
|
77
|
+
}
|
78
|
+
|
79
|
+
function isRegistered(address token) external view returns (bool) {
|
80
|
+
return _registered[token];
|
81
|
+
}
|
82
|
+
|
83
|
+
function isActive(address token, VersionPart majorVersion) external view returns (bool) {
|
84
|
+
return _active[token][majorVersion];
|
85
|
+
}
|
86
|
+
|
87
|
+
/// @dev some sanity checks to prevent unintended registration
|
88
|
+
function _registerToken(address token) internal {
|
89
|
+
|
90
|
+
// MUST be contract
|
91
|
+
if(token.code.length == 0) {
|
92
|
+
revert NotContract(token);
|
93
|
+
}
|
94
|
+
|
95
|
+
// MUST not be GIF registerable
|
96
|
+
if(ERC165Checker.supportsInterface(token, type(IRegisterable).interfaceId)) {
|
97
|
+
revert NotToken(token);
|
98
|
+
}
|
99
|
+
|
100
|
+
// MUST have decimals > 0
|
101
|
+
IERC20Metadata erc20 = IERC20Metadata(token);
|
102
|
+
if(erc20.decimals() == 0) {
|
103
|
+
revert TokenDecimalsZero();
|
104
|
+
}
|
105
|
+
|
106
|
+
_registered[token] = true;
|
107
|
+
_token.push(token);
|
108
|
+
|
109
|
+
emit LogRegistered(token, erc20.symbol(), erc20.decimals());
|
110
|
+
}
|
111
|
+
}
|
@@ -7,14 +7,18 @@ contract ERC165 is IERC165 {
|
|
7
7
|
mapping(bytes4 => bool) private _isSupported;
|
8
8
|
|
9
9
|
constructor() {
|
10
|
-
|
11
|
-
_registerInterface(type(IERC165).interfaceId);
|
10
|
+
_initializeERC165();
|
12
11
|
}
|
13
12
|
|
14
13
|
function supportsInterface(bytes4 interfaceId) external view override returns (bool) {
|
15
14
|
return _isSupported[interfaceId];
|
16
15
|
}
|
17
16
|
|
17
|
+
// @dev register support for ERC165 itself
|
18
|
+
function _initializeERC165() internal {
|
19
|
+
_isSupported[type(IERC165).interfaceId] = true;
|
20
|
+
}
|
21
|
+
|
18
22
|
function _registerInterface(bytes4 interfaceId) internal {
|
19
23
|
_isSupported[interfaceId] = true;
|
20
24
|
}
|
@@ -22,6 +22,8 @@ function ORACLE_OWNER_ROLE_NAME() pure returns (string memory) { return "OracleO
|
|
22
22
|
function POOL_OWNER_ROLE_NAME() pure returns (string memory) { return "PoolOwnerRole"; }
|
23
23
|
function PRODUCT_OWNER_ROLE_NAME() pure returns (string memory) { return "ProductOwnerRole"; }
|
24
24
|
|
25
|
+
function ADMIN_ROLE() pure returns (RoleId) { return RoleIdLib.toRoleId(0); }
|
26
|
+
|
25
27
|
// TODO correct numbers (maybe they are already defined in RegistryService)
|
26
28
|
function DISTRIBUTION_OWNER_ROLE() pure returns (RoleId) { return RoleIdLib.toRoleId(100); }
|
27
29
|
function ORACLE_OWNER_ROLE() pure returns (RoleId) { return RoleIdLib.toRoleId(200); }
|
@@ -34,6 +36,11 @@ function BUNDLE_REGISTRAR_ROLE() pure returns (RoleId) { return RoleIdLib.toRole
|
|
34
36
|
function POOL_REGISTRAR_ROLE() pure returns (RoleId) { return RoleIdLib.toRoleId(1300); }
|
35
37
|
function PRODUCT_REGISTRAR_ROLE() pure returns (RoleId) { return RoleIdLib.toRoleId(1400); }
|
36
38
|
|
39
|
+
function DISTRIBUTION_SERVICE_ROLE() pure returns (RoleId) { return RoleIdLib.toRoleId(10000); }
|
40
|
+
function POOL_SERVICE_ROLE() pure returns (RoleId) { return RoleIdLib.toRoleId(10100); }
|
41
|
+
|
42
|
+
function INSTANCE_SERVICE_ROLE() pure returns (RoleId) { return RoleIdLib.toRoleId(11000); }
|
43
|
+
|
37
44
|
// @dev Returns true iff role ids a and b are identical
|
38
45
|
function eqRoleId(RoleId a, RoleId b) pure returns (bool isSame) {
|
39
46
|
return RoleId.unwrap(a) == RoleId.unwrap(b);
|
@@ -58,6 +58,10 @@ function PAID() pure returns (StateId) {
|
|
58
58
|
return toStateId(220);
|
59
59
|
}
|
60
60
|
|
61
|
+
function KEEP_STATE() pure returns (StateId) {
|
62
|
+
return toStateId(type(uint8).max);
|
63
|
+
}
|
64
|
+
|
61
65
|
/// @dev Converts the uint8 to a StateId.
|
62
66
|
function toStateId(uint256 id) pure returns (StateId) {
|
63
67
|
return StateId.wrap(uint8(id));
|
@@ -6,15 +6,18 @@ type VersionPart is uint8;
|
|
6
6
|
using {
|
7
7
|
versionPartGt as >,
|
8
8
|
versionPartEq as ==,
|
9
|
+
versionPartNe as !=,
|
9
10
|
VersionPartLib.toInt
|
10
11
|
}
|
11
12
|
for VersionPart global;
|
12
13
|
|
13
14
|
function versionPartGt(VersionPart a, VersionPart b) pure returns(bool isGreaterThan) { return VersionPart.unwrap(a) > VersionPart.unwrap(b); }
|
14
15
|
function versionPartEq(VersionPart a, VersionPart b) pure returns(bool isSame) { return VersionPart.unwrap(a) == VersionPart.unwrap(b); }
|
16
|
+
function versionPartNe(VersionPart a, VersionPart b) pure returns(bool isSame) { return VersionPart.unwrap(a) != VersionPart.unwrap(b); }
|
15
17
|
|
16
18
|
library VersionPartLib {
|
17
|
-
function toInt(VersionPart
|
19
|
+
function toInt(VersionPart a) external pure returns(uint) { return VersionPart.unwrap(a); }
|
20
|
+
function toVersionPart(uint256 a) external pure returns(VersionPart) { return VersionPart.wrap(uint8(a)); }
|
18
21
|
}
|
19
22
|
|
20
23
|
type Version is uint24; // contains major,minor,patch version parts
|
package/package.json
CHANGED