@etherisc/gif-next 0.0.2-7631288 → 0.0.2-7878646-744

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 (344) hide show
  1. package/README.md +293 -1
  2. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.dbg.json +4 -0
  3. package/artifacts/contracts/components/BaseComponent.sol/BaseComponent.json +301 -0
  4. package/artifacts/contracts/components/Distribution.sol/Distribution.dbg.json +4 -0
  5. package/artifacts/contracts/components/Distribution.sol/Distribution.json +557 -0
  6. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.dbg.json +4 -0
  7. package/artifacts/contracts/components/IBaseComponent.sol/IBaseComponent.json +254 -0
  8. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.dbg.json +4 -0
  9. package/artifacts/contracts/components/IDistributionComponent.sol/IDistributionComponent.json +177 -0
  10. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.dbg.json +4 -0
  11. package/artifacts/contracts/components/IPoolComponent.sol/IPoolComponent.json +308 -0
  12. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.dbg.json +4 -0
  13. package/artifacts/contracts/components/IProductComponent.sol/IProductComponent.json +207 -0
  14. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +4 -0
  15. package/artifacts/contracts/components/Pool.sol/Pool.json +716 -0
  16. package/artifacts/contracts/components/Product.sol/Product.dbg.json +4 -0
  17. package/artifacts/contracts/components/Product.sol/Product.json +614 -0
  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 +4 -0
  25. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +105 -0
  26. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +4 -0
  27. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +105 -0
  28. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +4 -0
  29. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +128 -0
  30. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +4 -0
  31. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +42 -0
  32. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +4 -0
  33. package/artifacts/contracts/experiment/inheritance/B.sol/B.json +76 -0
  34. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +4 -0
  35. package/artifacts/contracts/experiment/inheritance/C.sol/C.json +89 -0
  36. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +4 -0
  37. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.json +128 -0
  38. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +4 -0
  39. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.json +37 -0
  40. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +4 -0
  41. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.json +50 -0
  42. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +4 -0
  43. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.json +63 -0
  44. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +4 -0
  45. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +59 -0
  46. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +4 -0
  47. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.json +124 -0
  48. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +4 -0
  49. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.json +74 -0
  50. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +4 -0
  51. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +124 -0
  52. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +4 -0
  53. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +207 -0
  54. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +4 -0
  55. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +10 -0
  56. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +4 -0
  57. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +10 -0
  58. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +4 -0
  59. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +1940 -0
  60. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.dbg.json +4 -0
  61. package/artifacts/contracts/instance/IInstanceLinked.sol/IInstanceLinked.json +24 -0
  62. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +4 -0
  63. package/artifacts/contracts/instance/Instance.sol/Instance.json +2334 -0
  64. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.dbg.json +4 -0
  65. package/artifacts/contracts/instance/base/ComponentServiceBase.sol/ComponentServiceBase.json +481 -0
  66. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.dbg.json +4 -0
  67. package/artifacts/contracts/instance/base/IInstanceBase.sol/IInstanceBase.json +113 -0
  68. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.dbg.json +4 -0
  69. package/artifacts/contracts/instance/base/IKeyValueStore.sol/IKeyValueStore.json +560 -0
  70. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.dbg.json +4 -0
  71. package/artifacts/contracts/instance/base/ILifecycle.sol/ILifecycle.json +115 -0
  72. package/artifacts/contracts/instance/base/IService.sol/IService.dbg.json +4 -0
  73. package/artifacts/contracts/instance/base/IService.sol/IService.json +421 -0
  74. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.dbg.json +4 -0
  75. package/artifacts/contracts/instance/base/InstanceBase.sol/InstanceBase.json +544 -0
  76. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.dbg.json +4 -0
  77. package/artifacts/contracts/instance/base/KeyValueStore.sol/KeyValueStore.json +710 -0
  78. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.dbg.json +4 -0
  79. package/artifacts/contracts/instance/base/Lifecycle.sol/Lifecycle.json +169 -0
  80. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.dbg.json +4 -0
  81. package/artifacts/contracts/instance/base/ModuleBase.sol/ModuleBase.json +10 -0
  82. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.dbg.json +4 -0
  83. package/artifacts/contracts/instance/base/ServiceBase.sol/ServiceBase.json +468 -0
  84. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.dbg.json +4 -0
  85. package/artifacts/contracts/instance/module/bundle/BundleModule.sol/BundleModule.json +297 -0
  86. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.dbg.json +4 -0
  87. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundle.json +10 -0
  88. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.dbg.json +4 -0
  89. package/artifacts/contracts/instance/module/bundle/IBundle.sol/IBundleModule.json +297 -0
  90. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.dbg.json +4 -0
  91. package/artifacts/contracts/instance/module/component/ComponentModule.sol/ComponentModule.json +117 -0
  92. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.dbg.json +4 -0
  93. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponent.json +10 -0
  94. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.dbg.json +4 -0
  95. package/artifacts/contracts/instance/module/component/IComponent.sol/IComponentModule.json +117 -0
  96. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.dbg.json +4 -0
  97. package/artifacts/contracts/instance/module/distribution/DistributionModule.sol/DistributionModule.json +10 -0
  98. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.dbg.json +4 -0
  99. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistribution.json +10 -0
  100. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.dbg.json +4 -0
  101. package/artifacts/contracts/instance/module/distribution/IDistribution.sol/IDistributionModule.json +10 -0
  102. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.dbg.json +4 -0
  103. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicy.json +10 -0
  104. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.dbg.json +4 -0
  105. package/artifacts/contracts/instance/module/policy/IPolicy.sol/IPolicyModule.json +271 -0
  106. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.dbg.json +4 -0
  107. package/artifacts/contracts/instance/module/policy/PolicyModule.sol/PolicyModule.json +271 -0
  108. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.dbg.json +4 -0
  109. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPool.json +10 -0
  110. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.dbg.json +4 -0
  111. package/artifacts/contracts/instance/module/pool/IPoolModule.sol/IPoolModule.json +164 -0
  112. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.dbg.json +4 -0
  113. package/artifacts/contracts/instance/module/pool/PoolModule.sol/PoolModule.json +164 -0
  114. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.dbg.json +4 -0
  115. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRisk.json +10 -0
  116. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.dbg.json +4 -0
  117. package/artifacts/contracts/instance/module/risk/IRisk.sol/IRiskModule.json +113 -0
  118. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.dbg.json +4 -0
  119. package/artifacts/contracts/instance/module/risk/RiskModule.sol/RiskModule.json +131 -0
  120. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.dbg.json +4 -0
  121. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasury.json +10 -0
  122. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.dbg.json +4 -0
  123. package/artifacts/contracts/instance/module/treasury/ITreasury.sol/ITreasuryModule.json +638 -0
  124. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.dbg.json +4 -0
  125. package/artifacts/contracts/instance/module/treasury/TokenHandler.sol/TokenHandler.json +76 -0
  126. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +4 -0
  127. package/artifacts/contracts/instance/module/treasury/TreasuryModule.sol/TreasuryModule.json +638 -0
  128. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.dbg.json +4 -0
  129. package/artifacts/contracts/instance/service/ComponentOwnerService.sol/ComponentOwnerService.json +827 -0
  130. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.dbg.json +4 -0
  131. package/artifacts/contracts/instance/service/DistributionService.sol/DistributionService.json +630 -0
  132. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.dbg.json +4 -0
  133. package/artifacts/contracts/instance/service/IComponentOwnerService.sol/IComponentOwnerService.json +466 -0
  134. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.dbg.json +4 -0
  135. package/artifacts/contracts/instance/service/IDistributionService.sol/IDistributionService.json +446 -0
  136. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.dbg.json +4 -0
  137. package/artifacts/contracts/instance/service/IPoolService.sol/IPoolService.json +561 -0
  138. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.dbg.json +4 -0
  139. package/artifacts/contracts/instance/service/IProductService.sol/IProductService.json +751 -0
  140. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.dbg.json +4 -0
  141. package/artifacts/contracts/instance/service/PoolService.sol/PoolService.json +753 -0
  142. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.dbg.json +4 -0
  143. package/artifacts/contracts/instance/service/ProductService.sol/ProductService.json +1068 -0
  144. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +4 -0
  145. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +726 -0
  146. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +4 -0
  147. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +457 -0
  148. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +4 -0
  149. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +444 -0
  150. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +4 -0
  151. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +872 -0
  152. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +4 -0
  153. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +34 -0
  154. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +4 -0
  155. package/artifacts/contracts/registry/Registry.sol/Registry.json +713 -0
  156. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +4 -0
  157. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +1245 -0
  158. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +4 -0
  159. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +496 -0
  160. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.dbg.json +4 -0
  161. package/artifacts/contracts/shared/ContractDeployerLib.sol/ContractDeployerLib.json +107 -0
  162. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +4 -0
  163. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +35 -0
  164. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +4 -0
  165. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +127 -0
  166. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +4 -0
  167. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +201 -0
  168. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +4 -0
  169. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.json +205 -0
  170. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +4 -0
  171. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +158 -0
  172. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  173. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +349 -0
  174. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +4 -0
  175. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +274 -0
  176. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  177. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +129 -0
  178. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +4 -0
  179. package/artifacts/contracts/shared/Versionable.sol/Versionable.json +228 -0
  180. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.dbg.json +4 -0
  181. package/artifacts/contracts/test/TestDistribution.sol/TestDistribution.json +557 -0
  182. package/artifacts/contracts/test/TestFee.sol/TestFee.dbg.json +4 -0
  183. package/artifacts/contracts/test/TestFee.sol/TestFee.json +119 -0
  184. package/artifacts/contracts/test/TestPool.sol/TestPool.dbg.json +4 -0
  185. package/artifacts/contracts/test/TestPool.sol/TestPool.json +716 -0
  186. package/artifacts/contracts/test/TestProduct.sol/TestProduct.dbg.json +4 -0
  187. package/artifacts/contracts/test/TestProduct.sol/TestProduct.json +744 -0
  188. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.dbg.json +4 -0
  189. package/artifacts/contracts/test/TestRegisterable.sol/TestRegisterable.json +305 -0
  190. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.dbg.json +4 -0
  191. package/artifacts/contracts/test/TestRoleId.sol/TestRoleId.json +116 -0
  192. package/artifacts/contracts/test/TestService.sol/TestService.dbg.json +4 -0
  193. package/artifacts/contracts/test/TestService.sol/TestService.json +584 -0
  194. package/artifacts/contracts/test/TestToken.sol/TestUsdc.dbg.json +4 -0
  195. package/artifacts/contracts/test/TestToken.sol/TestUsdc.json +376 -0
  196. package/artifacts/contracts/test/TestVersion.sol/TestVersion.dbg.json +4 -0
  197. package/artifacts/contracts/test/TestVersion.sol/TestVersion.json +218 -0
  198. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.dbg.json +4 -0
  199. package/artifacts/contracts/test/TestVersionable.sol/TestVersionable.json +270 -0
  200. package/artifacts/contracts/test/Usdc.sol/USDC.dbg.json +4 -0
  201. package/artifacts/contracts/test/Usdc.sol/USDC.json +376 -0
  202. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.dbg.json +4 -0
  203. package/artifacts/contracts/types/AddressSet.sol/LibAddressSet.json +10 -0
  204. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +4 -0
  205. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +174 -0
  206. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +4 -0
  207. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +10 -0
  208. package/artifacts/contracts/types/Fee.sol/FeeLib.dbg.json +4 -0
  209. package/artifacts/contracts/types/Fee.sol/FeeLib.json +257 -0
  210. package/artifacts/contracts/types/Key32.sol/Key32Lib.dbg.json +4 -0
  211. package/artifacts/contracts/types/Key32.sol/Key32Lib.json +111 -0
  212. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +4 -0
  213. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +153 -0
  214. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.dbg.json +4 -0
  215. package/artifacts/contracts/types/NftIdSet.sol/LibNftIdSet.json +10 -0
  216. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +4 -0
  217. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +92 -0
  218. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.dbg.json +4 -0
  219. package/artifacts/contracts/types/ReferralId.sol/ReferralIdLib.json +99 -0
  220. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.dbg.json +4 -0
  221. package/artifacts/contracts/types/RiskId.sol/RiskIdLib.json +86 -0
  222. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.dbg.json +4 -0
  223. package/artifacts/contracts/types/RoleId.sol/RoleIdLib.json +30 -0
  224. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +4 -0
  225. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +92 -0
  226. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +4 -0
  227. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +236 -0
  228. package/artifacts/contracts/types/UFixed.sol/MathLib.dbg.json +4 -0
  229. package/artifacts/contracts/types/UFixed.sol/MathLib.json +10 -0
  230. package/artifacts/contracts/types/UFixed.sol/UFixedLib.dbg.json +4 -0
  231. package/artifacts/contracts/types/UFixed.sol/UFixedLib.json +479 -0
  232. package/artifacts/contracts/types/Version.sol/VersionLib.dbg.json +4 -0
  233. package/artifacts/contracts/types/Version.sol/VersionLib.json +177 -0
  234. package/artifacts/contracts/types/Version.sol/VersionPartLib.dbg.json +4 -0
  235. package/artifacts/contracts/types/Version.sol/VersionPartLib.json +30 -0
  236. package/contracts/components/BaseComponent.sol +79 -0
  237. package/contracts/components/Distribution.sol +155 -0
  238. package/contracts/components/IBaseComponent.sol +19 -0
  239. package/contracts/components/IDistributionComponent.sol +46 -0
  240. package/contracts/components/IPoolComponent.sol +64 -0
  241. package/contracts/components/IProductComponent.sol +37 -0
  242. package/contracts/components/Pool.sol +246 -0
  243. package/contracts/components/Product.sol +299 -0
  244. package/contracts/experiment/cloning/Cloner.sol +47 -0
  245. package/contracts/experiment/errors/Require.sol +38 -0
  246. package/contracts/experiment/errors/Revert.sol +44 -0
  247. package/contracts/experiment/inheritance/A.sol +53 -0
  248. package/contracts/experiment/inheritance/B.sol +28 -0
  249. package/contracts/experiment/inheritance/C.sol +34 -0
  250. package/contracts/experiment/inheritance/IA.sol +13 -0
  251. package/contracts/experiment/inheritance/IB.sol +10 -0
  252. package/contracts/experiment/inheritance/IC.sol +12 -0
  253. package/contracts/experiment/statemachine/Dummy.sol +27 -0
  254. package/contracts/experiment/statemachine/ISM.sol +25 -0
  255. package/contracts/experiment/statemachine/SM.sol +57 -0
  256. package/contracts/experiment/statemachine/SimpleStateMachine.sol +31 -0
  257. package/contracts/experiment/types/TypeA.sol +47 -0
  258. package/contracts/experiment/types/TypeB.sol +29 -0
  259. package/contracts/instance/IInstance.sol +52 -0
  260. package/contracts/instance/IInstanceLinked.sol +8 -0
  261. package/contracts/instance/Instance.sol +83 -0
  262. package/contracts/instance/base/ComponentServiceBase.sol +49 -0
  263. package/contracts/instance/base/IInstanceBase.sol +23 -0
  264. package/contracts/instance/base/IKeyValueStore.sol +50 -0
  265. package/contracts/instance/base/ILifecycle.sol +30 -0
  266. package/contracts/instance/base/IService.sol +15 -0
  267. package/contracts/instance/base/InstanceBase.sol +89 -0
  268. package/contracts/instance/base/KeyValueStore.sol +161 -0
  269. package/contracts/instance/base/Lifecycle.sol +100 -0
  270. package/contracts/instance/base/ModuleBase.sol +57 -0
  271. package/contracts/instance/base/ServiceBase.sol +44 -0
  272. package/contracts/instance/module/bundle/BundleModule.sol +134 -0
  273. package/contracts/instance/module/bundle/IBundle.sol +53 -0
  274. package/contracts/instance/module/component/ComponentModule.sol +71 -0
  275. package/contracts/instance/module/component/IComponent.sol +28 -0
  276. package/contracts/instance/module/distribution/DistributionModule.sol +17 -0
  277. package/contracts/instance/module/distribution/IDistribution.sol +10 -0
  278. package/contracts/instance/module/policy/IPolicy.sol +63 -0
  279. package/contracts/instance/module/policy/PolicyModule.sol +91 -0
  280. package/contracts/instance/module/pool/IPoolModule.sol +41 -0
  281. package/contracts/instance/module/pool/PoolModule.sol +95 -0
  282. package/contracts/instance/module/risk/IRisk.sol +26 -0
  283. package/contracts/instance/module/risk/RiskModule.sol +62 -0
  284. package/contracts/instance/module/treasury/ITreasury.sol +84 -0
  285. package/contracts/instance/module/treasury/TokenHandler.sol +48 -0
  286. package/contracts/instance/module/treasury/TreasuryModule.sol +131 -0
  287. package/contracts/instance/service/ComponentOwnerService.sol +315 -0
  288. package/contracts/instance/service/DistributionService.sol +54 -0
  289. package/contracts/instance/service/IComponentOwnerService.sol +20 -0
  290. package/contracts/instance/service/IDistributionService.sol +12 -0
  291. package/contracts/instance/service/IPoolService.sol +37 -0
  292. package/contracts/instance/service/IProductService.sol +107 -0
  293. package/contracts/instance/service/PoolService.sol +149 -0
  294. package/contracts/instance/service/ProductService.sol +510 -0
  295. package/contracts/registry/ChainNft.sol +187 -0
  296. package/contracts/registry/IChainNft.sol +22 -0
  297. package/contracts/registry/IRegistry.sol +57 -0
  298. package/contracts/registry/IRegistryService.sol +35 -0
  299. package/contracts/registry/ITransferInterceptor.sol +6 -0
  300. package/contracts/registry/Registry.sol +426 -0
  301. package/contracts/registry/RegistryService.sol +441 -0
  302. package/contracts/registry/RegistryServiceManager.sol +64 -0
  303. package/contracts/shared/ContractDeployerLib.sol +72 -0
  304. package/contracts/shared/ERC165.sol +21 -0
  305. package/contracts/shared/INftOwnable.sol +22 -0
  306. package/contracts/shared/IRegisterable.sol +17 -0
  307. package/contracts/shared/IVersionable.sol +96 -0
  308. package/contracts/shared/NftOwnable.sol +136 -0
  309. package/contracts/shared/ProxyManager.sol +94 -0
  310. package/contracts/shared/Registerable.sol +89 -0
  311. package/contracts/shared/UpgradableProxyWithAdmin.sol +16 -0
  312. package/contracts/shared/Versionable.sol +147 -0
  313. package/contracts/test/TestDistribution.sol +22 -0
  314. package/contracts/test/TestFee.sol +25 -0
  315. package/contracts/test/TestPool.sol +27 -0
  316. package/contracts/test/TestProduct.sol +74 -0
  317. package/contracts/test/TestRegisterable.sol +18 -0
  318. package/contracts/test/TestRoleId.sol +14 -0
  319. package/contracts/test/TestService.sol +26 -0
  320. package/contracts/{Dip.sol → test/TestToken.sol} +5 -5
  321. package/contracts/test/TestVersion.sol +44 -0
  322. package/contracts/test/TestVersionable.sol +17 -0
  323. package/contracts/test/Usdc.sol +26 -0
  324. package/contracts/types/AddressSet.sol +58 -0
  325. package/contracts/types/Blocknumber.sol +118 -0
  326. package/contracts/types/ChainId.sol +38 -0
  327. package/contracts/types/Fee.sol +56 -0
  328. package/contracts/types/Key32.sol +45 -0
  329. package/contracts/types/NftId.sol +72 -0
  330. package/contracts/types/NftIdSet.sol +60 -0
  331. package/contracts/types/ObjectType.sol +131 -0
  332. package/contracts/types/ReferralId.sol +48 -0
  333. package/contracts/types/RiskId.sol +43 -0
  334. package/contracts/types/RoleId.sol +45 -0
  335. package/contracts/types/StateId.sol +101 -0
  336. package/contracts/types/Timestamp.sol +123 -0
  337. package/contracts/types/UFixed.sol +325 -0
  338. package/contracts/types/Version.sol +104 -0
  339. package/package.json +26 -10
  340. package/artifacts/contracts/Dip.sol/DIP.dbg.json +0 -4
  341. package/artifacts/contracts/Dip.sol/DIP.json +0 -338
  342. package/artifacts/contracts/Lock.sol/Lock.dbg.json +0 -4
  343. package/artifacts/contracts/Lock.sol/Lock.json +0 -74
  344. package/contracts/Lock.sol +0 -34
