@etherisc/gif-next 0.0.2-b9e9dc3-713 → 0.0.2-bc11089-132

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 (256) hide show
  1. package/README.md +67 -1
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +155 -0
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +177 -15
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +117 -0
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +28 -2
  11. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  12. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  13. package/artifacts/contracts/components/Pool.sol/Pool.json +209 -16
  14. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  15. package/artifacts/contracts/components/Product.sol/Product.json +179 -50
  16. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +1 -1
  18. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +2 -2
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +2 -2
  35. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  36. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
  37. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  38. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  39. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +4 -0
  40. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +1206 -0
  41. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +4 -0
  42. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +788 -0
  43. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +4 -0
  44. package/artifacts/contracts/instance/{AccessManagedSimple.sol/AccessManagedSimple.json → Cloneable.sol/Cloneable.json} +86 -2
  45. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  46. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1408 -22
  47. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
  48. package/artifacts/contracts/instance/IInstanceBase.sol/IInstanceBase.json +448 -0
  49. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  50. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +120 -0
  51. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  52. package/artifacts/contracts/instance/Instance.sol/Instance.json +200 -624
  53. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  54. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +283 -143
  55. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.dbg.json +4 -0
  56. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.json +763 -0
  57. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  58. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +202 -37
  59. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  60. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +344 -56
  61. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  62. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +97 -13
  63. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +4 -0
  64. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +285 -0
  65. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  66. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +40 -0
  67. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  68. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  69. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  70. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  71. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +2 -2
  72. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  73. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +2 -2
  74. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  75. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +54 -22
  76. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  77. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  78. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  79. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  80. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  81. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  82. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +4 -0
  83. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +923 -0
  84. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +4 -0
  85. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +440 -0
  86. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  87. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +18 -18
  88. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  89. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +684 -0
  90. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
  91. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +428 -0
  92. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +4 -0
  93. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +669 -0
  94. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  95. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  96. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +4 -0
  97. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +664 -0
  98. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  99. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +9 -71
  100. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  101. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +17 -232
  102. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +4 -0
  103. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +984 -0
  104. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +4 -0
  105. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +464 -0
  106. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  107. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +718 -0
  108. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
  109. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +428 -0
  110. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  111. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +768 -0
  112. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
  113. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +420 -0
  114. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  115. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  116. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +201 -0
  117. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  118. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +94 -19
  119. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  120. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  121. package/artifacts/contracts/registry/Registry.sol/Registry.json +172 -49
  122. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  123. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +61 -29
  124. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  125. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +47 -34
  126. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
  127. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +410 -0
  128. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  129. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  130. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  131. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  132. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  133. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +4 -0
  134. package/artifacts/contracts/{instance/base → shared}/IService.sol/IService.json +1 -1
  135. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  136. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  137. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +2 -2
  138. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  139. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +2 -2
  140. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  141. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +4 -4
  142. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +4 -0
  143. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.json +442 -0
  144. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +4 -0
  145. package/artifacts/contracts/{instance/base/ServiceBase.sol/ServiceBase.json → shared/Service.sol/Service.json} +2 -2
  146. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  147. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  148. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
  149. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  150. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  151. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  152. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +4 -4
  153. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  154. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  155. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  156. package/artifacts/contracts/test/TestService.sol/TestService.json +11 -11
  157. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  158. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  159. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  160. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  161. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +2 -2
  162. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  163. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  164. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  165. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  166. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  167. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  168. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  169. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  170. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  171. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +26 -3
  172. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  173. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  174. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  175. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  176. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  177. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  178. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  179. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  180. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  181. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  182. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  183. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  184. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  185. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  186. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +22 -3
  187. package/contracts/components/BaseComponent.sol +73 -11
  188. package/contracts/components/Distribution.sol +15 -18
  189. package/contracts/components/IBaseComponent.sol +8 -0
  190. package/contracts/components/IDistributionComponent.sol +1 -0
  191. package/contracts/components/IPoolComponent.sol +5 -1
  192. package/contracts/components/Pool.sol +43 -31
  193. package/contracts/components/Product.sol +42 -47
  194. package/contracts/instance/AccessManagerUpgradeableInitializeable.sol +23 -0
  195. package/contracts/instance/BundleManager.sol +129 -0
  196. package/contracts/instance/Cloneable.sol +46 -0
  197. package/contracts/instance/IInstance.sol +41 -7
  198. package/contracts/instance/IInstanceBase.sol +26 -0
  199. package/contracts/instance/IInstanceService.sol +29 -8
  200. package/contracts/instance/Instance.sol +66 -226
  201. package/contracts/instance/InstanceAccessManager.sol +94 -78
  202. package/contracts/instance/InstanceBase.sol +41 -0
  203. package/contracts/instance/InstanceReader.sol +36 -1
  204. package/contracts/instance/InstanceService.sol +245 -47
  205. package/contracts/instance/InstanceServiceManager.sol +6 -5
  206. package/contracts/instance/ObjectManager.sol +101 -0
  207. package/contracts/instance/base/ComponentServiceBase.sol +44 -21
  208. package/contracts/instance/module/IAccess.sol +27 -17
  209. package/contracts/instance/module/IBundle.sol +1 -0
  210. package/contracts/instance/module/ISetup.sol +3 -0
  211. package/contracts/instance/service/BundleService.sol +260 -0
  212. package/contracts/instance/service/BundleServiceManager.sol +54 -0
  213. package/contracts/instance/service/ComponentOwnerService.sol +5 -5
  214. package/contracts/instance/service/DistributionService.sol +118 -0
  215. package/contracts/instance/service/DistributionServiceManager.sol +54 -0
  216. package/contracts/instance/service/IBundleService.sol +45 -0
  217. package/contracts/instance/service/IComponentOwnerService.sol +1 -1
  218. package/contracts/instance/service/IDistributionService.sol +1 -1
  219. package/contracts/instance/service/IPolicyService.sol +87 -0
  220. package/contracts/instance/service/IPoolService.sol +7 -24
  221. package/contracts/instance/service/IProductService.sol +7 -74
  222. package/contracts/instance/service/PolicyService.sol +508 -0
  223. package/contracts/instance/service/PolicyServiceManager.sol +54 -0
  224. package/contracts/instance/service/PoolService.sol +124 -0
  225. package/contracts/instance/service/PoolServiceManager.sol +54 -0
  226. package/contracts/instance/service/ProductService.sol +173 -0
  227. package/contracts/instance/service/ProductServiceManager.sol +54 -0
  228. package/contracts/registry/IRegistry.sol +26 -2
  229. package/contracts/registry/IRegistryService.sol +34 -19
  230. package/contracts/registry/Registry.sol +61 -36
  231. package/contracts/registry/RegistryService.sol +42 -124
  232. package/contracts/registry/RegistryServiceManager.sol +21 -5
  233. package/contracts/registry/TokenRegistry.sol +111 -0
  234. package/contracts/shared/ERC165.sol +6 -2
  235. package/contracts/{instance/base → shared}/IService.sol +3 -3
  236. package/contracts/shared/NftOwnable.sol +2 -4
  237. package/contracts/shared/Registerable.sol +1 -0
  238. package/contracts/shared/RegisterableUpgradable.sol +16 -0
  239. package/contracts/shared/Service.sol +55 -0
  240. package/contracts/test/TestService.sol +3 -5
  241. package/contracts/types/NftIdSet.sol +26 -24
  242. package/contracts/types/RoleId.sol +10 -1
  243. package/contracts/types/StateId.sol +4 -0
  244. package/contracts/types/Version.sol +4 -1
  245. package/package.json +1 -1
  246. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +0 -4
  247. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +0 -4
  248. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.json +0 -1119
  249. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +0 -4
  250. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.json +0 -1082
  251. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +0 -4
  252. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +0 -4
  253. package/contracts/instance/AccessManagedSimple.sol +0 -114
  254. package/contracts/instance/AccessManagerSimple.sol +0 -682
  255. package/contracts/instance/IAccessManagerSimple.sol +0 -391
  256. package/contracts/instance/base/ServiceBase.sol +0 -44
