@etherisc/gif-next 0.0.2-7b86057-523 → 0.0.2-7bdebe2-893

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 (353) hide show
  1. package/README.md +8 -13
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
  3. package/artifacts/contracts/components/Component.sol/Component.json +315 -98
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +1 -1
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +668 -141
  6. package/artifacts/contracts/components/IComponent.sol/IComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IComponent.sol/IComponent.json +241 -60
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +438 -86
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +489 -163
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +250 -137
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +626 -189
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  17. package/artifacts/contracts/components/Product.sol/Product.json +427 -178
  18. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +4 -0
  19. package/artifacts/contracts/instance/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +1206 -0
  20. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +1 -1
  21. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +64 -50
  22. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.dbg.json +1 -1
  23. package/artifacts/contracts/instance/Cloneable.sol/Cloneable.json +5 -0
  24. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  25. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1562 -814
  26. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  27. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +227 -213
  28. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  29. package/artifacts/contracts/instance/Instance.sol/Instance.json +1119 -785
  30. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +1 -1
  31. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +463 -167
  32. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  33. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +418 -230
  34. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  35. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +439 -379
  36. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  37. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +355 -104
  38. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.dbg.json +1 -1
  39. package/artifacts/contracts/instance/ObjectManager.sol/ObjectManager.json +8 -13
  40. package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.dbg.json +1 -1
  41. package/artifacts/contracts/instance/base/ComponentService.sol/ComponentService.json +197 -169
  42. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +1 -1
  43. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  44. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +1 -1
  45. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +40 -10
  46. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  47. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +36 -11
  48. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +1 -1
  49. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +58 -75
  50. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  51. package/artifacts/contracts/instance/module/IComponents.sol/IComponents.dbg.json +4 -0
  52. package/artifacts/contracts/instance/module/IComponents.sol/IComponents.json +10 -0
  53. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  54. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  55. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  56. package/artifacts/contracts/instance/module/ISetup.sol/ISetup.dbg.json +1 -1
  57. package/artifacts/contracts/instance/module/ITreasury.sol/ITreasury.dbg.json +1 -1
  58. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.dbg.json +4 -0
  59. package/artifacts/contracts/instance/service/ApplicationService.sol/ApplicationService.json +1092 -0
  60. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +4 -0
  61. package/artifacts/contracts/instance/service/ApplicationServiceManager.sol/ApplicationServiceManager.json +672 -0
  62. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.dbg.json +1 -1
  63. package/artifacts/contracts/instance/service/BundleService.sol/BundleService.json +527 -338
  64. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
  65. package/artifacts/contracts/instance/service/BundleServiceManager.sol/BundleServiceManager.json +344 -93
  66. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.dbg.json +4 -0
  67. package/artifacts/contracts/instance/service/ClaimService.sol/ClaimService.json +1400 -0
  68. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +4 -0
  69. package/artifacts/contracts/instance/service/ClaimServiceManager.sol/ClaimServiceManager.json +760 -0
  70. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +1 -1
  71. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +1282 -256
  72. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  73. package/artifacts/contracts/instance/service/DistributionServiceManager.sol/DistributionServiceManager.json +430 -87
  74. package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.dbg.json +4 -0
  75. package/artifacts/contracts/instance/service/IApplicationService.sol/IApplicationService.json +619 -0
  76. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.dbg.json +1 -1
  77. package/artifacts/contracts/instance/service/IBundleService.sol/IBundleService.json +279 -264
  78. package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.dbg.json +4 -0
  79. package/artifacts/contracts/instance/service/IClaimService.sol/IClaimService.json +743 -0
  80. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +800 -159
  82. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.dbg.json +1 -1
  83. package/artifacts/contracts/instance/service/IPolicyService.sol/IPolicyService.json +159 -274
  84. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +1 -1
  85. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +701 -118
  86. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +1 -1
  87. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +71 -160
  88. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.dbg.json +1 -1
  89. package/artifacts/contracts/instance/service/PolicyService.sol/PolicyService.json +338 -412
  90. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
  91. package/artifacts/contracts/instance/service/PolicyServiceManager.sol/PolicyServiceManager.json +299 -128
  92. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +1 -1
  93. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +1062 -198
  94. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  95. package/artifacts/contracts/instance/service/PoolServiceManager.sol/PoolServiceManager.json +384 -89
  96. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +1 -1
  97. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +231 -223
  98. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.dbg.json +1 -1
  99. package/artifacts/contracts/instance/service/ProductServiceManager.sol/ProductServiceManager.json +298 -95
  100. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  101. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +15 -2
  102. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  103. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +34 -2
  104. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  105. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +70 -193
  106. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  107. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +18 -0
  108. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  109. package/artifacts/contracts/registry/Registry.sol/Registry.json +47 -15
  110. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.dbg.json +1 -1
  111. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.json +2 -2
  112. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  113. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +182 -232
  114. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  115. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +287 -94
  116. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +1 -1
  117. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +23 -11
  118. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  119. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +128 -37
  120. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +1 -1
  121. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +1 -1
  122. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +41 -3
  123. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  124. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +27 -29
  125. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.dbg.json +4 -0
  126. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.json +189 -0
  127. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  128. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +8 -29
  129. package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.dbg.json +4 -0
  130. package/artifacts/contracts/{experiment/inheritance/IA.sol/ISharedA.json → shared/IRegistryLinked.sol/IRegistryLinked.json} +15 -17
  131. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  132. package/artifacts/contracts/shared/IService.sol/IService.json +71 -160
  133. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +1 -1
  134. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +2 -152
  135. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  136. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +100 -33
  137. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +4 -0
  138. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.json +302 -0
  139. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +1 -1
  140. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +283 -76
  141. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  142. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +115 -58
  143. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +4 -0
  144. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.json +71 -0
  145. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  146. package/artifacts/contracts/shared/Service.sol/Service.json +172 -160
  147. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  148. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +2 -2
  149. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +1 -1
  150. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +2 -2
  151. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +1 -1
  152. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +2 -152
  153. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +1 -1
  154. package/artifacts/contracts/test/TestFee.sol/TestFee.json +2 -2
  155. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +1 -1
  156. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +115 -58
  157. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +1 -1
  158. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +6 -6
  159. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +1 -1
  160. package/artifacts/contracts/test/TestService.sol/TestService.json +190 -210
  161. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +1 -1
  162. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +1 -1
  163. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +2 -2
  164. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +1 -1
  165. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +8 -190
  166. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +1 -1
  167. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  168. package/artifacts/contracts/types/Amount.sol/AmountLib.dbg.json +4 -0
  169. package/artifacts/contracts/types/Amount.sol/AmountLib.json +209 -0
  170. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  171. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
  172. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  173. package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.dbg.json +4 -0
  174. package/artifacts/contracts/types/ClaimId.sol/ClaimIdLib.json +179 -0
  175. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  176. package/artifacts/contracts/types/DistributorType.sol/DistributorTypeLib.json +2 -2
  177. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +1 -1
  178. package/artifacts/contracts/types/Fee.sol/FeeLib.json +40 -9
  179. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +1 -1
  180. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +2 -2
  181. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  182. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +17 -4
  183. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  184. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +2 -2
  185. package/artifacts/contracts/types/NumberId.sol/NumberIdLib.dbg.json +1 -1
  186. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  187. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +2 -2
  188. package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.dbg.json +4 -0
  189. package/artifacts/contracts/types/PayoutId.sol/PayoutIdLib.json +209 -0
  190. package/artifacts/contracts/types/Referral.sol/ReferralLib.dbg.json +1 -1
  191. package/artifacts/contracts/types/Referral.sol/ReferralLib.json +23 -4
  192. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +1 -1
  193. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +2 -2
  194. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +1 -1
  195. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +2 -2
  196. package/artifacts/contracts/types/Seconds.sol/SecondsLib.dbg.json +4 -0
  197. package/artifacts/contracts/types/Seconds.sol/SecondsLib.json +124 -0
  198. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +1 -1
  199. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +2 -2
  200. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  201. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +38 -7
  202. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +1 -1
  203. package/artifacts/contracts/types/UFixed.sol/MathLib.json +2 -2
  204. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +1 -1
  205. package/artifacts/contracts/types/UFixed.sol/UFixedLib.json +2 -2
  206. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +1 -1
  207. package/artifacts/contracts/types/Version.sol/VersionLib.json +2 -2
  208. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +1 -1
  209. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +2 -2
  210. package/contracts/components/Component.sol +134 -78
  211. package/contracts/components/Distribution.sol +190 -57
  212. package/contracts/components/IComponent.sol +62 -15
  213. package/contracts/components/IDistributionComponent.sol +39 -15
  214. package/contracts/components/IPoolComponent.sol +84 -31
  215. package/contracts/components/IProductComponent.sol +3 -2
  216. package/contracts/components/Pool.sol +223 -148
  217. package/contracts/components/Product.sol +221 -115
  218. package/contracts/instance/AccessManagerUpgradeableInitializeable.sol +13 -0
  219. package/contracts/instance/BundleManager.sol +10 -9
  220. package/contracts/instance/Cloneable.sol +7 -2
  221. package/contracts/instance/IInstance.sol +51 -19
  222. package/contracts/instance/IInstanceService.sol +33 -11
  223. package/contracts/instance/Instance.sol +143 -94
  224. package/contracts/instance/InstanceAccessManager.sol +389 -160
  225. package/contracts/instance/InstanceReader.sol +85 -12
  226. package/contracts/instance/InstanceService.sol +273 -224
  227. package/contracts/instance/InstanceServiceManager.sol +1 -1
  228. package/contracts/instance/ObjectManager.sol +6 -8
  229. package/contracts/instance/base/ComponentService.sol +28 -32
  230. package/contracts/instance/base/KeyValueStore.sol +13 -36
  231. package/contracts/instance/base/Lifecycle.sol +26 -6
  232. package/contracts/instance/module/IAccess.sol +22 -16
  233. package/contracts/instance/module/IBundle.sol +8 -5
  234. package/contracts/instance/module/IComponents.sol +41 -0
  235. package/contracts/instance/module/IDistribution.sol +2 -0
  236. package/contracts/instance/module/IPolicy.sol +41 -9
  237. package/contracts/instance/module/ISetup.sol +7 -20
  238. package/contracts/instance/service/ApplicationService.sol +356 -0
  239. package/contracts/instance/service/ApplicationServiceManager.sol +35 -0
  240. package/contracts/instance/service/BundleService.sol +224 -132
  241. package/contracts/instance/service/BundleServiceManager.sol +1 -1
  242. package/contracts/instance/service/ClaimService.sol +444 -0
  243. package/contracts/instance/service/ClaimServiceManager.sol +35 -0
  244. package/contracts/instance/service/DistributionService.sol +344 -19
  245. package/contracts/instance/service/DistributionServiceManager.sol +1 -1
  246. package/contracts/instance/service/IApplicationService.sol +78 -0
  247. package/contracts/instance/service/IBundleService.sol +93 -22
  248. package/contracts/instance/service/IClaimService.sol +90 -0
  249. package/contracts/instance/service/IDistributionService.sol +87 -0
  250. package/contracts/instance/service/IPolicyService.sol +36 -50
  251. package/contracts/instance/service/IPoolService.sol +106 -3
  252. package/contracts/instance/service/PolicyService.sol +166 -346
  253. package/contracts/instance/service/PolicyServiceManager.sol +2 -2
  254. package/contracts/instance/service/PoolService.sol +312 -19
  255. package/contracts/instance/service/PoolServiceManager.sol +1 -1
  256. package/contracts/instance/service/ProductService.sol +35 -58
  257. package/contracts/instance/service/ProductServiceManager.sol +2 -2
  258. package/contracts/registry/ChainNft.sol +8 -0
  259. package/contracts/registry/IRegistry.sol +5 -2
  260. package/contracts/registry/IRegistryService.sol +12 -11
  261. package/contracts/registry/ITransferInterceptor.sol +1 -0
  262. package/contracts/registry/Registry.sol +43 -28
  263. package/contracts/registry/RegistryService.sol +70 -50
  264. package/contracts/registry/RegistryServiceManager.sol +13 -13
  265. package/contracts/registry/ReleaseManager.sol +32 -40
  266. package/contracts/registry/TokenRegistry.sol +16 -12
  267. package/contracts/shared/ERC165.sol +14 -12
  268. package/contracts/shared/INftOwnable.sol +11 -10
  269. package/contracts/shared/IPolicyHolder.sol +40 -0
  270. package/contracts/shared/IRegisterable.sol +3 -3
  271. package/contracts/shared/IRegistryLinked.sol +11 -0
  272. package/contracts/shared/IService.sol +6 -4
  273. package/contracts/shared/IVersionable.sol +4 -47
  274. package/contracts/shared/NftOwnable.sol +64 -85
  275. package/contracts/shared/PolicyHolder.sol +94 -0
  276. package/contracts/shared/ProxyManager.sol +100 -25
  277. package/contracts/shared/Registerable.sol +16 -27
  278. package/contracts/shared/RegistryLinked.sol +43 -0
  279. package/contracts/shared/Service.sol +32 -20
  280. package/contracts/shared/TokenHandler.sol +11 -5
  281. package/contracts/shared/Versionable.sol +4 -92
  282. package/contracts/test/TestRegisterable.sol +1 -1
  283. package/contracts/test/TestService.sol +1 -1
  284. package/contracts/types/Amount.sol +80 -0
  285. package/contracts/types/Blocknumber.sol +1 -0
  286. package/contracts/types/ClaimId.sol +75 -0
  287. package/contracts/types/DistributorType.sol +2 -2
  288. package/contracts/types/Fee.sol +13 -5
  289. package/contracts/types/NftId.sol +8 -0
  290. package/contracts/types/ObjectType.sol +11 -6
  291. package/contracts/types/PayoutId.sol +82 -0
  292. package/contracts/types/Referral.sol +4 -0
  293. package/contracts/types/RoleId.sol +16 -9
  294. package/contracts/types/Seconds.sol +54 -0
  295. package/contracts/types/StateId.sol +7 -2
  296. package/contracts/types/Timestamp.sol +18 -13
  297. package/contracts/types/UFixed.sol +1 -0
  298. package/contracts/types/Version.sol +1 -0
  299. package/package.json +3 -3
  300. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.dbg.json +0 -4
  301. package/artifacts/contracts/experiment/cloning/Cloner.sol/Cloner.json +0 -66
  302. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.dbg.json +0 -4
  303. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock1.json +0 -24
  304. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.dbg.json +0 -4
  305. package/artifacts/contracts/experiment/cloning/Cloner.sol/Mock2.json +0 -42
  306. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +0 -4
  307. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +0 -105
  308. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +0 -4
  309. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +0 -105
  310. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +0 -4
  311. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +0 -128
  312. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +0 -4
  313. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +0 -42
  314. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +0 -4
  315. package/artifacts/contracts/experiment/inheritance/B.sol/B.json +0 -76
  316. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +0 -4
  317. package/artifacts/contracts/experiment/inheritance/C.sol/C.json +0 -89
  318. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +0 -4
  319. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.json +0 -128
  320. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +0 -4
  321. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +0 -4
  322. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.json +0 -50
  323. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +0 -4
  324. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.json +0 -63
  325. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +0 -4
  326. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +0 -59
  327. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +0 -4
  328. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.json +0 -124
  329. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +0 -4
  330. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.json +0 -74
  331. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +0 -4
  332. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +0 -124
  333. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +0 -4
  334. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +0 -207
  335. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +0 -4
  336. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +0 -10
  337. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +0 -4
  338. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +0 -10
  339. package/contracts/experiment/cloning/Cloner.sol +0 -47
  340. package/contracts/experiment/errors/Require.sol +0 -38
  341. package/contracts/experiment/errors/Revert.sol +0 -44
  342. package/contracts/experiment/inheritance/A.sol +0 -53
  343. package/contracts/experiment/inheritance/B.sol +0 -28
  344. package/contracts/experiment/inheritance/C.sol +0 -34
  345. package/contracts/experiment/inheritance/IA.sol +0 -13
  346. package/contracts/experiment/inheritance/IB.sol +0 -10
  347. package/contracts/experiment/inheritance/IC.sol +0 -12
  348. package/contracts/experiment/statemachine/Dummy.sol +0 -27
  349. package/contracts/experiment/statemachine/ISM.sol +0 -25
  350. package/contracts/experiment/statemachine/SM.sol +0 -57
  351. package/contracts/experiment/statemachine/SimpleStateMachine.sol +0 -31
  352. package/contracts/experiment/types/TypeA.sol +0 -47
  353. package/contracts/experiment/types/TypeB.sol +0 -29
