@etherisc/gif-next 0.0.2-c83506f-943 → 0.0.2-c96f882-016

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.
Files changed (142) hide show
  1. package/README.md +4 -0
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.json +2 -2
  5. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  6. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  8. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  10. package/artifacts/contracts/components/Pool.sol/Pool.json +2 -2
  11. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  12. package/artifacts/contracts/components/Product.sol/Product.json +2 -2
  13. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
  14. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
  15. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
  16. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  18. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  33. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +1 -1
  34. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.json +13 -0
  35. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +1 -1
  36. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.json +15 -2
  37. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +1 -1
  38. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  39. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  40. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +59 -0
  41. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  42. package/artifacts/contracts/instance/Instance.sol/Instance.json +138 -81
  43. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  44. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +45 -32
  45. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  46. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +63 -37
  47. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  48. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +80 -28
  49. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  50. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +17 -9
  51. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  52. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  53. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  54. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  55. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  56. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  57. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  58. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  59. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  60. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  61. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  62. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  63. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  64. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  65. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +2 -2
  66. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  67. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  68. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  69. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  70. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  71. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  72. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +283 -0
  73. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  74. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  75. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  76. package/artifacts/contracts/registry/Registry.sol/Registry.json +226 -28
  77. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  78. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +8 -8
  79. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  80. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +26 -22
  81. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  82. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  83. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  84. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  85. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  86. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  87. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  88. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  89. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  90. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  91. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  92. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +2 -2
  93. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +1 -1
  94. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  95. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  96. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  97. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
  98. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  99. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  100. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  101. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +2 -2
  102. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  103. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  104. package/artifacts/contracts/test/TestService.sol/TestService.json +2 -2
  105. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  106. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  107. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  108. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  109. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +2 -2
  110. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  111. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  112. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  113. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  114. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  115. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  116. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  117. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  118. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  119. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  120. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  121. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  122. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  123. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  124. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  125. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  126. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  127. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  128. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  129. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  130. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  131. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +22 -3
  132. package/contracts/instance/AccessManagedSimple.sol +8 -0
  133. package/contracts/instance/AccessManagerSimple.sol +10 -0
  134. package/contracts/instance/IInstanceService.sol +14 -1
  135. package/contracts/instance/Instance.sol +12 -6
  136. package/contracts/instance/InstanceReader.sol +10 -0
  137. package/contracts/instance/InstanceService.sol +54 -18
  138. package/contracts/registry/IRegistry.sol +35 -2
  139. package/contracts/registry/Registry.sol +77 -28
  140. package/contracts/registry/RegistryService.sol +7 -2
  141. package/contracts/types/Version.sol +4 -1
  142. package/package.json +1 -1
@@ -26,6 +26,7 @@ import {TimestampLib} from "../types/Timestamp.sol";
26
26
 
27
27
 