@@ -2,12 +2,12 @@
2
2
  pragma solidity ^0.8.20;
3
3
 
4
4
  import {IRegisterable} from "../shared/IRegisterable.sol";
5
- import {IService} from "../instance/base/IService.sol";
5
+ import {IService} from "../shared/IService.sol";
6
6
 
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,30 +28,17 @@ 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);
33
+ uint256 public constant REGISTRY_TOKEN_SEQUENCE_ID = 2;
46
34
  uint256 public constant REGISTRY_SERVICE_TOKEN_SEQUENCE_ID = 3;
47
35
  string public constant EMPTY_URI = "";
48
36
 
37
+ VersionPart internal _majorVersion;
38
+
49
39
  mapping(NftId nftId => ObjectInfo info) internal _info;
50
40
  mapping(address object => NftId nftId) internal _nftIdByAddress;
51
41
 
52
- mapping(NftId registrator => mapping(
53
- ObjectType objectType => bool)) internal _isApproved;
54
-
55
42
  mapping(ObjectType objectType => mapping(
56
43
  ObjectType parentType => bool)) internal _isValidContractCombination;
57
44
 
@@ -69,13 +56,12 @@ contract Registry is
69
56
 
70
57
  modifier onlyOwner() {
71
58
  if(msg.sender != getOwner()) {
72
- revert NotOwner();
59
+ revert NotOwner(msg.sender);
73
60
  }
74
61
  _;
75
62
  }