@@ -6,13 +6,15 @@ import {IInstance} from "../../instance/IInstance.sol";
6
6
  import {InstanceAccessManager} from "../InstanceAccessManager.sol";
7
7
  import {InstanceReader} from "../../instance/InstanceReader.sol";
8
8
  import {ISetup} from "../../instance/module/ISetup.sol";
9
+ import {IPolicy} from "../module/IPolicy.sol";
9
10
 
10
- import {NftId, NftIdLib} from "../../types/NftId.sol";
11
- import {Fee} from "../../types/Fee.sol";
12
- import {DISTRIBUTION_OWNER_ROLE} from "../../types/RoleId.sol";
11
+ import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
12
+ import {Fee, FeeLib} from "../../types/Fee.sol";
13
+ import {PRODUCT_SERVICE_ROLE, DISTRIBUTION_OWNER_ROLE} from "../../types/RoleId.sol";
13
14
  import {KEEP_STATE} from "../../types/StateId.sol";
14
- import {ObjectType, DISTRIBUTION} from "../../types/ObjectType.sol";
15
+ import {ObjectType, DISTRIBUTION, INSTANCE, DISTRIBUTION, DISTRIBUTOR} from "../../types/ObjectType.sol";
15
16
  import {Version, VersionLib} from "../../types/Version.sol";
