@etherisc/gif-next 0.0.2-299fe4a-464 → 0.0.2-29a48ef-239

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 (390) hide show
  1. package/README.md +192 -7
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +1 -1
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +176 -23
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +4 -0
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +618 -0
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +129 -23
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +152 -0
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +74 -181
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +55 -177
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +463 -63
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +494 -70
  18. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +4 -0
  19. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.json +66 -0
  20. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +4 -0
  21. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.json +24 -0
  22. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +4 -0
  23. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.json +42 -0
  24. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +2 -2
  26. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +2 -2
  28. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  29. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +2 -2
  30. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  31. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +2 -2
  32. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  33. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  34. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  35. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  36. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  37. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  38. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +1 -1
  39. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +2 -2
  40. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +1 -1
  41. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +1 -1
  42. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +1 -1
  43. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +2 -2
  44. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +1 -1
  45. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +2 -2
  46. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  47. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +2 -2
  48. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  49. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +2 -2
  50. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.dbg.json +4 -0
  51. package/artifacts/contracts/instance/AccessManagedSimple.sol/AccessManagedSimple.json +101 -0
  52. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.dbg.json +4 -0
  53. package/artifacts/contracts/instance/AccessManagerSimple.sol/AccessManagerSimple.json +1132 -0
  54. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.dbg.json +4 -0
  55. package/artifacts/contracts/instance/IAccessManagerSimple.sol/IAccessManagerSimple.json +1082 -0
  56. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  57. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +906 -1243
  58. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +4 -0
  59. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +480 -0
  60. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  61. package/artifacts/contracts/instance/Instance.sol/Instance.json +2406 -1112
  62. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +4 -0
  63. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +917 -0
  64. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +4 -0
  65. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +1422 -0
  66. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +4 -0
  67. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +931 -0
  68. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +4 -0
  69. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +508 -0
  70. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +4 -0
  71. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +540 -0
  72. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
  73. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +113 -0
  74. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +4 -0
  75. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.json +429 -0
  76. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +4 -0
  77. package/artifacts/contracts/instance/{module/lifecycle/ILifecycle.sol/ILifecycleModule.json → base/ILifecycle.sol/ILifecycle.json} +10 -77
  78. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +4 -0
  79. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +502 -0
  80. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +4 -0
  81. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +169 -0
  82. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +4 -0
  83. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +211 -0
  84. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +4 -0
  85. package/artifacts/contracts/instance/module/{bundle/IBundle.sol → IBundle.sol}/IBundle.json +1 -1
  86. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +4 -0
  87. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.json +10 -0
  88. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +4 -0
  89. package/artifacts/contracts/instance/module/{policy/IPolicy.sol → IPolicy.sol}/IPolicy.json +1 -1
  90. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +4 -0
  91. package/artifacts/contracts/instance/module/{access/IAccess.sol/IAccess.json → IRisk.sol/IRisk.json} +2 -2
  92. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +4 -0
  93. package/artifacts/contracts/instance/module/{pool/IPoolModule.sol/IPool.json → ISetup.sol/ISetup.json} +2 -2
  94. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +4 -0
  95. package/artifacts/contracts/instance/module/{treasury/ITreasury.sol → ITreasury.sol}/ITreasury.json +1 -1
  96. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +1 -1
  97. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +393 -85
  98. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  99. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +716 -0
  100. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +4 -0
  101. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +444 -0
  102. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +1 -1
  103. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +182 -80
  104. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +4 -0
  105. package/artifacts/contracts/instance/service/{ComponentServiceBase.sol/ComponentServiceBase.json → IDistributionService.sol/IDistributionService.json} +209 -63
  106. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  107. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +347 -54
  108. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  109. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +339 -56
  110. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  111. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +545 -73
  112. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +4 -0
  113. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +460 -0
  114. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  115. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +561 -99
  116. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +4 -0
  117. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +488 -0
  118. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  119. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +186 -12
  120. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  121. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +377 -37
  122. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +4 -0
  123. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +947 -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 +487 -123
  128. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +4 -0
  129. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +1293 -0
  130. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +4 -0
  131. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +517 -0
  132. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +4 -0
  133. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +410 -0
  134. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +4 -0
  135. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.json +107 -0
  136. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  137. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +2 -2
  138. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +4 -0
  139. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +127 -0
  140. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  141. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +117 -37
  142. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +4 -0
  143. package/artifacts/contracts/{instance/service → shared}/IService.sol/IService.json +180 -59
  144. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  145. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +60 -19
  146. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +4 -0
  147. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +158 -0
  148. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  149. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +349 -0
  150. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  151. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +190 -37
  152. package/artifacts/contracts/shared/RegisterableUpgradable.sol/RegisterableUpgradable.dbg.json +4 -0
  153. package/artifacts/contracts/{instance/InstanceBase.sol/InstanceBase.json → shared/RegisterableUpgradable.sol/RegisterableUpgradable.json} +209 -80
  154. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +4 -0
  155. package/artifacts/contracts/{instance/service/ServiceBase.sol/ServiceBase.json → shared/Service.sol/Service.json} +227 -59
  156. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +4 -0
  157. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +96 -0
  158. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  159. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +129 -0
  160. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  161. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +83 -19
  162. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  163. package/artifacts/contracts/test/TestFee.sol/TestFee.json +30 -6
  164. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  165. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +204 -36
  166. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  167. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +44 -10
  168. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  169. package/artifacts/contracts/test/TestService.sol/TestService.json +277 -84
  170. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  171. package/artifacts/contracts/test/TestToken.sol/TestUsdc.json +91 -53
  172. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  173. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +14 -18
  174. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  175. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +106 -50
  176. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +4 -0
  177. package/artifacts/contracts/test/Usdc.sol/USDC.json +376 -0
  178. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  179. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.json +2 -2
  180. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  181. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
  182. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  183. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +2 -2
  184. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +4 -0
  185. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.json +104 -0
  186. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +4 -0
  187. package/artifacts/contracts/types/Fee.sol/FeeLib.json +257 -0
  188. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +4 -0
  189. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +125 -0
  190. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  191. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +65 -4
  192. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  193. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +2 -2
  194. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +4 -0
  195. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.json +100 -0
  196. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  197. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
  198. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +4 -0
  199. package/artifacts/contracts/types/Referral.sol/ReferralLib.json +123 -0
  200. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +4 -0
  201. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +86 -0
  202. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +4 -0
  203. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +156 -0
  204. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  205. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  206. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  207. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +15 -2
  208. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +4 -0
  209. package/artifacts/contracts/types/UFixed.sol/MathLib.json +10 -0
  210. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +4 -0
  211. package/artifacts/contracts/types/UFixed.sol/UFixedLib.json +479 -0
  212. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  213. package/artifacts/contracts/types/Version.sol/VersionLib.json +101 -2
  214. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  215. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +22 -3
  216. package/contracts/components/BaseComponent.sol +26 -24
  217. package/contracts/components/Distribution.sol +163 -0
  218. package/contracts/components/IBaseComponent.sol +9 -3
  219. package/contracts/components/IDistributionComponent.sol +44 -0
  220. package/contracts/components/IPoolComponent.sol +15 -10
  221. package/contracts/components/IProductComponent.sol +25 -9
  222. package/contracts/components/Pool.sol +106 -33
  223. package/contracts/components/Product.sol +204 -32
  224. package/contracts/experiment/cloning/Cloner.sol +47 -0
  225. package/contracts/instance/AccessManagedSimple.sol +115 -0
  226. package/contracts/instance/AccessManagerSimple.sol +692 -0
  227. package/contracts/instance/IAccessManagerSimple.sol +391 -0
  228. package/contracts/instance/IInstance.sol +44 -40
  229. package/contracts/instance/IInstanceService.sol +30 -0
  230. package/contracts/instance/Instance.sol +426 -45
  231. package/contracts/instance/InstanceAccessManager.sol +288 -0
  232. package/contracts/instance/InstanceReader.sol +315 -0
  233. package/contracts/instance/InstanceService.sol +198 -0
  234. package/contracts/instance/InstanceServiceManager.sol +57 -0
  235. package/contracts/instance/base/ComponentServiceBase.sol +134 -0
  236. package/contracts/instance/base/IInstanceBase.sol +23 -0
  237. package/contracts/instance/base/IKeyValueStore.sol +49 -0
  238. package/contracts/instance/base/ILifecycle.sol +30 -0
  239. package/contracts/instance/base/KeyValueStore.sol +172 -0
  240. package/contracts/instance/{module/lifecycle/LifecycleModule.sol → base/Lifecycle.sol} +51 -40
  241. package/contracts/instance/module/IAccess.sol +38 -0
  242. package/contracts/instance/module/IBundle.sol +20 -0
  243. package/contracts/instance/module/IDistribution.sol +39 -0
  244. package/contracts/instance/module/IPolicy.sol +45 -0
  245. package/contracts/instance/module/IRisk.sol +11 -0
  246. package/contracts/instance/module/ISetup.sol +47 -0
  247. package/contracts/instance/module/ITreasury.sol +23 -0
  248. package/contracts/instance/service/ComponentOwnerService.sol +246 -103
  249. package/contracts/instance/service/DistributionService.sol +88 -0
  250. package/contracts/instance/service/DistributionServiceManager.sol +54 -0
  251. package/contracts/instance/service/IComponentOwnerService.sol +1 -3
  252. package/contracts/instance/service/IDistributionService.sol +12 -0
  253. package/contracts/instance/service/IPoolService.sol +14 -1
  254. package/contracts/instance/service/IProductService.sol +59 -7
  255. package/contracts/instance/service/PoolService.sol +150 -44
  256. package/contracts/instance/service/PoolServiceManager.sol +54 -0
  257. package/contracts/instance/service/ProductService.sol +344 -141
  258. package/contracts/instance/service/ProductServiceManager.sol +54 -0
  259. package/contracts/registry/ChainNft.sol +80 -37
  260. package/contracts/registry/IRegistry.sol +49 -25
  261. package/contracts/registry/IRegistryService.sol +50 -0
  262. package/contracts/registry/ITransferInterceptor.sol +6 -0
  263. package/contracts/registry/Registry.sol +337 -270
  264. package/contracts/registry/RegistryService.sol +358 -0
  265. package/contracts/registry/RegistryServiceManager.sol +80 -0
  266. package/contracts/registry/TokenRegistry.sol +111 -0
  267. package/contracts/shared/ContractDeployerLib.sol +72 -0
  268. package/contracts/shared/ERC165.sol +6 -2
  269. package/contracts/shared/INftOwnable.sol +22 -0
  270. package/contracts/shared/IRegisterable.sol +8 -15
  271. package/contracts/{instance/service → shared}/IService.sol +3 -3
  272. package/contracts/shared/IVersionable.sol +56 -12
  273. package/contracts/shared/NftOwnable.sol +134 -0
  274. package/contracts/shared/ProxyManager.sol +94 -0
  275. package/contracts/shared/Registerable.sol +63 -59
  276. package/contracts/shared/RegisterableUpgradable.sol +16 -0
  277. package/contracts/shared/Service.sol +55 -0
  278. package/contracts/shared/TokenHandler.sol +27 -0
  279. package/contracts/shared/UpgradableProxyWithAdmin.sol +16 -0
  280. package/contracts/shared/Versionable.sol +112 -57
  281. package/contracts/test/TestFee.sol +4 -4
  282. package/contracts/test/TestRegisterable.sol +5 -6
  283. package/contracts/test/TestRoleId.sol +2 -2
  284. package/contracts/test/TestService.sol +6 -17
  285. package/contracts/test/TestVersion.sol +4 -7
  286. package/contracts/test/TestVersionable.sol +2 -5
  287. package/contracts/test/Usdc.sol +26 -0
  288. package/contracts/types/DistributorType.sol +55 -0
  289. package/contracts/types/Fee.sol +44 -20
  290. package/contracts/types/Key32.sol +50 -0
  291. package/contracts/types/NftId.sol +16 -1
  292. package/contracts/types/NumberId.sol +52 -0
  293. package/contracts/types/ObjectType.sol +51 -14
  294. package/contracts/types/Referral.sol +85 -0
  295. package/contracts/types/RiskId.sol +43 -0
  296. package/contracts/types/RoleId.sol +65 -11
  297. package/contracts/types/StateId.sol +12 -2
  298. package/contracts/types/Timestamp.sol +7 -3
  299. package/contracts/types/UFixed.sol +144 -25
  300. package/contracts/types/Version.sol +42 -26
  301. package/package.json +7 -3
  302. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +0 -4
  303. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.json +0 -24
  304. package/artifacts/contracts/instance/IServiceLinked.sol/IServiceLinked.dbg.json +0 -4
  305. package/artifacts/contracts/instance/IServiceLinked.sol/IServiceLinked.json +0 -50
  306. package/artifacts/contracts/instance/InstanceBase.sol/InstanceBase.dbg.json +0 -4
  307. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.dbg.json +0 -4
  308. package/artifacts/contracts/instance/module/access/Access.sol/AccessModule.json +0 -333
  309. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccess.dbg.json +0 -4
  310. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.dbg.json +0 -4
  311. package/artifacts/contracts/instance/module/access/IAccess.sol/IAccessModule.json +0 -333
  312. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +0 -4
  313. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.json +0 -276
  314. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +0 -4
  315. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +0 -4
  316. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.json +0 -276
  317. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +0 -4
  318. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.json +0 -188
  319. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +0 -4
  320. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.json +0 -10
  321. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +0 -4
  322. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.json +0 -188
  323. package/artifacts/contracts/instance/module/lifecycle/ILifecycle.sol/ILifecycle.dbg.json +0 -4
  324. package/artifacts/contracts/instance/module/lifecycle/ILifecycle.sol/ILifecycle.json +0 -134
  325. package/artifacts/contracts/instance/module/lifecycle/ILifecycle.sol/ILifecycleModule.dbg.json +0 -4
  326. package/artifacts/contracts/instance/module/lifecycle/LifecycleModule.sol/LifecycleModule.dbg.json +0 -4
  327. package/artifacts/contracts/instance/module/lifecycle/LifecycleModule.sol/LifecycleModule.json +0 -221
  328. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +0 -4
  329. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +0 -4
  330. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.json +0 -261
  331. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +0 -4
  332. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.json +0 -261
  333. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +0 -4
  334. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +0 -4
  335. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.json +0 -149
  336. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +0 -4
  337. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.json +0 -149
  338. package/artifacts/contracts/instance/module/product/IProductModule.sol/IProductModule.dbg.json +0 -4
  339. package/artifacts/contracts/instance/module/product/IProductModule.sol/IProductModule.json +0 -10
  340. package/artifacts/contracts/instance/module/product/ProductModule.sol/ProductModule.dbg.json +0 -4
  341. package/artifacts/contracts/instance/module/product/ProductModule.sol/ProductModule.json +0 -10
  342. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +0 -4
  343. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +0 -4
  344. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.json +0 -538
  345. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +0 -4
  346. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +0 -76
  347. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +0 -4
  348. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.json +0 -538
  349. package/artifacts/contracts/instance/service/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +0 -4
  350. package/artifacts/contracts/instance/service/IService.sol/IService.dbg.json +0 -4
  351. package/artifacts/contracts/instance/service/ServiceBase.sol/ServiceBase.dbg.json +0 -4
  352. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +0 -4
  353. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +0 -452
  354. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.dbg.json +0 -4
  355. package/artifacts/contracts/registry/IRegistryLinked.sol/IRegistryLinked.json +0 -24
  356. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.dbg.json +0 -4
  357. package/artifacts/contracts/shared/IOwnable.sol/IOwnable.json +0 -24
  358. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +0 -4
  359. package/artifacts/contracts/test/TestPool.sol/TestPool.json +0 -387
  360. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +0 -4
  361. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +0 -393
  362. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +0 -4
  363. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +0 -453
  364. package/contracts/experiment/statemachine/README.md +0 -112
  365. package/contracts/instance/IInstanceLinked.sol +0 -8
  366. package/contracts/instance/IServiceLinked.sol +0 -12
  367. package/contracts/instance/InstanceBase.sol +0 -74
  368. package/contracts/instance/module/access/Access.sol +0 -149
  369. package/contracts/instance/module/access/IAccess.sol +0 -53
  370. package/contracts/instance/module/bundle/BundleModule.sol +0 -228
  371. package/contracts/instance/module/bundle/IBundle.sol +0 -53
  372. package/contracts/instance/module/component/ComponentModule.sol +0 -104
  373. package/contracts/instance/module/component/IComponent.sol +0 -53
  374. package/contracts/instance/module/lifecycle/ILifecycle.sol +0 -47
  375. package/contracts/instance/module/policy/IPolicy.sol +0 -60
  376. package/contracts/instance/module/policy/PolicyModule.sol +0 -84
  377. package/contracts/instance/module/pool/IPoolModule.sol +0 -41
  378. package/contracts/instance/module/pool/PoolModule.sol +0 -87
  379. package/contracts/instance/module/product/IProductModule.sol +0 -6
  380. package/contracts/instance/module/product/ProductModule.sol +0 -8
  381. package/contracts/instance/module/treasury/ITreasury.sol +0 -104
  382. package/contracts/instance/module/treasury/TokenHandler.sol +0 -48
  383. package/contracts/instance/module/treasury/TreasuryModule.sol +0 -148
  384. package/contracts/instance/service/ComponentServiceBase.sol +0 -41
  385. package/contracts/instance/service/ServiceBase.sol +0 -39
  386. package/contracts/registry/IChainNft.sol +0 -21
  387. package/contracts/registry/IRegistryLinked.sol +0 -8
  388. package/contracts/shared/IOwnable.sol +0 -6
  389. package/contracts/test/TestPool.sol +0 -22
  390. package/contracts/test/TestProduct.sol +0 -44