76
63
 
77
64
  modifier onlyRegistryService() {
78
-
79
65
  if(msg.sender != _info[_serviceNftId].objectAddress) {
80
66
  revert NotRegistryService();
81
67
  }
@@ -85,7 +71,10 @@ contract Registry is
85
71
  constructor(address registryOwner, VersionPart majorVersion)
86
72
  {
87
73
  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");
74
+
75
+ // major version at constructor time
76
+ _majorVersion = VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
77
+ emit LogInitialMajorVersionSet(_majorVersion);
89
78
 
90
79
  // deploy NFT
91
80
  _chainNft = new ChainNft(address(this));// adds 10kb to deployment size
@@ -101,6 +90,24 @@ contract Registry is
101
90
  _registerInterface(type(IRegistry).interfaceId);
102
91
  }
103
92
 
93
+ // from IRegistry
94
+
95
+ /// @dev latest GIF release version
96
+ function setMajorVersion(VersionPart newMajorVersion)
97
+ external
98
+ onlyOwner
99
+ {
100
+ // ensure major version increments is one
101
+ uint256 oldMax = _majorVersion.toInt();
102
+ uint256 newMax = newMajorVersion.toInt();
103
+ if (newMax <= oldMax || newMax - oldMax != 1) {
104
+ revert MajorVersionMaxIncreaseInvalid(newMajorVersion, _majorVersion);
105
+ }
106
+
107
+ _majorVersion = newMajorVersion;
108
+ emit LogMajorVersionSet(_majorVersion);
109
+ }
110
+
104
111
  /// @dev registry protects only against tampering existing records, registering with invalid types pairs and 0 parent address
105
112
  // TODO service registration means its approval for some type?
106
113
  // TODO registration of precompile addresses
@@ -168,13 +175,35 @@ contract Registry is
168
175
 
169
176
  emit LogRegistration(info);
170
177
  }