17
+ import {RoleId} from "../../types/RoleId.sol";
16
18
 
17
19
  import {IVersionable} from "../../shared/IVersionable.sol";
18
20
  import {Versionable} from "../../shared/Versionable.sol";
@@ -25,11 +27,23 @@ import {IComponent} from "../../components/IComponent.sol";
25
27
  import {IDistributionComponent} from "../../components/IDistributionComponent.sol";
26
28
  import {IDistributionService} from "./IDistributionService.sol";
27
29
 
30
+ import {UFixed, UFixedLib} from "../../types/UFixed.sol";
31
+ import {DistributorType, DistributorTypeLib} from "../../types/DistributorType.sol";
32
+ import {ReferralId, ReferralStatus, ReferralLib} from "../../types/Referral.sol";
33
+ import {Timestamp, TimestampLib, zeroTimestamp} from "../../types/Timestamp.sol";
34
+ import {Key32} from "../../types/Key32.sol";
35
+ import {IDistribution} from "../module/IDistribution.sol";
36
+
37
+
28
38
  contract DistributionService is
29
39
  ComponentService,
30
40
  IDistributionService
31
41
  {
32
42
  using NftIdLib for NftId;
43
+ using TimestampLib for Timestamp;
44
+ using UFixedLib for UFixed;
45
+ using FeeLib for Fee;
46
+ using ReferralLib for ReferralId;
33
47
 
34
48
  address internal _registryAddress;
35
49
 
@@ -46,12 +60,11 @@ contract DistributionService is
46
60
  (registryAddress, initialOwner) = abi.decode(data, (address, address));
47
61
  // TODO while DistributionService is not deployed in DistributionServiceManager constructor
48
62
  // owner is DistributionServiceManager deployer
49
- _initializeService(registryAddress, owner);
50
-
51
- _registerInterface(type(IDistributionService).interfaceId);
63
+ initializeService(registryAddress, address(0), owner);
64
+ registerInterface(type(IDistributionService).interfaceId);
52
65
  }
