@etherisc/gif-next 0.0.2-f752d2a-551 → 0.0.2-f7b8c9f-518

Sign up to get free protection for your applications and to get access to all the features.
Files changed (282) hide show
  1. package/README.md +71 -0
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +166 -39
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +4 -0
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +557 -0
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +119 -39
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +177 -0
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +108 -156
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +67 -139
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +417 -88
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +360 -51
  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/Dummy.sol/LifeCycleModule.json +2 -2
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  32. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  35. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  36. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  37. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +913 -530
  38. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +1 -1
  39. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  40. package/artifacts/contracts/instance/Instance.sol/Instance.json +1043 -556
  41. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +1 -1
  42. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +224 -43
  43. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +1 -1
  44. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +51 -1
  45. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  46. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.json +49 -0
  47. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  48. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +1 -1
  49. package/artifacts/contracts/instance/base/IService.sol/IService.json +174 -53
  50. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +1 -1
  51. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.json +263 -45
  52. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  53. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +41 -23
  54. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  55. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +4 -4
  56. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +1 -1
  57. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +1 -1
  58. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.json +220 -52
  59. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +1 -1
  60. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +1 -1
  61. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +1 -1
  62. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +1 -1
  63. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.json +55 -54
  64. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +1 -1
  65. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +1 -1
  66. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.json +56 -55
  67. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +1 -1
  68. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.json +22 -93
  69. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +1 -1
  70. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +1 -1
  71. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.json +22 -93
  72. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +4 -0
  73. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.json +10 -0
  74. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +4 -0
  75. package/artifacts/contracts/instance/module/{compensation/ICompensation.sol/ICompensation.json → distribution/IDistribution.sol/IDistribution.json} +2 -2
  76. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +4 -0
  77. package/artifacts/contracts/instance/module/{compensation/ICompensation.sol/ICompensationModule.json → distribution/IDistribution.sol/IDistributionModule.json} +2 -2
  78. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +1 -1
  79. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +1 -1
  80. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.json +61 -51
  81. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
  82. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.json +61 -51
  83. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +1 -1
  84. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +1 -1
  85. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.json +29 -14
  86. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
  87. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.json +28 -13
  88. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +1 -1
  89. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +1 -1
  90. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.json +104 -1
  91. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +1 -1
  92. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +126 -5
  93. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +1 -1
  94. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +1 -1
  95. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.json +326 -221
  96. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  97. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +2 -2
  98. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +1 -1
  99. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.json +326 -221
  100. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  101. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +350 -79
  102. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  103. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +630 -0
  104. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  105. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +176 -74
  106. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +4 -0
  107. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +446 -0
  108. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  109. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +235 -50
  110. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  111. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +325 -51
  112. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  113. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +335 -53
  114. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  115. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +466 -71
  116. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  117. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +141 -12
  118. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  119. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +5 -0
  120. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  121. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +298 -39
  122. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +4 -0
  123. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +745 -0
  124. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +4 -0
  125. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +34 -0
  126. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  127. package/artifacts/contracts/registry/Registry.sol/Registry.json +489 -120
  128. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +4 -0
  129. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +997 -0
  130. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +4 -0
  131. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +468 -0
  132. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +4 -0
  133. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.json +107 -0
  134. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  135. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  136. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +4 -0
  137. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +127 -0
  138. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  139. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +117 -37
  140. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  141. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +55 -14
  142. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +4 -0
  143. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +158 -0
  144. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  145. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +349 -0
  146. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  147. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +190 -37
  148. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  149. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +129 -0
  150. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  151. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +78 -14
  152. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +4 -0
  153. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +557 -0
  154. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  155. package/artifacts/contracts/test/TestFee.sol/TestFee.json +2 -2
  156. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +1 -1
  157. package/artifacts/contracts/test/TestPool.sol/TestPool.json +417 -88
  158. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +1 -1
  159. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +407 -56
  160. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  161. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +204 -36
  162. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  163. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +2 -2
  164. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  165. package/artifacts/contracts/test/TestService.sol/TestService.json +267 -62
  166. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  167. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  168. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  169. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  170. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +89 -25
  171. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  172. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  173. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  174. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  175. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  176. package/artifacts/contracts/types/Fee.sol/FeeLib.json +50 -11
  177. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  178. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +2 -2
  179. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  180. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +2 -2
  181. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  182. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +2 -2
  183. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  184. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
  185. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +4 -0
  186. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.json +99 -0
  187. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +4 -0
  188. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +86 -0
  189. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  190. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  191. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  192. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  193. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  194. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  195. package/artifacts/contracts/types/Version.sol/VersionLib.json +40 -2
  196. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  197. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +2 -2
  198. package/contracts/components/BaseComponent.sol +12 -21
  199. package/contracts/components/Distribution.sol +155 -0
  200. package/contracts/components/IBaseComponent.sol +2 -2
  201. package/contracts/components/IDistributionComponent.sol +46 -0
  202. package/contracts/components/IPoolComponent.sol +15 -8
  203. package/contracts/components/IProductComponent.sol +26 -8
  204. package/contracts/components/Pool.sol +99 -27
  205. package/contracts/components/Product.sol +204 -22
  206. package/contracts/instance/IInstance.sol +12 -10
  207. package/contracts/instance/Instance.sol +28 -9
  208. package/contracts/instance/base/ComponentServiceBase.sol +13 -6
  209. package/contracts/instance/base/IInstanceBase.sol +11 -2
  210. package/contracts/instance/base/IKeyValueStore.sol +4 -3
  211. package/contracts/instance/base/InstanceBase.sol +19 -10
  212. package/contracts/instance/base/KeyValueStore.sol +12 -7
  213. package/contracts/instance/base/Lifecycle.sol +15 -10
  214. package/contracts/instance/base/ModuleBase.sol +22 -17
  215. package/contracts/instance/base/ServiceBase.sol +20 -13
  216. package/contracts/instance/module/access/Access.sol +3 -3
  217. package/contracts/instance/module/bundle/BundleModule.sol +10 -12
  218. package/contracts/instance/module/bundle/IBundle.sol +6 -11
  219. package/contracts/instance/module/component/ComponentModule.sol +34 -58
  220. package/contracts/instance/module/component/IComponent.sol +7 -32
  221. package/contracts/instance/module/distribution/DistributionModule.sol +17 -0
  222. package/contracts/instance/module/distribution/IDistribution.sol +10 -0
  223. package/contracts/instance/module/policy/IPolicy.sol +13 -10
  224. package/contracts/instance/module/policy/PolicyModule.sol +35 -20
  225. package/contracts/instance/module/pool/IPoolModule.sol +4 -4
  226. package/contracts/instance/module/pool/PoolModule.sol +23 -15
  227. package/contracts/instance/module/risk/IRisk.sol +18 -2
  228. package/contracts/instance/module/risk/RiskModule.sol +56 -2
  229. package/contracts/instance/module/treasury/ITreasury.sol +32 -51
  230. package/contracts/instance/module/treasury/TokenHandler.sol +2 -2
  231. package/contracts/instance/module/treasury/TreasuryModule.sol +68 -89
  232. package/contracts/instance/service/ComponentOwnerService.sol +200 -95
  233. package/contracts/instance/service/DistributionService.sol +54 -0
  234. package/contracts/instance/service/IComponentOwnerService.sol +0 -2
  235. package/contracts/instance/service/IDistributionService.sol +12 -0
  236. package/contracts/instance/service/IPoolService.sol +7 -0
  237. package/contracts/instance/service/IProductService.sol +56 -7
  238. package/contracts/instance/service/PoolService.sol +49 -23
  239. package/contracts/instance/service/ProductService.sol +248 -92
  240. package/contracts/registry/ChainNft.sol +43 -15
  241. package/contracts/registry/IChainNft.sol +3 -2
  242. package/contracts/registry/IRegistry.sol +42 -26
  243. package/contracts/registry/IRegistryService.sol +29 -0
  244. package/contracts/registry/ITransferInterceptor.sol +6 -0
  245. package/contracts/registry/Registry.sol +384 -274
  246. package/contracts/registry/RegistryService.sol +368 -0
  247. package/contracts/registry/RegistryServiceManager.sol +43 -0
  248. package/contracts/shared/ContractDeployerLib.sol +72 -0
  249. package/contracts/shared/ERC165.sol +1 -1
  250. package/contracts/shared/INftOwnable.sol +22 -0
  251. package/contracts/shared/IRegisterable.sol +9 -16
  252. package/contracts/shared/IVersionable.sol +55 -11
  253. package/contracts/shared/NftOwnable.sol +136 -0
  254. package/contracts/shared/ProxyManager.sol +94 -0
  255. package/contracts/shared/Registerable.sol +62 -59
  256. package/contracts/shared/UpgradableProxyWithAdmin.sol +16 -0
  257. package/contracts/shared/Versionable.sol +112 -54
  258. package/contracts/test/TestDistribution.sol +22 -0
  259. package/contracts/test/TestPool.sol +7 -2
  260. package/contracts/test/TestProduct.sol +37 -7
  261. package/contracts/test/TestRegisterable.sol +5 -6
  262. package/contracts/test/TestService.sol +5 -11
  263. package/contracts/types/Fee.sol +8 -3
  264. package/contracts/types/ObjectType.sol +24 -8
  265. package/contracts/types/ReferralId.sol +48 -0
  266. package/contracts/types/RiskId.sol +43 -0
  267. package/contracts/types/RoleId.sol +2 -2
  268. package/contracts/types/Version.sol +9 -0
  269. package/package.json +1 -1
  270. package/artifacts/contracts/instance/module/compensation/CompensationModule.sol/CompensationModule.dbg.json +0 -4
  271. package/artifacts/contracts/instance/module/compensation/CompensationModule.sol/CompensationModule.json +0 -10
  272. package/artifacts/contracts/instance/module/compensation/ICompensation.sol/ICompensation.dbg.json +0 -4
  273. package/artifacts/contracts/instance/module/compensation/ICompensation.sol/ICompensationModule.dbg.json +0 -4
  274. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +0 -4
  275. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.json +0 -24
  276. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +0 -4
  277. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.json +0 -24
  278. package/contracts/experiment/statemachine/README.md +0 -112
  279. package/contracts/instance/module/compensation/CompensationModule.sol +0 -8
  280. package/contracts/instance/module/compensation/ICompensation.sol +0 -10
  281. package/contracts/registry/IRegistryLinked.sol +0 -8
  282. package/contracts/shared/IOwnable.sol +0 -6