178
+ /// @dev earliest GIF major version
179
+ function getMajorVersionMin() external view returns (VersionPart) {
180
+ return VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT);
181
+ }
182
+
183
+ // TODO make distinction between active an not yet active version
184
+ // need to be thought trough, not yet clear if necessary
185
+ // need to answer question: what is the latest version during the upgrade process?
186
+ // likely setting up a new gif version does not fit into a single tx
187
+ // in this case we might want to have a period where the latest version is
188
+ // in the process of being set up while the latest active version is 1 major release smaller
189
+ /// @dev latest GIF major version (might not yet be active)
190
+ function getMajorVersionMax() external view returns (VersionPart) {
191
+ return _majorVersion;
192
+ }
193
+
194
+ /// @dev latest active GIF release version
195
+ function getMajorVersion() external view returns (VersionPart) {
196
+ return _majorVersion;
197
+ }
171
198
 
172
- // from IRegistry
173
199
  function getObjectCount() external view override returns (uint256) {
174
-
175
200
  return _chainNft.totalSupply();
176
201
  }
177
202
 
203
+ function getNftId() external view returns (NftId nftId) {
204
+ return _registryNftId;
205
+ }
206
+
178
207
  function getNftId(address object) external view override returns (NftId id) {
179
208
  return _nftIdByAddress[object];
180
209
  }
@@ -184,7 +213,6 @@ contract Registry is
184
213
  }
185
214
 
186
215
  function ownerOf(address contractAddress) public view returns (address) {
187
-
188
216
  return _chainNft.ownerOf(_nftIdByAddress[contractAddress].toInt());
189
217
  }
190
218
 
@@ -193,7 +221,6 @@ contract Registry is
193
221
  }
194
222
 
195
223
  function getObjectInfo(address object) external view override returns (ObjectInfo memory) {
196
-
197
224
  return _info[_nftIdByAddress[object]];
198
225
  }
199
226
 
@@ -205,6 +232,10 @@ contract Registry is
205
232
  return _nftIdByAddress[object].gtz();
206
233
  }
207
234
 
235
+ function isRegisteredService(address object) external view override returns (bool) {
236
+ return _nftIdByAddress[object].gtz() && _info[_nftIdByAddress[object]].objectType == SERVICE();
237
+ }
238
+
208
239
  function getServiceName(NftId nftId) external view returns (string memory) {
209
240
  return _string[nftId];
210
241
  }
@@ -238,14 +269,8 @@ contract Registry is
238
269
  ) = abi.decode(info.data, (string, VersionPart));
239
270
  bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