53
66
 
54
- function getDomain() public pure override(Service, IService) returns(ObjectType) {
67
+ function getDomain() public pure override returns(ObjectType) {
55
68
  return DISTRIBUTION();
56
69
  }
57
70
 
@@ -75,32 +88,344 @@ contract DistributionService is
75
88
  distributionNftId = distributionInfo.nftId;
76
89
 
77
90
  instance.createDistributionSetup(distributionNftId, distribution.getSetupInfo());
78
- getInstanceService().createGifTarget(instanceNftId, distributionAddress, distribution.getName());
79
- getInstanceService().grantDistributionDefaultPermissions(instanceNftId, distributionAddress, distribution.getName());
80
- }
91
+ // TODO move to distribution?
92
+ bytes4[][] memory selectors = new bytes4[][](2);
93
+ selectors[0] = new bytes4[](1);
94
+ selectors[1] = new bytes4[](2);
81
95
 
82
- function _decodeAndVerifyDistributionData(bytes memory data)
83
- internal
84
- returns(string memory name)
85
- {
86
- (name) = abi.decode(data, (string));
96
+ selectors[0][0] = IDistributionComponent.setFees.selector;
97
+ selectors[1][0] = IDistributionComponent.processRenewal.selector;
87
98
 
88
- // TODO add checks if applicable
99
+ RoleId[] memory roles = new RoleId[](2);
100
+ roles[0] = DISTRIBUTION_OWNER_ROLE();
101
+ roles[1] = PRODUCT_SERVICE_ROLE();
102
+
103
+ getInstanceService().createGifTarget(
104
+ instanceNftId,
105
+ distributionAddress,
106
+ distribution.getName(),
107
+ selectors,
108
+ roles);
89
109
  }
90
110
 
91
111
  function setFees(
112
+ Fee memory minDistributionOwnerFee,
92
113
  Fee memory distributionFee
93
114
  )
94
115
  external
95
116
  override
96
117
  {
97
- (IRegistry.ObjectInfo memory info , IInstance instance) = _getAndVerifyComponentInfoAndInstance(DISTRIBUTION());
118
+ if (minDistributionOwnerFee.fractionalFee > distributionFee.fractionalFee) {
119
+ revert ErrorIDistributionServiceMinFeeTooHigh(minDistributionOwnerFee.fractionalFee.toInt(), distributionFee.fractionalFee.toInt());
120
+ }
121
+
122
+ (NftId distributionNftId, IRegistry.ObjectInfo memory info , IInstance instance) = _getAndVerifyComponentInfoAndInstance(DISTRIBUTION());
98
123
  InstanceReader instanceReader = instance.getInstanceReader();
99
- NftId distributionNftId = info.nftId;
100
124
 
101
125
  ISetup.DistributionSetupInfo memory distSetupInfo = instanceReader.getDistributionSetupInfo(distributionNftId);
126
+ distSetupInfo.minDistributionOwnerFee = minDistributionOwnerFee;
102
127
  distSetupInfo.distributionFee = distributionFee;
103
128
 
104
129
  instance.updateDistributionSetup(distributionNftId, distSetupInfo, KEEP_STATE());
105
130
  }