@@ -2,10 +2,14 @@
2
2
  pragma solidity ^0.8.19;
3
3
 
4
4
  import {IRegistry} from "../../registry/IRegistry.sol";
5
+ import {IProductComponent} from "../../components/IProductComponent.sol";
6
+ import {Product} from "../../components/Product.sol";
5
7
  import {IPoolComponent} from "../../components/IPoolComponent.sol";
8
+ import {IDistributionComponent} from "../../components/IDistributionComponent.sol";
6
9
  import {IInstance} from "../../instance/IInstance.sol";
7
10
  import {IPolicy, IPolicyModule} from "../module/policy/IPolicy.sol";
8
11
  import {IPool} from "../module/pool/IPoolModule.sol";
12
+ import {IRisk} from "../module/risk/IRisk.sol";
9
13
  import {IBundle} from "../module/bundle/IBundle.sol";
10
14
  import {IProductService} from "./IProductService.sol";
11
15
  import {ITreasury, ITreasuryModule, TokenHandler} from "../../instance/module/treasury/ITreasury.sol";
@@ -15,13 +19,18 @@ import {Versionable} from "../../shared/Versionable.sol";
15
19
 
16
20
  import {Timestamp, zeroTimestamp} from "../../types/Timestamp.sol";
17
21
  import {UFixed, UFixedMathLib} from "../../types/UFixed.sol";