240
271
 
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
- ) {
272
+ // ensures consistency of service.getVersion() and majorVersion here
273
+ if(majorVersion != _majorVersion) {
249
274
  revert InvalidServiceVersion(majorVersion);
250
275
  }
251
276
 
@@ -312,7 +337,7 @@ contract Registry is
312
337
  function _registerRegistry(address registryOwner)
313
338
  internal
314
339
  {
315
- uint256 registryId = _chainNft.calculateTokenId(2);
340
+ uint256 registryId = _chainNft.calculateTokenId(REGISTRY_TOKEN_SEQUENCE_ID);
316
341
  NftId registryNftId = toNftId(registryId);
317
342
 
318
343
  NftId parentNftId;
@@ -386,7 +411,7 @@ contract Registry is
386
411
 
387
412
  string memory serviceName = "RegistryService";
388
413
  bytes32 serviceNameHash = keccak256(abi.encode(serviceName));
389
- _service[serviceNameHash][VersionLib.toVersionPart(MAJOR_VERSION_MIN)] = msg.sender;
414
+ _service[serviceNameHash][VersionLib.toVersionPart(GIF_MAJOR_VERSION_AT_DEPLOYMENT)] = msg.sender;
390
415
  _string[serviceNftId] = serviceName;
391
416
  _serviceNftId = serviceNftId;
392
417
  }
@@ -1,17 +1,13 @@
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";
10
8
  import {IInstance} from "../instance/IInstance.sol";
11
9
 
12
10
  import {ContractDeployerLib} from "../shared/ContractDeployerLib.sol";
13
- // import {IComponent, IComponentModule} from "../../contracts/instance/module/component/IComponent.sol";
14
- // import {IPool} from "../../contracts/instance/module/pool/IPoolModule.sol";
15
11
  import {IBaseComponent} from "../../contracts/components/IBaseComponent.sol";
16
12
  import {IPoolComponent} from "../../contracts/components/IPoolComponent.sol";
17
13
  import {IProductComponent} from "../../contracts/components/IProductComponent.sol";
@@ -22,42 +18,24 @@ import {Versionable} from "../../contracts/shared/Versionable.sol";
22
18
  import {IRegisterable} from "../../contracts/shared/IRegisterable.sol";
23
19
 
24
20
  import {RoleId, PRODUCT_OWNER_ROLE, POOL_OWNER_ROLE, ORACLE_OWNER_ROLE} from "../../contracts/types/RoleId.sol";
25
- import {ObjectType, REGISTRY, TOKEN, SERVICE, PRODUCT, ORACLE, POOL, TOKEN, INSTANCE, DISTRIBUTION, POLICY, BUNDLE} from "../../contracts/types/ObjectType.sol";
21
+ import {ObjectType, REGISTRY, SERVICE, PRODUCT, ORACLE, POOL, INSTANCE, DISTRIBUTION, POLICY, BUNDLE, STAKE} from "../../contracts/types/ObjectType.sol";
26
22
  import {StateId, ACTIVE, PAUSED} from "../../contracts/types/StateId.sol";
27
23
  import {NftId, NftIdLib, zeroNftId} from "../../contracts/types/NftId.sol";
28
24
  import {Fee, FeeLib} from "../../contracts/types/Fee.sol";
29
25
  import {Version, VersionPart, VersionLib} from "../../contracts/types/Version.sol";
30
26
 
31
- import {ServiceBase} from "../../contracts/instance/base/ServiceBase.sol";
32
- import {IService} from "../../contracts/instance/base/IService.sol";
27
+ import {Service} from "../shared/Service.sol";
28
+ import {IService} from "../shared/IService.sol";
33
29
  import {IRegistryService} from "./IRegistryService.sol";
34
30
  import {Registry} from "./Registry.sol";
35
- import {ChainNft} from "./ChainNft.sol";
36
31
 
37
32
  contract RegistryService is
38
33
  AccessManagedUpgradeable,
39
- ServiceBase,
34
+ Service,
40
35
  IRegistryService
41
36
  {
42
37
  using NftIdLib for NftId;
43
38
 
44
- error SelfRegistration();
45
- error NotRegistryOwner();
46
-
47
- error NotToken();
48
- error NotService();
49
- error NotInstance();
50
- error NotProduct();
51
- error NotPool();
52
- error NotDistribution();
53
-
54
- error UnexpectedRegisterableType(ObjectType expected, ObjectType found);
55
- error NotRegisterableOwner(address expectedOwner);
56
- error RegisterableOwnerIsZero();
57
- error RegisterableOwnerIsRegistered();
58
- error InvalidInitialOwner(address initialOwner);
59
- error InvalidAddress(address registerableAddress);
60
-
61
39
 
62
40
  // Initial value for constant variable has to be compile-time constant
63
41
  // TODO define types as constants?
@@ -69,48 +47,6 @@ contract RegistryService is
69
47
 
70
48
  address public constant NFT_LOCK_ADDRESS = address(0x1);
71
49
 
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
50
  /// @dev
115
51
  // msg.sender - ONLY registry owner
116
52
  // CAN NOT register itself
@@ -119,9 +55,7 @@ contract RegistryService is
119
55
  // IMPORTANT: MUST NOT check owner before calling external contract
120
56
  function registerService(IService service)
121
57
  external
122
- // TODO restrict access - registryService.registerService must use accessmanager for checking permissions as
123
- // services are not always owned by registry owner - actually only registry service is owned by registry owner
124
-
58
+ restricted
125
59
  returns(
126
60
  IRegistry.ObjectInfo memory info,
127
61
  bytes memory data
@@ -140,17 +74,9 @@ contract RegistryService is
140
74
 
141
75
  info.nftId = _registry.register(info);
142
76
  service.linkToRegisteredNftId();
143
- return (
144
- info,
145
- data
146
- );
77
+ return (info, data);
147
78
  }
148
79
 
149
- // If msg.sender is approved service:
150
- // 1) add owner arg (service MUST pass it's msg.sender as owner)
151
- // 2) check service allowance
152
- // 3) comment self registrstion check
153
- //function registerInstance(IRegisterable instance, address owner)
154
80
  function registerInstance(IRegisterable instance)
155
81
  external
156
82
  returns(
@@ -158,7 +84,6 @@ contract RegistryService is
158
84
  bytes memory data
159
85
  )
160
86
  {
161
-
162
87
  if(!instance.supportsInterface(type(IInstance).interfaceId)) {
163
88
  revert NotInstance();
164
89
  }
@@ -171,10 +96,7 @@ contract RegistryService is
171
96
  info.nftId = _registry.register(info);
172
97
  instance.linkToRegisteredNftId(); // asume safe
173
98
 
174
- return (
175
- info,
176
- data
177
- );
99
+ return (info, data);
178
100
  }
179
101
 
180
102
  function registerProduct(IBaseComponent product, address owner)
@@ -195,16 +117,11 @@ contract RegistryService is
195
117
  data
196
118
  ) = _getAndVerifyContractInfo(product, PRODUCT(), owner);
197
119
 
198
- NftId serviceNftId = _registry.getNftId(msg.sender);
199
-
200
120
  info.nftId = _registry.register(info);
201
121
  // TODO unsafe, let component or its owner derive nftId latter, when state assumptions and modifications of GIF contracts are finished
202
122
  product.linkToRegisteredNftId();
203
123
 
204
- return (
205
- info,
206
- data
207
- );
124
+ return (info, data);
208
125
  }