131
+
132
+ function createDistributorType(
133
+ string memory name,
134
+ UFixed minDiscountPercentage,
135
+ UFixed maxDiscountPercentage,
136
+ UFixed commissionPercentage,
137
+ uint32 maxReferralCount,
138
+ uint32 maxReferralLifetime,
139
+ bool allowSelfReferrals,
140
+ bool allowRenewals,
141
+ bytes memory data
142
+ )
143
+ external
144
+ returns (DistributorType distributorType)
145
+ {
146
+ (NftId distributionNftId, IInstance instance) = _getAndVerifyCallingDistribution();
147
+
148
+ {
149
+ ISetup.DistributionSetupInfo memory setupInfo = instance.getInstanceReader().getDistributionSetupInfo(distributionNftId);
150
+ UFixed variableFeesPartsTotal = setupInfo.minDistributionOwnerFee.fractionalFee.add(commissionPercentage);
151
+ UFixed maxDiscountPercentageLimit = setupInfo.distributionFee.fractionalFee.sub(variableFeesPartsTotal);
152
+ if (maxDiscountPercentage.gt(maxDiscountPercentageLimit)) {
153
+ revert ErrorIDistributionServiceMaxDiscountTooHigh(maxDiscountPercentage.toInt(), maxDiscountPercentageLimit.toInt());
154
+ }
155
+ }
156
+
157
+ distributorType = DistributorTypeLib.toDistributorType(distributionNftId, name);
158
+ IDistribution.DistributorTypeInfo memory info = IDistribution.DistributorTypeInfo(
159
+ name,
160
+ minDiscountPercentage,
161
+ maxDiscountPercentage,
162
+ commissionPercentage,
163
+ maxReferralCount,
164
+ maxReferralLifetime,
165
+ allowSelfReferrals,
166
+ allowRenewals,
167
+ data);
168
+
169
+ instance.createDistributorType(distributorType, info);
170
+ }
171
+
172
+ function createDistributor(
173
+ address distributor,
174
+ DistributorType distributorType,
175
+ bytes memory data
176
+ ) external returns (NftId distributorNftId)
177
+ {
178
+ (NftId distributionNftId, IInstance instance) = _getAndVerifyCallingDistribution();
179
+
180
+ distributorNftId = getRegistryService().registerDistributor(
181
+ IRegistry.ObjectInfo(
182
+ zeroNftId(),
183
+ distributionNftId,
184
+ DISTRIBUTOR(),
185
+ true, // intercepting property for bundles is defined on pool
186
+ address(0),
187
+ distributor,
188
+ ""
189
+ ));
190
+
191
+ IDistribution.DistributorInfo memory info = IDistribution.DistributorInfo(
192
+ distributorType,
193
+ true, // active
194
+ data,
195
+ 0,
196
+ 0);
197
+
198
+ instance.createDistributor(distributorNftId, info);
199
+ }
200
+
201
+ function updateDistributorType(
202
+ NftId distributorNftId,
203
+ DistributorType distributorType,
204
+ bytes memory data
205
+ ) external virtual
206
+ {
207
+ (, IInstance instance) = _getAndVerifyCallingDistribution();
208
+ InstanceReader instanceReader = instance.getInstanceReader();
209
+ IDistribution.DistributorInfo memory distributorInfo = instanceReader.getDistributorInfo(distributorNftId);
210
+ distributorInfo.distributorType = distributorType;
211
+ distributorInfo.data = data;
212
+ instance.updateDistributor(distributorNftId, distributorInfo, KEEP_STATE());
213
+ }
214
+
215
+
216
+ function createReferral(
217
+ NftId distributorNftId,
218
+ string memory code,
219
+ UFixed discountPercentage,
220
+ uint32 maxReferrals,
221
+ Timestamp expiryAt,
222
+ bytes memory data
223
+ )
224
+ external
225
+ virtual
226
+ returns (ReferralId referralId)
227
+ {
228
+ (NftId distributionNftId, IInstance instance) = _getAndVerifyCallingDistribution();
229
+
230
+ if (bytes(code).length == 0) {
231
+ revert ErrorIDistributionServiceInvalidReferral(code);
232
+ }
233
+ if (expiryAt.eqz()) {
234
+ revert ErrorIDistributionServiceExpirationInvalid(expiryAt);
235
+ }
236
+
237
+ InstanceReader instanceReader = instance.getInstanceReader();
238
+ IDistribution.DistributorInfo memory distributorInfo = instanceReader.getDistributorInfo(distributorNftId);
239
+ DistributorType distributorType = distributorInfo.distributorType;
240
+ IDistribution.DistributorTypeInfo memory distributorTypeData = instanceReader.getDistributorTypeInfo(distributorType);
241
+
242
+ if (distributorTypeData.maxReferralCount < maxReferrals) {
243
+ revert ErrorIDistributionServiceMaxReferralsExceeded(distributorTypeData.maxReferralCount);
244
+ }
245
+ if (distributorTypeData.minDiscountPercentage > discountPercentage) {
246
+ revert ErrorIDistributionServiceDiscountTooLow(distributorTypeData.minDiscountPercentage.toInt(), discountPercentage.toInt());
247
+ }
248
+ if (distributorTypeData.maxDiscountPercentage < discountPercentage) {
249
+ revert ErrorIDistributionServiceDiscountTooHigh(distributorTypeData.maxDiscountPercentage.toInt(), discountPercentage.toInt());
250
+ }
251
+ if (expiryAt.toInt() - TimestampLib.blockTimestamp().toInt() > distributorTypeData.maxReferralLifetime) {
252
+ revert ErrorIDistributionServiceExpiryTooLong(distributorTypeData.maxReferralLifetime, expiryAt.toInt());
253
+ }
254
+
255
+ referralId = ReferralLib.toReferralId(distributionNftId, code);
256
+ IDistribution.ReferralInfo memory info = IDistribution.ReferralInfo(
257
+ distributorNftId,
258
+ code,
259
+ discountPercentage,
260
+ maxReferrals,
261
+ 0, // used referrals
262
+ expiryAt,
263
+ data
264
+ );
265
+
266
+ instance.createReferral(referralId, info);
267
+ return referralId;
268
+ }
269
+
270
+ function processSale(
271
+ NftId distributionNftId,
272
+ ReferralId referralId,
273
+ IPolicy.Premium memory premium,
274
+ uint256 transferredDistributionFeeAmount
275
+ )
276
+ external
277
+ virtual
278
+ {
279
+ bool isReferral = ! referralId.eqz();
280
+ bool referralValid = referralIsValid(distributionNftId, referralId);
281
+
282
+ if (isReferral && ! referralValid) {
283
+ revert ErrorIDistributionServiceReferralInvalid(distributionNftId, referralId);
284
+ }
285
+
286
+ IInstance instance = _getInstanceForDistribution(distributionNftId);
287
+ InstanceReader reader = instance.getInstanceReader();
288
+ IDistribution.ReferralInfo memory referralInfo = reader.getReferralInfo(referralId);
289
+ IDistribution.DistributorInfo memory distributorInfo = reader.getDistributorInfo(referralInfo.distributorNftId);
290
+ ISetup.DistributionSetupInfo memory setupInfo = reader.getDistributionSetupInfo(distributionNftId);
291
+
292
+ uint256 distributionOwnerFee = premium.distributionOwnerFeeFixAmount + premium.distributionOwnerFeeVarAmount;
293
+ uint256 commissionAmount = premium.commissionAmount;
294
+
295
+ if (transferredDistributionFeeAmount != distributionOwnerFee + commissionAmount) {
296
+ revert ErrorIDistributionServiceInvalidFeeTransferred(transferredDistributionFeeAmount, distributionOwnerFee + commissionAmount);
297
+ }
298
+
299
+
300
+ if (distributionOwnerFee > 0) {
301
+ setupInfo.sumDistributionOwnerFees += distributionOwnerFee;
302
+ instance.updateDistributionSetup(distributionNftId, setupInfo, KEEP_STATE());
303
+ }
304
+
305
+ if (isReferral) {
306
+ referralInfo.usedReferrals += 1;
307
+ instance.updateReferral(referralId, referralInfo, KEEP_STATE());
308
+
309
+ if (commissionAmount > 0) {
310
+ distributorInfo.sumCommisions += commissionAmount;
311
+ distributorInfo.numPoliciesSold += 1;
312
+ instance.updateDistributor(referralInfo.distributorNftId, distributorInfo, KEEP_STATE());
313
+ }
314
+ }
315
+ }
316
+
317
+ function calculateFeeAmount(
318
+ NftId distributionNftId,
319
+ ReferralId referralId,
320
+ IPolicy.Premium memory premium
321
+ )
322
+ external
323
+ virtual
324
+ view
325
+ returns (IPolicy.Premium memory finalPremium)
326
+ {
327
+ IInstance instance = _getInstanceForDistribution(distributionNftId);
328
+ InstanceReader reader = instance.getInstanceReader();
329
+
330
+ // first calculate all fixed and variable fees for the distribution - this will defined the fullPremium
331
+ ISetup.DistributionSetupInfo memory setupInfo = reader.getDistributionSetupInfo(distributionNftId);
332
+ Fee memory distributionFee = setupInfo.distributionFee;
333
+ Fee memory minDistributionOwnerFee = setupInfo.minDistributionOwnerFee;
334
+ uint256 distributionFeeVarAmount = (UFixedLib.toUFixed(premium.netPremiumAmount) * distributionFee.fractionalFee).toInt();
335
+ premium.distributionFeeVarAmount = distributionFeeVarAmount;
336
+ premium.fullPremiumAmount += distributionFeeVarAmount;
337
+
338
+ // if the referral is not valid, then the distribution owner gets everything
339
+ if (! referralIsValid(distributionNftId, referralId)) {
340
+ premium.distributionOwnerFeeFixAmount = premium.distributionFeeFixAmount;
341
+ premium.distributionOwnerFeeVarAmount = premium.distributionFeeVarAmount;
342
+ premium.premiumAmount = premium.fullPremiumAmount;
343
+ return premium;
344
+ }
345
+
346
+ // if the referral is valid, the the commission and discount are calculated based in the full premium
347
+ // the remaing amount goes to the distribution owner
348
+ {
349
+ IDistribution.ReferralInfo memory referralInfo = reader.getReferralInfo(referralId);
350
+ IDistribution.DistributorInfo memory distributorInfo = reader.getDistributorInfo(referralInfo.distributorNftId);
351
+ IDistribution.DistributorTypeInfo memory distributorTypeInfo = reader.getDistributorTypeInfo(distributorInfo.distributorType);
352
+
353
+ uint256 commissionAmount = UFixedLib.toUFixed(premium.netPremiumAmount).mul(distributorTypeInfo.commissionPercentage).toInt();
354
+ premium.commissionAmount = commissionAmount;
355
+ premium.discountAmount = UFixedLib.toUFixed(premium.fullPremiumAmount).mul(referralInfo.discountPercentage).toInt();
356
+ premium.distributionOwnerFeeFixAmount = minDistributionOwnerFee.fixedFee;
357
+ premium.distributionOwnerFeeVarAmount = distributionFeeVarAmount - commissionAmount - premium.discountAmount;
358
+ premium.premiumAmount = premium.fullPremiumAmount - premium.discountAmount;
359
+ }
360
+
361
+ // sanity check to validate the fee calculation
362
+ if (premium.distributionOwnerFeeFixAmount < minDistributionOwnerFee.fixedFee) {
363
+ revert ErrorIDistributionServiceFeeCalculationMismatch(
364
+ premium.distributionFeeFixAmount,
365
+ premium.distributionFeeVarAmount,
366
+ premium.distributionOwnerFeeFixAmount,
367
+ premium.distributionOwnerFeeVarAmount,
368
+ premium.commissionAmount,
369
+ premium.discountAmount
370
+ );
371
+ }
372
+ if ((premium.distributionFeeVarAmount) != (premium.discountAmount + premium.distributionOwnerFeeVarAmount + premium.commissionAmount)) {
373
+ revert ErrorIDistributionServiceFeeCalculationMismatch(
374
+ premium.distributionFeeFixAmount,
375
+ premium.distributionFeeVarAmount,
376
+ premium.distributionOwnerFeeFixAmount,
377
+ premium.distributionOwnerFeeVarAmount,
378
+ premium.commissionAmount,
379
+ premium.discountAmount
380
+ );
381
+ }
382
+
383
+ return premium;
384
+ }
385
+
386
+ // TODO: zero should return false
387
+ function referralIsValid(NftId distributionNftId, ReferralId referralId) public view returns (bool isValid) {
388
+ IInstance instance = _getInstanceForDistribution(distributionNftId);
389
+ IDistribution.ReferralInfo memory info = instance.getInstanceReader().getReferralInfo(referralId);
390
+
391
+ if (info.distributorNftId.eqz()) {
392
+ return false;
393
+ }
394
+
395
+ isValid = info.expiryAt.eqz() || (info.expiryAt.gtz() && TimestampLib.blockTimestamp() <= info.expiryAt);
396
+ isValid = isValid && info.usedReferrals < info.maxReferrals;
397
+ }
398
+
399
+ function _getAndVerifyCallingDistribution()
400
+ internal
401
+ view
402
+ returns(
403
+ NftId distributionNftId,
404
+ IInstance instance
405
+ )
406
+ {
407
+ distributionNftId = getRegistry().getNftId(msg.sender);
408
+ if (distributionNftId.eqz()) {
409
+ revert ErrorDistributionServiceCallerNotRegistered(msg.sender);
410
+ }
411
+
412
+ IRegistry.ObjectInfo memory info = getRegistry().getObjectInfo(distributionNftId);
413
+ if(info.objectType != DISTRIBUTION()) {
414
+ revert ErrorIDistributionServiceCallerNotDistributor(msg.sender);
415
+ }
416
+
417
+ address instanceAddress = getRegistry().getObjectInfo(info.parentNftId).objectAddress;
418
+ instance = IInstance(instanceAddress);
419
+ }
420
+
421
+
422
+ function _getInstanceForDistribution(NftId distributionNftId)
423
+ internal
424
+ view
425
+ returns(IInstance instance)
426
+ {
427
+ NftId instanceNftId = getRegistry().getObjectInfo(distributionNftId).parentNftId;
428
+ address instanceAddress = getRegistry().getObjectInfo(instanceNftId).objectAddress;
429
+ return IInstance(instanceAddress);
430
+ }
106
431
  }