22
+ import {Blocknumber, blockNumber} from "../../types/Blocknumber.sol";
18
23
  import {ObjectType, INSTANCE, PRODUCT, POLICY} from "../../types/ObjectType.sol";
19
24
  import {APPLIED, UNDERWRITTEN, ACTIVE} from "../../types/StateId.sol";
20
- import {NftId, NftIdLib} from "../../types/NftId.sol";
21
- import {Blocknumber, blockNumber} from "../../types/Blocknumber.sol";
25
+ import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
22
26
  import {Fee, FeeLib} from "../../types/Fee.sol";
27
+ import {ReferralId} from "../../types/ReferralId.sol";
28
+ import {RiskId} from "../../types/RiskId.sol";
29
+ import {StateId} from "../../types/StateId.sol";
23
30
  import {Version, VersionLib} from "../../types/Version.sol";
24
31
 
32
+ import {IService} from "../base/IService.sol";
33
+ import {ServiceBase} from "../base/ServiceBase.sol";
25
34
  import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
26
35
  import {IProductService} from "./IProductService.sol";
27
36
 
@@ -35,57 +44,186 @@ contract ProductService is ComponentServiceBase, IProductService {
35
44
 
36
45
  constructor(
37
46
  address registry,
38
- NftId registryNftId
39
- ) ComponentServiceBase(registry, registryNftId) // solhint-disable-next-line no-empty-blocks
47
+ NftId registryNftId,
48
+ address initialOwner
49
+ ) ComponentServiceBase(registry, registryNftId, initialOwner)
40
50
  {
41
51
  _registerInterface(type(IProductService).interfaceId);
42
52
  }
