@etherisc/gif-next 0.0.2-de0a1d3-009 → 0.0.2-e37834a-021

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 (237) hide show
  1. package/README.md +40 -25
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +80 -41
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +101 -61
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +43 -40
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +0 -163
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +6 -185
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +0 -163
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +150 -126
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +110 -52
  18. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  20. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  22. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  35. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  36. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +198 -74
  37. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +1 -1
  38. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  39. package/artifacts/contracts/instance/Instance.sol/Instance.json +285 -178
  40. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  41. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +59 -53
  42. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  43. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +1 -1
  44. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  45. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  46. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +1 -1
  47. package/artifacts/contracts/instance/base/IService.sol/IService.json +45 -42
  48. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +1 -1
  49. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.json +62 -69
  50. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  51. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  52. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +1 -1
  53. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +1 -1
  54. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.json +55 -62
  55. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +1 -1
  56. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +1 -1
  57. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +1 -1
  58. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +1 -1
  59. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +1 -1
  60. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +1 -1
  61. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +1 -1
  62. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +1 -1
  63. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +1 -1
  64. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +1 -1
  65. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.json +2 -2
  66. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +1 -1
  67. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +1 -1
  68. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +1 -1
  69. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +1 -1
  70. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
  71. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +1 -1
  72. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +1 -1
  73. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.json +29 -9
  74. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
  75. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.json +28 -8
  76. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +1 -1
  77. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +1 -1
  78. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +1 -1
  79. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +2 -2
  80. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +1 -1
  81. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +1 -1
  82. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.json +138 -11
  83. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  84. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +2 -2
  85. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +1 -1
  86. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.json +138 -11
  87. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  88. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +165 -93
  89. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  90. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +87 -68
  91. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  92. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +45 -61
  93. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  94. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +45 -42
  95. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  96. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +45 -42
  97. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  98. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +45 -42
  99. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  100. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +89 -70
  101. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  102. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +117 -98
  103. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  104. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +141 -12
  105. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  106. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +5 -0
  107. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  108. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +293 -40
  109. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +4 -0
  110. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +668 -0
  111. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +4 -0
  112. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +34 -0
  113. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  114. package/artifacts/contracts/registry/Registry.sol/Registry.json +483 -120
  115. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +4 -0
  116. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +885 -0
  117. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +4 -0
  118. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +460 -0
  119. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +4 -0
  120. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.json +107 -0
  121. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  122. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  123. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +1 -1
  124. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  125. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +43 -40
  126. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  127. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +2 -2
  128. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +4 -0
  129. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +132 -0
  130. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  131. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +344 -0
  132. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  133. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +76 -37
  134. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  135. package/artifacts/contracts/shared/{Proxy.sol/ProxyWithProxyAdminGetter.json → UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json} +4 -4
  136. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  137. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +4 -27
  138. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +1 -1
  139. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +101 -61
  140. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  141. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +1 -1
  142. package/artifacts/contracts/test/TestPool.sol/TestPool.json +150 -126
  143. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +1 -1
  144. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +115 -58
  145. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  146. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +93 -39
  147. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  148. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  149. package/artifacts/contracts/test/TestService.sol/TestService.json +81 -75
  150. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  151. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  152. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  153. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  154. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +15 -38
  155. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  156. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  157. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  158. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  159. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  160. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  161. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  162. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  163. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  164. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +1 -1
  165. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  166. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  167. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  168. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  169. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  170. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  171. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  172. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  173. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +2 -2
  174. package/contracts/components/BaseComponent.sol +12 -27
  175. package/contracts/components/Distribution.sol +29 -6
  176. package/contracts/components/IBaseComponent.sol +2 -2
  177. package/contracts/components/IDistributionComponent.sol +1 -2
  178. package/contracts/components/IPoolComponent.sol +3 -10
  179. package/contracts/components/IProductComponent.sol +2 -3
  180. package/contracts/components/Pool.sol +84 -73
  181. package/contracts/components/Product.sol +85 -13
  182. package/contracts/instance/IInstance.sol +4 -3
  183. package/contracts/instance/Instance.sol +14 -3
  184. package/contracts/instance/base/ComponentServiceBase.sol +13 -6
  185. package/contracts/instance/base/IInstanceBase.sol +3 -2
  186. package/contracts/instance/base/InstanceBase.sol +6 -8
  187. package/contracts/instance/base/ServiceBase.sol +19 -13
  188. package/contracts/instance/module/component/ComponentModule.sol +5 -4
  189. package/contracts/instance/module/component/IComponent.sol +2 -2
  190. package/contracts/instance/module/pool/IPoolModule.sol +4 -3
  191. package/contracts/instance/module/pool/PoolModule.sol +12 -7
  192. package/contracts/instance/module/treasury/ITreasury.sol +7 -5
  193. package/contracts/instance/module/treasury/TokenHandler.sol +2 -2
  194. package/contracts/instance/module/treasury/TreasuryModule.sol +21 -28
  195. package/contracts/instance/service/ComponentOwnerService.sol +181 -66
  196. package/contracts/instance/service/DistributionService.sol +6 -11
  197. package/contracts/instance/service/IComponentOwnerService.sol +0 -2
  198. package/contracts/instance/service/PoolService.sol +19 -19
  199. package/contracts/instance/service/ProductService.sol +25 -24
  200. package/contracts/registry/ChainNft.sol +43 -15
  201. package/contracts/registry/IChainNft.sol +3 -2
  202. package/contracts/registry/IRegistry.sol +44 -28
  203. package/contracts/registry/IRegistryService.sol +29 -0
  204. package/contracts/registry/ITransferInterceptor.sol +6 -0
  205. package/contracts/registry/Registry.sol +382 -273
  206. package/contracts/registry/RegistryService.sol +375 -0
  207. package/contracts/registry/RegistryServiceManager.sol +52 -0
  208. package/contracts/shared/ContractDeployerLib.sol +72 -0
  209. package/contracts/shared/ERC165.sol +1 -1
  210. package/contracts/shared/IRegisterable.sol +7 -9
  211. package/contracts/shared/IVersionable.sol +40 -9
  212. package/contracts/shared/NftOwnable.sol +87 -0
  213. package/contracts/shared/ProxyManager.sol +103 -0
  214. package/contracts/shared/Registerable.sol +74 -43
  215. package/contracts/shared/UpgradableProxyWithAdmin.sol +16 -0
  216. package/contracts/shared/Versionable.sol +108 -60
  217. package/contracts/test/TestDistribution.sol +3 -2
  218. package/contracts/test/TestPool.sol +4 -2
  219. package/contracts/test/TestProduct.sol +4 -2
  220. package/contracts/test/TestRegisterable.sol +5 -6
  221. package/contracts/test/TestService.sol +5 -11
  222. package/contracts/types/Version.sol +1 -0
  223. package/package.json +1 -1
  224. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +0 -4
  225. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.json +0 -24
  226. package/artifacts/contracts/registry/RegistryUpgradeable.sol/RegistryUpgradeable.dbg.json +0 -4
  227. package/artifacts/contracts/registry/RegistryUpgradeable.sol/RegistryUpgradeable.json +0 -724
  228. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.dbg.json +0 -4
  229. package/artifacts/contracts/shared/Proxy.sol/ProxyDeployer.json +0 -248
  230. package/artifacts/contracts/shared/Proxy.sol/ProxyWithProxyAdminGetter.dbg.json +0 -4
  231. package/artifacts/contracts/shared/VersionableUpgradeable.sol/VersionableUpgradeable.dbg.json +0 -4
  232. package/artifacts/contracts/shared/VersionableUpgradeable.sol/VersionableUpgradeable.json +0 -228
  233. package/contracts/experiment/statemachine/README.md +0 -112
  234. package/contracts/registry/IRegistryLinked.sol +0 -8
  235. package/contracts/registry/RegistryUpgradeable.sol +0 -473
  236. package/contracts/shared/Proxy.sol +0 -94
  237. package/contracts/shared/VersionableUpgradeable.sol +0 -133