28
28
  contract InstanceReader {
29
+ bool private _initialized;
29
30
 
30
31
  IRegistry internal _registry;
31
32
  NftId internal _instanceNftId;
@@ -37,6 +38,12 @@ contract InstanceReader {
37
38
  NftId instanceNftId
38
39
  )
39
40
  {
41
+ initialize(registry, instanceNftId);
42
+ }
43
+
44
+ function initialize(address registry, NftId instanceNftId) public {
45
+ require(!_initialized, "ERROR:CRD-000:ALREADY_INITIALIZED");
46
+
40
47
  require(
41
48
  address(registry) != address(0),
42
49
  "ERROR:CRD-001:REGISTRY_ZERO");
@@ -55,8 +62,11 @@ contract InstanceReader {
55
62
 
56
63
  _instance = IInstance(instanceInfo.objectAddress);
57
64
  _store = IKeyValueStore(instanceInfo.objectAddress);
65
+
66
+ _initialized = true;
58
67
  }
59
68
 
69
+
60
70
  // module specific functions
61
71
 
62
72
  function getPolicyInfo(NftId policyNftId)
@@ -7,18 +7,22 @@ import {AccessManagerSimple} from "./AccessManagerSimple.sol";
7
7
  import {InstanceAccessManager} from "./InstanceAccessManager.sol";
8
8
  import {Instance} from "./Instance.sol";
9
9
  import {IInstanceService} from "./IInstanceService.sol";
10
- import {Service} from "../shared/Service.sol";
10
+ import {InstanceReader} from "./InstanceReader.sol";
11
11
  import {IRegistry} from "../registry/IRegistry.sol";
12
+ import {Registry} from "../registry/Registry.sol";
13
+ import {RegistryService} from "../registry/RegistryService.sol";
14
+ import {Service} from "../../contracts/shared/Service.sol";
12
15
  import {IService} from "../shared/IService.sol";
13
16
  import {ContractDeployerLib} from "../shared/ContractDeployerLib.sol";
14
- import {NftId, NftIdLib, zeroNftId} from "../types/NftId.sol";
17
+ import {NftId, NftIdLib, zeroNftId} from "../../contracts/types/NftId.sol";
18
+ import {VersionLib} from "../types/Version.sol";
15
19
 
16
20
  contract InstanceService is Service, IInstanceService {
17
21
 
18
22
  address internal _registryAddress;
19
23
  address internal _accessManagerMaster;
20
- address internal _instanceAccessManagerMaster;
21
24
  address internal _instanceMaster;
25
+ address internal _instanceReaderMaster;
22
26
 
23
27
  // TODO update to real hash when instance is stable
24
28
  bytes32 public constant INSTANCE_CREATION_CODE_HASH = bytes32(0);
@@ -27,31 +31,63 @@ contract InstanceService is Service, IInstanceService {
27
31
  function createInstanceClone()
28
32
  external
29
33
  returns (
30
- AccessManagerSimple am,
31
- InstanceAccessManager im,
32
- Instance i
34
+ AccessManagerSimple clonedAccessManager,
35
+ Instance clonedInstance,
36
+ NftId instanceNftId,
37
+ InstanceReader clonedInstanceReader
33
38
  )
34
39
  {
35
- am = AccessManagerSimple(Clones.clone(_accessManagerMaster));
36
- im = InstanceAccessManager(Clones.clone(_instanceAccessManagerMaster));
37
- i = Instance(Clones.clone(_instanceMaster));
40
+ Registry registry = Registry(_registryAddress);
41
+ NftId registryNftId = registry.getNftId(_registryAddress);
42
+ address registryServiceAddress = registry.getServiceAddress("RegistryService", VersionLib.toVersion(3, 0, 0).toMajorPart());
43
+ RegistryService registryService = RegistryService(registryServiceAddress);
44
+
45
+ clonedAccessManager = AccessManagerSimple(Clones.clone(_accessManagerMaster));
46
+ clonedAccessManager.initialize(msg.sender);
47
+
48
+ clonedInstance = Instance(Clones.clone(_instanceMaster));
49
+ clonedInstance.initialize(address(clonedAccessManager), _registryAddress, registryNftId, msg.sender);
50
+ ( IRegistry.ObjectInfo memory info, ) = registryService.registerInstance(clonedInstance);
51
+ instanceNftId = info.nftId;
52
+
53
+ clonedInstanceReader = InstanceReader(Clones.clone(address(_instanceReaderMaster)));
54
+ clonedInstanceReader.initialize(_registryAddress, instanceNftId);
55
+
56
+ emit LogInstanceCloned(address(clonedAccessManager), address(clonedInstance), address(clonedInstanceReader), instanceNftId);
38
57
  }
39
58
 
40
- function setAccessManagerMaster(address accessManager) external {
41
- _accessManagerMaster = accessManager;
59
+ function setAccessManagerMaster(address accessManagerMaster) external {
60
+ require(
61
+ _accessManagerMaster == address(0),
62
+ "ERROR:CRD-001:ACCESS_MANAGER_MASTER_ALREADY_SET");
63
+ _accessManagerMaster = accessManagerMaster;
42
64
  }
43
65
 
44
- function setInstanceAccessManagerMaster(address instanceAccessManager) external {
45
- _instanceAccessManagerMaster = instanceAccessManager;
66
+ function setInstanceMaster(address instanceMaster) external {
67
+ require(
68
+ _instanceMaster == address(0),
69
+ "ERROR:CRD-002:INSTANCE_MASTER_ALREADY_SET");
70
+ _instanceMaster = instanceMaster;
46
71
  }
47
72
 
48
- function setInstanceMaster(address instance) external {
49
- _instanceMaster = instance;
73
+ function setInstanceReaderMaster(address instanceReaderMaster) external {
74
+ require(
75
+ _instanceReaderMaster == address(0),
76
+ "ERROR:CRD-003:INSTANCE_READER_MASTER_ALREADY_SET");
77
+ _instanceReaderMaster = instanceReaderMaster;
50
78
  }
51
79
 
52
- function getAccessManagerMaster() external view returns (address) { return address(_accessManagerMaster); }
53
- function getInstanceAccessManagerMaster() external view returns (address) { return address(_instanceAccessManagerMaster); }
54
- function getInstanceMaster() external view returns (address) { return address(_instanceMaster); }
80
+ function getInstanceReaderMaster() external view returns (address) {
81
+ return _instanceReaderMaster;
82
+ }
83
+
84
+ function getInstanceMaster() external view returns (address) {
85
+ return _instanceMaster;
86
+ }
87
+
88
+ function getAccessManagerMaster() external view returns (address) {
89
+ return _accessManagerMaster;
90
+ }
55
91
 
56
92
  // From IService
57
93
  function getName() public pure override(IService, Service) returns(string memory) {
@@ -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,20 @@ 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 getMajorVersion() external view returns (VersionPart);
30
59
 
31
60
  function getObjectCount() external view returns (uint256);
32
61
 
62
+ function getNftId() external view returns (NftId nftId);
63
+
33
64
  function getNftId(address objectAddress) external view returns (NftId nftId);
34
65
 
35
66
  function ownerOf(NftId nftId) external view returns (address);
@@ -44,6 +75,8 @@ interface IRegistry is IERC165 {
44
75
 
45
76
  function isRegistered(address contractAddress) external view returns (bool);
46
77
 
78
+ function isTokenActive(address token, VersionPart majorVersion) external view returns (bool);
79
+
47
80
  function getServiceName(NftId nftId) external view returns (string memory name);
48
81
 
49
82
  function getServiceAddress(
@@ -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
- // register
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
- require(majorVersion.toInt() == MAJOR_VERSION_MIN, "Registry: initial major version of registry service is not MAJOR_VERSION_MIN");
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,50 @@ contract Registry is
169
182
  emit LogRegistration(info);
170
183
  }
171
184
 
172
- // from IRegistry
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 latest GIF release version
217
+ function getMajorVersion() external view returns (VersionPart) {
218
+ return _majorVersion;
219
+ }
220
+
173
221
  function getObjectCount() external view override returns (uint256) {
174
-
175
222
  return _chainNft.totalSupply();
176
223
  }
177
224
 
225
+ function getNftId() external view returns (NftId nftId) {
226
+ return _registryNftId;
227
+ }
228
+
178
229
  function getNftId(address object) external view override returns (NftId id) {
179
230
  return _nftIdByAddress[object];
180
231
  }
@@ -205,6 +256,10 @@ contract Registry is
205
256
  return _nftIdByAddress[object].gtz();
206
257
  }
207
258
 
259
+ function isTokenActive(address token, VersionPart majorVersion) external view returns (bool) {
260
+ return _tokenIsActive[token][majorVersion];
261
+ }
262
+
208
263
  function getServiceName(NftId nftId) external view returns (string memory) {
209
264
  return _string[nftId];
210
265
  }
@@ -238,14 +293,8 @@ contract Registry is
238
293
  ) = abi.decode(info.data, (string, VersionPart));
239
294
  bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
240
295
 
241
- // TODO MUST guarantee consistency of service.getVersion() and majorVersion here
242
- // TODO update _serviceNftId when registryService with new major version is registered? -> it is fixed in current setup -> can lock up
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
- ) {
296
+ // ensures consistency of service.getVersion() and majorVersion here
297
+ if(majorVersion != _majorVersion) {
249
298
  revert InvalidServiceVersion(majorVersion);
250
299
  }
251
300
 
@@ -386,7 +435,7 @@ contract Registry is
386
435
 
387
436
  string memory serviceName = "RegistryService";
388
437
  bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
389
- _service[serviceNameHash][VersionLib.toVersionPart(MAJOR_VERSION_MIN)] = msg.sender;
438
+ _service[serviceNameHash][VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT)] = msg.sender;
390
439
  _string[serviceNftId] = serviceName;
391
440
  _serviceNftId = serviceNftId;
392
441
  }
@@ -366,8 +366,13 @@ contract RegistryService is
366
366
 
367
367
  address owner = info.initialOwner;
368
368
 
369
- if(owner != expectedOwner) { // registerable owner protection
370
- revert NotRegisterableOwner(expectedOwner);
369
+ // solhint-disable-next-line
370
+ if(expectedType == INSTANCE()) {
371
+ // any address may create a new instance via instance service
372
+ } else {
373
+ if(owner != expectedOwner) { // registerable owner protection
374
+ revert NotRegisterableOwner(expectedOwner);
375
+ }
371
376
  }
372
377
 
373
378
  if(owner == address(registerable)) {
@@ -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 x) external pure returns(uint) { return VersionPart.unwrap(x); }
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etherisc/gif-next",
3
- "version": "0.0.2-c83506f-943",
3
+ "version": "0.0.2-c96f882-016",
4
4
  "description": "This is the repository for the next version of the Generic Insurance Framework (GIF) smart contracts. ",
5
5
  "main": "index.js",
6
6
  "scripts": {