43
53
 
44
- function getVersion()
45
- public
46
- pure
47
- virtual override (IVersionable, Versionable)
48
- returns(Version)
49
- {
50
- return VersionLib.toVersion(3,0,0);
51
- }
52
54
 
53
- function getName() external pure override returns(string memory name) {
55
+ function getName() public pure override(IService, ServiceBase) returns(string memory name) {
54
56
  return NAME;
55
57
  }
56
58
 
57
59
  function setFees(
58
- Fee memory policyFee,
60
+ Fee memory productFee,
59
61
  Fee memory processingFee
60
62
  )
61
63
  external
62
64
  override
63
65
  {
64
66
  (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
65
- instance.setProductFees(productInfo.nftId, policyFee, processingFee);
67
+ NftId productNftId = productInfo.nftId;
68
+ ITreasury.TreasuryInfo memory treasuryInfo = instance.getTreasuryInfo(productNftId);
69
+ treasuryInfo.productFee = productFee;
70
+ treasuryInfo.processingFee = processingFee;
71
+ instance.setTreasuryInfo(productNftId, treasuryInfo);
72
+ }
73
+
74
+ function createRisk(
75
+ RiskId riskId,
76
+ bytes memory data
77
+ ) external override {
78
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
79
+ NftId productNftId = productInfo.nftId;
80
+ instance.createRisk(
81
+ riskId,
82
+ productNftId,
83
+ data
84
+ );
85
+ }
86
+
87
+ function setRiskInfo(
88
+ RiskId riskId,
89
+ IRisk.RiskInfo memory info
90
+ ) external {
91
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
92
+ instance.setRiskInfo(
93
+ riskId,
94
+ info
95
+ );
96
+ }
97
+
98
+ function updateRiskState(
99
+ RiskId riskId,
100
+ StateId state
101
+ ) external {
102
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
103
+ instance.updateRiskState(
104
+ riskId,
105
+ state
106
+ );
107
+ }
108
+
109
+ function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
110
+ IRegistry.ObjectInfo memory productInfo;
111
+ (productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
112
+ product = Product(productInfo.objectAddress);
113
+ }
114
+
115
+ function calculatePremium(
116
+ RiskId riskId,
117
+ uint256 sumInsuredAmount,
118
+ uint256 lifetime,
119
+ bytes memory applicationData,
120
+ NftId bundleNftId,
121
+ ReferralId referralId
122
+ )
123
+ public
124
+ view
125
+ override
126
+ returns (
127
+ uint256 premiumAmount,
128
+ uint256 productFeeAmount,
129
+ uint256 poolFeeAmount,
130
+ uint256 bundleFeeAmount,
131
+ uint256 distributionFeeAmount
132
+ )
133
+ {
134
+ Product product = _getAndVerifyInstanceAndProduct();
135
+ uint256 netPremiumAmount = product.calculateNetPremium(
136
+ sumInsuredAmount,
137
+ riskId,
138
+ lifetime,
139
+ applicationData
140
+ );
141
+
142
+ (
143
+ productFeeAmount,
144
+ poolFeeAmount,
145
+ bundleFeeAmount,
146
+ distributionFeeAmount
147
+ ) = _calculateFeeAmounts(
148
+ netPremiumAmount,
149
+ product,
150
+ bundleNftId,
151
+ referralId
152
+ );
153
+
154
+ premiumAmount = netPremiumAmount + productFeeAmount;
155
+ premiumAmount += poolFeeAmount + bundleFeeAmount;
156
+ premiumAmount += distributionFeeAmount;
157
+ }
158
+
159
+ function _calculateFeeAmounts(
160
+ uint256 netPremiumAmount,
161
+ Product product,
162
+ NftId bundleNftId,
163
+ ReferralId referralId
164
+ )
165
+ internal
166
+ view
167
+ returns (
168
+ uint256 productFeeAmount,
169
+ uint256 poolFeeAmount,
170
+ uint256 bundleFeeAmount,
171
+ uint256 distributionFeeAmount
172
+ )
173
+ {
174
+ IInstance instance = product.getInstance();
175
+ ITreasury.TreasuryInfo memory treasuryInfo = instance.getTreasuryInfo(product.getNftId());
176
+ IBundle.BundleInfo memory bundleInfo = instance.getBundleInfo(bundleNftId);
177
+ require(bundleInfo.poolNftId == treasuryInfo.poolNftId,"ERROR:PRS-035:BUNDLE_POOL_MISMATCH");
178
+
179
+ (productFeeAmount,) = FeeLib.calculateFee(treasuryInfo.productFee, netPremiumAmount);
180
+ (poolFeeAmount,) = FeeLib.calculateFee(treasuryInfo.poolFee, netPremiumAmount);
181
+ (bundleFeeAmount,) = FeeLib.calculateFee(bundleInfo.fee, netPremiumAmount);
182
+
183
+ IRegistry.ObjectInfo memory distributionInfo = getRegistry().getObjectInfo(treasuryInfo.distributionNftId);
184
+ IDistributionComponent distribution = IDistributionComponent(distributionInfo.objectAddress);
185
+ distributionFeeAmount = distribution.calculateFeeAmount(referralId, netPremiumAmount);
66
186
  }
67
187
 
188
+
68
189
  function createApplication(
69
190
  address applicationOwner,
191
+ RiskId riskId,
70
192
  uint256 sumInsuredAmount,
71
- uint256 premiumAmount,
72
193
  uint256 lifetime,
73
- NftId bundleNftId
194
+ bytes memory applicationData,
195
+ NftId bundleNftId,
196
+ ReferralId referralId
74
197
  ) external override returns (NftId policyNftId) {
75
198
  (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
76
- NftId productNftId = productInfo.nftId;
77
199
  // TODO add validations (see create bundle in pool service)
78
200
 
79
- policyNftId = this.getRegistry().registerObjectForInstance(
80
- productNftId,
81
- POLICY(),
82
- applicationOwner,
83
- ""
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
+ )
84
211
  );
85
212
 
86
- instance.createApplication(
87
- productNftId,
213
+ (uint256 premiumAmount,,,,) = calculatePremium(
214
+ riskId,
215
+ sumInsuredAmount,
216
+ lifetime,
217
+ applicationData,
218
+ bundleNftId,
219
+ referralId
220
+ );
221
+
222
+ instance.createPolicyInfo(
88
223
  policyNftId,
224
+ productInfo.nftId,
225
+ referralId,
226
+ riskId,
89
227
  sumInsuredAmount,
90
228
  premiumAmount,
91
229
  lifetime,
@@ -102,30 +240,29 @@ contract ProductService is ComponentServiceBase, IProductService {
102
240
  internal
103
241
  view
104
242
  returns (
105
- ITreasury.ProductSetup memory productSetup,
243
+ ITreasury.TreasuryInfo memory treasuryInfo,
244
+ NftId bundleNftId,
106
245
  IBundle.BundleInfo memory bundleInfo,
107
- uint256 collateralAmount,
108
- bool poolIsVerifying,
109
- bytes memory bundleFilter
246
+ uint256 collateralAmount
110
247
  )
111
248
  {
112
249
  // check match between policy and bundle (via pool)
113
- productSetup = instance.getProductSetup(policyInfo.productNftId);
114
- bundleInfo = instance.getBundleInfo(policyInfo.bundleNftId);
115
- require(bundleInfo.poolNftId == productSetup.poolNftId, "POLICY_BUNDLE_MISMATCH");
250
+ treasuryInfo = instance.getTreasuryInfo(policyInfo.productNftId);
251
+ bundleNftId = policyInfo.bundleNftId;
252
+ bundleInfo = instance.getBundleInfo(bundleNftId);
253
+ require(bundleInfo.poolNftId == treasuryInfo.poolNftId, "POLICY_BUNDLE_MISMATCH");
116
254
 
117
255
  // calculate required collateral
118
- NftId poolNftId = productSetup.poolNftId;
256
+ NftId poolNftId = treasuryInfo.poolNftId;
119
257
  IPool.PoolInfo memory poolInfo = instance.getPoolInfo(poolNftId);
120
258
 
121
259
  // obtain remaining return values
122
- poolIsVerifying = poolInfo.isVerifying;
123
260
  collateralAmount = calculateRequiredCollateral(poolInfo.collateralizationLevel, policyInfo.sumInsuredAmount);
124
- bundleFilter = bundleInfo.filter;
125
261
  }
126
262
 
127
263
  function _lockCollateralInBundle(
128
264
  IInstance instance,
265
+ NftId bundleNftId,
129
266
  IBundle.BundleInfo memory bundleInfo,
130
267
  NftId policyNftId,
131
268
  uint256 collateralAmount
@@ -134,28 +271,39 @@ contract ProductService is ComponentServiceBase, IProductService {
134
271
  returns (IBundle.BundleInfo memory)
135
272
  {
136
273
  bundleInfo.lockedAmount += collateralAmount;
137
- instance.collateralizePolicy(bundleInfo.nftId, policyNftId, collateralAmount);
274
+ instance.collateralizePolicy(bundleNftId, policyNftId, collateralAmount);
138
275
  return bundleInfo;
139
276
  }
140
277
 
141
278
  function _underwriteByPool(
142
- ITreasury.ProductSetup memory productSetup,
279
+ ITreasury.TreasuryInfo memory treasuryInfo,
280
+ NftId policyNftId,
143
281
  IPolicy.PolicyInfo memory policyInfo,
144
282
  bytes memory bundleFilter,
145
283
  uint256 collateralAmount
146
284
  )
147
285
  internal
148
286
  {
149
- address poolAddress = _registry.getObjectInfo(productSetup.poolNftId).objectAddress;
287
+ address poolAddress = getRegistry().getObjectInfo(treasuryInfo.poolNftId).objectAddress;
150
288
  IPoolComponent pool = IPoolComponent(poolAddress);
151
289
  pool.underwrite(
152
- policyInfo.nftId,
153
- policyInfo.data,
290
+ policyNftId,
291
+ policyInfo.applicationData,
154
292
  bundleFilter,
155
293
  collateralAmount);
156
294
  }
157
295
 
158
296
 
297
+ function revoke(
298
+ NftId policyNftId
299
+ )
300
+ external
301
+ override
302
+ {
303
+ require(false, "ERROR:PRS-234:NOT_YET_IMPLEMENTED");
304
+ }
305
+
306
+
159
307
  function underwrite(
160
308
  NftId policyNftId,
161
309
  bool requirePremiumPayment,
@@ -174,14 +322,18 @@ contract ProductService is ComponentServiceBase, IProductService {
174
322
  NftId productNftId = productInfo.nftId;
175
323
  IPolicy.PolicyInfo memory policyInfo = instance.getPolicyInfo(policyNftId);
176
324
  require(policyInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
177
- require(policyInfo.state == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
325
+ require(instance.getState(policyNftId.toKey32(POLICY())) == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
326
+
327
+ ITreasury.TreasuryInfo memory treasuryInfo;
328
+ NftId bundleNftId;
329
+ IBundle.BundleInfo memory bundleInfo;
330
+ uint256 collateralAmount;
178
331
 
179
332
  (
180
- ITreasury.ProductSetup memory productSetup,
181
- IBundle.BundleInfo memory bundleInfo,
182
- uint256 collateralAmount,
183
- bool poolIsVerifying,
184
- bytes memory bundleFilter
333
+ treasuryInfo,
334
+ bundleNftId,
335
+ bundleInfo,
336
+ collateralAmount
185
337
  ) = _getAndVerifyUnderwritingSetup(
186
338
  instance,
187
339
  policyInfo
@@ -190,15 +342,28 @@ contract ProductService is ComponentServiceBase, IProductService {
190
342
  // lock bundle collateral
191
343
  bundleInfo = _lockCollateralInBundle(
192
344
  instance,
345
+ bundleNftId,
193
346
  bundleInfo,
194
347
  policyNftId,
195
348
  collateralAmount);
196
349
 
197
- // collect premium
350
+ // set policy state to underwritten
351
+ instance.updatePolicyState(policyNftId, UNDERWRITTEN());
352
+
353
+ // optional activation of policy
354
+ if(activateAt > zeroTimestamp()) {
355
+ policyInfo.activatedAt = activateAt;
356
+ policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
357
+
358
+ instance.updatePolicyState(policyNftId, ACTIVE());
359
+ }
360
+
361
+ // optional collection of premium
198
362
  if(requirePremiumPayment) {
199
363
  uint256 netPremiumAmount = _processPremiumByTreasury(
200
364
  instance,
201
- productSetup,
365
+ productInfo.nftId,
366
+ treasuryInfo,
202
367
  policyNftId,
203
368
  policyInfo.premiumAmount);
204
369
 
@@ -206,31 +371,23 @@ contract ProductService is ComponentServiceBase, IProductService {
206
371
  bundleInfo.balanceAmount += netPremiumAmount;
207
372
  }
208
373
 
209
- // set policy state to underwritten
210
- // TODO add require for state change
211
- policyInfo.state = UNDERWRITTEN();
212
- policyInfo.updatedIn = blockNumber();
213
-
214
- // optional activation of policy
215
- if(activateAt > zeroTimestamp()) {
216
- policyInfo.activatedAt = activateAt;
217
- policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
218
-
219
- // TODO add require for state change
220
- policyInfo.state = ACTIVE();
221
- }
222
-
223
- instance.setPolicyInfo(policyInfo);
224
- instance.setBundleInfo(bundleInfo);
225
-
226
- // integrate pool component
227
- if(poolIsVerifying) {
228
- _underwriteByPool(
229
- productSetup,
230
- policyInfo,
231
- bundleFilter,
232
- collateralAmount
233
- );
374
+ instance.setPolicyInfo(policyNftId, policyInfo);
375
+ instance.setBundleInfo(bundleNftId, bundleInfo);
376
+
377
+ // involve pool if necessary
378
+ {
379
+ NftId poolNftId = treasuryInfo.poolNftId;
380
+ IPool.PoolInfo memory poolInfo = instance.getPoolInfo(poolNftId);
381
+
382
+ if(poolInfo.isVerifying) {
383
+ _underwriteByPool(
384
+ treasuryInfo,
385
+ policyNftId,
386
+ policyInfo,
387
+ bundleInfo.filter,
388
+ collateralAmount
389
+ );
390
+ }
234
391
  }
235
392
 
236
393
  // TODO add logging
@@ -248,14 +405,13 @@ contract ProductService is ComponentServiceBase, IProductService {
248
405
 
249
406
  // perform actual token transfers
250
407
  IPolicy.PolicyInfo memory policyInfo = instance.getPolicyInfo(policyNftId);
251
- ITreasury.ProductSetup memory product = instance.getProductSetup(productInfo.nftId);
408
+ ITreasury.TreasuryInfo memory treasuryInfo = instance.getTreasuryInfo(productInfo.nftId);
252
409
 
253
410
  uint256 premiumAmount = policyInfo.premiumAmount;
254
- _processPremiumByTreasury(instance, product, policyNftId, premiumAmount);
411
+ _processPremiumByTreasury(instance, productInfo.nftId, treasuryInfo, policyNftId, premiumAmount);
255
412
 
256
413
  // policy level book keeping for premium paid
257
414
  policyInfo.premiumPaidAmount += premiumAmount;
258
- policyInfo.updatedIn = blockNumber();
259
415
 
260
416
  // optional activation of policy
261
417
  if(activateAt > zeroTimestamp()) {
@@ -266,11 +422,10 @@ contract ProductService is ComponentServiceBase, IProductService {
266
422
  policyInfo.activatedAt = activateAt;
267
423
  policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
268
424
 
269
- // TODO add require for state change
270
- policyInfo.state = ACTIVE();
425
+ instance.updatePolicyState(policyNftId, ACTIVE());
271
426
  }
272
427
 
273
- instance.setPolicyInfo(policyInfo);
428
+ instance.setPolicyInfo(policyNftId, policyInfo);
274
429
 
275
430
  // TODO add logging
276
431
  }
@@ -288,10 +443,8 @@ contract ProductService is ComponentServiceBase, IProductService {
288
443
  policyInfo.activatedAt = activateAt;
289
444
  policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
290
445
 
291
- // TODO add require for state change
292
- policyInfo.state = ACTIVE();
293
-
294
- instance.setPolicyInfo(policyInfo);
446
+ instance.setPolicyInfo(policyNftId, policyInfo);
447
+ instance.updatePolicyState(policyNftId, ACTIVE());
295
448
 
296
449
  // TODO add logging
297
450
  }
@@ -311,12 +464,14 @@ contract ProductService is ComponentServiceBase, IProductService {
311
464
  view
312
465
  returns (NftId poolNftid)
313
466
  {
314
- return instance.getProductSetup(productNftId).poolNftId;
467
+ return instance.getTreasuryInfo(productNftId).poolNftId;
315
468
  }
316
469
 
470
+
317
471
  function _processPremiumByTreasury(
318
472
  IInstance instance,
319
- ITreasury.ProductSetup memory product,
473
+ NftId productNftId,
474
+ ITreasury.TreasuryInfo memory treasuryInfo,
320
475
  NftId policyNftId,
321
476
  uint256 premiumAmount
322
477
  )
@@ -325,13 +480,13 @@ contract ProductService is ComponentServiceBase, IProductService {
325
480
  {
326
481
  // process token transfer(s)
327
482
  if(premiumAmount > 0) {
328
- TokenHandler tokenHandler = instance.getTokenHandler(product.productNftId);
329
- address policyOwner = _registry.getOwner(policyNftId);
330
- address poolWallet = instance.getPoolSetup(product.poolNftId).wallet;
483
+ TokenHandler tokenHandler = instance.getTokenHandler(productNftId);
484
+ address policyOwner = getRegistry().ownerOf(policyNftId);
485
+ address poolWallet = instance.getComponentWallet(treasuryInfo.poolNftId);
331
486
  netPremiumAmount = premiumAmount;
332
- Fee memory policyFee = product.policyFee;
487
+ Fee memory productFee = treasuryInfo.productFee;
333
488
 
334
- if (FeeLib.feeIsZero(policyFee)) {
489
+ if (FeeLib.feeIsZero(productFee)) {
335
490
  tokenHandler.transfer(
336
491
  policyOwner,
337
492
  poolWallet,
@@ -340,10 +495,11 @@ contract ProductService is ComponentServiceBase, IProductService {
340
495
  } else {
341
496
  (uint256 feeAmount, uint256 netAmount) = instance.calculateFeeAmount(
342
497
  premiumAmount,
343
- policyFee
498
+ productFee
344
499
  );
345
500
 
346
- tokenHandler.transfer(policyOwner, product.wallet, feeAmount);
501
+ address productWallet = instance.getComponentWallet(productNftId);
502
+ tokenHandler.transfer(policyOwner, productWallet, feeAmount);
347
503
  tokenHandler.transfer(policyOwner, poolWallet, netAmount);
348
504
  netPremiumAmount = netAmount;
349
505
  }
@@ -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
 
@@ -1,11 +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 {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
4
+ import {IERC721Enumerable} from "@openzeppelin5/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
5
5
 
6
6
  interface IChainNft is IERC721Enumerable {
7
7
  function mint(
8
8
  address to,
9
+ address interceptor,
9
10
  string memory uri
10
11
  ) external returns (uint256 tokenId);
11
12