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

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 (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