@@ -1,12 +1,12 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
3
 
4
- import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
4
+ import {IERC20Metadata} from "@openzeppelin5/contracts/token/ERC20/extensions/IERC20Metadata.sol";
5
5
 
6
6
  import {IRegistry} from "../../registry/IRegistry.sol";
7
7
  import {IInstance} from "../IInstance.sol";
8
8
 
9
- import {ITreasuryModule} from "../module/treasury/ITreasury.sol";
9
+ import {ITreasury, ITreasuryModule} from "../module/treasury/ITreasury.sol";
10
10
  import {TreasuryModule} from "../module/treasury/TreasuryModule.sol";
11
11
  import {IComponent, IComponentModule} from "../module/component/IComponent.sol";
12
12
  import {IBaseComponent} from "../../components/IBaseComponent.sol";
@@ -16,18 +16,23 @@ import {IVersionable} from "../../shared/IVersionable.sol";
16
16
  import {Versionable} from "../../shared/Versionable.sol";
17
17
 
18
18
  import {RoleId, PRODUCT_OWNER_ROLE, POOL_OWNER_ROLE, DISTRIBUTION_OWNER_ROLE, ORACLE_OWNER_ROLE} from "../../types/RoleId.sol";
19
- import {ObjectType, COMPONENT, PRODUCT, ORACLE, POOL, DISTRIBUTION} from "../../types/ObjectType.sol";
19
+ import {ObjectType, TOKEN, COMPONENT, PRODUCT, ORACLE, POOL, DISTRIBUTION} from "../../types/ObjectType.sol";
20
20
  import {StateId, ACTIVE, PAUSED} from "../../types/StateId.sol";