@@ -16,7 +16,7 @@ contract DistributionServiceManager is ProxyManager {
16
16
  constructor(
17
17
  address registryAddress
18
18
  )
19
- ProxyManager()
19
+ ProxyManager(registryAddress)
20
20
  {
21
21
  DistributionService distSrv = new DistributionService();
22
22
  bytes memory data = abi.encode(registryAddress, address(this));
@@ -0,0 +1,78 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IPolicy} from "../module/IPolicy.sol";
5
+ import {IService} from "../../shared/IService.sol";
6
+
7
+ import {NftId} from "../../types/NftId.sol";
8
+ import {ObjectType} from "../../types/ObjectType.sol";
9
+ import {ReferralId} from "../../types/Referral.sol";
10
+ import {RiskId} from "../../types/RiskId.sol";
11
+ import {Seconds} from "../../types/Seconds.sol";
12
+
13
+ /// @dev gif service responsible for creating applications
14
+ /// only product components may call transaction functions
15
+ interface IApplicationService is IService {
16
+
17
+ error ErrorApplicationServiceNotProduct(NftId callerNftId, ObjectType callerType);
18
+ error ErrorApplicationServiceBundlePoolMismatch(NftId bundleNftId, NftId bundlePoolNftId, NftId poolNftId);
19
+
20
+ /// @dev creates a new application based on the specified attributes
21
+ /// may only be called by a product component
22
+ function create(
23
+ address applicationOwner,
24
+ RiskId riskId,
25
+ uint256 sumInsuredAmount,
26
+ Seconds lifetime,
27
+ NftId bundleNftId,
28
+ ReferralId referralId,
29
+ bytes memory applicationData
30
+ ) external returns (NftId applicationNftId);
31
+
32
+ /// @dev updates application attributes
33
+ /// may only be called while the application is in applied state
34
+ /// may only be called by the referenced product related to applicationNftId
35
+ function adjust(
36
+ NftId applicationNftId,
37
+ RiskId riskId,
38
+ NftId bundleNftId,
39
+ ReferralId referralId,
40
+ uint256 sumInsuredAmount,
41
+ uint256 lifetime,
42
+ bytes memory applicationData
43
+ ) external;
44
+
45
+ /// @dev creates a new application that extends the provided policy
46
+ /// lifetime will seamlessly extend referenced policy, for closed policies
47
+ /// lifetime will start at underwriting time
48
+ /// product will need to limit the time window for renewal as underwriting
49
+ /// will lock the collateral at underwriting time which might be earlier than activation time
50
+ /// policyNftId needs to refer to an underwritten (or active or closed) policy
51
+ /// may only be called by the referenced product related to policyNftId
52
+ function renew(
53
+ NftId policyNftId, // policy to be renewd (renewal inherits policy attributes)
54
+ NftId bundleNftId // will likely need a newer bundle for underwriting
55
+ ) external returns (NftId applicationNftId);
56
+
57
+ /// @dev revokes the application represented by {policyNftId}
58
+ /// an application can only be revoked in applied state
59
+ /// only the application holder may revoke an application
60
+ function revoke(NftId policyNftId) external;
61
+
62
+ /// @dev calculates the premium amount for the specified attributes
63
+ /// also returns the various fee components involved with creating a policy
64
+ function calculatePremium(
65
+ NftId productNftId,
66
+ RiskId riskId,
67
+ uint256 sumInsuredAmount,
68
+ Seconds lifetime,
69
+ bytes memory applicationData,
70
+ NftId bundleNftId,
71
+ ReferralId referralId
72
+ )
73
+ external
74
+ view
75
+ returns (
76
+ IPolicy.Premium memory premium
77
+ );
78
+ }
@@ -1,44 +1,115 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  pragma solidity ^0.8.19;
3
3
 
4
+ import {Amount} from "../../types/Amount.sol";
4
5
  import {NftId} from "../../types/NftId.sol";
5
6
  import {Fee} from "../../types/Fee.sol";
6
- import {StateId} from "../../types/StateId.sol";
7
7
  import {IService} from "../../shared/IService.sol";
8
8
  import {IBundle} from "../module/IBundle.sol";
9
9
  import {IInstance} from "../../instance/IInstance.sol";
10
+ import {Seconds} from "../../types/Seconds.sol";
11
+ import {StateId} from "../../types/StateId.sol";
12
+ import {Timestamp} from "../../types/Timestamp.sol";
10
13
 
11
14
  interface IBundleService is IService {
12
- error ErrorIBundleServiceInsufficientAllowance(address bundleOwner, address tokenHandlerAddress, uint256 amount);
13
15
 
14
- function createBundle(
15
- address owner,
16
- Fee memory fee,
17
- uint256 amount,
18
- uint256 lifetime,
19
- bytes calldata filter
20
- ) external returns(NftId bundleNftId);
16
+ event LogBundleServiceBundleActivated(NftId bundleNftId);
17
+ event LogBundleServiceBundleLocked(NftId bundleNftId);
21
18
 
22
- function setBundleFee(
23
- NftId bundleNftId,
24
- Fee memory fee
25
- ) external;
19
+ error ErrorBundleServiceInsufficientAllowance(address bundleOwner, address tokenHandlerAddress, uint256 amount);
20
+ error ErrorBundleServiceBundleNotOpen(NftId bundleNftId, StateId state, Timestamp expiredAt);
21
+ error ErrorBundleServiceCapacityInsufficient(NftId bundleNftId, uint capacityAmount, uint collateralAmount);
22
+ error ErrorBundleServiceBundleWithOpenPolicies(NftId bundleNftId, uint256 openPoliciesCount);
26
23
 
27
- function updateBundle(NftId instanceNftId, NftId bundleNftId, IBundle.BundleInfo memory bundleInfo, StateId state) external;
24
+ error ErrorBundleServiceBundleUnknown(NftId bundleNftId);
25
+ error ErrorBundleServiceBundlePoolMismatch(NftId expectedPoolNftId, NftId bundlePoolNftId);
28
26
 
29
- function underwritePolicy(IInstance instanceNftId, NftId policyNftId, NftId bundleNftId, uint256 collateralAmount, uint256 netPremium) external;
27
+ error ErrorBundleServicePolicyNotCloseable(NftId policyNftId);
30
28
 
31
- function increaseBalance(IInstance instance, NftId bundleNftId, uint256 amount) external;
29
+ /// @dev create a new bundle for the specified attributes
30
+ /// may only be called by pool service
31
+ function create(
32
+ IInstance instance, // instance relevant for bundle
33
+ NftId poolNftId, // the pool the bundle will be linked to
34
+ address owner, // initial bundle owner
35
+ Fee memory fee, // fees deducted from premium that go to bundle owner
36
+ Amount stakingAmount, // staking amount - staking fees result in initial bundle capital
37
+ Seconds lifetime, // initial duration for which new policies are covered
38
+ bytes calldata filter // optional use case specific criteria that define if a policy may be covered by this bundle
39
+ )
40
+ external
41
+ returns(NftId bundleNftId); // the nft id of the newly created bundle
32
42
 
33
- function closePolicy(IInstance instance, NftId policyNftId, NftId bundleNftId, uint256 collateralAmount) external;
34
43
 
35
- // function fundBundle(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
44
+ /// @dev increase bundle stakes by the specified amount
45
+ /// may only be called by the bundle owner
46
+ // function stake(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
36
47
 
37
- // function defundBundle(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
48
+ // function unstake(NftId bundleNftId, uint256 amount) external returns(uint256 netAmount);
38
49
 
39
- function lockBundle(NftId bundleNftId) external;
50
+ /// @dev locks the specified bundle, locked bundles are not available to collateralize new policies
51
+ /// only active bundles may be locked
52
+ /// may only be called by registered and unlocked pool components
53
+ function lock(NftId bundleNftId) external;
40
54
 
41
- function unlockBundle(NftId bundleNftId) external;
55
+ /// @dev activates the specified bundle
56
+ /// only locked bundles may be unlocked
57
+ /// may only be called by registered and unlocked pool components
58
+ function unlock(NftId bundleNftId) external;
59
+
60
+ /// @dev closes the specified bundle
61
+ /// only open bundles (active or locked) may be closed
62
+ /// to close a bundle it may not have any non-closed polices attached to it
63
+ /// may only be called by registered and unlocked pool components
64
+ function close(
65
+ IInstance instance,
66
+ NftId bundleNftId
67
+ ) external;
68
+
69
+ /// @dev set bundle fee to provided value
70
+ /// may only be called by registered and unlocked pool components
71
+ function setFee(
72
+ NftId bundleNftId,
73
+ Fee memory fee
74
+ ) external;
42
75
 
43
- // function closeBundle(NftId bundleNftId) external;
76
+
77
+ /// @dev locks the specified collateral in the bundle
78
+ /// the locked collateral is added to the bundle locked capital
79
+ /// the bundles' fees are updated with the fees for this premium
80
+ /// the premium (minus bundle fee) is added to the bundle capital
81
+ /// may only be called by pool service
82
+ function lockCollateral(
83
+ IInstance instanceNftId,
84
+ NftId policyNftId,
85
+ NftId bundleNftId,
86
+ uint256 collateralAmount,
87
+ uint256 premium // premium amount after pool fee
88
+ ) external;
89
+
90
+ /// @dev releases the specified collateral in the bundle
91
+ /// may only be called by pool service
92
+ function releaseCollateral(
93
+ IInstance instance,
94
+ NftId policyNftId,
95
+ NftId bundleNftId,
96
+ uint256 collateralAmount
97
+ ) external;
98
+
99
+ /// @dev unlink policy from bundle
100
+ /// policy may only be unlinked if policy is closeable
101
+ /// may only be called by pool service
102
+ function unlinkPolicy(
103
+ IInstance instance,
104
+ NftId policyNftId
105
+ ) external;
106
+
107
+ /// @dev updates the bundle's fees of with the provided fee amount
108
+ function updateBundleFees(
109
+ IInstance instance,
110
+ NftId bundleNftId,
111
+ Amount feeAmount
112
+ ) external;
113
+
114
+ function increaseBalance(IInstance instance, NftId bundleNftId, uint256 amount) external;
44
115
  }