@@ -2,28 +2,44 @@
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";
6
- import {IInstance} from "../../instance/IInstance.sol";
7
- import {IPolicy, IPolicyModule} from "../module/policy/IPolicy.sol";
8
- import {IPool} from "../module/pool/IPoolModule.sol";
9
- import {IBundle} from "../module/bundle/IBundle.sol";
8
+ import {IDistributionComponent} from "../../components/IDistributionComponent.sol";
9
+ import {IInstance} from "../IInstance.sol";
10
+ import {IPolicy} from "../module/IPolicy.sol";
11
+ import {IRisk} from "../module/IRisk.sol";
12
+ import {IBundle} from "../module/IBundle.sol";
10
13
  import {IProductService} from "./IProductService.sol";
11
- import {ITreasury, ITreasuryModule, TokenHandler} from "../../instance/module/treasury/ITreasury.sol";
14
+ import {ITreasury} from "../module/ITreasury.sol";
15
+ import {ISetup} from "../module/ISetup.sol";
16
+
17
+ import {TokenHandler} from "../../shared/TokenHandler.sol";
12
18
 
13
19
  import {IVersionable} from "../../shared/IVersionable.sol";
14
20
  import {Versionable} from "../../shared/Versionable.sol";
15
21
 
16
22
  import {Timestamp, zeroTimestamp} from "../../types/Timestamp.sol";