21
21
  import {Key32} from "../../types/Key32.sol";
22
22
  import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
23
23
  import {Fee} from "../../types/Fee.sol";
24
24
  import {Version, VersionLib} from "../../types/Version.sol";
25
+ import {UFixed, UFixedMathLib} from "../../types/UFixed.sol";
25
26
 
26
27
  import {IDistributionComponent} from "../../components/IDistributionComponent.sol";
27
28
  import {IPoolComponent} from "../../components/IPoolComponent.sol";
28
29
  import {IProductComponent} from "../../components/IProductComponent.sol";
29
- import {ServiceBase} from "../base/ServiceBase.sol";
30
+ import {IService} from "../base/IService.sol";
30
31
  import {IComponentOwnerService} from "./IComponentOwnerService.sol";
32
+ import {ServiceBase} from "../base/ServiceBase.sol";
33
+ import {IPool, IPoolModule} from "../module/pool/IPoolModule.sol";
34
+
35
+ import {IRegistryService} from "../../registry/IRegistryService.sol";
31
36
 
32
37
  contract ComponentOwnerService is
33
38
  ServiceBase,
@@ -35,32 +40,35 @@ contract ComponentOwnerService is
35
40
  {
36
41
  using NftIdLib for NftId;
37
42
 
43
+ error MissingTypeRole();
44
+ error WalletIsZero();
45
+ error InvalidToken();
46
+ error InvalidPool();
47
+ error InvalidDistribution();
48
+ error InvalidPoolsInstance();
49
+ error InvalidDistributionsInstance();
50
+
51
+ error CollateralizationLevelIsZero();
52
+
38
53
  string public constant NAME = "ComponentOwnerService";
39
54
 
40
55
  modifier onlyRegisteredComponent(IBaseComponent component) {
41
- NftId nftId = _registry.getNftId(address(component));
56
+ NftId nftId = getRegistry().getNftId(address(component));
42
57
  require(nftId.gtz(), "ERROR:COS-001:COMPONENT_UNKNOWN");
43
58
  _;
44
59
  }
45
60
 
46
61
  constructor(
47
62
  address registry,
48
- NftId registryNftId
49
- ) ServiceBase(registry, registryNftId) // solhint-disable-next-line no-empty-blocks
50
- {
51
-
52
- }
53
-
54
- function getVersion()
55
- public
56
- pure
57
- virtual override (IVersionable, Versionable)
58
- returns(Version)
63
+ NftId registryNftId,
64
+ address initialOwner
65
+ )
59
66
  {
60
- return VersionLib.toVersion(3,0,0);
67
+ _initializeServiceBase(registry, registryNftId, initialOwner);
68
+ _registerInterface(type(IComponentOwnerService).interfaceId);
61
69
  }
62
70
 
63
- function getName() external pure override returns(string memory name) {
71
+ function getName() public pure override(IService, ServiceBase) returns(string memory name) {
64
72
  return NAME;
65
73
  }
66
74
 
@@ -81,58 +89,49 @@ contract ComponentOwnerService is
81
89
  }
82
90
  }
83
91
 