209
126
 
210
127
  function registerPool(IBaseComponent pool, address owner)
@@ -224,15 +141,10 @@ contract RegistryService is
224
141
  data
225
142
  ) = _getAndVerifyContractInfo(pool, POOL(), owner);
226
143
 
227
- NftId serviceNftId = _registry.getNftId(msg.sender);
228
-
229
144
  info.nftId = _registry.register(info);
230
145
  pool.linkToRegisteredNftId();
231
146
 
232
- return (
233
- info,
234
- data
235
- );
147
+ return (info, data);
236
148
  }
237
149
 
238
150
  function registerDistribution(IBaseComponent distribution, address owner)
@@ -252,15 +164,10 @@ contract RegistryService is
252
164
  data
253
165
  ) = _getAndVerifyContractInfo(distribution, DISTRIBUTION(), owner);
254
166
 
255
- NftId serviceNftId = _registry.getNftId(msg.sender);
256
-
257
167
  info.nftId = _registry.register(info);
258
168
  distribution.linkToRegisteredNftId();
259
169
 
260
- return (
261
- info,
262
- data
263
- );
170
+ return (info, data);
264
171
  }
265
172
 
266
173
  function registerPolicy(IRegistry.ObjectInfo memory info)
@@ -268,8 +175,6 @@ contract RegistryService is
268
175
  restricted
269
176
  returns(NftId nftId)