17
- import {UFixed, UFixedMathLib} from "../../types/UFixed.sol";
18
- import {ObjectType, INSTANCE, PRODUCT, POLICY} from "../../types/ObjectType.sol";
19
- import {APPLIED, UNDERWRITTEN, ACTIVE} from "../../types/StateId.sol";
20
- import {NftId, NftIdLib} from "../../types/NftId.sol";
23
+ import {UFixed, UFixedLib} from "../../types/UFixed.sol";
21
24
  import {Blocknumber, blockNumber} from "../../types/Blocknumber.sol";
22
- import {Fee, feeIsZero} from "../../types/Fee.sol";
23
- import {Version, toVersion, toVersionPart} from "../../types/Version.sol";
24
-
25
- import {ComponentServiceBase} from "./ComponentServiceBase.sol";
25
+ import {ObjectType, INSTANCE, PRODUCT, POLICY} from "../../types/ObjectType.sol";
26
+ import {APPLIED, UNDERWRITTEN, ACTIVE, KEEP_STATE} from "../../types/StateId.sol";
27
+ import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
28
+ import {Fee, FeeLib} from "../../types/Fee.sol";
29
+ import {ReferralId} from "../../types/Referral.sol";
30
+ import {RiskId} from "../../types/RiskId.sol";
31
+ import {StateId} from "../../types/StateId.sol";
32
+ import {Version, VersionLib} from "../../types/Version.sol";
33
+
34
+ import {IService} from "../../shared/IService.sol";
35
+ import {Service} from "../../shared/Service.sol";
36
+ import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
26
37
  import {IProductService} from "./IProductService.sol";