@@ -0,0 +1,510 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IRegistry} from "../../registry/IRegistry.sol";
5
+ import {IProductComponent} from "../../components/IProductComponent.sol";
6
+ import {Product} from "../../components/Product.sol";
7
+ import {IPoolComponent} from "../../components/IPoolComponent.sol";
8
+ import {IDistributionComponent} from "../../components/IDistributionComponent.sol";
9
+ import {IInstance} from "../../instance/IInstance.sol";
10
+ import {IPolicy, IPolicyModule} from "../module/policy/IPolicy.sol";
11
+ import {IPool} from "../module/pool/IPoolModule.sol";
12
+ import {IRisk} from "../module/risk/IRisk.sol";
13
+ import {IBundle} from "../module/bundle/IBundle.sol";
14
+ import {IProductService} from "./IProductService.sol";
15
+ import {ITreasury, ITreasuryModule, TokenHandler} from "../../instance/module/treasury/ITreasury.sol";
16
+
17
+ import {IVersionable} from "../../shared/IVersionable.sol";
18
+ import {Versionable} from "../../shared/Versionable.sol";
19
+
20
+ import {Timestamp, zeroTimestamp} from "../../types/Timestamp.sol";
21
+ import {UFixed, UFixedLib} from "../../types/UFixed.sol";
22
+ import {Blocknumber, blockNumber} from "../../types/Blocknumber.sol";
23
+ import {ObjectType, INSTANCE, PRODUCT, POLICY} from "../../types/ObjectType.sol";
24
+ import {APPLIED, UNDERWRITTEN, ACTIVE} from "../../types/StateId.sol";
25
+ import {NftId, NftIdLib, zeroNftId} from "../../types/NftId.sol";
26
+ import {Fee, FeeLib} from "../../types/Fee.sol";
27
+ import {ReferralId} from "../../types/ReferralId.sol";
28
+ import {RiskId} from "../../types/RiskId.sol";
29
+ import {StateId} from "../../types/StateId.sol";
30
+ import {Version, VersionLib} from "../../types/Version.sol";
31
+
32
+ import {IService} from "../base/IService.sol";
33
+ import {ServiceBase} from "../base/ServiceBase.sol";
34
+ import {ComponentServiceBase} from "../base/ComponentServiceBase.sol";
35
+ import {IProductService} from "./IProductService.sol";
36
+
37
+ // TODO or name this ProtectionService to have Product be something more generic (loan, savings account, ...)
38
+ contract ProductService is ComponentServiceBase, IProductService {
39
+ using NftIdLib for NftId;
40
+
41
+ string public constant NAME = "ProductService";
42
+
43
+ event LogProductServiceSender(address sender);
44
+
45
+ constructor(
46
+ address registry,
47
+ NftId registryNftId,
48
+ address initialOwner
49
+ ) ComponentServiceBase(registry, registryNftId, initialOwner)
50
+ {
51
+ _registerInterface(type(IProductService).interfaceId);
52
+ }
53
+
54
+
55
+ function getName() public pure override(IService, ServiceBase) returns(string memory name) {
56
+ return NAME;
57
+ }
58
+
59
+ function setFees(
60
+ Fee memory productFee,
61
+ Fee memory processingFee
62
+ )
63
+ external
64
+ override
65
+ {
66
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
67
+ NftId productNftId = productInfo.nftId;
68
+ ITreasury.TreasuryInfo memory treasuryInfo = instance.getTreasuryInfo(productNftId);
69
+ treasuryInfo.productFee = productFee;
70
+ treasuryInfo.processingFee = processingFee;
71
+ instance.setTreasuryInfo(productNftId, treasuryInfo);
72
+ }
73
+
74
+ function createRisk(
75
+ RiskId riskId,
76
+ bytes memory data
77
+ ) external override {
78
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
79
+ NftId productNftId = productInfo.nftId;
80
+ instance.createRisk(
81
+ riskId,
82
+ productNftId,
83
+ data
84
+ );
85
+ }
86
+
87
+ function setRiskInfo(
88
+ RiskId riskId,
89
+ IRisk.RiskInfo memory info
90
+ ) external {
91
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
92
+ instance.setRiskInfo(
93
+ riskId,
94
+ info
95
+ );
96
+ }
97
+
98
+ function updateRiskState(
99
+ RiskId riskId,
100
+ StateId state
101
+ ) external {
102
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
103
+ instance.updateRiskState(
104
+ riskId,
105
+ state
106
+ );
107
+ }
108
+
109
+ function _getAndVerifyInstanceAndProduct() internal view returns (Product product) {
110
+ IRegistry.ObjectInfo memory productInfo;
111
+ (productInfo,) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
112
+ product = Product(productInfo.objectAddress);
113
+ }
114
+
115
+ function calculatePremium(
116
+ RiskId riskId,
117
+ uint256 sumInsuredAmount,
118
+ uint256 lifetime,
119
+ bytes memory applicationData,
120
+ NftId bundleNftId,
121
+ ReferralId referralId
122
+ )
123
+ public
124
+ view
125
+ override
126
+ returns (
127
+ uint256 premiumAmount,
128
+ uint256 productFeeAmount,
129
+ uint256 poolFeeAmount,
130
+ uint256 bundleFeeAmount,
131
+ uint256 distributionFeeAmount
132
+ )
133
+ {
134
+ Product product = _getAndVerifyInstanceAndProduct();
135
+ uint256 netPremiumAmount = product.calculateNetPremium(
136
+ sumInsuredAmount,
137
+ riskId,
138
+ lifetime,
139
+ applicationData
140
+ );
141
+
142
+ (
143
+ productFeeAmount,
144
+ poolFeeAmount,
145
+ bundleFeeAmount,
146
+ distributionFeeAmount
147
+ ) = _calculateFeeAmounts(
148
+ netPremiumAmount,
149
+ product,
150
+ bundleNftId,
151
+ referralId
152
+ );
153
+
154
+ premiumAmount = netPremiumAmount + productFeeAmount;
155
+ premiumAmount += poolFeeAmount + bundleFeeAmount;
156
+ premiumAmount += distributionFeeAmount;
157
+ }
158
+
159
+ function _calculateFeeAmounts(
160
+ uint256 netPremiumAmount,
161
+ Product product,
162
+ NftId bundleNftId,
163
+ ReferralId referralId
164
+ )
165
+ internal
166
+ view
167
+ returns (
168
+ uint256 productFeeAmount,
169
+ uint256 poolFeeAmount,
170
+ uint256 bundleFeeAmount,
171
+ uint256 distributionFeeAmount
172
+ )
173
+ {
174
+ IInstance instance = product.getInstance();
175
+ ITreasury.TreasuryInfo memory treasuryInfo = instance.getTreasuryInfo(product.getNftId());
176
+ IBundle.BundleInfo memory bundleInfo = instance.getBundleInfo(bundleNftId);
177
+ require(bundleInfo.poolNftId == treasuryInfo.poolNftId,"ERROR:PRS-035:BUNDLE_POOL_MISMATCH");
178
+
179
+ (productFeeAmount,) = FeeLib.calculateFee(treasuryInfo.productFee, netPremiumAmount);
180
+ (poolFeeAmount,) = FeeLib.calculateFee(treasuryInfo.poolFee, netPremiumAmount);
181
+ (bundleFeeAmount,) = FeeLib.calculateFee(bundleInfo.fee, netPremiumAmount);
182
+
183
+ IRegistry.ObjectInfo memory distributionInfo = getRegistry().getObjectInfo(treasuryInfo.distributionNftId);
184
+ IDistributionComponent distribution = IDistributionComponent(distributionInfo.objectAddress);
185
+ distributionFeeAmount = distribution.calculateFeeAmount(referralId, netPremiumAmount);
186
+ }
187
+
188
+
189
+ function createApplication(
190
+ address applicationOwner,
191
+ RiskId riskId,
192
+ uint256 sumInsuredAmount,
193
+ uint256 lifetime,
194
+ bytes memory applicationData,
195
+ NftId bundleNftId,
196
+ ReferralId referralId
197
+ ) external override returns (NftId policyNftId) {
198
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
199
+ // TODO add validations (see create bundle in pool service)
200
+
201
+ policyNftId = getRegistryService().registerPolicy(
202
+ IRegistry.ObjectInfo(
203
+ zeroNftId(),
204
+ productInfo.nftId,
205
+ POLICY(),
206
+ false, // intercepting property for policies is defined on product
207
+ address(0),
208
+ applicationOwner,
209
+ ""
210
+ )
211
+ );
212
+
213
+ (uint256 premiumAmount,,,,) = calculatePremium(
214
+ riskId,
215
+ sumInsuredAmount,
216
+ lifetime,
217
+ applicationData,
218
+ bundleNftId,
219
+ referralId
220
+ );
221
+
222
+ instance.createPolicyInfo(
223
+ policyNftId,
224
+ productInfo.nftId,
225
+ referralId,
226
+ riskId,
227
+ sumInsuredAmount,
228
+ premiumAmount,
229
+ lifetime,
230
+ bundleNftId
231
+ );
232
+
233
+ // TODO add logging
234
+ }
235
+
236
+ function _getAndVerifyUnderwritingSetup(
237
+ IInstance instance,
238
+ IPolicy.PolicyInfo memory policyInfo
239
+ )
240
+ internal
241
+ view
242
+ returns (
243
+ ITreasury.TreasuryInfo memory treasuryInfo,
244
+ NftId bundleNftId,
245
+ IBundle.BundleInfo memory bundleInfo,
246
+ uint256 collateralAmount
247
+ )
248
+ {
249
+ // check match between policy and bundle (via pool)
250
+ treasuryInfo = instance.getTreasuryInfo(policyInfo.productNftId);
251
+ bundleNftId = policyInfo.bundleNftId;
252
+ bundleInfo = instance.getBundleInfo(bundleNftId);
253
+ require(bundleInfo.poolNftId == treasuryInfo.poolNftId, "POLICY_BUNDLE_MISMATCH");
254
+
255
+ // calculate required collateral
256
+ NftId poolNftId = treasuryInfo.poolNftId;
257
+ IPool.PoolInfo memory poolInfo = instance.getPoolInfo(poolNftId);
258
+
259
+ // obtain remaining return values
260
+ collateralAmount = calculateRequiredCollateral(poolInfo.collateralizationLevel, policyInfo.sumInsuredAmount);
261
+ }
262
+
263
+ function _lockCollateralInBundle(
264
+ IInstance instance,
265
+ NftId bundleNftId,
266
+ IBundle.BundleInfo memory bundleInfo,
267
+ NftId policyNftId,
268
+ uint256 collateralAmount
269
+ )
270
+ internal
271
+ returns (IBundle.BundleInfo memory)
272
+ {
273
+ bundleInfo.lockedAmount += collateralAmount;
274
+ instance.collateralizePolicy(bundleNftId, policyNftId, collateralAmount);
275
+ return bundleInfo;
276
+ }
277
+
278
+ function _underwriteByPool(
279
+ ITreasury.TreasuryInfo memory treasuryInfo,
280
+ NftId policyNftId,
281
+ IPolicy.PolicyInfo memory policyInfo,
282
+ bytes memory bundleFilter,
283
+ uint256 collateralAmount
284
+ )
285
+ internal
286
+ {
287
+ address poolAddress = getRegistry().getObjectInfo(treasuryInfo.poolNftId).objectAddress;
288
+ IPoolComponent pool = IPoolComponent(poolAddress);
289
+ pool.underwrite(
290
+ policyNftId,
291
+ policyInfo.applicationData,
292
+ bundleFilter,
293
+ collateralAmount);
294
+ }
295
+
296
+
297
+ function revoke(
298
+ NftId policyNftId
299
+ )
300
+ external
301
+ override
302
+ {
303
+ require(false, "ERROR:PRS-234:NOT_YET_IMPLEMENTED");
304
+ }
305
+
306
+
307
+ function underwrite(
308
+ NftId policyNftId,
309
+ bool requirePremiumPayment,
310
+ Timestamp activateAt
311
+ )
312
+ external
313
+ override
314
+ {
315
+ // check caller is registered product
316
+ (
317
+ IRegistry.ObjectInfo memory productInfo,
318
+ IInstance instance
319
+ ) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
320
+
321
+ // check match between policy and calling product
322
+ NftId productNftId = productInfo.nftId;
323
+ IPolicy.PolicyInfo memory policyInfo = instance.getPolicyInfo(policyNftId);
324
+ require(policyInfo.productNftId == productNftId, "POLICY_PRODUCT_MISMATCH");
325
+ require(instance.getState(policyNftId.toKey32(POLICY())) == APPLIED(), "ERROR:PRS-021:STATE_NOT_APPLIED");
326
+
327
+ ITreasury.TreasuryInfo memory treasuryInfo;
328
+ NftId bundleNftId;
329
+ IBundle.BundleInfo memory bundleInfo;
330
+ uint256 collateralAmount;
331
+
332
+ (
333
+ treasuryInfo,
334
+ bundleNftId,
335
+ bundleInfo,
336
+ collateralAmount
337
+ ) = _getAndVerifyUnderwritingSetup(
338
+ instance,
339
+ policyInfo
340
+ );
341
+
342
+ // lock bundle collateral
343
+ bundleInfo = _lockCollateralInBundle(
344
+ instance,
345
+ bundleNftId,
346
+ bundleInfo,
347
+ policyNftId,
348
+ collateralAmount);
349
+
350
+ // set policy state to underwritten
351
+ instance.updatePolicyState(policyNftId, UNDERWRITTEN());
352
+
353
+ // optional activation of policy
354
+ if(activateAt > zeroTimestamp()) {
355
+ policyInfo.activatedAt = activateAt;
356
+ policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
357
+
358
+ instance.updatePolicyState(policyNftId, ACTIVE());
359
+ }
360
+
361
+ // optional collection of premium
362
+ if(requirePremiumPayment) {
363
+ uint256 netPremiumAmount = _processPremiumByTreasury(
364
+ instance,
365
+ productInfo.nftId,
366
+ treasuryInfo,
367
+ policyNftId,
368
+ policyInfo.premiumAmount);
369
+
370
+ policyInfo.premiumPaidAmount += policyInfo.premiumAmount;
371
+ bundleInfo.balanceAmount += netPremiumAmount;
372
+ }
373
+
374
+ instance.setPolicyInfo(policyNftId, policyInfo);
375
+ instance.setBundleInfo(bundleNftId, bundleInfo);
376
+
377
+ // involve pool if necessary
378
+ {
379
+ NftId poolNftId = treasuryInfo.poolNftId;
380
+ IPool.PoolInfo memory poolInfo = instance.getPoolInfo(poolNftId);
381
+
382
+ if(poolInfo.isVerifying) {
383
+ _underwriteByPool(
384
+ treasuryInfo,
385
+ policyNftId,
386
+ policyInfo,
387
+ bundleInfo.filter,
388
+ collateralAmount
389
+ );
390
+ }
391
+ }
392
+
393
+ // TODO add logging
394
+ }
395
+
396
+ function calculateRequiredCollateral(UFixed collateralizationLevel, uint256 sumInsuredAmount) public pure override returns(uint256 collateralAmount) {
397
+ UFixed sumInsuredUFixed = UFixedLib.toUFixed(sumInsuredAmount);
398
+ UFixed collateralUFixed = collateralizationLevel * sumInsuredUFixed;
399
+ return collateralUFixed.toInt();
400
+ }
401
+
402
+ function collectPremium(NftId policyNftId, Timestamp activateAt) external override {
403
+ // check caller is registered product
404
+ (IRegistry.ObjectInfo memory productInfo, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
405
+
406
+ // perform actual token transfers
407
+ IPolicy.PolicyInfo memory policyInfo = instance.getPolicyInfo(policyNftId);
408
+ ITreasury.TreasuryInfo memory treasuryInfo = instance.getTreasuryInfo(productInfo.nftId);
409
+
410
+ uint256 premiumAmount = policyInfo.premiumAmount;
411
+ _processPremiumByTreasury(instance, productInfo.nftId, treasuryInfo, policyNftId, premiumAmount);
412
+
413
+ // policy level book keeping for premium paid
414
+ policyInfo.premiumPaidAmount += premiumAmount;
415
+
416
+ // optional activation of policy
417
+ if(activateAt > zeroTimestamp()) {
418
+ require(
419
+ policyInfo.activatedAt.eqz(),
420
+ "ERROR:PRS-030:ALREADY_ACTIVATED");
421
+
422
+ policyInfo.activatedAt = activateAt;
423
+ policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
424
+
425
+ instance.updatePolicyState(policyNftId, ACTIVE());
426
+ }
427
+
428
+ instance.setPolicyInfo(policyNftId, policyInfo);
429
+
430
+ // TODO add logging
431
+ }
432
+
433
+ function activate(NftId policyNftId, Timestamp activateAt) external override {
434
+ // check caller is registered product
435
+ (, IInstance instance) = _getAndVerifyComponentInfoAndInstance(PRODUCT());
436
+
437
+ IPolicy.PolicyInfo memory policyInfo = instance.getPolicyInfo(policyNftId);
438
+
439
+ require(
440
+ policyInfo.activatedAt.eqz(),
441
+ "ERROR:PRS-020:ALREADY_ACTIVATED");
442
+
443
+ policyInfo.activatedAt = activateAt;
444
+ policyInfo.expiredAt = activateAt.addSeconds(policyInfo.lifetime);
445
+
446
+ instance.setPolicyInfo(policyNftId, policyInfo);
447
+ instance.updatePolicyState(policyNftId, ACTIVE());
448
+
449
+ // TODO add logging
450
+ }
451
+
452
+ function close(
453
+ NftId policyNftId
454
+ ) external override // solhint-disable-next-line no-empty-blocks
455
+ {
456
+
457
+ }
458
+
459
+ function _getPoolNftId(
460
+ IInstance instance,
461
+ NftId productNftId
462
+ )
463
+ internal
464
+ view
465
+ returns (NftId poolNftid)
466
+ {
467
+ return instance.getTreasuryInfo(productNftId).poolNftId;
468
+ }
469
+
470
+
471
+ function _processPremiumByTreasury(
472
+ IInstance instance,
473
+ NftId productNftId,
474
+ ITreasury.TreasuryInfo memory treasuryInfo,
475
+ NftId policyNftId,
476
+ uint256 premiumAmount
477
+ )
478
+ internal
479
+ returns (uint256 netPremiumAmount)
480
+ {
481
+ // process token transfer(s)
482
+ if(premiumAmount > 0) {
483
+ TokenHandler tokenHandler = instance.getTokenHandler(productNftId);
484
+ address policyOwner = getRegistry().ownerOf(policyNftId);
485
+ address poolWallet = instance.getComponentWallet(treasuryInfo.poolNftId);
486
+ netPremiumAmount = premiumAmount;
487
+ Fee memory productFee = treasuryInfo.productFee;
488
+
489
+ if (FeeLib.feeIsZero(productFee)) {
490
+ tokenHandler.transfer(
491
+ policyOwner,
492
+ poolWallet,
493
+ premiumAmount
494
+ );
495
+ } else {
496
+ (uint256 feeAmount, uint256 netAmount) = instance.calculateFeeAmount(
497
+ premiumAmount,
498
+ productFee
499
+ );
500
+
501
+ address productWallet = instance.getComponentWallet(productNftId);
502
+ tokenHandler.transfer(policyOwner, productWallet, feeAmount);
503
+ tokenHandler.transfer(policyOwner, poolWallet, netAmount);
504
+ netPremiumAmount = netAmount;
505
+ }
506
+ }
507
+
508
+ // TODO add logging
509
+ }
510
+ }
@@ -0,0 +1,187 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.20;
3
+
4
+ import {ERC721, ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
5
+ import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
6
+
7
+ import {IChainNft} from "./IChainNft.sol";
8
+ import {ITransferInterceptor} from "./ITransferInterceptor.sol";
9
+
10
+ contract ChainNft is ERC721Enumerable, IChainNft {
11
+ string public constant NAME = "Dezentralized Insurance Protocol Registry";
12
+ string public constant SYMBOL = "DIPR";
13
+
14
+ uint256 public constant PROTOCOL_NFT_ID = 1101;
15
+ uint256 public constant GLOBAL_REGISTRY_ID = 2101;
16
+
17
+ // remember interceptors
18
+ mapping(uint256 tokenId => address interceptor) private _interceptor;
19
+
20
+ // remember token uri
21
+ mapping(uint256 tokenId => string uri) private _uri;
22
+
23
+ // remember registry
24
+ address private _registry;
25
+
26
+ // only used for _getNextTokenId
27
+ uint256 internal _chainIdInt;
28
+ uint256 internal _chainIdDigits;
29
+ uint256 internal _chainIdMultiplier;
30
+ uint256 internal _idNext;
31
+ uint256 internal _totalMinted;
32
+
33
+ modifier onlyRegistry() {
34
+ require(msg.sender == _registry, "ERROR:NFT-001:CALLER_NOT_REGISTRY");
35
+ _;
36
+ }
37
+
38
+ constructor(address registry) ERC721(NAME, SYMBOL) {
39
+ require(registry != address(0), "ERROR:NFT-010:REGISTRY_ZERO");
40
+
41
+ _registry = registry;
42
+
43
+ _chainIdInt = block.chainid;
44
+ _chainIdDigits = _countDigits(_chainIdInt);
45
+ _chainIdMultiplier = 10 ** _chainIdDigits;
46
+ _idNext = 4;
47
+ }
48
+
49
+ /**
50
+ * @dev mints a token for a specified token id
51
+ * not part of the IRegistry interface only needed for
52
+ * initial registry setup (protocol and global registry objects)
53
+ */
54
+ function mint(address to, uint256 tokenId) external onlyRegistry {
55
+ _totalMinted++;
56
+ _safeMint(to, tokenId);
57
+ }
58
+
59
+
60
+ /**
61
+ * @dev mints the next token to register new objects
62
+ * non-zero transferInterceptors are recorded and called during nft token transfers.
63
+ * the contract receiving such a notification may decides to revert or record the transfer
64
+ */
65
+ function mint(
66
+ address to,
67
+ address interceptor,
68
+ string memory uri
69
+ ) public onlyRegistry returns (uint256 tokenId) {
70
+ tokenId = _getNextTokenId();
71
+
72
+ if (interceptor != address(0)) {
73
+ _interceptor[tokenId] = interceptor;
74
+ }
75
+
76
+ if (bytes(uri).length > 0) {
77
+ _uri[tokenId] = uri;
78
+ }
79
+
80
+ _safeMint(to, tokenId);
81
+ _totalMinted++;
82
+ }
83
+
84
+
85
+ /**
86
+ * @dev amend the open zeppelin transferFrom function by an interceptor call if such an interceptor is defined for the nft token id
87
+ * this allows distribution, product and pool components to be notified when distributors, policies and bundles are transferred.
88
+ */
89
+ function transferFrom(address from, address to, uint256 tokenId) public override (ERC721, IERC721) {
90
+ super.transferFrom(from, to, tokenId);
91
+
92
+ if (_interceptor[tokenId] != address(0)) {
93
+ ITransferInterceptor(_interceptor[tokenId]).nftTransferFrom(from, to, tokenId);
94
+ }
95
+ }
96
+
97
+
98
+ function burn(uint256 tokenId) external override onlyRegistry {
99
+ _requireOwned(tokenId);
100
+ _burn(tokenId);
101
+ delete _uri[tokenId];
102
+ }
103
+
104
+ function setURI(
105
+ uint256 tokenId,
106
+ string memory uri
107
+ ) external override onlyRegistry {
108
+ require(bytes(uri).length > 0, "ERROR:CRG-011:URI_EMPTY");
109
+
110
+ _requireOwned(tokenId);
111
+ _uri[tokenId] = uri;
112
+ }
113
+
114
+ function exists(uint256 tokenId) external view override returns (bool) {
115
+ return _ownerOf(tokenId) != address(0);
116
+ }
117
+
118
+ function tokenURI(
119
+ uint256 tokenId
120
+ ) public view override returns (string memory) {
121
+ _requireOwned(tokenId);
122
+ return _uri[tokenId];
123
+ }
124
+
125
+ function getRegistryAddress() external view override returns (address) {
126
+ return _registry;
127
+ }
128
+
129
+ function totalMinted() external view override returns (uint256) {
130
+ return _totalMinted;
131
+ }
132
+
133
+ /**
134
+ * @dev token id calculation based on an index value that is supposed
135
+ * to increase with every minted token
136
+ *
137
+ * requirement: each chain registry produces token ids that
138
+ * are guaranteed to not collide with any token id genereated
139
+ * on a different chain
140
+ *
141
+ * format concat(counter,chainid,2 digits for len-of-chain-id)
142
+ * restriction chainid up to 99 digits
143
+ * decode: from right to left:
144
+ * - 2 right most digits encode length of chainid
145
+ * - move number of digits to left as determined above (-> chainid)
146
+ * - the reminder to the left is the counter
147
+ *
148
+ * special cases
149
+ * 1101 -> decentralized insurance protocol
150
+ * 2102 -> global registry
151
+ * 2xxxxx -> chain registry, where xxxxx = <chain-part>
152
+ *
153
+ * examples
154
+ * 1101
155
+ * ^^ ^
156
+ * || +- 1-digit chain id
157
+ * |+-- chain id = 1 (mainnet)
158
+ * +-- 1st token id on mainnet
159
+ * (1 * 10 ** 1 + 1) * 100 + 1
160
+ * 42987654321010
161
+ * ^ ^ ^
162
+ * | | +- 10-digit chain id
163
+ * | +-- chain id = 9876543210 (hypothetical chainid)
164
+ * +-- 42nd token id on this chain
165
+ * (42 * 10 ** 10 + 9876543210) * 100 + 10
166
+ * (index * 10 ** digits + chainid) * 100 + digits (1 < digits < 100)
167
+ */
168
+ function calculateTokenId(uint256 idIndex) public view returns (uint256 id) {
169
+ id =
170
+ (idIndex * _chainIdMultiplier + _chainIdInt) *
171
+ 100 +
172
+ _chainIdDigits;
173
+ }
174
+
175
+ function _getNextTokenId() private returns (uint256 id) {
176
+ id = calculateTokenId(_idNext);
177
+ _idNext++;
178
+ }
179
+
180
+ function _countDigits(uint256 num) private pure returns (uint256 count) {
181
+ count = 0;
182
+ while (num != 0) {
183
+ count++;
184
+ num /= 10;
185
+ }
186
+ }
187
+ }