84
- function register(
85
- IBaseComponent component
86
- ) external override returns (NftId nftId) {
87
- address initialOwner = component.getOwner();
88
- require(
89
- msg.sender == address(component),
90
- "ERROR:COS-003:NOT_COMPONENT"
91
- );
92
+ function getRegistryService() public view virtual returns (IRegistryService) {
93
+ address service = getRegistry().getServiceAddress("RegistryService", getMajorVersion());
94
+ return IRegistryService(service);
95
+ }
92
96
 
93
- IInstance instance = component.getInstance();
94
- ObjectType objectType = component.getType();
95
- RoleId typeRole = getRoleForType(objectType);
96
- require(
97
- instance.hasRole(typeRole, initialOwner),
98
- "ERROR:CMP-004:TYPE_ROLE_MISSING"
99
- );
97
+ // TODO if user passes type BUNDLE??? -> registerComponent() must catch this
98
+ function register(
99
+ IBaseComponent component,
100
+ ObjectType componentType
101
+ ) external returns (NftId nftId) {
100
102
 
101
- nftId = _registry.register(address(component));
102
- IERC20Metadata token = component.getToken();
103
+ // TODO some info parameters from component and from register may differ -> getObjectInfo() after registration?
104
+ (
105
+ IRegistry.ObjectInfo memory info,
106
+ bytes memory data
107
+ ) = getRegistryService().registerComponent(component, componentType, msg.sender);
103
108
 
104
- instance.registerComponent(
105
- nftId,
106
- token,
107
- component.getWallet());
108
-
109
- // component type specific registration actions
110
- if (component.getType() == PRODUCT()) {
111
- IProductComponent product = IProductComponent(address(component));
109
+ NftId instanceNftId = info.parentNftId;
110
+ address instancAddress = getRegistry().getObjectInfo(instanceNftId).objectAddress;
111
+ IInstance instance = IInstance(instancAddress);
112
112
 
113
- NftId poolNftId = product.getPoolNftId();
114
- require(poolNftId.gtz(), "ERROR:CMP-005:POOL_UNKNOWN");
115
- IPoolComponent pool = IPoolComponent(_registry.getObjectInfo(poolNftId).objectAddress);
113
+ RoleId typeRole = getRoleForType(componentType);
114
+ if(instance.hasRole(typeRole, msg.sender) == false) {
115
+ revert MissingTypeRole();
116
+ }
116
117
 
117
- NftId distributionNftId = product.getDistributionNftId();
118
- IDistributionComponent distribution = IDistributionComponent(_registry.getObjectInfo(distributionNftId).objectAddress);
119
-
120
- // register with tresury
121
- instance.registerProductSetup(
122
- product,
123
- pool,
124
- distribution
118
+ // component type specific registration actions
119
+ if (componentType == PRODUCT()) {
120
+ _registerProduct(
121
+ info.nftId,
122
+ instanceNftId,
123
+ instance,
124
+ data
125
125
  );
126
- } else if (component.getType() == POOL()) {
127
- IPoolComponent pool = IPoolComponent(address(component));
128
-
129
- // register with pool
130
- instance.registerPool(
131
- nftId,
132
- pool.isVerifying(),
133
- pool.getCollateralizationLevel());
134
- }
135
- // TODO add compensation
126
+ } else if (componentType == POOL()) {
127
+ _registerPool(
128
+ info.nftId,
129
+ instanceNftId,
130
+ instance,
131
+ data
132
+ );
133
+ }
134
+ // TODO add distribution and oracle
136
135
  }
137
136
 
138
137
  function lock(
@@ -154,4 +153,120 @@ contract ComponentOwnerService is
154
153
  Key32 key = nftId.toKey32(COMPONENT());
155
154
  instance.updateState(key, ACTIVE());
156
155
  }
157
- }
156
+
157
+ // Internals
158
+
159
+ function _registerProduct(
160
+ NftId nftId,
161
+ NftId instanceNftId,
162
+ IInstance instance,
163
+ bytes memory data
164
+ )
165
+ internal
166
+ {
167
+ (
168
+ ITreasury.TreasuryInfo memory info,
169
+ address wallet
170
+ ) = abi.decode(data, (ITreasury.TreasuryInfo, address));
171
+
172
+ IRegistry _registry = getRegistry();
173
+
174
+ if(wallet == address(0)) {
175
+ revert WalletIsZero();
176
+ }
177
+
178
+ IRegistry.ObjectInfo memory tokenInfo = _registry.getObjectInfo(address(info.token));
179
+
180
+ if(tokenInfo.objectType != TOKEN()) {
181
+ revert InvalidToken();
182
+ }
183
+
184
+ IRegistry.ObjectInfo memory poolInfo = _registry.getObjectInfo(info.poolNftId);
185
+
186
+ if(poolInfo.objectType != POOL()) {
187
+ revert InvalidPool();
188
+ }
189
+
190
+ if(poolInfo.parentNftId != instanceNftId) {
191
+ revert InvalidPoolsInstance();
192
+ }
193
+ // TODO pool have the same token
194
+ //ITreasury.PoolSetup memory poolSetup = instance.getPoolSetup(info.poolNftId);
195
+ //require(tokenInfo.objectAddress == address(poolSetup.token), "ERROR:COS-018:PRODUCT_POOL_TOKEN_MISMATCH");
196
+ // TODO pool is not linked
197
+
198
+ IRegistry.ObjectInfo memory distributionInfo = _registry.getObjectInfo(info.distributionNftId);
199
+
200
+ if(distributionInfo.objectType != DISTRIBUTION()) {
201
+ revert InvalidDistribution();
202
+ }
203
+
204
+ if(distributionInfo.parentNftId != instanceNftId) {
205
+ revert InvalidDistributionsInstance();
206
+ }
207
+ // TODO distribution have the same token
208
+ // TODO distribution is not linked
209
+
210
+ // component module
211
+ instance.registerComponent(
212
+ nftId,
213
+ info.token,
214
+ wallet // TODO move wallet into TreasuryInfo?
215
+ );
216
+
217
+ // treasury module
218
+ instance.registerProductSetup(
219
+ nftId,
220
+ info
221
+ );
222
+ }
223
+
224
+ function _registerPool(
225
+ NftId nftId,
226
+ NftId instanceNftId,
227
+ IInstance instance,
228
+ bytes memory data
229
+ )
230
+ internal
231
+ {
232
+ (
233
+ IPool.PoolInfo memory info,
234
+ address wallet,
235
+ IERC20Metadata token,
236
+ /*poolFee*/,
237
+ /*stakingFee*/,
238
+ /*performanceFee*/
239
+ ) = abi.decode(data, (IPool.PoolInfo, address, IERC20Metadata, Fee, Fee, Fee));
240
+
241
+ IRegistry _registry = getRegistry();
242
+
243
+ if(wallet == address(0)) {
244
+ revert WalletIsZero();
245
+ }
246
+
247
+ ObjectType tokenType = _registry.getObjectInfo(address(token)).objectType;
248
+
249
+ if(tokenType != TOKEN()) {
250
+ revert InvalidToken();
251
+ }
252
+
253
+ if(UFixedMathLib.eqz(info.collateralizationLevel)) {
254
+ revert CollateralizationLevelIsZero();
255
+ }
256
+
257
+ // TODO add more validations
258
+
259
+ // component module
260
+ instance.registerComponent(
261
+ nftId,
262
+ token,
263
+ wallet
264
+ );
265
+
266
+ // pool module
267
+ instance.registerPool(
268
+ nftId,
269
+ info
270
+ );
271
+ }
272
+ }
@@ -13,6 +13,8 @@ import {Version, VersionLib} from "../../types/Version.sol";
13
13
  import {IVersionable} from "../../shared/IVersionable.sol";