38
+ import {InstanceReader} from "../InstanceReader.sol";
39
+ import {IPoolService} from "./PoolService.sol";
40
+ import {POOL_SERVICE_NAME} from "./PoolService.sol";
41
+
42
+ string constant PRODUCT_SERVICE_NAME = "ProductService";
27
43
 
28
44
  // TODO or name this ProtectionService to have Product be something more generic (loan, savings account, ...)
29
45
  contract ProductService is ComponentServiceBase, IProductService {
@@ -31,104 +47,274 @@ contract ProductService is ComponentServiceBase, IProductService {
31
47
 
32
48
  string public constant NAME = "ProductService";
33
49
 
50
+ address internal _registryAddress;
51
+ IPoolService internal _poolService;
52
+
34
53
  event LogProductServiceSender(address sender);
35
54
 
36
- constructor(
37
- address registry,
38
- NftId registryNftId
39
- ) ComponentServiceBase(registry, registryNftId) // solhint-disable-next-line no-empty-blocks
55
+ function _initialize(
56
+ address owner,
57
+ bytes memory data
58
+ )
59
+ internal
60
+ initializer
61
+ virtual override
40
62
  {
63
+ address initialOwner = address(0);
64
+ (_registryAddress, initialOwner) = abi.decode(data, (address, address));
65
+
66
+ _initializeService(_registryAddress, owner);
67
+
68
+ _poolService = IPoolService(_registry.getServiceAddress(POOL_SERVICE_NAME, getMajorVersion()));
69
+
70
+ _registerInterface(type(IService).interfaceId);
41
71
  _registerInterface(type(IProductService).interfaceId);
42
72
  }
43
73
 
44
- function getVersion()
45
- public
46
- pure
47
- virtual override (IVersionable, Versionable)
48
- returns(Version)
49
- {
50
- return toVersion(
51
- toVersionPart(3),
52
- toVersionPart(0),
53
- toVersionPart(0));
54
- }
55
74
 
56
- function getName() external pure override returns(string memory name) {
75
+ function getName() public pure override(IService, Service) returns(string memory name) {
57
76
  return NAME;
58
77
  }
59
78
 
79
+ function _finalizeComponentRegistration(NftId componentNftId, bytes memory initialObjData, IInstance instance) internal override {
80
+ ISetup.ProductSetupInfo memory initialSetup = abi.decode(
81
+ initialObjData,
82
+ (ISetup.ProductSetupInfo)
83
+ );
84
+ instance.createProductSetup(componentNftId, initialSetup);
85
+ }
86
+
60
87
  function setFees(
61
- Fee memory policyFee,
88
+ Fee memory productFee,
62
89
  Fee memory processingFee
63
90
  )
64
91
  external
65
92
  override
66
93
  {
67
94
  (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
68
- instance.setProductFees(productInfo.nftId, policyFee, processingFee);
95
+ InstanceReader instanceReader = instance.getInstanceReader();
96
+ NftId productNftId = productInfo.nftId;
97
+
98
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(productNftId);
99
+ productSetupInfo.productFee = productFee;
100
+ productSetupInfo.processingFee = processingFee;
101
+
102
+ instance.updateProductSetup(productNftId, productSetupInfo, KEEP_STATE());
103
+ }
104
+
105
+ function createRisk(
106
+ RiskId riskId,
107
+ bytes memory data
108
+ ) external override {
109
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
110
+ NftId productNftId = productInfo.nftId;
111
+ IRisk.RiskInfo memory riskInfo = IRisk.RiskInfo(productNftId, data);
112
+ instance.createRisk(
113
+ riskId,
114
+ riskInfo
115
+ );
116
+ }
117
+
118
+ function updateRisk(
119
+ RiskId riskId,
120
+ bytes memory data
121
+ ) external {
122
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
123
+ InstanceReader instanceReader = instance.getInstanceReader();
124
+ IRisk.RiskInfo memory riskInfo = instanceReader.getRiskInfo(riskId);
125
+ riskInfo.data = data;
126
+ instance.updateRisk(riskId, riskInfo, KEEP_STATE());
127
+ }
128
+
129
+ function updateRiskState(
130
+ RiskId riskId,
131
+ StateId state
132
+ ) external {
133
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
134
+ instance.updateRiskState(riskId, state);
69
135
  }
70
136
 
137
+ function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
138
+ IRegistry.ObjectInfo memory productInfo;
139
+ (productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
140
+ product = Product(productInfo.objectAddress);
141
+ }
142
+
143
+ function calculatePremium(
144
+ RiskId riskId,
145
+ uint256 sumInsuredAmount,
146
+ uint256 lifetime,
147
+ bytes memory applicationData,
148
+ NftId bundleNftId,
149
+ ReferralId referralId
150
+ )
151
+ public
152
+ view
153
+ override
154
+ returns (
155
+ uint256 premiumAmount,
156
+ uint256 productFeeAmount,
157
+ uint256 poolFeeAmount,
158
+ uint256 bundleFeeAmount,
159
+ uint256 distributionFeeAmount
160
+ )
161
+ {
162
+ Product product = _getAndVerifyInstanceAndProduct();
163
+ uint256 netPremiumAmount = product.calculateNetPremium(
164
+ sumInsuredAmount,
165
+ riskId,
166
+ lifetime,
167
+ applicationData
168
+ );
169
+
170
+ (
171
+ productFeeAmount,
172
+ poolFeeAmount,
173
+ bundleFeeAmount,
174
+ distributionFeeAmount
175
+ ) = _calculateFeeAmounts(
176
+ netPremiumAmount,
177
+ product,
178
+ bundleNftId,
179
+ referralId
180
+ );
181
+
182
+ premiumAmount = netPremiumAmount + productFeeAmount;
183
+ premiumAmount += poolFeeAmount + bundleFeeAmount;
184
+ premiumAmount += distributionFeeAmount;
185
+ }
186
+
187
+ function _calculateFeeAmounts(
188
+ uint256 netPremiumAmount,
189
+ Product product,
190
+ NftId bundleNftId,
191
+ ReferralId referralId
192
+ )
193
+ internal
194
+ view
195
+ returns (
196
+ uint256 productFeeAmount,
197
+ uint256 poolFeeAmount,
198
+ uint256 bundleFeeAmount,
199
+ uint256 distributionFeeAmount
200
+ )
201
+ {
202
+ InstanceReader instanceReader;
203
+ {
204
+ IInstance instance = product.getInstance();
205
+ instanceReader = instance.getInstanceReader();
206
+ }
207
+
208
+ NftId poolNftId = product.getPoolNftId();
209
+ IBundle.BundleInfo memory bundleInfo = instanceReader.getBundleInfo(bundleNftId);
210
+ require(bundleInfo.poolNftId == poolNftId,"ERROR:PRS-035:BUNDLE_POOL_MISMATCH");
211
+
212
+ {
213
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(product.getProductNftId());
214
+ (productFeeAmount,) = FeeLib.calculateFee(productSetupInfo.productFee, netPremiumAmount);
215
+ }
216
+ {
217
+ ISetup.PoolSetupInfo memory poolSetupInfo = instanceReader.getPoolSetupInfo(poolNftId);
218
+ (poolFeeAmount,) = FeeLib.calculateFee(poolSetupInfo.poolFee, netPremiumAmount);
219
+ }
220
+ {
221
+ NftId distributionNftId = product.getDistributionNftId();
222
+ ISetup.DistributionSetupInfo memory distributionSetupInfo = instanceReader.getDistributionSetupInfo(distributionNftId);
223
+ (distributionFeeAmount,) = FeeLib.calculateFee(distributionSetupInfo.distributionFee, netPremiumAmount);
224
+ }
225
+
226
+ (bundleFeeAmount,) = FeeLib.calculateFee(bundleInfo.fee, netPremiumAmount);
227
+ }
228
+
229
+
71
230
  function createApplication(
72
231
  address applicationOwner,
232
+ RiskId riskId,
73
233
  uint256 sumInsuredAmount,
74
- uint256 premiumAmount,
75
234
  uint256 lifetime,
76
- NftId bundleNftId
235
+ bytes memory applicationData,
236
+ NftId bundleNftId,
237
+ ReferralId referralId
77
238
  ) external override returns (NftId policyNftId) {
78
239
  (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
79
- NftId productNftId = productInfo.nftId;
80
240
  // TODO add validations (see create bundle in pool service)
81
241
 
82
- policyNftId = this.getRegistry().registerObjectForInstance(
83
- productNftId,
84
- POLICY(),
85
- applicationOwner,
86
- ""
242
+ policyNftId = getRegistryService().registerPolicy(
243
+ IRegistry.ObjectInfo(
244
+ zeroNftId(),
245
+ productInfo.nftId,
246
+ POLICY(),
247
+ false, // intercepting property for policies is defined on product
248
+ address(0),
249
+ applicationOwner,
250
+ ""
251
+ )
252
+ );
253
+
254
+ (uint256 premiumAmount,,,,) = calculatePremium(
255
+ riskId,
256
+ sumInsuredAmount,
257
+ lifetime,
258
+ applicationData,
259
+ bundleNftId,
260
+ referralId
87
261
  );
88
262
 
89
- instance.createApplication(
90
- productNftId,
91
- policyNftId,
263
+ IPolicy.PolicyInfo memory policyInfo = IPolicy.PolicyInfo(
264
+ productInfo.nftId,
265
+ bundleNftId,
266
+ referralId,
267
+ riskId,
92
268
  sumInsuredAmount,
93
269
  premiumAmount,
270
+ 0,
94
271
  lifetime,
95
- bundleNftId
272
+ applicationData,
273
+ "",
274
+ 0,
275
+ 0,
276
+ 0,
277
+ zeroTimestamp(),
278
+ zeroTimestamp(),
279
+ zeroTimestamp()
96
280
  );
281
+
282
+ instance.createPolicy(policyNftId, policyInfo);
283
+ instance.updatePolicyState(policyNftId, APPLIED());
97
284
 
98
285
  // TODO add logging
99
286
  }
100
287
 
101
288
  function _getAndVerifyUnderwritingSetup(
102
289
  IInstance instance,
103
- IPolicy.PolicyInfo memory policyInfo
290
+ InstanceReader instanceReader,
291
+ IPolicy.PolicyInfo memory policyInfo,
292
+ ISetup.ProductSetupInfo memory productSetupInfo
104
293
  )
105
294
  internal
106
295
  view
107
296
  returns (
108
- ITreasury.ProductSetup memory productSetup,
297
+ NftId bundleNftId,
109
298
  IBundle.BundleInfo memory bundleInfo,
110
- uint256 collateralAmount,
111
- bool poolIsVerifying,
112
- bytes memory bundleFilter
299
+ uint256 collateralAmount
113
300
  )
114
301
  {
115
302
  // check match between policy and bundle (via pool)
116
- productSetup = instance.getProductSetup(policyInfo.productNftId);
117
- bundleInfo = instance.getBundleInfo(policyInfo.bundleNftId);
118
- require(bundleInfo.poolNftId == productSetup.poolNftId, "POLICY_BUNDLE_MISMATCH");
303
+ bundleNftId = policyInfo.bundleNftId;
304
+ bundleInfo = instanceReader.getBundleInfo(bundleNftId);
305
+ require(bundleInfo.poolNftId == productSetupInfo.poolNftId, "POLICY_BUNDLE_MISMATCH");
119
306
 
120
307
  // calculate required collateral
121
- NftId poolNftId = productSetup.poolNftId;
122
- IPool.PoolInfo memory poolInfo = instance.getPoolInfo(poolNftId);
308
+ NftId poolNftId = productSetupInfo.poolNftId;
309
+ ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
123
310
 
124
311
  // obtain remaining return values
125
- poolIsVerifying = poolInfo.isVerifying;
126
312
  collateralAmount = calculateRequiredCollateral(poolInfo.collateralizationLevel, policyInfo.sumInsuredAmount);
127
- bundleFilter = bundleInfo.filter;
128
313
  }
129
314
 
130
315
  function _lockCollateralInBundle(
131
316
  IInstance instance,
317
+ NftId bundleNftId,
132
318
  IBundle.BundleInfo memory bundleInfo,
133
319
  NftId policyNftId,
134
320
  uint256 collateralAmount
@@ -137,29 +323,39 @@ contract ProductService is ComponentServiceBase, IProductService {
137
323
  returns (IBundle.BundleInfo memory)
138
324
  {
139
325
  bundleInfo.lockedAmount += collateralAmount;
140
- bundleInfo.updatedIn = blockNumber();
141
- instance.collateralizePolicy(bundleInfo.nftId, policyNftId, collateralAmount);
326
+ // TODO: track policy associated to bundle in bundlemanager (tbd) and how much is locked for it
142
327
  return bundleInfo;
143
328
  }
144
329
 
145
330
  function _underwriteByPool(
146
- ITreasury.ProductSetup memory productSetup,
331
+ NftId poolNftId,
332
+ NftId policyNftId,
147
333
  IPolicy.PolicyInfo memory policyInfo,
148
334
  bytes memory bundleFilter,
149
335
  uint256 collateralAmount
150
336
  )
151
337
  internal
152
338
  {
153
- address poolAddress = _registry.getObjectInfo(productSetup.poolNftId).objectAddress;
339
+ address poolAddress = getRegistry().getObjectInfo(poolNftId).objectAddress;
154
340
  IPoolComponent pool = IPoolComponent(poolAddress);
155
341
  pool.underwrite(
156
- policyInfo.nftId,
157
- policyInfo.data,
342
+ policyNftId,
343
+ policyInfo.applicationData,
158
344
  bundleFilter,
159
345
  collateralAmount);
160
346
  }
161
347
 
162
348
 
349
+ function revoke(
350
+ NftId policyNftId
351
+ )
352
+ external
353
+ override
354
+ {
355
+ require(false, "ERROR:PRS-234:NOT_YET_IMPLEMENTED");
356
+ }
357
+
358
+
163
359
  function underwrite(
164
360
  NftId policyNftId,
165
361
  bool requirePremiumPayment,
@@ -173,36 +369,53 @@ contract ProductService is ComponentServiceBase, IProductService {
173
369
  IRegistry.ObjectInfo memory productInfo,
174
370
  IInstance instance
175
371
  ) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
372
+ InstanceReader instanceReader = instance.getInstanceReader();
176
373
 
177
374
  // check match between policy and calling product
178
375
  NftId productNftId = productInfo.nftId;
179
- IPolicy.PolicyInfo memory policyInfo = instance.getPolicyInfo(policyNftId);
376
+ IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
180
377
  require(policyInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
181
- require(policyInfo.state == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
378
+ require(instanceReader.getPolicyState(policyNftId) == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
182
379
 
183
- (
184
- ITreasury.ProductSetup memory productSetup,
185
- IBundle.BundleInfo memory bundleInfo,
186
- uint256 collateralAmount,
187
- bool poolIsVerifying,
188
- bytes memory bundleFilter
189
- ) = _getAndVerifyUnderwritingSetup(
190
- instance,
191
- policyInfo
192
- );
380
+ NftId bundleNftId;
381
+ IBundle.BundleInfo memory bundleInfo;
382
+ uint256 collateralAmount;
383
+ {
384
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(productNftId);
385
+
386
+ (
387
+ bundleNftId,
388
+ bundleInfo,
389
+ collateralAmount
390
+ ) = _getAndVerifyUnderwritingSetup(
391
+ instance,
392
+ instanceReader,
393
+ policyInfo,
394
+ productSetupInfo
395
+ );
396
+ }
193
397
 
194
398
  // lock bundle collateral
195
399
  bundleInfo = _lockCollateralInBundle(
196
400
  instance,
401
+ bundleNftId,
197
402
  bundleInfo,
198
403
  policyNftId,
199
404
  collateralAmount);
405
+ StateId newPolicyState = UNDERWRITTEN();
406
+
407
+ // optional activation of policy
408
+ if(activateAt > zeroTimestamp()) {
409
+ newPolicyState = ACTIVE();
410
+ policyInfo.activatedAt = activateAt;
411
+ policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
412
+ }
200
413
 
201
- // collect premium
414
+ // optional collection of premium
202
415
  if(requirePremiumPayment) {
203
416
  uint256 netPremiumAmount = _processPremiumByTreasury(
204
417
  instance,
205
- productSetup,
418
+ productInfo.nftId,
206
419
  policyNftId,
207
420
  policyInfo.premiumAmount);
208
421
 
@@ -210,38 +423,30 @@ contract ProductService is ComponentServiceBase, IProductService {
210
423
  bundleInfo.balanceAmount += netPremiumAmount;
211
424
  }
212
425
 
213
- // set policy state to underwritten
214
- // TODO add require for state change
215
- policyInfo.state = UNDERWRITTEN();
216
- policyInfo.updatedIn = blockNumber();
217
-
218
- // optional activation of policy
219
- if(activateAt > zeroTimestamp()) {
220
- policyInfo.activatedAt = activateAt;
221
- policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
222
-
223
- // TODO add require for state change
224
- policyInfo.state = ACTIVE();
225
- }
226
-
227
- instance.setPolicyInfo(policyInfo);
228
- instance.setBundleInfo(bundleInfo);
229
-
230
- // integrate pool component
231
- if(poolIsVerifying) {
232
- _underwriteByPool(
233
- productSetup,
234
- policyInfo,
235
- bundleFilter,
236
- collateralAmount
237
- );
426
+ instance.updatePolicy(policyNftId, policyInfo, newPolicyState);
427
+ _poolService.updateBundle(productInfo.parentNftId, bundleNftId, bundleInfo, KEEP_STATE());
428
+
429
+ // involve pool if necessary
430
+ {
431
+ NftId poolNftId = bundleInfo.poolNftId;
432
+ ISetup.PoolSetupInfo memory poolInfo = instanceReader.getPoolSetupInfo(poolNftId);
433
+
434
+ if(poolInfo.isConfirmingApplication) {
435
+ _underwriteByPool(
436
+ poolNftId,
437
+ policyNftId,
438
+ policyInfo,
439
+ bundleInfo.filter,
440
+ collateralAmount
441
+ );
442
+ }
238
443
  }
239
444
 
240
445
  // TODO add logging
241
446
  }
242
447
 
243
448
  function calculateRequiredCollateral(UFixed collateralizationLevel, uint256 sumInsuredAmount) public pure override returns(uint256 collateralAmount) {
244
- UFixed sumInsuredUFixed = UFixedMathLib.toUFixed(sumInsuredAmount);
449
+ UFixed sumInsuredUFixed = UFixedLib.toUFixed(sumInsuredAmount);
245
450
  UFixed collateralUFixed = collateralizationLevel * sumInsuredUFixed;
246
451
  return collateralUFixed.toInt();
247
452
  }
@@ -249,41 +454,37 @@ contract ProductService is ComponentServiceBase, IProductService {
249
454
  function collectPremium(NftId policyNftId, Timestamp activateAt) external override {
250
455
  // check caller is registered product
251
456
  (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
457
+ InstanceReader instanceReader = instance.getInstanceReader();
252
458
 
253
- // perform actual token transfers
254
- IPolicy.PolicyInfo memory policyInfo = instance.getPolicyInfo(policyNftId);
255
- ITreasury.ProductSetup memory product = instance.getProductSetup(productInfo.nftId);
256
-
257
- uint256 premiumAmount = policyInfo.premiumAmount;
258
- _processPremiumByTreasury(instance, product, policyNftId, premiumAmount);
459
+ // TODO: check if not paid
460
+ // TODO: transfer premium
461
+ // TODO: optionally activate
259
462
 
260
- // policy level book keeping for premium paid
261
- policyInfo.premiumPaidAmount += premiumAmount;
262
- policyInfo.updatedIn = blockNumber();
263
-
264
- // optional activation of policy
265
- if(activateAt > zeroTimestamp()) {
266
- require(
267
- policyInfo.activatedAt.eqz(),
268
- "ERROR:PRS-030:ALREADY_ACTIVATED");
463
+ // // perform actual token transfers (this code is probably not complete)
464
+ // IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
465
+
466
+ // uint256 premiumAmount = policyInfo.premiumAmount;
467
+ // _processPremiumByTreasury(instance, productInfo.nftId, policyNftId, premiumAmount);
269
468
 
270
- policyInfo.activatedAt = activateAt;
271
- policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
469
+ // // policy level book keeping for premium paid
470
+ // policyInfo.premiumPaidAmount += premiumAmount;
272
471
 
273
- // TODO add require for state change
274
- policyInfo.state = ACTIVE();
275
- }
472
+ // instance.updatePolicy(policyNftId, policyInfo, KEEP_STATE());
276
473
 
277
- instance.setPolicyInfo(policyInfo);
474
+ // // optional activation of policy
475
+ // if(activateAt > zeroTimestamp()) {
476
+ // activate(policyNftId, activateAt);
477
+ // }
278
478
 
279
479
  // TODO add logging
280
480
  }
281
481
 
282
- function activate(NftId policyNftId, Timestamp activateAt) external override {
482
+ function activate(NftId policyNftId, Timestamp activateAt) public override {
283
483
  // check caller is registered product
284
484
  (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
485
+ InstanceReader instanceReader = instance.getInstanceReader();
285
486
 
286
- IPolicy.PolicyInfo memory policyInfo = instance.getPolicyInfo(policyNftId);
487
+ IPolicy.PolicyInfo memory policyInfo = instanceReader.getPolicyInfo(policyNftId);
287
488
 
288
489
  require(
289
490
  policyInfo.activatedAt.eqz(),
@@ -292,10 +493,7 @@ contract ProductService is ComponentServiceBase, IProductService {
292
493
  policyInfo.activatedAt = activateAt;
293
494
  policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
294
495
 
295
- // TODO add require for state change
296
- policyInfo.state = ACTIVE();
297
-
298
- instance.setPolicyInfo(policyInfo);
496
+ instance.updatePolicy(policyNftId, policyInfo, ACTIVE());
299
497
 
300
498
  // TODO add logging
301
499
  }
@@ -315,12 +513,15 @@ contract ProductService is ComponentServiceBase, IProductService {
315
513
  view
316
514
  returns (NftId poolNftid)
317
515
  {
318
- return instance.getProductSetup(productNftId).poolNftId;
516
+ InstanceReader instanceReader = instance.getInstanceReader();
517
+ ISetup.ProductSetupInfo memory productSetupInfo = instanceReader.getProductSetupInfo(productNftId);
518
+ return productSetupInfo.poolNftId;
319
519
  }
320
520
 
521
+
321
522
  function _processPremiumByTreasury(
322
523
  IInstance instance,
323
- ITreasury.ProductSetup memory product,
524
+ NftId productNftId,
324
525
  NftId policyNftId,
325
526
  uint256 premiumAmount
326
527
  )
@@ -329,25 +530,27 @@ contract ProductService is ComponentServiceBase, IProductService {
329
530
  {
330
531
  // process token transfer(s)
331
532
  if(premiumAmount > 0) {
332
- TokenHandler tokenHandler = product.tokenHandler;
333
- address policyOwner = _registry.getOwner(policyNftId);
334
- address poolWallet = instance.getPoolSetup(product.poolNftId).wallet;
533
+ ISetup.ProductSetupInfo memory productSetupInfo = instance.getInstanceReader().getProductSetupInfo(productNftId);
534
+ TokenHandler tokenHandler = productSetupInfo.tokenHandler;
535
+ address policyOwner = getRegistry().ownerOf(policyNftId);
536
+ ISetup.PoolSetupInfo memory poolSetupInfo = instance.getInstanceReader().getPoolSetupInfo(productSetupInfo.poolNftId);
537
+ address poolWallet = poolSetupInfo.wallet;
335
538
  netPremiumAmount = premiumAmount;
336
- Fee memory policyFee = product.policyFee;
539
+ Fee memory productFee = productSetupInfo.productFee;
337
540
 
338
- if (feeIsZero(policyFee)) {
541
+ if (FeeLib.feeIsZero(productFee)) {
339
542
  tokenHandler.transfer(
340
543
  policyOwner,
341
544
  poolWallet,
342
545
  premiumAmount
343
546
  );
344
547
  } else {
345
- (uint256 feeAmount, uint256 netAmount) = instance.calculateFeeAmount(
346
- premiumAmount,
347
- policyFee
348
- );
349
-
350
- tokenHandler.transfer(policyOwner, product.wallet, feeAmount);
548
+ (uint256 productFeeAmount, uint256 netAmount) = FeeLib.calculateFee(productSetupInfo.productFee, netPremiumAmount);
549
+ address productWallet = productSetupInfo.wallet;
550
+ if (tokenHandler.getToken().allowance(policyOwner, address(tokenHandler)) < premiumAmount) {
551
+ revert ErrorIProductServiceInsufficientAllowance(policyOwner, address(tokenHandler), premiumAmount);
552
+ }
553
+ tokenHandler.transfer(policyOwner, productWallet, productFeeAmount);
351
554
  tokenHandler.transfer(policyOwner, poolWallet, netAmount);
352
555
  netPremiumAmount = netAmount;
353
556
  }