270
177
  {
271
- NftId senderNftId = _registry.getNftId(msg.sender);
272
-
273
178
  _verifyObjectInfo(info, POLICY());
274
179
 
275
180
  nftId = _registry.register(info);
@@ -280,17 +185,23 @@ contract RegistryService is
280
185
  restricted
281
186
  returns(NftId nftId)
282
187
  {
283
-
284
- NftId senderNftId = _registry.getNftId(msg.sender);
285
-
286
188
  _verifyObjectInfo(info, BUNDLE());
287
189
 
288
190
  nftId = _registry.register(info);
289
191
  }
290
192
 
193
+ function registerStake(IRegistry.ObjectInfo memory info)
194
+ external
195
+ restricted
196
+ returns(NftId nftId)
197
+ {
198
+ _verifyObjectInfo(info, STAKE());
199
+
200
+ nftId = _registry.register(info);
201
+ }
291
202
 
292
203
  // From IService
293
- function getName() public pure override(IService, ServiceBase) returns(string memory) {
204
+ function getName() public pure override(IService, Service) returns(string memory) {
294
205
  return NAME;
295
206
  }
296
207
  //function getType() public pure override(IService, ServiceBase) returns(ObjectType serviceType) {
@@ -334,7 +245,7 @@ contract RegistryService is
334
245
 
335
246
  NftId registryNftId = registry.getNftId(address(registry));
336
247
 
337
- _initializeServiceBase(address(registry), registryNftId, owner);
248
+ _initializeService(address(registry), owner);
338
249
 
339
250
  // TODO why do registry service proxy need to keep its nftId??? -> no registryServiceNftId checks in implementation
340
251
  // if they are -> use registry address to obtain owner of registry service nft (works the same with any registerable and(or) implementation)
@@ -342,7 +253,6 @@ contract RegistryService is
342
253
  _registerInterface(type(IRegistryService).interfaceId);
343
254
  }
344
255
 
345
- // parent check done in registry because of approve()
346
256
  function _getAndVerifyContractInfo(
347
257
  IRegisterable registerable,
348
258
  ObjectType expectedType, // assume can be valid only
@@ -367,8 +277,13 @@ contract RegistryService is
367
277
 
368
278
  address owner = info.initialOwner;
369
279
 
370
- if(owner != expectedOwner) { // registerable owner protection
371
- revert NotRegisterableOwner(expectedOwner);
280
+ // solhint-disable-next-line
281
+ if(expectedType == INSTANCE()) {
282
+ // any address may create a new instance via instance service
283
+ } else {
284
+ if(owner != expectedOwner) { // registerable owner protection
285
+ revert NotRegisterableOwner(expectedOwner);
286
+ }
372
287
  }
373
288
 
374
289
  if(owner == address(registerable)) {
@@ -396,25 +311,28 @@ contract RegistryService is
396
311
  );
397
312
  }
398
313
 
399
- // parent checks done in registry because of approve()
400
314
  function _verifyObjectInfo(
401
315
  IRegistry.ObjectInfo memory info,
402
- ObjectType objectType
316
+ ObjectType expectedType
403
317
  )
404
318
  internal
405
319
  view
406
320
  {
407
- if(info.objectAddress > address(0)) {
408
- revert InvalidAddress(info.objectAddress);
321
+ // enforce instead of check
322
+ info.objectAddress = address(0);
323
+
324
+ if(info.objectType != expectedType) {// type is checked in registry anyway...but service logic may depend on expected value
325
+ revert UnexpectedRegisterableType(expectedType, info.objectType);
326
+ }
327
+
328
+ address owner = info.initialOwner;
329
+
330
+ if(owner == address(0)) {
331
+ revert RegisterableOwnerIsZero();
409
332
  }
410
333
 
411
- if(
412
- getRegistry().isRegistered(info.initialOwner) ||
413
- info.initialOwner == address(0)) {
414
- // TODO non registered address can register object(e.g. POLICY()) and then transfer associated nft to registered contract
415
- // what are motivations to do so?
416
- // at least registered contract can not register objects by itself, SERVICE,
417
- revert InvalidInitialOwner(info.initialOwner);
334
+ if(getRegistry().isRegistered(owner)) {
335
+ revert RegisterableOwnerIsRegistered();
418
336
  }
419
337
 
420
338
  // can catch all 3 if check that initialOwner is not registered
@@ -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 getAccessManager()
73
+ function getTokenRegistry()
58
74
  external
59
75
  view
60
- returns (AccessManager)
76
+ returns (TokenRegistry)
61
77
  {
62
- return _accessManager;
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
+ }