14
14
  import {Versionable} from "../../shared/Versionable.sol";
15
15
 
16
+ import {IService} from "../base/IService.sol";
17
+ import {ServiceBase} from "../base/ServiceBase.sol";
16
18
  import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
17
19
  import {IDistributionService} from "./IDistributionService.sol";
18
20
 
@@ -24,22 +26,15 @@ contract DistributionService is
24
26
 
25
27
  constructor(
26
28
  address registry,
27
- NftId registryNftId
28
- ) ComponentServiceBase(registry, registryNftId) // solhint-disable-next-line no-empty-blocks
29
+ NftId registryNftId,
30
+ address initialOwner
31
+ ) ComponentServiceBase(registry, registryNftId, initialOwner)
29
32
  {
30
33
  _registerInterface(type(IDistributionService).interfaceId);
31
34
  }
32
35
 
33
- function getVersion()
34
- public
35
- pure
36
- virtual override (IVersionable, Versionable)
37
- returns(Version)
38
- {
39
- return VersionLib.toVersion(3,0,0);
40
- }
41
36
 
42
- function getName() external pure override returns(string memory name) {
37
+ function getName() public pure override(IService, ServiceBase) returns(string memory name) {
43
38
  return NAME;
44
39
  }
45
40
 
@@ -10,8 +10,6 @@ import {IService} from "../base/IService.sol";
10
10
  // TODO rename to registry service
11
11
  interface IComponentOwnerService is IService {
12
12
 
13
- function register(IBaseComponent component) external returns(NftId componentNftId);
14
-
15
13
  // TODO move to product/pool services
16
14
  function lock(IBaseComponent component) external;
17
15
 
@@ -9,11 +9,13 @@ import {ITreasury, ITreasuryModule, TokenHandler} from "../../instance/module/tr
9
9
  import {IVersionable} from "../../shared/IVersionable.sol";
10
10
  import {Versionable} from "../../shared/Versionable.sol";
11
11
 
12
- import {NftId, NftIdLib} from "../../types/NftId.sol";
12
+ import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
13
13
  import {POOL, BUNDLE} from "../../types/ObjectType.sol";
14
14
  import {Fee} from "../../types/Fee.sol";
15
15
  import {Version, VersionLib} from "../../types/Version.sol";
16
16
 
17
+ import {IService} from "../base/IService.sol";
18
+ import {ServiceBase} from "../base/ServiceBase.sol";
17
19
  import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
18
20
  import {IPoolService} from "./IPoolService.sol";
19
21
 
@@ -25,22 +27,14 @@ contract PoolService is ComponentServiceBase, IPoolService {
25
27
 
26
28
  constructor(
27
29
  address registry,
28
- NftId registryNftId
29
- ) ComponentServiceBase(registry, registryNftId) // solhint-disable-next-line no-empty-blocks
30
+ NftId registryNftId,
31
+ address initialOwner
32
+ ) ComponentServiceBase(registry, registryNftId, initialOwner)
30
33
  {
31
34
  _registerInterface(type(IPoolService).interfaceId);
32
35
  }
33
36
 
34
- function getVersion()
35
- public
36
- pure
37
- virtual override (IVersionable, Versionable)
38
- returns(Version)
39
- {
40
- return VersionLib.toVersion(3,0,0);
41
- }
42
-
43
- function getName() external pure override returns(string memory name) {
37
+ function getName() public pure override(IService, ServiceBase) returns(string memory name) {
44
38
  return NAME;
45
39
  }
46
40
 
@@ -77,11 +71,17 @@ contract PoolService is ComponentServiceBase, IPoolService {
77
71
 
78
72
  // register bundle with registry
79
73
  NftId poolNftId = info.nftId;
80
- bundleNftId = _registry.registerObjectForInstance(
81
- poolNftId,
82
- BUNDLE(),
83
- owner,
84
- "");
74
+ bundleNftId = getRegistryService().registerBundle(
75
+ IRegistry.ObjectInfo(
76
+ zeroNftId(),
77
+ poolNftId,
78
+ BUNDLE(),
79
+ false, // intercepting property for bundles is defined on pool
80
+ address(0),
81
+ owner,
82
+ ""
83
+ )
84
+ );
85
85
 
86
86
  // create bundle info in instance
87
87
  instance.createBundleInfo(
@@ -136,7 +136,7 @@ contract PoolService is ComponentServiceBase, IPoolService {
136
136
  if(stakingAmount > 0) {
137
137
  NftId productNftId = instance.getProductNftId(poolNftId);
138
138
  TokenHandler tokenHandler = instance.getTokenHandler(productNftId);
139
- address bundleOwner = _registry.getOwner(bundleNftId);
139
+ address bundleOwner = getRegistry().ownerOf(bundleNftId);
140
140
  address poolWallet = instance.getComponentWallet(poolNftId);
141
141
 
142
142
  tokenHandler.transfer(
@@ -3,6 +3,7 @@ pragma solidity ^0.8.19;
3
3
 
4
4
  import {IRegistry} from "../../registry/IRegistry.sol";
5
5
  import {IProductComponent} from "../../components/IProductComponent.sol";
6
+ import {Product} from "../../components/Product.sol";
6
7
  import {IPoolComponent} from "../../components/IPoolComponent.sol";
7
8
  import {IDistributionComponent} from "../../components/IDistributionComponent.sol";
8
9
  import {IInstance} from "../../instance/IInstance.sol";
@@ -21,13 +22,15 @@ import {UFixed, UFixedMathLib} from "../../types/UFixed.sol";
21
22
  import {Blocknumber, blockNumber} from "../../types/Blocknumber.sol";
22
23
  import {ObjectType, INSTANCE, PRODUCT, POLICY} from "../../types/ObjectType.sol";
23
24
  import {APPLIED, UNDERWRITTEN, ACTIVE} from "../../types/StateId.sol";
24
- import {NftId, NftIdLib} from "../../types/NftId.sol";
25
+ import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
25
26
  import {Fee, FeeLib} from "../../types/Fee.sol";
26
27
  import {ReferralId} from "../../types/ReferralId.sol";
27
28
  import {RiskId} from "../../types/RiskId.sol";
28
29
  import {StateId} from "../../types/StateId.sol";
29
30
  import {Version, VersionLib} from "../../types/Version.sol";
30
31
 
32
+ import {IService} from "../base/IService.sol";
33
+ import {ServiceBase} from "../base/ServiceBase.sol";
31
34
  import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
32
35
  import {IProductService} from "./IProductService.sol";
33
36
 
@@ -41,22 +44,15 @@ contract ProductService is ComponentServiceBase, IProductService {
41
44
 
42
45
  constructor(
43
46
  address registry,
44
- NftId registryNftId
45
- ) ComponentServiceBase(registry, registryNftId) // solhint-disable-next-line no-empty-blocks
47
+ NftId registryNftId,
48
+ address initialOwner
49
+ ) ComponentServiceBase(registry, registryNftId, initialOwner)
46
50
  {
47
51
  _registerInterface(type(IProductService).interfaceId);
48
52
  }
49
53
 
50
- function getVersion()
51
- public
52
- pure
53
- virtual override (IVersionable, Versionable)
54
- returns(Version)
55
- {
56
- return VersionLib.toVersion(3,0,0);
57
- }
58
54
 
59
- function getName() external pure override returns(string memory name) {
55
+ function getName() public pure override(IService, ServiceBase) returns(string memory name) {
60
56
  return NAME;
61
57
  }
62
58
 
@@ -110,10 +106,10 @@ contract ProductService is ComponentServiceBase, IProductService {
110
106
  );
111
107
  }
112
108
 
113
- function _getAndVerifyInstanceAndProduct() internal view returns (IProductComponent product) {
109
+ function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
114
110
  IRegistry.ObjectInfo memory productInfo;
115
111
  (productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
116
- product = IProductComponent(productInfo.objectAddress);
112
+ product = Product(productInfo.objectAddress);
117
113
  }
118
114
 
119
115
  function calculatePremium(
@@ -135,7 +131,7 @@ contract ProductService is ComponentServiceBase, IProductService {
135
131
  uint256 distributionFeeAmount
136
132
  )
137
133
  {
138
- IProductComponent product = _getAndVerifyInstanceAndProduct();
134
+ Product product = _getAndVerifyInstanceAndProduct();
139
135
  uint256 netPremiumAmount = product.calculateNetPremium(
140
136
  sumInsuredAmount,
141
137
  riskId,
@@ -162,7 +158,7 @@ contract ProductService is ComponentServiceBase, IProductService {
162
158
 
163
159
  function _calculateFeeAmounts(
164
160
  uint256 netPremiumAmount,
165
- IProductComponent product,
161
+ Product product,
166
162
  NftId bundleNftId,
167
163
  ReferralId referralId
168
164
  )
@@ -184,7 +180,7 @@ contract ProductService is ComponentServiceBase, IProductService {
184
180
  (poolFeeAmount,) = FeeLib.calculateFee(treasuryInfo.poolFee, netPremiumAmount);
185
181
  (bundleFeeAmount,) = FeeLib.calculateFee(bundleInfo.fee, netPremiumAmount);
186
182
 
187
- IRegistry.ObjectInfo memory distributionInfo = _registry.getObjectInfo(treasuryInfo.distributionNftId);
183
+ IRegistry.ObjectInfo memory distributionInfo = getRegistry().getObjectInfo(treasuryInfo.distributionNftId);
188
184
  IDistributionComponent distribution = IDistributionComponent(distributionInfo.objectAddress);
189
185
  distributionFeeAmount = distribution.calculateFeeAmount(referralId, netPremiumAmount);
190
186
  }
@@ -202,11 +198,16 @@ contract ProductService is ComponentServiceBase, IProductService {
202
198
  (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
203
199
  // TODO add validations (see create bundle in pool service)
204
200
 
205
- policyNftId = this.getRegistry().registerObjectForInstance(
206
- productInfo.nftId,
207
- POLICY(),
208
- applicationOwner,
209
- ""
201
+ policyNftId = getRegistryService().registerPolicy(
202
+ IRegistry.ObjectInfo(
203
+ zeroNftId(),
204
+ productInfo.nftId,
205
+ POLICY(),
206
+ false, // intercepting property for policies is defined on product
207
+ address(0),
208
+ applicationOwner,
209
+ ""
210
+ )
210
211
  );
211
212
 
212
213
  (uint256 premiumAmount,,,,) = calculatePremium(
@@ -283,7 +284,7 @@ contract ProductService is ComponentServiceBase, IProductService {
283
284
  )
284
285
  internal
285
286
  {
286
- address poolAddress = _registry.getObjectInfo(treasuryInfo.poolNftId).objectAddress;
287
+ address poolAddress = getRegistry().getObjectInfo(treasuryInfo.poolNftId).objectAddress;
287
288
  IPoolComponent pool = IPoolComponent(poolAddress);
288
289
  pool.underwrite(
289
290
  policyNftId,
@@ -480,7 +481,7 @@ contract ProductService is ComponentServiceBase, IProductService {
480
481
  // process token transfer(s)
481
482
  if(premiumAmount > 0) {
482
483
  TokenHandler tokenHandler = instance.getTokenHandler(productNftId);
483
- address policyOwner = _registry.getOwner(policyNftId);
484
+ address policyOwner = getRegistry().ownerOf(policyNftId);
484
485
  address poolWallet = instance.getComponentWallet(treasuryInfo.poolNftId);
485
486
  netPremiumAmount = premiumAmount;
486
487
  Fee memory productFee = treasuryInfo.productFee;
@@ -1,8 +1,11 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
- pragma solidity ^0.8.19;
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {ERC721, ERC721Enumerable} from "@openzeppelin5/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
5
+ import {IERC721} from "@openzeppelin5/contracts/token/ERC721/IERC721.sol";
3
6
 
4
- import {ERC721, ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
5
7
  import {IChainNft} from "./IChainNft.sol";
8
+ import {ITransferInterceptor} from "./ITransferInterceptor.sol";
6
9
 
7
10
  contract ChainNft is ERC721Enumerable, IChainNft {
8
11
  string public constant NAME = "Dezentralized Insurance Protocol Registry";
@@ -11,6 +14,9 @@ contract ChainNft is ERC721Enumerable, IChainNft {
11
14
  uint256 public constant PROTOCOL_NFT_ID = 1101;
12
15
  uint256 public constant GLOBAL_REGISTRY_ID = 2101;
13
16
 
17
+ // remember interceptors
18
+ mapping(uint256 tokenId => address interceptor) private _interceptor;
19
+
14
20
  // remember token uri
15
21
  mapping(uint256 tokenId => string uri) private _uri;
16
22
 
@@ -37,18 +43,36 @@ contract ChainNft is ERC721Enumerable, IChainNft {
37
43
  _chainIdInt = block.chainid;
38
44
  _chainIdDigits = _countDigits(_chainIdInt);
39
45
  _chainIdMultiplier = 10 ** _chainIdDigits;
40
- _idNext = 3;
46
+ _idNext = 4;
41
47
  }
42
48
 
49
+ /**
50
+ * @dev mints a token for a specified token id
51
+ * not part of the IRegistry interface only needed for
52
+ * initial registry setup (protocol and global registry objects)
53
+ */
54
+ function mint(address to, uint256 tokenId) external onlyRegistry {
55
+ _totalMinted++;
56
+ _safeMint(to, tokenId);
57
+ }
58
+
59
+
43
60
  /**
44
61
  * @dev mints the next token to register new objects
62
+ * non-zero transferInterceptors are recorded and called during nft token transfers.
63
+ * the contract receiving such a notification may decides to revert or record the transfer
45
64
  */
46
65
  function mint(
47
66
  address to,
67
+ address interceptor,
48
68
  string memory uri
49
- ) external override onlyRegistry returns (uint256 tokenId) {
69
+ ) public onlyRegistry returns (uint256 tokenId) {
50
70
  tokenId = _getNextTokenId();
51
71
 
72
+ if (interceptor != address(0)) {
73
+ _interceptor[tokenId] = interceptor;
74
+ }
75
+
52
76
  if (bytes(uri).length > 0) {
53
77
  _uri[tokenId] = uri;
54
78
  }
@@ -57,18 +81,22 @@ contract ChainNft is ERC721Enumerable, IChainNft {
57
81
  _totalMinted++;
58
82
  }
59
83
 
84
+
60
85
  /**
61
- * @dev mints a token for a specified token id
62
- * not part of the IRegistry interface only needed for
63
- * initial registry setup (protocol and global registry objects)
64
- */
65
- function mint(address to, uint256 tokenId) external onlyRegistry {
66
- _totalMinted++;
67
- _safeMint(to, tokenId);
86
+ * @dev amend the open zeppelin transferFrom function by an interceptor call if such an interceptor is defined for the nft token id
87
+ * this allows distribution, product and pool components to be notified when distributors, policies and bundles are transferred.
88
+ */
89
+ function transferFrom(address from, address to, uint256 tokenId) public override (ERC721, IERC721) {
90
+ super.transferFrom(from, to, tokenId);
91
+
92
+ if (_interceptor[tokenId] != address(0)) {
93
+ ITransferInterceptor(_interceptor[tokenId]).nftTransferFrom(from, to, tokenId);
94
+ }
68
95
  }
69
96
 
97
+
70
98
  function burn(uint256 tokenId) external override onlyRegistry {
71
- _requireMinted(tokenId);
99
+ _requireOwned(tokenId);
72
100
  _burn(tokenId);
73
101
  delete _uri[tokenId];
74
102
  }
@@ -79,18 +107,18 @@ contract ChainNft is ERC721Enumerable, IChainNft {
79
107
  ) external override onlyRegistry {
80
108
  require(bytes(uri).length > 0, "ERROR:CRG-011:URI_EMPTY");
81
109
 
82
- _requireMinted(tokenId);
110
+ _requireOwned(tokenId);
83
111
  _uri[tokenId] = uri;
84
112
  }
85
113
 
86
114
  function exists(uint256 tokenId) external view override returns (bool) {
87
- return _exists(tokenId);
115
+ return _ownerOf(tokenId) != address(0);
88
116
  }
89
117
 
90
118
  function tokenURI(
91
119
  uint256 tokenId
92
120
  ) public view override returns (string memory) {
93
- _requireMinted(tokenId);
121
+ _requireOwned(tokenId);
94
122
  return _uri[tokenId];
95
123
  }
96
124