@etherisc/gif-next 0.0.2-7f39e38-904 → 0.0.2-7fe9ae1-227

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 (598) hide show
  1. package/README.md +136 -318
  2. package/artifacts/contracts/accounting/AccountingService.sol/AccountingService.dbg.json +4 -0
  3. package/artifacts/contracts/accounting/AccountingService.sol/AccountingService.json +1075 -0
  4. package/artifacts/contracts/accounting/AccountingServiceManager.sol/AccountingServiceManager.dbg.json +4 -0
  5. package/artifacts/contracts/accounting/AccountingServiceManager.sol/AccountingServiceManager.json +810 -0
  6. package/artifacts/contracts/accounting/IAccountingService.sol/IAccountingService.dbg.json +4 -0
  7. package/artifacts/contracts/accounting/IAccountingService.sol/IAccountingService.json +843 -0
  8. package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.dbg.json +4 -0
  9. package/artifacts/contracts/authorization/AccessAdmin.sol/AccessAdmin.json +1735 -0
  10. package/artifacts/contracts/authorization/AccessAdminLib.sol/AccessAdminLib.dbg.json +4 -0
  11. package/artifacts/contracts/authorization/AccessAdminLib.sol/AccessAdminLib.json +2008 -0
  12. package/artifacts/contracts/authorization/AccessManagerCloneable.sol/AccessManagerCloneable.dbg.json +4 -0
  13. package/artifacts/contracts/authorization/AccessManagerCloneable.sol/AccessManagerCloneable.json +1403 -0
  14. package/artifacts/contracts/authorization/Authorization.sol/Authorization.dbg.json +4 -0
  15. package/artifacts/contracts/authorization/Authorization.sol/Authorization.json +817 -0
  16. package/artifacts/contracts/authorization/IAccess.sol/IAccess.dbg.json +4 -0
  17. package/artifacts/contracts/authorization/IAccess.sol/IAccess.json +10 -0
  18. package/artifacts/contracts/authorization/IAccessAdmin.sol/IAccessAdmin.dbg.json +4 -0
  19. package/artifacts/contracts/authorization/IAccessAdmin.sol/IAccessAdmin.json +1400 -0
  20. package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.dbg.json +4 -0
  21. package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.json +465 -0
  22. package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.dbg.json +4 -0
  23. package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.json +407 -0
  24. package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.dbg.json +4 -0
  25. package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.json +652 -0
  26. package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.dbg.json +4 -0
  27. package/artifacts/contracts/distribution/BasicDistribution.sol/BasicDistribution.json +1234 -0
  28. package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.dbg.json +4 -0
  29. package/artifacts/contracts/distribution/BasicDistributionAuthorization.sol/BasicDistributionAuthorization.json +844 -0
  30. package/artifacts/contracts/distribution/Distribution.sol/Distribution.dbg.json +1 -1
  31. package/artifacts/contracts/distribution/Distribution.sol/Distribution.json +146 -617
  32. package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.dbg.json +1 -1
  33. package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.json +767 -301
  34. package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  35. package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.json +267 -116
  36. package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  37. package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.json +152 -283
  38. package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  39. package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.json +553 -77
  40. package/artifacts/contracts/examples/fire/DamageLevel.sol/DamageLevelLib.dbg.json +4 -0
  41. package/artifacts/contracts/examples/fire/DamageLevel.sol/DamageLevelLib.json +22 -0
  42. package/artifacts/contracts/examples/fire/FirePool.sol/FirePool.dbg.json +4 -0
  43. package/artifacts/contracts/examples/fire/FirePool.sol/FirePool.json +1474 -0
  44. package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.dbg.json +4 -0
  45. package/artifacts/contracts/examples/fire/FirePoolAuthorization.sol/FirePoolAuthorization.json +844 -0
  46. package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.dbg.json +4 -0
  47. package/artifacts/contracts/examples/fire/FireProduct.sol/FireProduct.json +2043 -0
  48. package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.dbg.json +4 -0
  49. package/artifacts/contracts/examples/fire/FireProductAuthorization.sol/FireProductAuthorization.json +844 -0
  50. package/artifacts/contracts/examples/fire/FireUSD.sol/FireUSD.dbg.json +4 -0
  51. package/artifacts/contracts/examples/fire/FireUSD.sol/FireUSD.json +376 -0
  52. package/artifacts/contracts/examples/unpermissioned/SimpleDistribution.sol/SimpleDistribution.dbg.json +4 -0
  53. package/artifacts/contracts/examples/unpermissioned/SimpleDistribution.sol/SimpleDistribution.json +1429 -0
  54. package/artifacts/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol/SimpleDistributionAuthorization.dbg.json +4 -0
  55. package/artifacts/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol/SimpleDistributionAuthorization.json +844 -0
  56. package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.dbg.json +4 -0
  57. package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.json +1161 -0
  58. package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.dbg.json +4 -0
  59. package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.json +1637 -0
  60. package/artifacts/contracts/examples/unpermissioned/SimplePoolAuthorization.sol/SimplePoolAuthorization.dbg.json +4 -0
  61. package/artifacts/contracts/examples/unpermissioned/SimplePoolAuthorization.sol/SimplePoolAuthorization.json +844 -0
  62. package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.dbg.json +4 -0
  63. package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.json +2575 -0
  64. package/artifacts/contracts/examples/unpermissioned/SimpleProductAuthorization.sol/SimpleProductAuthorization.dbg.json +4 -0
  65. package/artifacts/contracts/examples/unpermissioned/SimpleProductAuthorization.sol/SimpleProductAuthorization.json +844 -0
  66. package/artifacts/contracts/instance/BaseStore.sol/BaseStore.dbg.json +4 -0
  67. package/artifacts/contracts/{shared/IKeyValueStore.sol/IKeyValueStore.json → instance/BaseStore.sol/BaseStore.json} +59 -205
  68. package/artifacts/contracts/instance/BundleSet.sol/BundleSet.dbg.json +4 -0
  69. package/artifacts/contracts/instance/BundleSet.sol/BundleSet.json +851 -0
  70. package/artifacts/contracts/instance/IBaseStore.sol/IBaseStore.dbg.json +4 -0
  71. package/artifacts/contracts/instance/IBaseStore.sol/IBaseStore.json +304 -0
  72. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  73. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +614 -92
  74. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  75. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +517 -75
  76. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  77. package/artifacts/contracts/instance/Instance.sol/Instance.json +639 -237
  78. package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.dbg.json +4 -0
  79. package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.json +2400 -0
  80. package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.dbg.json +4 -0
  81. package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.json +872 -0
  82. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  83. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +1711 -755
  84. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  85. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +509 -224
  86. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  87. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +175 -98
  88. package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.dbg.json +1 -1
  89. package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.json +1482 -1911
  90. package/artifacts/contracts/instance/ProductStore.sol/ProductStore.dbg.json +4 -0
  91. package/artifacts/contracts/instance/ProductStore.sol/ProductStore.json +3427 -0
  92. package/artifacts/contracts/instance/RiskSet.sol/RiskSet.dbg.json +4 -0
  93. package/artifacts/contracts/instance/RiskSet.sol/RiskSet.json +866 -0
  94. package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.dbg.json +1 -1
  95. package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.json +8 -8
  96. package/artifacts/contracts/instance/base/Cloneable.sol/Cloneable.dbg.json +1 -1
  97. package/artifacts/contracts/instance/base/Cloneable.sol/Cloneable.json +0 -53
  98. package/artifacts/contracts/instance/base/ObjectCounter.sol/ObjectCounter.dbg.json +4 -0
  99. package/artifacts/contracts/instance/base/ObjectCounter.sol/ObjectCounter.json +10 -0
  100. package/artifacts/contracts/instance/base/ObjectLifecycle.sol/ObjectLifecycle.dbg.json +4 -0
  101. package/artifacts/contracts/instance/base/ObjectLifecycle.sol/ObjectLifecycle.json +223 -0
  102. package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.dbg.json +4 -0
  103. package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.json +192 -0
  104. package/artifacts/contracts/instance/base/ObjectSetHelperLib.sol/ObjectSetHelperLib.dbg.json +4 -0
  105. package/artifacts/contracts/instance/base/ObjectSetHelperLib.sol/ObjectSetHelperLib.json +168 -0
  106. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  107. package/artifacts/contracts/instance/module/IComponents.sol/IComponents.dbg.json +1 -1
  108. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  109. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  110. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  111. package/artifacts/contracts/mock/Dip.sol/Dip.dbg.json +1 -1
  112. package/artifacts/contracts/mock/Dip.sol/Dip.json +2 -2
  113. package/artifacts/contracts/oracle/BasicOracle.sol/BasicOracle.dbg.json +4 -0
  114. package/artifacts/contracts/oracle/BasicOracle.sol/BasicOracle.json +947 -0
  115. package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.dbg.json +4 -0
  116. package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.json +849 -0
  117. package/artifacts/contracts/oracle/IOracle.sol/IOracle.dbg.json +4 -0
  118. package/artifacts/contracts/oracle/IOracle.sol/IOracle.json +52 -0
  119. package/artifacts/contracts/oracle/IOracleComponent.sol/IOracleComponent.dbg.json +4 -0
  120. package/artifacts/contracts/oracle/IOracleComponent.sol/IOracleComponent.json +762 -0
  121. package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.dbg.json +4 -0
  122. package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.json +762 -0
  123. package/artifacts/contracts/oracle/Oracle.sol/Oracle.dbg.json +4 -0
  124. package/artifacts/contracts/oracle/Oracle.sol/Oracle.json +863 -0
  125. package/artifacts/contracts/oracle/OracleService.sol/OracleService.dbg.json +4 -0
  126. package/artifacts/contracts/oracle/OracleService.sol/OracleService.json +1042 -0
  127. package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.dbg.json +4 -0
  128. package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.json +830 -0
  129. package/artifacts/contracts/pool/BasicPool.sol/BasicPool.dbg.json +4 -0
  130. package/artifacts/contracts/pool/BasicPool.sol/BasicPool.json +1232 -0
  131. package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.dbg.json +4 -0
  132. package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.json +844 -0
  133. package/artifacts/contracts/pool/BundleService.sol/BundleService.dbg.json +1 -1
  134. package/artifacts/contracts/pool/BundleService.sol/BundleService.json +582 -235
  135. package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
  136. package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.json +257 -94
  137. package/artifacts/contracts/pool/IBundleService.sol/IBundleService.dbg.json +1 -1
  138. package/artifacts/contracts/pool/IBundleService.sol/IBundleService.json +398 -49
  139. package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  140. package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.json +151 -404
  141. package/artifacts/contracts/pool/IPoolService.sol/IPoolService.dbg.json +1 -1
  142. package/artifacts/contracts/pool/IPoolService.sol/IPoolService.json +770 -365
  143. package/artifacts/contracts/pool/Pool.sol/Pool.dbg.json +1 -1
  144. package/artifacts/contracts/pool/Pool.sol/Pool.json +148 -692
  145. package/artifacts/contracts/pool/PoolLib.sol/PoolLib.dbg.json +4 -0
  146. package/artifacts/contracts/pool/PoolLib.sol/PoolLib.json +522 -0
  147. package/artifacts/contracts/pool/PoolService.sol/PoolService.dbg.json +1 -1
  148. package/artifacts/contracts/pool/PoolService.sol/PoolService.json +947 -525
  149. package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  150. package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.json +260 -93
  151. package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.dbg.json +1 -1
  152. package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.json +382 -166
  153. package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
  154. package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.json +201 -90
  155. package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.dbg.json +4 -0
  156. package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.json +1149 -0
  157. package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.dbg.json +4 -0
  158. package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.json +844 -0
  159. package/artifacts/contracts/product/ClaimService.sol/ClaimService.dbg.json +1 -1
  160. package/artifacts/contracts/product/ClaimService.sol/ClaimService.json +502 -230
  161. package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
  162. package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.json +229 -110
  163. package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.dbg.json +1 -1
  164. package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.json +320 -9
  165. package/artifacts/contracts/product/IClaimService.sol/IClaimService.dbg.json +1 -1
  166. package/artifacts/contracts/product/IClaimService.sol/IClaimService.json +369 -18
  167. package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.dbg.json +1 -1
  168. package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.json +436 -101
  169. package/artifacts/contracts/product/IPricingService.sol/IPricingService.dbg.json +1 -1
  170. package/artifacts/contracts/product/IPricingService.sol/IPricingService.json +202 -80
  171. package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  172. package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.json +291 -274
  173. package/artifacts/contracts/product/IRiskService.sol/IRiskService.dbg.json +4 -0
  174. package/artifacts/contracts/{shared/ComponentVerifyingService.sol/ComponentVerifyingService.json → product/IRiskService.sol/IRiskService.json} +295 -150
  175. package/artifacts/contracts/product/PolicyService.sol/PolicyService.dbg.json +1 -1
  176. package/artifacts/contracts/product/PolicyService.sol/PolicyService.json +564 -292
  177. package/artifacts/contracts/product/PolicyServiceLib.sol/PolicyServiceLib.dbg.json +4 -0
  178. package/artifacts/contracts/product/PolicyServiceLib.sol/PolicyServiceLib.json +783 -0
  179. package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
  180. package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.json +239 -96
  181. package/artifacts/contracts/product/PricingService.sol/PricingService.dbg.json +1 -1
  182. package/artifacts/contracts/product/PricingService.sol/PricingService.json +262 -299
  183. package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.dbg.json +1 -1
  184. package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.json +193 -114
  185. package/artifacts/contracts/product/Product.sol/Product.dbg.json +1 -1
  186. package/artifacts/contracts/product/Product.sol/Product.json +322 -606
  187. package/artifacts/contracts/product/RiskService.sol/RiskService.dbg.json +4 -0
  188. package/artifacts/contracts/product/RiskService.sol/RiskService.json +873 -0
  189. package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.dbg.json +4 -0
  190. package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.json +794 -0
  191. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  192. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +59 -16
  193. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  194. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +402 -79
  195. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  196. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +125 -146
  197. package/artifacts/contracts/registry/IRelease.sol/IRelease.dbg.json +4 -0
  198. package/artifacts/contracts/registry/IRelease.sol/IRelease.json +24 -0
  199. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  200. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +5 -18
  201. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  202. package/artifacts/contracts/registry/Registry.sol/Registry.json +719 -120
  203. package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.dbg.json +4 -0
  204. package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.json +2255 -0
  205. package/artifacts/contracts/registry/RegistryAuthorization.sol/RegistryAuthorization.dbg.json +4 -0
  206. package/artifacts/contracts/registry/RegistryAuthorization.sol/RegistryAuthorization.json +1137 -0
  207. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  208. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +174 -274
  209. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  210. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +180 -92
  211. package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.dbg.json +4 -0
  212. package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.json +2271 -0
  213. package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.dbg.json +4 -0
  214. package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.json +205 -0
  215. package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.dbg.json +4 -0
  216. package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.json +1401 -0
  217. package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.dbg.json +4 -0
  218. package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.json +705 -0
  219. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  220. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +135 -67
  221. package/artifacts/contracts/shared/Component.sol/Component.dbg.json +1 -1
  222. package/artifacts/contracts/shared/Component.sol/Component.json +92 -287
  223. package/artifacts/contracts/shared/ComponentService.sol/ComponentService.dbg.json +1 -1
  224. package/artifacts/contracts/shared/ComponentService.sol/ComponentService.json +632 -542
  225. package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.dbg.json +1 -1
  226. package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.json +230 -113
  227. package/artifacts/contracts/shared/ContractLib.sol/ContractLib.dbg.json +4 -0
  228. package/artifacts/contracts/shared/ContractLib.sol/ContractLib.json +632 -0
  229. package/artifacts/contracts/shared/ContractLib.sol/IInstanceAdminHelper.dbg.json +4 -0
  230. package/artifacts/contracts/shared/ContractLib.sol/IInstanceAdminHelper.json +24 -0
  231. package/artifacts/contracts/shared/ContractLib.sol/ITargetHelper.dbg.json +4 -0
  232. package/artifacts/contracts/shared/ContractLib.sol/ITargetHelper.json +30 -0
  233. package/artifacts/contracts/shared/ContractLib.sol/ITokenRegistryHelper.dbg.json +4 -0
  234. package/artifacts/contracts/shared/ContractLib.sol/ITokenRegistryHelper.json +40 -0
  235. package/artifacts/contracts/shared/IComponent.sol/IComponent.dbg.json +1 -1
  236. package/artifacts/contracts/shared/IComponent.sol/IComponent.json +99 -104
  237. package/artifacts/contracts/shared/IComponentService.sol/IComponentService.dbg.json +1 -1
  238. package/artifacts/contracts/shared/IComponentService.sol/IComponentService.json +549 -228
  239. package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.dbg.json +1 -1
  240. package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.json +138 -140
  241. package/artifacts/contracts/shared/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  242. package/artifacts/contracts/shared/ILifecycle.sol/ILifecycle.json +34 -3
  243. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  244. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +42 -1
  245. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.dbg.json +1 -1
  246. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.json +15 -47
  247. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  248. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +173 -0
  249. package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
  250. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  251. package/artifacts/contracts/shared/IService.sol/IService.json +103 -2
  252. package/artifacts/contracts/shared/InitializableERC165.sol/InitializableERC165.dbg.json +4 -0
  253. package/artifacts/contracts/shared/InitializableERC165.sol/InitializableERC165.json +53 -0
  254. package/artifacts/contracts/shared/InstanceLinkedComponent.sol/InstanceLinkedComponent.dbg.json +1 -1
  255. package/artifacts/contracts/shared/InstanceLinkedComponent.sol/InstanceLinkedComponent.json +131 -376
  256. package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  257. package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.json +42 -62
  258. package/artifacts/contracts/shared/NftIdSet.sol/NftIdSet.dbg.json +4 -0
  259. package/artifacts/contracts/shared/NftIdSet.sol/NftIdSet.json +306 -0
  260. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  261. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +45 -55
  262. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +1 -1
  263. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.json +19 -141
  264. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  265. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +148 -98
  266. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +1 -1
  267. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.json +2 -15
  268. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  269. package/artifacts/contracts/shared/Service.sol/Service.json +96 -102
  270. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  271. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +585 -12
  272. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandlerBase.dbg.json +4 -0
  273. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandlerBase.json +484 -0
  274. package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.dbg.json +4 -0
  275. package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.json +172 -0
  276. package/artifacts/contracts/staking/IStaking.sol/IStaking.dbg.json +1 -1
  277. package/artifacts/contracts/staking/IStaking.sol/IStaking.json +1558 -246
  278. package/artifacts/contracts/staking/IStakingService.sol/IStakingService.dbg.json +1 -1
  279. package/artifacts/contracts/staking/IStakingService.sol/IStakingService.json +382 -119
  280. package/artifacts/contracts/staking/ITargetLimitHandler.sol/ITargetLimitHandler.dbg.json +4 -0
  281. package/artifacts/contracts/staking/ITargetLimitHandler.sol/ITargetLimitHandler.json +50 -0
  282. package/artifacts/contracts/staking/Staking.sol/Staking.dbg.json +1 -1
  283. package/artifacts/contracts/staking/Staking.sol/Staking.json +1734 -561
  284. package/artifacts/contracts/staking/StakingLib.sol/StakingLib.dbg.json +4 -0
  285. package/artifacts/contracts/staking/StakingLib.sol/StakingLib.json +470 -0
  286. package/artifacts/contracts/staking/StakingManager.sol/StakingManager.dbg.json +1 -1
  287. package/artifacts/contracts/staking/StakingManager.sol/StakingManager.json +232 -113
  288. package/artifacts/contracts/staking/StakingReader.sol/StakingReader.dbg.json +1 -1
  289. package/artifacts/contracts/staking/StakingReader.sol/StakingReader.json +430 -94
  290. package/artifacts/contracts/staking/StakingService.sol/StakingService.dbg.json +1 -1
  291. package/artifacts/contracts/staking/StakingService.sol/StakingService.json +442 -305
  292. package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.dbg.json +1 -1
  293. package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.json +181 -93
  294. package/artifacts/contracts/staking/StakingStore.sol/StakingStore.dbg.json +1 -1
  295. package/artifacts/contracts/staking/StakingStore.sol/StakingStore.json +2044 -637
  296. package/artifacts/contracts/staking/TargetHandler.sol/TargetHandler.dbg.json +4 -0
  297. package/artifacts/contracts/staking/TargetHandler.sol/TargetHandler.json +309 -0
  298. package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.dbg.json +1 -1
  299. package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.json +253 -68
  300. package/artifacts/contracts/type/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  301. package/artifacts/contracts/type/AddressSet.sol/LibAddressSet.json +2 -2
  302. package/artifacts/contracts/type/Amount.sol/AmountLib.dbg.json +1 -1
  303. package/artifacts/contracts/type/Amount.sol/AmountLib.json +122 -5
  304. package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  305. package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.json +64 -19
  306. package/artifacts/contracts/type/ChainId.sol/ChainIdLib.dbg.json +4 -0
  307. package/artifacts/contracts/type/ChainId.sol/ChainIdLib.json +193 -0
  308. package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.dbg.json +1 -1
  309. package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.json +28 -4
  310. package/artifacts/contracts/type/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  311. package/artifacts/contracts/type/DistributorType.sol/DistributorTypeLib.json +4 -4
  312. package/artifacts/contracts/type/Fee.sol/FeeLib.dbg.json +1 -1
  313. package/artifacts/contracts/type/Fee.sol/FeeLib.json +98 -37
  314. package/artifacts/contracts/type/Key32.sol/Key32Lib.dbg.json +1 -1
  315. package/artifacts/contracts/type/Key32.sol/Key32Lib.json +2 -2
  316. package/artifacts/contracts/type/Key32Set.sol/LibKey32Set.dbg.json +4 -0
  317. package/artifacts/contracts/type/Key32Set.sol/LibKey32Set.json +33 -0
  318. package/artifacts/contracts/type/NftId.sol/NftIdLib.dbg.json +1 -1
  319. package/artifacts/contracts/type/NftId.sol/NftIdLib.json +47 -4
  320. package/artifacts/contracts/type/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  321. package/artifacts/contracts/type/NftIdSet.sol/LibNftIdSet.json +2 -2
  322. package/artifacts/contracts/type/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  323. package/artifacts/contracts/type/ObjectType.sol/ObjectTypeLib.json +153 -4
  324. package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.dbg.json +1 -1
  325. package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.json +19 -19
  326. package/artifacts/contracts/type/Referral.sol/ReferralLib.dbg.json +1 -1
  327. package/artifacts/contracts/type/Referral.sol/ReferralLib.json +4 -4
  328. package/artifacts/contracts/type/RequestId.sol/RequestIdLib.dbg.json +4 -0
  329. package/artifacts/contracts/type/RequestId.sol/RequestIdLib.json +204 -0
  330. package/artifacts/contracts/type/RiskId.sol/RiskIdLib.dbg.json +1 -1
  331. package/artifacts/contracts/type/RiskId.sol/RiskIdLib.json +125 -7
  332. package/artifacts/contracts/type/RoleId.sol/RoleIdLib.dbg.json +1 -1
  333. package/artifacts/contracts/type/RoleId.sol/RoleIdLib.json +121 -23
  334. package/artifacts/contracts/type/Seconds.sol/SecondsLib.dbg.json +1 -1
  335. package/artifacts/contracts/type/Seconds.sol/SecondsLib.json +117 -2
  336. package/artifacts/contracts/type/Selector.sol/SelectorLib.dbg.json +4 -0
  337. package/artifacts/contracts/type/Selector.sol/SelectorLib.json +148 -0
  338. package/artifacts/contracts/type/Selector.sol/SelectorSetLib.dbg.json +4 -0
  339. package/artifacts/contracts/type/Selector.sol/SelectorSetLib.json +10 -0
  340. package/artifacts/contracts/type/StateId.sol/StateIdLib.dbg.json +1 -1
  341. package/artifacts/contracts/type/StateId.sol/StateIdLib.json +15 -2
  342. package/artifacts/contracts/type/String.sol/StrLib.dbg.json +4 -0
  343. package/artifacts/contracts/type/String.sol/StrLib.json +180 -0
  344. package/artifacts/contracts/type/Timestamp.sol/TimestampLib.dbg.json +1 -1
  345. package/artifacts/contracts/type/Timestamp.sol/TimestampLib.json +37 -5
  346. package/artifacts/contracts/type/UFixed.sol/UFixedLib.dbg.json +1 -1
  347. package/artifacts/contracts/type/UFixed.sol/UFixedLib.json +126 -33
  348. package/artifacts/contracts/type/Version.sol/VersionLib.dbg.json +1 -1
  349. package/artifacts/contracts/type/Version.sol/VersionLib.json +2 -21
  350. package/artifacts/contracts/type/Version.sol/VersionPartLib.dbg.json +1 -1
  351. package/artifacts/contracts/type/Version.sol/VersionPartLib.json +120 -2
  352. package/artifacts/contracts/upgradeability/IVersionable.sol/IVersionable.dbg.json +4 -0
  353. package/artifacts/contracts/{shared → upgradeability}/IVersionable.sol/IVersionable.json +11 -1
  354. package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  355. package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.json +672 -0
  356. package/artifacts/contracts/upgradeability/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  357. package/artifacts/contracts/upgradeability/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +142 -0
  358. package/artifacts/contracts/upgradeability/Versionable.sol/Versionable.dbg.json +4 -0
  359. package/artifacts/contracts/{shared → upgradeability}/Versionable.sol/Versionable.json +11 -1
  360. package/contracts/accounting/AccountingService.sol +274 -0
  361. package/contracts/accounting/AccountingServiceManager.sol +38 -0
  362. package/contracts/accounting/IAccountingService.sol +47 -0
  363. package/contracts/authorization/AccessAdmin.sol +679 -0
  364. package/contracts/authorization/AccessAdminLib.sol +678 -0
  365. package/contracts/authorization/AccessManagerCloneable.sol +140 -0
  366. package/contracts/authorization/Authorization.sol +190 -0
  367. package/contracts/authorization/IAccess.sol +66 -0
  368. package/contracts/authorization/IAccessAdmin.sol +142 -0
  369. package/contracts/authorization/IAuthorization.sol +26 -0
  370. package/contracts/authorization/IServiceAuthorization.sol +78 -0
  371. package/contracts/authorization/ServiceAuthorization.sol +300 -0
  372. package/contracts/distribution/BasicDistribution.sol +140 -0
  373. package/contracts/distribution/BasicDistributionAuthorization.sol +67 -0
  374. package/contracts/distribution/Distribution.sol +125 -143
  375. package/contracts/distribution/DistributionService.sol +287 -137
  376. package/contracts/distribution/DistributionServiceManager.sol +8 -23
  377. package/contracts/distribution/IDistributionComponent.sol +21 -42
  378. package/contracts/distribution/IDistributionService.sol +60 -26
  379. package/contracts/examples/fire/DamageLevel.sol +59 -0
  380. package/contracts/examples/fire/FirePool.sol +86 -0
  381. package/contracts/examples/fire/FirePoolAuthorization.sol +35 -0
  382. package/contracts/examples/fire/FireProduct.sol +433 -0
  383. package/contracts/examples/fire/FireProductAuthorization.sol +45 -0
  384. package/contracts/examples/fire/FireUSD.sol +26 -0
  385. package/contracts/examples/unpermissioned/SimpleDistribution.sol +81 -0
  386. package/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol +28 -0
  387. package/contracts/examples/unpermissioned/SimpleOracle.sol +133 -0
  388. package/contracts/examples/unpermissioned/SimplePool.sol +102 -0
  389. package/contracts/examples/unpermissioned/SimplePoolAuthorization.sol +28 -0
  390. package/contracts/examples/unpermissioned/SimpleProduct.sol +437 -0
  391. package/contracts/examples/unpermissioned/SimpleProductAuthorization.sol +28 -0
  392. package/contracts/instance/BaseStore.sol +93 -0
  393. package/contracts/instance/BundleSet.sol +130 -0
  394. package/contracts/instance/IBaseStore.sol +37 -0
  395. package/contracts/instance/IInstance.sol +128 -49
  396. package/contracts/instance/IInstanceService.sol +82 -46
  397. package/contracts/instance/Instance.sol +254 -131
  398. package/contracts/instance/InstanceAdmin.sol +307 -0
  399. package/contracts/instance/InstanceAuthorizationV3.sol +275 -0
  400. package/contracts/instance/InstanceReader.sol +477 -237
  401. package/contracts/instance/InstanceService.sol +391 -244
  402. package/contracts/instance/InstanceServiceManager.sol +8 -13
  403. package/contracts/instance/InstanceStore.sol +172 -109
  404. package/contracts/instance/ProductStore.sol +290 -0
  405. package/contracts/instance/RiskSet.sol +126 -0
  406. package/contracts/instance/TargetNames.sol +10 -0
  407. package/contracts/instance/base/BalanceStore.sol +15 -12
  408. package/contracts/instance/base/Cloneable.sol +2 -25
  409. package/contracts/instance/base/ObjectCounter.sol +20 -0
  410. package/contracts/instance/base/ObjectLifecycle.sol +109 -0
  411. package/contracts/instance/base/ObjectSet.sol +77 -0
  412. package/contracts/instance/base/ObjectSetHelperLib.sol +30 -0
  413. package/contracts/instance/module/IBundle.sol +6 -5
  414. package/contracts/instance/module/IComponents.sol +29 -21
  415. package/contracts/instance/module/IDistribution.sol +21 -9
  416. package/contracts/instance/module/IPolicy.sol +50 -29
  417. package/contracts/instance/module/IRisk.sol +5 -0
  418. package/contracts/mock/Dip.sol +1 -1
  419. package/contracts/oracle/BasicOracle.sol +44 -0
  420. package/contracts/oracle/BasicOracleAuthorization.sol +53 -0
  421. package/contracts/oracle/IOracle.sol +41 -0
  422. package/contracts/oracle/IOracleComponent.sol +33 -0
  423. package/contracts/oracle/IOracleService.sol +66 -0
  424. package/contracts/oracle/Oracle.sol +152 -0
  425. package/contracts/oracle/OracleService.sol +310 -0
  426. package/contracts/oracle/OracleServiceManager.sol +39 -0
  427. package/contracts/pool/BasicPool.sol +161 -0
  428. package/contracts/pool/BasicPoolAuthorization.sol +81 -0
  429. package/contracts/pool/BundleService.sol +225 -135
  430. package/contracts/pool/BundleServiceManager.sol +8 -11
  431. package/contracts/pool/IBundleService.sol +43 -33
  432. package/contracts/pool/IPoolComponent.sol +20 -70
  433. package/contracts/pool/IPoolService.sol +98 -75
  434. package/contracts/pool/Pool.sol +196 -164
  435. package/contracts/pool/PoolLib.sol +341 -0
  436. package/contracts/pool/PoolService.sol +444 -254
  437. package/contracts/pool/PoolServiceManager.sol +6 -9
  438. package/contracts/product/ApplicationService.sol +159 -86
  439. package/contracts/product/ApplicationServiceManager.sol +6 -6
  440. package/contracts/product/BasicProduct.sol +48 -0
  441. package/contracts/product/BasicProductAuthorization.sol +63 -0
  442. package/contracts/product/ClaimService.sol +396 -207
  443. package/contracts/product/ClaimServiceManager.sol +6 -6
  444. package/contracts/product/IApplicationService.sol +29 -3
  445. package/contracts/product/IClaimService.sol +51 -8
  446. package/contracts/product/IPolicyService.sol +61 -37
  447. package/contracts/product/IPricingService.sol +11 -10
  448. package/contracts/product/IProductComponent.sol +29 -9
  449. package/contracts/product/IRiskService.sol +48 -0
  450. package/contracts/product/PolicyService.sol +450 -278
  451. package/contracts/product/PolicyServiceLib.sol +139 -0
  452. package/contracts/product/PolicyServiceManager.sol +6 -9
  453. package/contracts/product/PricingService.sol +95 -90
  454. package/contracts/product/PricingServiceManager.sol +6 -9
  455. package/contracts/product/Product.sol +261 -147
  456. package/contracts/product/RiskService.sol +189 -0
  457. package/contracts/product/RiskServiceManager.sol +39 -0
  458. package/contracts/registry/ChainNft.sol +72 -39
  459. package/contracts/registry/IRegistry.sol +88 -41
  460. package/contracts/registry/IRegistryService.sol +4 -10
  461. package/contracts/registry/IRelease.sol +29 -0
  462. package/contracts/registry/ITransferInterceptor.sol +1 -2
  463. package/contracts/registry/Registry.sol +389 -231
  464. package/contracts/registry/RegistryAdmin.sol +173 -0
  465. package/contracts/registry/RegistryAuthorization.sol +337 -0
  466. package/contracts/registry/RegistryService.sol +50 -75
  467. package/contracts/registry/RegistryServiceManager.sol +5 -24
  468. package/contracts/registry/ReleaseAdmin.sol +199 -0
  469. package/contracts/registry/ReleaseLifecycle.sol +32 -0
  470. package/contracts/registry/ReleaseRegistry.sol +525 -0
  471. package/contracts/registry/ServiceAuthorizationV3.sol +342 -0
  472. package/contracts/registry/TokenRegistry.sol +73 -110
  473. package/contracts/shared/Component.sol +72 -148
  474. package/contracts/shared/ComponentService.sol +466 -370
  475. package/contracts/shared/ComponentServiceManager.sol +10 -7
  476. package/contracts/shared/ContractLib.sol +312 -0
  477. package/contracts/shared/IComponent.sol +7 -23
  478. package/contracts/shared/IComponentService.sol +51 -31
  479. package/contracts/shared/IInstanceLinkedComponent.sol +10 -26
  480. package/contracts/shared/ILifecycle.sol +3 -2
  481. package/contracts/shared/INftOwnable.sol +5 -1
  482. package/contracts/shared/IPolicyHolder.sol +12 -22
  483. package/contracts/shared/IRegisterable.sol +22 -1
  484. package/contracts/shared/IService.sol +10 -5
  485. package/contracts/shared/{ERC165.sol → InitializableERC165.sol} +11 -3
  486. package/contracts/shared/InstanceLinkedComponent.sol +96 -49
  487. package/contracts/shared/Lifecycle.sol +30 -63
  488. package/contracts/shared/{NftIdSetManager.sol → NftIdSet.sol} +1 -1
  489. package/contracts/shared/NftOwnable.sol +35 -24
  490. package/contracts/shared/PolicyHolder.sol +19 -57
  491. package/contracts/shared/Registerable.sol +52 -21
  492. package/contracts/shared/RegistryLinked.sol +9 -14
  493. package/contracts/shared/Service.sol +31 -41
  494. package/contracts/shared/TokenHandler.sol +310 -26
  495. package/contracts/shared/TokenHandlerDeployerLib.sol +20 -0
  496. package/contracts/staking/IStaking.sol +284 -70
  497. package/contracts/staking/IStakingService.sol +59 -94
  498. package/contracts/staking/ITargetLimitHandler.sol +17 -0
  499. package/contracts/staking/Staking.sol +558 -263
  500. package/contracts/staking/StakingLib.sol +195 -0
  501. package/contracts/staking/StakingManager.sol +20 -32
  502. package/contracts/staking/StakingReader.sol +84 -60
  503. package/contracts/staking/StakingService.sol +108 -162
  504. package/contracts/staking/StakingServiceManager.sol +10 -8
  505. package/contracts/staking/StakingStore.sol +1222 -183
  506. package/contracts/staking/TargetHandler.sol +132 -0
  507. package/contracts/staking/TargetManagerLib.sol +95 -40
  508. package/contracts/type/Amount.sol +43 -3
  509. package/contracts/type/Blocknumber.sol +24 -23
  510. package/contracts/type/ChainId.sol +101 -0
  511. package/contracts/type/ClaimId.sol +6 -1
  512. package/contracts/type/Fee.sol +8 -8
  513. package/contracts/type/Key32.sol +2 -2
  514. package/contracts/type/Key32Set.sol +62 -0
  515. package/contracts/type/NftId.sol +15 -8
  516. package/contracts/type/ObjectType.sol +203 -65
  517. package/contracts/type/PayoutId.sol +10 -10
  518. package/contracts/type/Referral.sol +1 -0
  519. package/contracts/type/RequestId.sol +75 -0
  520. package/contracts/type/RiskId.sol +38 -6
  521. package/contracts/type/RoleId.sol +121 -84
  522. package/contracts/type/Seconds.sol +50 -1
  523. package/contracts/type/Selector.sol +107 -0
  524. package/contracts/type/StateId.sol +27 -1
  525. package/contracts/type/String.sol +65 -0
  526. package/contracts/type/Timestamp.sol +20 -9
  527. package/contracts/type/UFixed.sol +62 -125
  528. package/contracts/type/Version.sol +57 -6
  529. package/contracts/{shared → upgradeability}/IVersionable.sol +3 -0
  530. package/contracts/{shared → upgradeability}/ProxyManager.sol +102 -51
  531. package/contracts/upgradeability/UpgradableProxyWithAdmin.sol +24 -0
  532. package/contracts/{shared → upgradeability}/Versionable.sol +8 -5
  533. package/package.json +12 -8
  534. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +0 -4
  535. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +0 -778
  536. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.dbg.json +0 -4
  537. package/artifacts/contracts/instance/InstanceAccessManager.sol/InstanceAccessManager.json +0 -1348
  538. package/artifacts/contracts/instance/InstanceAuthorizationsLib.sol/InstanceAuthorizationsLib.dbg.json +0 -4
  539. package/artifacts/contracts/instance/InstanceAuthorizationsLib.sol/InstanceAuthorizationsLib.json +0 -132
  540. package/artifacts/contracts/instance/base/ObjectManager.sol/ObjectManager.dbg.json +0 -4
  541. package/artifacts/contracts/instance/base/ObjectManager.sol/ObjectManager.json +0 -256
  542. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +0 -4
  543. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +0 -237
  544. package/artifacts/contracts/product/IProductService.sol/IProductService.dbg.json +0 -4
  545. package/artifacts/contracts/product/IProductService.sol/IProductService.json +0 -381
  546. package/artifacts/contracts/product/ProductService.sol/ProductService.dbg.json +0 -4
  547. package/artifacts/contracts/product/ProductService.sol/ProductService.json +0 -673
  548. package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.dbg.json +0 -4
  549. package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.json +0 -675
  550. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.dbg.json +0 -4
  551. package/artifacts/contracts/registry/RegistryAccessManager.sol/RegistryAccessManager.json +0 -322
  552. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +0 -4
  553. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +0 -1151
  554. package/artifacts/contracts/registry/ServiceAuthorizationsLib.sol/ServiceAuthorizationsLib.dbg.json +0 -4
  555. package/artifacts/contracts/registry/ServiceAuthorizationsLib.sol/ServiceAuthorizationsLib.json +0 -137
  556. package/artifacts/contracts/shared/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.dbg.json +0 -4
  557. package/artifacts/contracts/shared/AccessManagerUpgradeableInitializeable.sol/AccessManagerUpgradeableInitializeable.json +0 -1206
  558. package/artifacts/contracts/shared/ComponentVerifyingService.sol/ComponentVerifyingService.dbg.json +0 -4
  559. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +0 -4
  560. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +0 -73
  561. package/artifacts/contracts/shared/IKeyValueStore.sol/IKeyValueStore.dbg.json +0 -4
  562. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +0 -4
  563. package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.dbg.json +0 -4
  564. package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.json +0 -581
  565. package/artifacts/contracts/shared/NftIdSetManager.sol/NftIdSetManager.dbg.json +0 -4
  566. package/artifacts/contracts/shared/NftIdSetManager.sol/NftIdSetManager.json +0 -306
  567. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +0 -4
  568. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +0 -598
  569. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +0 -4
  570. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +0 -129
  571. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +0 -4
  572. package/artifacts/contracts/staking/IStakingManager.sol/IStakingManager.dbg.json +0 -4
  573. package/artifacts/contracts/staking/IStakingManager.sol/IStakingManager.json +0 -37
  574. package/artifacts/contracts/staking/IStakingStore.sol/IStakingStore.dbg.json +0 -4
  575. package/artifacts/contracts/staking/IStakingStore.sol/IStakingStore.json +0 -357
  576. package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.dbg.json +0 -4
  577. package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.json +0 -402
  578. package/artifacts/contracts/type/UFixed.sol/MathLib.dbg.json +0 -4
  579. package/artifacts/contracts/type/UFixed.sol/MathLib.json +0 -10
  580. package/contracts/instance/BundleManager.sol +0 -126
  581. package/contracts/instance/InstanceAccessManager.sol +0 -543
  582. package/contracts/instance/InstanceAuthorizationsLib.sol +0 -336
  583. package/contracts/instance/base/ObjectManager.sol +0 -82
  584. package/contracts/instance/module/IAccess.sol +0 -54
  585. package/contracts/product/IProductService.sol +0 -33
  586. package/contracts/product/ProductService.sol +0 -124
  587. package/contracts/product/ProductServiceManager.sol +0 -42
  588. package/contracts/registry/RegistryAccessManager.sol +0 -196
  589. package/contracts/registry/ReleaseManager.sol +0 -563
  590. package/contracts/registry/ServiceAuthorizationsLib.sol +0 -173
  591. package/contracts/shared/AccessManagerUpgradeableInitializeable.sol +0 -13
  592. package/contracts/shared/ComponentVerifyingService.sol +0 -111
  593. package/contracts/shared/IKeyValueStore.sol +0 -53
  594. package/contracts/shared/KeyValueStore.sol +0 -130
  595. package/contracts/shared/UpgradableProxyWithAdmin.sol +0 -16
  596. package/contracts/staking/IStakingManager.sol +0 -15
  597. package/contracts/staking/IStakingStore.sol +0 -130
  598. package/contracts/staking/StakeManagerLib.sol +0 -156
@@ -2,328 +2,1367 @@
2
2
  pragma solidity ^0.8.20;
3
3
 
4
4
  import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";
5
+ import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
5
6
 
6
- import {Amount, AmountLib} from "../type/Amount.sol";
7
- import {Blocknumber, BlocknumberLib} from "../type/Blocknumber.sol";
8
- import {ChainNft} from "../registry/ChainNft.sol";
9
- import {Component} from "../shared/Component.sol";
10
7
  import {IRegistry} from "../registry/IRegistry.sol";
11
- import {IRegistryService} from "../registry/IRegistryService.sol";
12
8
  import {IStaking} from "./IStaking.sol";
13
- import {IVersionable} from "../shared/IVersionable.sol";
14
- import {Key32} from "../type/Key32.sol";
15
- import {KeyValueStore} from "../shared/KeyValueStore.sol";
16
- import {KEEP_STATE} from "../type/StateId.sol";
17
- import {LibNftIdSet} from "../type/NftIdSet.sol";
9
+ import {ITargetLimitHandler} from "./ITargetLimitHandler.sol";
10
+
11
+ import {Amount, AmountLib} from "../type/Amount.sol";
12
+ import {ChainId, ChainIdLib} from "../type/ChainId.sol";
13
+ import {Blocknumber, BlocknumberLib} from "../type/Blocknumber.sol";
18
14
  import {NftId, NftIdLib} from "../type/NftId.sol";
19
- import {NftIdSetManager} from "../shared/NftIdSetManager.sol";
20
- import {ObjectType, INSTANCE, PROTOCOL, STAKE, STAKING, TARGET} from "../type/ObjectType.sol";
15
+ import {NftIdSet} from "../shared/NftIdSet.sol";
16
+ import {ObjectType} from "../type/ObjectType.sol";
17
+ import {PROTOCOL, INSTANCE} from "../type/ObjectType.sol";
21
18
  import {Seconds, SecondsLib} from "../type/Seconds.sol";
19
+ import {StakingLib} from "./StakingLib.sol";
22
20
  import {StakingReader} from "./StakingReader.sol";
23
21
  import {TargetManagerLib} from "./TargetManagerLib.sol";
24
22
  import {Timestamp, TimestampLib} from "../type/Timestamp.sol";
25
- import {TokenRegistry} from "../registry/TokenRegistry.sol";
26
23
  import {UFixed, UFixedLib} from "../type/UFixed.sol";
27
- import {Version, VersionLib} from "../type/Version.sol";
28
- import {Versionable} from "../shared/Versionable.sol";
29
24
 
30
25
 
31
26
  contract StakingStore is
32
- AccessManaged,
33
- KeyValueStore
27
+ Initializable,
28
+ AccessManaged
34
29
  {
35
30
 
36
- event LogStakingStoreStakesIncreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
37
- event LogStakingStoreStakesDecreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
31
+ // token
32
+ error ErrorStakingStoreTokenNotRegistered(ChainId chainId, address token);
33
+ error ErrorStakingStoreTokenAlreadyAdded(ChainId chainId, address token);
34
+ error ErrorStakingStoreTokenUnknown(ChainId chainId, address token);
35
+
36
+ // target
37
+ error ErrorStakingStoreTargetNotInitialized(NftId targetNftId);
38
+ error ErrorStakingStoreLimitNotInitialized(NftId targetNftId);
38
39
 
39
- event LogStakingStoreRewardsIncreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
40
- event LogStakingStoreRewardsDecreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
40
+ // in/decreasing reward reserves
41
+ error ErrorStakingStoreNotTarget(NftId targetNftId);
42
+ error ErrorStakingStoreRewardReservesInsufficient(NftId targetNftId, Amount reserveAmount, Amount claimedAmount);
41
43
 
42
- event LogStakingStoreRewardsRestaked(NftId nftId, Amount amount, Amount rewardAmount, Amount rewardIncrementAmount, Amount newBalance, Blocknumber lastUpdatedIn);
44
+ // stakes
45
+ error ErrorStakingStoreStakesExceedingTargetMaxAmount(NftId targetNftId, Amount stakeLimitAmount, Amount newIStaking);
46
+ error ErrorStakingStoreStakeNotInitialized(NftId nftId);
43
47
 
44
- // creating and updating of balance
45
- error ErrorStakingStoreBalanceAlreadyInitialized(NftId nftId);
46
- error ErrorStakingStoreBalanceNotInitialized(NftId nftId);
48
+ // creating and updating of staking balance
49
+ error ErrorStakingStoreStakeBalanceAlreadyInitialized(NftId nftId);
50
+ error ErrorStakingStoreStakeBalanceNotInitialized(NftId nftI);
47
51
 
48
- // update balance
52
+ // creating and updating of tvl balance
53
+ error ErrorStakingStoreTvlBalanceAlreadyInitialized(NftId nftId, address token);
54
+ error ErrorStakingStoreTvlBalanceNotInitialized(NftId nftId, address token);
49
55
 
50
56
  IRegistry private _registry;
51
- NftIdSetManager private _targetManager;
57
+ ITargetLimitHandler private _targetLimitHandler;
52
58
  StakingReader private _reader;
59
+ NftIdSet private _targetNftIdSet;
53
60
 
54
- mapping(NftId nftId => Amount stakes) private _stakeBalance;
55
- mapping(NftId nftId => Amount rewards) private _rewardBalance;
61
+ // target support
62
+ mapping(ObjectType targetType => IStaking.SupportInfo) private _supportInfo;
56
63
 
57
- // TODO check if this is made redundant by *Info struct updates
58
- mapping(NftId nftId => Timestamp lastUpdatedAt) private _lastUpdatedAt;
59
- mapping(NftId nftId => Blocknumber lastUpdatedIn) private _lastUpdatedIn;
64
+ // targets
65
+ mapping(NftId targetNftId => IStaking.TargetInfo) private _targetInfo;
66
+ mapping(NftId targetNftId => IStaking.LimitInfo) private _limitInfo;
67
+ mapping(NftId targetNftId => mapping(address token => IStaking.TvlInfo)) private _tvlInfo;
68
+ mapping(NftId targetNftId => address [] token) private _targetToken;
69
+
70
+ // staking rate
71
+ mapping(ChainId chainId => mapping(address token => IStaking.TokenInfo)) private _tokenInfo;
72
+
73
+ // stakes
74
+ mapping(NftId stakeNftId => IStaking.StakeInfo) private _stakeInfo;
60
75
 
61
76
 
62
77
  constructor(
63
- address initialAuthority,
64
- address registryAddress
78
+ IRegistry registry,
79
+ StakingReader reader
65
80
  )
66
- AccessManaged(initialAuthority)
81
+ AccessManaged(msg.sender)
67
82
  {
68
- _registry = IRegistry(registryAddress);
69
- _reader = new StakingReader();
70
- _targetManager = new NftIdSetManager();
83
+ // set final authority
84
+ setAuthority(registry.getAuthority());
85
+
86
+ // set internal variables
87
+ _registry = registry;
88
+ _reader = reader;
89
+ _targetNftIdSet = new NftIdSet();
90
+
91
+ _createInitialSetup();
92
+ // register protocol target
71
93
  }
72
94
 
73
95
 
74
- //--- target specific functions ------------------------------------//
96
+ function _createInitialSetup()
97
+ internal
98
+ {
99
+ // define support parameters for protocol target
100
+ _setSupportInfo(
101
+ PROTOCOL(),
102
+ true, // isSupported
103
+ false, // allowNewTargets,
104
+ true, // crossChainIsSupported
105
+ AmountLib.zero(), // minStakingAmount
106
+ AmountLib.max(), // maxStakingAmount,
107
+ SecondsLib.oneDay(), // minLockingPeriod,
108
+ SecondsLib.oneYear(), // maxLockingPeriod,
109
+ UFixedLib.zero(), // minRewardRate,
110
+ UFixedLib.toUFixed(15, -2)); // maxRewardRate
111
+
112
+ // create protocol target
113
+ _createTarget(
114
+ NftIdLib.toNftId(1101),
115
+ PROTOCOL(),
116
+ TargetManagerLib.getDefaultLockingPeriod(),
117
+ TargetManagerLib.getDefaultRewardRate(),
118
+ false); // no parameter check
119
+
120
+ // define support parameters for instance targets
121
+ _setSupportInfo(
122
+ INSTANCE(),
123
+ true, // isSupported
124
+ true, // allowNewTargets,
125
+ true, // allowCrossChain
126
+ AmountLib.toAmount(100000 * 10 ** 18), // minStakingAmount 100'000 DIP
127
+ AmountLib.max(), // maxStakingAmount,
128
+ SecondsLib.oneDay(), // minLockingPeriod,
129
+ SecondsLib.oneYear(), // maxLockingPeriod,
130
+ UFixedLib.zero(), // minRewardRate,
131
+ UFixedLib.toUFixed(3, -1)); // maxRewardRate 30%
132
+ }
133
+
134
+
135
+ function initialize(
136
+ address targetLimitHandler
137
+ )
138
+ external
139
+ initializer()
140
+ {
141
+ _targetLimitHandler = ITargetLimitHandler(targetLimitHandler);
142
+ }
143
+
144
+
145
+ //--- dependency management ---------------------------------------------//
146
+
147
+ function setStakingReader(address reader)
148
+ external
149
+ restricted()
150
+ {
151
+ address oldReader = address(_reader);
152
+ _reader = StakingReader(reader);
153
+
154
+ emit IStaking.LogStakingStakingReaderSet(reader, oldReader);
155
+ }
156
+
157
+
158
+ function setTargetLimitHandler(address targetLimitHandler )
159
+ external
160
+ restricted()
161
+ {
162
+ address oldTargetHandler = address(_targetLimitHandler);
163
+ _targetLimitHandler = ITargetLimitHandler(targetLimitHandler );
164
+
165
+ emit IStaking.LogStakingTargetHandlerSet(targetLimitHandler , oldTargetHandler);
166
+ }
167
+
168
+ //--- target support management -----------------------------------------//
169
+
170
+ /// @dev Generic setter for support info.
171
+ /// Any change in any of the parameters requires to set all parameters.
172
+ function setSupportInfo(
173
+ ObjectType targetType,
174
+ bool isSupported,
175
+ bool allowNewTargets,
176
+ bool allowCrossChain,
177
+ Amount minStakingAmount,
178
+ Amount maxStakingAmount,
179
+ Seconds minLockingPeriod,
180
+ Seconds maxLockingPeriod,
181
+ UFixed minRewardRate,
182
+ UFixed maxRewardRate
183
+ )
184
+ external
185
+ restricted()
186
+ {
187
+ _setSupportInfo(
188
+ targetType,
189
+ isSupported,
190
+ allowNewTargets,
191
+ allowCrossChain,
192
+ minStakingAmount,
193
+ maxStakingAmount,
194
+ minLockingPeriod,
195
+ maxLockingPeriod,
196
+ minRewardRate,
197
+ maxRewardRate);
198
+ }
199
+
200
+
201
+ function _setSupportInfo(
202
+ ObjectType targetType,
203
+ bool isSupported,
204
+ bool allowNewTargets,
205
+ bool allowCrossChain,
206
+ Amount minStakingAmount,
207
+ Amount maxStakingAmount,
208
+ Seconds minLockingPeriod,
209
+ Seconds maxLockingPeriod,
210
+ UFixed minRewardRate,
211
+ UFixed maxRewardRate
212
+ )
213
+ private
214
+ {
215
+ // checks
216
+ if (targetType.eqz()) {
217
+ revert IStaking.ErrorStakingSupportTypeInvalid(targetType);
218
+ }
219
+
220
+ // check staking amount limits
221
+ if (minStakingAmount > maxStakingAmount) {
222
+ revert IStaking.ErrorStakingStakingAmountsInvalid(minStakingAmount, maxStakingAmount);
223
+ }
224
+
225
+ // check locking period limits
226
+ if (minLockingPeriod > maxLockingPeriod) {
227
+ revert IStaking.ErrorStakingLockingPeriodsInvalid(minLockingPeriod, maxLockingPeriod);
228
+ }
229
+
230
+ // check reward rate limits
231
+ if (minRewardRate > maxRewardRate) {
232
+ revert IStaking.ErrorStakingRewardRatesInvalid(minRewardRate, maxRewardRate);
233
+ }
234
+
235
+ // effects
236
+ // remember previous last update
237
+ Blocknumber lastUpdateIn = _supportInfo[targetType].lastUpdateIn;
238
+
239
+ // set parameters to new values
240
+ _supportInfo[targetType].isSupported = isSupported;
241
+ _supportInfo[targetType].allowNewTargets = allowNewTargets;
242
+ _supportInfo[targetType].allowCrossChain = allowCrossChain;
243
+ _supportInfo[targetType].minStakingAmount = minStakingAmount;
244
+ _supportInfo[targetType].maxStakingAmount = maxStakingAmount;
245
+ _supportInfo[targetType].minLockingPeriod = minLockingPeriod;
246
+ _supportInfo[targetType].maxLockingPeriod = maxLockingPeriod;
247
+ _supportInfo[targetType].minRewardRate = minRewardRate;
248
+ _supportInfo[targetType].maxRewardRate = maxRewardRate;
249
+ // update last update
250
+ _supportInfo[targetType].lastUpdateIn = BlocknumberLib.current();
251
+
252
+ // logging
253
+ emit IStaking.LogStakingSupportInfoSet(
254
+ targetType,
255
+ isSupported,
256
+ allowNewTargets,
257
+ allowCrossChain,
258
+ minStakingAmount,
259
+ maxStakingAmount,
260
+ minLockingPeriod,
261
+ maxLockingPeriod,
262
+ minRewardRate,
263
+ maxRewardRate,
264
+ lastUpdateIn);
265
+ }
266
+
267
+ /// @dev Returns the support info for the specified target type.
268
+ function getSupportInfo(ObjectType targetType)
269
+ external
270
+ view
271
+ returns (IStaking.SupportInfo memory supportInfo)
272
+ {
273
+ return _supportInfo[targetType];
274
+ }
275
+
276
+ //--- token management --------------------------------------------------//
277
+
278
+ /// @dev Registers a token for tvl management.
279
+ function addToken(
280
+ ChainId chainId,
281
+ address token
282
+ )
283
+ external
284
+ restricted() // token registry via staking
285
+ {
286
+ // checks
287
+ IStaking.TokenInfo storage info = _tokenInfo[chainId][token];
288
+
289
+ // check token is not yet registered
290
+ if (info.lastUpdateIn.gtz()) {
291
+ revert ErrorStakingStoreTokenAlreadyAdded(chainId, token);
292
+ }
293
+
294
+ info.stakingRate = UFixedLib.zero();
295
+ info.lastUpdateIn = BlocknumberLib.current();
296
+
297
+ // logging
298
+ emit IStaking.LogStakingTokenAdded(chainId, token);
299
+ }
300
+
301
+
302
+ /// @dev Sets the staking rate for the token.
303
+ function setStakingRate(
304
+ ChainId chainId,
305
+ address token,
306
+ UFixed stakingRate
307
+ )
308
+ external
309
+ restricted() // staking
310
+ returns (
311
+ UFixed oldStakingRate,
312
+ Blocknumber lastUpdatedIn
313
+ )
314
+ {
315
+ IStaking.TokenInfo storage info = _tokenInfo[chainId][token];
316
+ if (info.lastUpdateIn.eqz()) {
317
+ revert ErrorStakingStoreTokenUnknown(chainId, token);
318
+ }
319
+
320
+ // get previous values
321
+ oldStakingRate = info.stakingRate;
322
+ lastUpdatedIn = info.lastUpdateIn;
323
+
324
+ // update values
325
+ info.stakingRate = stakingRate;
326
+ info.lastUpdateIn = BlocknumberLib.current();
327
+ }
328
+
329
+ //--- target management -------------------------------------------------//
75
330
 
76
331
  function createTarget(
77
332
  NftId targetNftId,
78
- IStaking.TargetInfo memory targetInfo
333
+ ObjectType objectType,
334
+ Seconds lockingPeriod,
335
+ UFixed rewardRate
336
+ )
337
+ external
338
+ restricted() // staking
339
+ {
340
+ _createTarget(targetNftId, objectType, lockingPeriod, rewardRate, true);
341
+ }
342
+
343
+
344
+ function setLockingPeriod(
345
+ NftId targetNftId,
346
+ Seconds lockingPeriod
79
347
  )
80
348
  external
349
+ restricted() // staking
81
350
  {
82
- _create(
83
- targetNftId.toKey32(TARGET()),
84
- abi.encode(targetInfo));
351
+ // checks
352
+ (
353
+ IStaking.TargetInfo storage targetInfo,
354
+ Blocknumber lastUpdateIn
355
+ ) = _verifyAndUpdateTarget(targetNftId);
356
+
357
+ TargetManagerLib.checkLockingPeriod(_reader, targetNftId, targetInfo.objectType, lockingPeriod);
85
358
 
86
- _createBalance(targetNftId, AmountLib.zero());
87
- _targetManager.add(targetNftId);
359
+ // effects
360
+ Seconds oldLockingPeriod = targetInfo.lockingPeriod;
361
+ targetInfo.lockingPeriod = lockingPeriod;
362
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
363
+
364
+ // logging
365
+ emit IStaking.LogStakingTargetLockingPeriodSet(targetNftId, lockingPeriod, oldLockingPeriod, lastUpdateIn);
88
366
  }
89
367
 
90
368
 
91
- function updateTarget(
369
+ function setRewardRate(
370
+ NftId targetNftId,
371
+ UFixed rewardRate
372
+ )
373
+ external
374
+ restricted() // staking
375
+ {
376
+ // checks
377
+ (
378
+ IStaking.TargetInfo storage targetInfo,
379
+ Blocknumber lastUpdateIn
380
+ ) = _verifyAndUpdateTarget(targetNftId);
381
+
382
+ TargetManagerLib.checkRewardRate(_reader, targetNftId, targetInfo.objectType, rewardRate);
383
+
384
+ // effects
385
+ UFixed oldRewardRate = targetInfo.rewardRate;
386
+ targetInfo.rewardRate = rewardRate;
387
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
388
+
389
+ // logging
390
+ emit IStaking.LogStakingTargetRewardRateSet(targetNftId, rewardRate, oldRewardRate, lastUpdateIn);
391
+ }
392
+
393
+
394
+ // TODO refactor to set limits functionality
395
+ function setMaxStakedAmount(
396
+ NftId targetNftId,
397
+ Amount stakeLimitAmount
398
+ )
399
+ external
400
+ restricted() // staking
401
+ returns (
402
+ Amount oldLimitAmount,
403
+ Blocknumber lastUpdatedIn
404
+ )
405
+ {
406
+ IStaking.TargetInfo storage targetInfo;
407
+ (targetInfo, lastUpdatedIn) = _verifyAndUpdateTarget(targetNftId);
408
+
409
+ oldLimitAmount = targetInfo.limitAmount;
410
+ targetInfo.limitAmount = stakeLimitAmount;
411
+
412
+ emit IStaking.LogStakingTargetMaxStakedAmountSet(targetNftId, stakeLimitAmount, lastUpdatedIn);
413
+
414
+ }
415
+
416
+
417
+ function setTargetLimits(
92
418
  NftId targetNftId,
93
- IStaking.TargetInfo memory targetInfo
419
+ Amount marginAmount,
420
+ Amount hardLimitAmount
94
421
  )
95
422
  external
423
+ virtual
424
+ restricted()
96
425
  {
97
- _update(
98
- targetNftId.toKey32(TARGET()),
99
- abi.encode(targetInfo), KEEP_STATE());
426
+ // checks
427
+ IStaking.LimitInfo storage limitInfo = _getAndVerifyLimit(targetNftId);
428
+ Blocknumber lastUpdateIn = limitInfo.lastUpdateIn;
429
+
430
+ // effects
431
+ limitInfo.marginAmount = marginAmount;
432
+ limitInfo.hardLimitAmount = hardLimitAmount;
433
+ limitInfo.lastUpdateIn = BlocknumberLib.current();
434
+
435
+ // logging
436
+ emit IStaking.LogStakingTargetLimitsUpdated(
437
+ targetNftId,
438
+ marginAmount,
439
+ hardLimitAmount,
440
+ lastUpdateIn);
100
441
  }
101
442
 
102
- //--- stake specific functions -------------------------------------//
103
443
 
104
- function create(
105
- NftId stakeNftId,
106
- IStaking.StakeInfo memory stakeInfo,
107
- Amount stakeAmount
444
+ function addTargetToken(
445
+ NftId targetNftId,
446
+ address token
108
447
  )
109
448
  external
449
+ restricted()
110
450
  {
111
- _create(
112
- stakeNftId.toKey32(STAKE()),
113
- abi.encode(stakeInfo));
451
+ // checks
114
452
 
115
- _createBalance(stakeNftId, stakeAmount);
453
+ // skip registering if tvl balance has already been initialized
454
+ IStaking.TvlInfo storage tvlInfo = _tvlInfo[targetNftId][token];
455
+ if (tvlInfo.lastUpdateIn.gtz()) {
456
+ return;
457
+ }
458
+
459
+ // check target exists
460
+ _getAndVerifyTarget(targetNftId);
461
+
462
+ // check token is known for chain id of target
463
+ ChainId chainId = ChainIdLib.fromNftId(targetNftId);
464
+ if (_tokenInfo[chainId][token].lastUpdateIn.eqz()) {
465
+ revert ErrorStakingStoreTokenUnknown(chainId, token);
466
+ }
467
+
468
+ // effects
469
+ tvlInfo.tvlAmount = AmountLib.zero();
470
+ tvlInfo.lastUpdateIn = BlocknumberLib.current();
471
+
472
+ // add token to list of know tokens for target
473
+ _targetToken[targetNftId].push(token);
116
474
  }
117
475
 
118
- function update(
119
- NftId stakeNftId,
120
- IStaking.StakeInfo memory stakeInfo
476
+
477
+ function refillRewardReserves(
478
+ NftId targetNftId,
479
+ Amount dipAmount
480
+ )
481
+ external
482
+ restricted()
483
+ returns (Amount newReserveBalance)
484
+ {
485
+ // checks
486
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
487
+ Blocknumber lastUpdateIn = targetInfo.lastUpdateIn;
488
+
489
+ // effects
490
+ targetInfo.reserveAmount = targetInfo.reserveAmount + dipAmount;
491
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
492
+
493
+ // logging
494
+ newReserveBalance = targetInfo.reserveAmount;
495
+ emit IStaking.LogStakingRewardReservesRefilled(
496
+ targetNftId,
497
+ dipAmount,
498
+ _registry.ownerOf(targetNftId),
499
+ newReserveBalance,
500
+ lastUpdateIn);
501
+ }
502
+
503
+
504
+ function withdrawRewardReserves(
505
+ NftId targetNftId,
506
+ Amount dipAmount
507
+ )
508
+ external
509
+ restricted()
510
+ returns (Amount newReserveBalance)
511
+ {
512
+ // checks
513
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
514
+
515
+ // effects
516
+ Blocknumber lastUpdateIn = _decreaseReserves(targetNftId, targetInfo, dipAmount);
517
+
518
+ // logging
519
+ newReserveBalance = targetInfo.reserveAmount;
520
+ emit IStaking.LogStakingRewardReservesWithdrawn(
521
+ targetNftId,
522
+ dipAmount,
523
+ _registry.ownerOf(targetNftId),
524
+ newReserveBalance,
525
+ lastUpdateIn);
526
+ }
527
+
528
+
529
+ //--- tvl specific functions -------------------------------------//
530
+
531
+ function increaseTotalValueLocked(
532
+ NftId targetNftId,
533
+ address token,
534
+ Amount amount
121
535
  )
122
536
  external
537
+ restricted()
538
+ returns (Amount newBalance)
123
539
  {
124
- _update(
125
- stakeNftId.toKey32(STAKE()),
126
- abi.encode(stakeInfo),
127
- KEEP_STATE());
540
+ // checks
541
+ IStaking.TvlInfo storage tvlInfo = _getAndVerifyTvl(targetNftId, token);
542
+ Blocknumber lastUpdateIn = tvlInfo.lastUpdateIn;
543
+
544
+ // effects
545
+ // update tvl balance and adapts required stakes if necessary
546
+ tvlInfo.tvlAmount = tvlInfo.tvlAmount + amount;
547
+ _checkAndUpdateTargetLimit(targetNftId, token, tvlInfo);
548
+ tvlInfo.lastUpdateIn = BlocknumberLib.current();
549
+ newBalance = tvlInfo.tvlAmount;
550
+
551
+ // logging
552
+ emit IStaking.LogStakingTvlIncreased(targetNftId, token, amount, newBalance, lastUpdateIn);
128
553
  }
129
554
 
130
- //--- general functions --------------------------------------------//
555
+
556
+ function decreaseTotalValueLocked(
557
+ NftId targetNftId,
558
+ address token,
559
+ Amount amount
560
+ )
561
+ external
562
+ restricted()
563
+ returns (Amount newBalance)
564
+ {
565
+ // checks
566
+ IStaking.TvlInfo storage tvlInfo = _getAndVerifyTvl(targetNftId, token);
567
+ Blocknumber lastUpdateIn = tvlInfo.lastUpdateIn;
568
+
569
+ // effects
570
+ // update tvl balance and adapts required stakes if necessary
571
+ tvlInfo.tvlAmount = tvlInfo.tvlAmount - amount;
572
+ _checkAndUpdateTargetLimit(targetNftId, token, tvlInfo);
573
+ tvlInfo.lastUpdateIn = BlocknumberLib.current();
574
+ newBalance = tvlInfo.tvlAmount;
575
+
576
+ // logging
577
+ emit IStaking.LogStakingTvlDecreased(targetNftId, token, amount, newBalance, lastUpdateIn);
578
+ }
131
579
 
132
580
 
133
- function increaseBalance(NftId nftId, Amount amount, Amount rewardIncrementAmount)
581
+ function updateTargetLimit(NftId targetNftId)
134
582
  external
583
+ restricted()
584
+ returns (Amount stakeLimitAmount)
135
585
  {
136
- Blocknumber lastUpdatedIn = _lastUpdatedIn[nftId];
137
- bool updated = false;
586
+ return _updateTargetLimit(targetNftId);
587
+ }
138
588
 
139
- if (lastUpdatedIn.eqz()) {
140
- revert ErrorStakingStoreBalanceNotInitialized(nftId);
589
+
590
+ function _checkAndUpdateTargetLimit(
591
+ NftId targetNftId,
592
+ address token,
593
+ IStaking.TvlInfo storage tvlInfo
594
+ )
595
+ internal
596
+ {
597
+ // update counter
598
+ tvlInfo.updatesCounter++;
599
+
600
+ // check if upgrade is necessary
601
+ bool updateRequired = _targetLimitHandler.isLimitUpdateRequired(
602
+ targetNftId,
603
+ token,
604
+ tvlInfo.updatesCounter,
605
+ tvlInfo.tvlBaselineAmount,
606
+ tvlInfo.tvlAmount);
607
+
608
+ if (updateRequired) {
609
+ // reset baseline and counter
610
+ tvlInfo.tvlBaselineAmount = tvlInfo.tvlAmount;
611
+ tvlInfo.updatesCounter = 0;
612
+
613
+ // update limit
614
+ _updateTargetLimit(targetNftId);
141
615
  }
616
+ }
142
617
 
143
- // update stake balance with amount
144
- if(amount.gtz()) {
145
- updated = true;
146
- _stakeBalance[nftId] = _stakeBalance[nftId] + amount;
147
- emit LogStakingStoreStakesIncreased(nftId, amount, _stakeBalance[nftId], lastUpdatedIn);
618
+
619
+ function _updateTargetLimit(NftId targetNftId)
620
+ internal
621
+ returns (Amount limitAmount)
622
+ {
623
+ // checks
624
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
625
+ IStaking.LimitInfo storage limitInfo = _getAndVerifyLimit(targetNftId);
626
+ Blocknumber lastUpdateIn = limitInfo.lastUpdateIn;
627
+
628
+ // calculate max stake amount
629
+ Amount requiredStakeAmount = getRequiredStakeBalance(targetNftId, false);
630
+ // limitAmount = AmountLib.min(
631
+ // targetInfo.limitAmount,
632
+ // requiredStakeAmount + limitInfo.marginAmount);
633
+
634
+ // add margin to required stakes
635
+ limitAmount = requiredStakeAmount + limitInfo.marginAmount;
636
+ // cap at hard limit
637
+ limitAmount = AmountLib.min(limitAmount, limitInfo.hardLimitAmount);
638
+
639
+ // effects
640
+ targetInfo.limitAmount = limitAmount;
641
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
642
+
643
+ // logging
644
+ emit IStaking.LogStakingTargetLimitUpdated(
645
+ targetNftId,
646
+ targetInfo.limitAmount,
647
+ limitInfo.hardLimitAmount,
648
+ requiredStakeAmount,
649
+ targetInfo.stakedAmount,
650
+ lastUpdateIn);
651
+ }
652
+
653
+ //--- stake specific functions -------------------------------------//
654
+
655
+ function createStake(
656
+ NftId stakeNftId,
657
+ NftId targetNftId,
658
+ address stakeOwner,
659
+ Amount stakeAmount
660
+ )
661
+ external
662
+ restricted()
663
+ returns (Timestamp lockedUntil)
664
+ {
665
+ // checks
666
+ IStaking.StakeInfo storage stakeInfo = _stakeInfo[stakeNftId];
667
+ if (stakeInfo.lastUpdateIn.gtz()) {
668
+ revert ErrorStakingStoreStakeBalanceAlreadyInitialized(stakeNftId);
148
669
  }
149
670
 
150
- // update reward balance with amount
151
- if(rewardIncrementAmount.gtz()) {
152
- updated = true;
153
- _rewardBalance[nftId] = _rewardBalance[nftId] + rewardIncrementAmount;
154
- emit LogStakingStoreRewardsIncreased(nftId, rewardIncrementAmount, _rewardBalance[nftId], lastUpdatedIn);
671
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
672
+ _checkMaxStakedAmount(targetNftId, targetInfo, stakeAmount);
673
+
674
+ // effects
675
+ stakeInfo.targetNftId = targetNftId;
676
+ stakeInfo.stakedAmount = AmountLib.zero();
677
+ stakeInfo.rewardAmount = AmountLib.zero();
678
+ stakeInfo.lockedUntil = TimestampLib.current();
679
+ _setStakeLastUpdatesToCurrent(stakeInfo);
680
+
681
+ // logging for creation of empty stake
682
+ emit IStaking.LogStakingStakeCreated(stakeNftId, stakeInfo.targetNftId, stakeInfo.stakedAmount, stakeInfo.lockedUntil, stakeOwner);
683
+
684
+ // process stake amount
685
+ _stake(stakeNftId, stakeInfo, targetInfo, targetInfo.lockingPeriod, stakeAmount);
686
+
687
+ return stakeInfo.lockedUntil;
688
+ }
689
+
690
+
691
+ function stake(
692
+ NftId stakeNftId,
693
+ bool updateRewards,
694
+ bool restakeRewards,
695
+ Seconds additionalLockingPeriod,
696
+ Amount stakeAmount
697
+ )
698
+ external
699
+ restricted()
700
+ {
701
+ // checks
702
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
703
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
704
+
705
+ if (updateRewards) {
706
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
155
707
  }
156
708
 
157
- if (updated) {
158
- _lastUpdatedAt[nftId] = TimestampLib.blockTimestamp();
159
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
709
+ if (restakeRewards) {
710
+ _restakeRewards(stakeNftId, stakeInfo, targetInfo);
160
711
  }
712
+
713
+ _stake(stakeNftId, stakeInfo, targetInfo, additionalLockingPeriod, stakeAmount);
161
714
  }
162
715
 
163
716
 
164
- function restakeRewards(
165
- NftId nftId,
166
- Amount rewardIncrementAmount
717
+ function unstake(
718
+ NftId stakeNftId,
719
+ bool updateRewards,
720
+ bool restakeRewards,
721
+ Amount maxUnstakeAmount
167
722
  )
168
723
  external
724
+ restricted()
725
+ returns (Amount unstakedAmount)
169
726
  {
170
- Blocknumber lastUpdatedIn = _lastUpdatedIn[nftId];
171
- Amount stakeAmount = _stakeBalance[nftId];
172
- Amount rewardAmount = _rewardBalance[nftId];
727
+ // checks
728
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
729
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
730
+
731
+ if (updateRewards) {
732
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
733
+ }
173
734
 
174
- if (lastUpdatedIn.eqz()) {
175
- revert ErrorStakingStoreBalanceNotInitialized(nftId);
735
+ if (restakeRewards) {
736
+ _restakeRewards(stakeNftId, stakeInfo, targetInfo);
176
737
  }
177
738
 
178
- // move all rewards to stake balance
179
- _stakeBalance[nftId] = stakeAmount + rewardAmount + rewardIncrementAmount;
180
- _rewardBalance[nftId] = AmountLib.zero();
739
+ return _unstake(stakeNftId, stakeInfo, targetInfo, maxUnstakeAmount);
740
+ }
741
+
181
742
 
182
- _lastUpdatedAt[nftId] = TimestampLib.blockTimestamp();
183
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
743
+ function updateRewards(NftId stakeNftId)
744
+ external
745
+ restricted()
746
+ {
747
+ // checks
748
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
749
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
750
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
751
+ }
752
+
753
+
754
+ function restakeRewards(
755
+ NftId stakeNftId,
756
+ bool updateRewards
757
+ )
758
+ external
759
+ restricted()
760
+ {
761
+ // checks
762
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
763
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
184
764
 
185
- emit LogStakingStoreRewardsRestaked(nftId, stakeAmount, rewardAmount, rewardIncrementAmount, _stakeBalance[nftId], lastUpdatedIn);
765
+ if (updateRewards) {
766
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
767
+ }
768
+
769
+ _restakeRewards(stakeNftId, stakeInfo, targetInfo);
186
770
  }
187
771
 
188
772
 
189
- function updateRewards(
190
- NftId nftId,
191
- Amount rewardIncrementAmount
773
+ function claimRewards(
774
+ NftId stakeNftId,
775
+ bool updateRewards,
776
+ Amount maxClaimAmount
192
777
  )
193
778
  external
779
+ restricted()
780
+ returns (Amount claimedAmount)
194
781
  {
195
- Blocknumber lastUpdatedIn = _lastUpdatedIn[nftId];
196
- Amount rewardAmount = _rewardBalance[nftId];
782
+ // checks
783
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
784
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
197
785
 
198
- if (lastUpdatedIn.eqz()) {
199
- revert ErrorStakingStoreBalanceNotInitialized(nftId);
786
+ if (updateRewards) {
787
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
200
788
  }
201
789
 
202
- // move all rewards to stake balance
203
- _rewardBalance[nftId] = rewardAmount + rewardIncrementAmount;
790
+ claimedAmount = _claimRewards(stakeNftId, stakeInfo, targetInfo, maxClaimAmount);
791
+ }
792
+
793
+ //--- view functions -----------------------------------------------//
204
794
 
205
- _lastUpdatedAt[nftId] = TimestampLib.blockTimestamp();
206
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
795
+ function getStakingReader() external view returns (StakingReader stakingReader){
796
+ return _reader;
797
+ }
207
798
 
208
- emit LogStakingStoreRewardsIncreased(nftId, rewardIncrementAmount, _rewardBalance[nftId], lastUpdatedIn);
799
+ function getTargetManager() external view returns (ITargetLimitHandler targetLimitHandler ){
800
+ return _targetLimitHandler;
209
801
  }
210
802
 
211
803
 
212
- function claimUpTo(
213
- NftId nftId,
214
- Amount maxRewardAmount
804
+ function exists(NftId stakeNftId) external view returns (bool) {
805
+ return _stakeInfo[stakeNftId].lastUpdateIn.gtz();
806
+ }
807
+
808
+
809
+ function getRequiredStakeBalance(
810
+ NftId targetNftId,
811
+ bool includeTargetTypeRequirements
215
812
  )
216
- external
217
- returns (Amount rewardsClaimedAmount)
813
+ public
814
+ view
815
+ returns (Amount requiredStakeAmount)
218
816
  {
219
- Blocknumber lastUpdatedIn = _lastUpdatedIn[nftId];
220
- bool updated = false;
817
+ address [] memory tokens = _targetToken[targetNftId];
818
+ if (tokens.length == 0) {
819
+ return AmountLib.zero();
820
+ }
821
+
822
+ // calculate tvl based required stake amount
823
+ requiredStakeAmount = AmountLib.zero();
824
+ ChainId targetChainId = _targetInfo[targetNftId].chainId;
825
+ address token;
826
+ Amount tvlAmount;
827
+ UFixed stakingRate;
221
828
 
222
- if (lastUpdatedIn.eqz()) {
223
- revert ErrorStakingStoreBalanceNotInitialized(nftId);
829
+ for (uint256 i = 0; i < tokens.length; i++) {
830
+ token = tokens[i];
831
+ tvlAmount = _tvlInfo[targetNftId][token].tvlAmount;
832
+ if (tvlAmount.eqz()) { continue; }
833
+
834
+ stakingRate = _tokenInfo[targetChainId][token].stakingRate;
835
+ if (stakingRate.eqz()) { continue; }
836
+
837
+ requiredStakeAmount = requiredStakeAmount + tvlAmount.multiplyWith(stakingRate);
224
838
  }
225
839
 
226
- // determine the claimable rewards amount
227
- if (maxRewardAmount > _rewardBalance[nftId]) {
228
- rewardsClaimedAmount = _rewardBalance[nftId];
229
- } else {
230
- rewardsClaimedAmount = maxRewardAmount;
840
+ // update required amount based on target type
841
+ if (includeTargetTypeRequirements) {
842
+ ObjectType targetType = _targetInfo[targetNftId].objectType;
843
+ IStaking.SupportInfo storage supportInfo = _supportInfo[targetType];
844
+
845
+ if (requiredStakeAmount < supportInfo.minStakingAmount) {
846
+ requiredStakeAmount = supportInfo.minStakingAmount;
847
+ } else if (requiredStakeAmount > supportInfo.maxStakingAmount) {
848
+ requiredStakeAmount = supportInfo.maxStakingAmount;
849
+ }
231
850
  }
851
+ }
852
+
232
853
 
233
- // decrease reward amount
234
- _rewardBalance[nftId] = _rewardBalance[nftId] - rewardsClaimedAmount;
854
+ /// @dev Returns true iff current stake amount is still locked
855
+ function isStakeLocked(NftId stakeNftId) public view returns (bool) {
856
+ return _stakeInfo[stakeNftId].lockedUntil > TimestampLib.current();
857
+ }
235
858
 
236
- _lastUpdatedAt[nftId] = TimestampLib.blockTimestamp();
237
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
238
859
 
239
- emit LogStakingStoreRewardsDecreased(nftId, rewardsClaimedAmount, _rewardBalance[nftId], lastUpdatedIn);
860
+ /// @dev Returns the stake infos for the specified stake.
861
+ function getStakeInfo(NftId stakeNftId) external view returns (IStaking.StakeInfo memory stakeInfo) {
862
+ return _stakeInfo[stakeNftId];
240
863
  }
241
864
 
242
865
 
243
- function unstakeUpTo(
244
- NftId nftId,
245
- Amount maxUnstakeAmount,
246
- Amount maxClaimAmount
247
- )
248
- external
866
+ /// @dev Returns the stake infos for the specified stake.
867
+ function getStakeTarget(NftId stakeNftId) external view returns (NftId targetNftId) {
868
+ return _stakeInfo[stakeNftId].targetNftId;
869
+ }
870
+
871
+
872
+ /// @dev Returns the target infos for the specified target.
873
+ function getTargetInfo(NftId targetNftId) external view returns (IStaking.TargetInfo memory targetInfo) {
874
+ return _targetInfo[targetNftId];
875
+ }
876
+
877
+
878
+ /// @dev Returns the target limit infos for the specified target.
879
+ function getLimitInfo(NftId targetNftId) external view returns (IStaking.LimitInfo memory limitInfo) {
880
+ return _limitInfo[targetNftId];
881
+ }
882
+
883
+
884
+ /// @dev Returns the tvl infos for the specified target.
885
+ function getTvlInfo(NftId targetNftId, address token) external view returns (IStaking.TvlInfo memory tvlInfo) {
886
+ return _tvlInfo[targetNftId][token];
887
+ }
888
+
889
+
890
+ /// @dev Returns the tvl infos for the specified target.
891
+ function getTokenInfo(ChainId chainId, address token) external view returns (IStaking.TokenInfo memory tokenInfo) {
892
+ return _tokenInfo[chainId][token];
893
+ }
894
+
895
+ function hasTokenInfo(ChainId chainId, address token) external view returns (bool) {
896
+ return _tokenInfo[chainId][token].lastUpdateIn.gtz();
897
+ }
898
+
899
+
900
+ function getTargetSet() external view returns (NftIdSet targetNftIdSet) {
901
+ return _targetNftIdSet;
902
+ }
903
+
904
+ //--- internal functions -----------------------------------------------//
905
+
906
+ function _verifyAndUpdateTarget(NftId targetNftId)
907
+ private
249
908
  returns (
250
- Amount unstakedAmount,
251
- Amount claimedAmount
909
+ IStaking.TargetInfo storage targetInfo,
910
+ Blocknumber lastUpdatedIn
252
911
  )
253
912
  {
254
- Blocknumber lastUpdatedIn = _lastUpdatedIn[nftId];
255
- bool updated = false;
913
+ // checks
914
+ targetInfo = _getAndVerifyTarget(targetNftId);
915
+ lastUpdatedIn = targetInfo.lastUpdateIn;
916
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
917
+ }
918
+
919
+
920
+ function _createTarget(
921
+ NftId targetNftId,
922
+ ObjectType objectType,
923
+ Seconds lockingPeriod,
924
+ UFixed rewardRate,
925
+ bool checkParameters
926
+ )
927
+ private
928
+ {
929
+ // checks
930
+ if (checkParameters) {
931
+ TargetManagerLib.checkTargetParameters(
932
+ _registry,
933
+ _reader,
934
+ targetNftId,
935
+ objectType,
936
+ lockingPeriod,
937
+ rewardRate);
938
+ }
939
+
940
+ // effects
941
+
942
+ // target info
943
+ IStaking.TargetInfo storage targetInfo = _targetInfo[targetNftId];
944
+ targetInfo.stakedAmount = AmountLib.zero();
945
+ targetInfo.rewardAmount = AmountLib.zero();
946
+ targetInfo.reserveAmount = AmountLib.zero();
947
+ targetInfo.limitAmount = AmountLib.max();
948
+
949
+ targetInfo.objectType = objectType;
950
+ targetInfo.lockingPeriod = lockingPeriod;
951
+ targetInfo.rewardRate = rewardRate;
952
+ targetInfo.chainId = ChainIdLib.fromNftId(targetNftId);
953
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
954
+
955
+ // create limit info
956
+ _setLimits(
957
+ _limitInfo[targetNftId],
958
+ targetNftId,
959
+ AmountLib.toAmount(AmountLib.max().toInt() / 2), // margin limit
960
+ AmountLib.max()); // hard limit
961
+
962
+ // add new target to target set
963
+ _targetNftIdSet.add(targetNftId);
964
+
965
+ // logging
966
+ emit IStaking.LogStakingTargetCreated(targetNftId, objectType, lockingPeriod, rewardRate);
967
+ }
968
+
969
+
970
+ function _setLimits(
971
+ IStaking.LimitInfo storage limitInfo,
972
+ NftId targetNftId,
973
+ Amount marginAmount,
974
+ Amount hardLimitAmount
975
+ )
976
+ private
977
+ {
978
+ // effects
979
+ Blocknumber lastUpdateIn = limitInfo.lastUpdateIn;
980
+ limitInfo.marginAmount = marginAmount;
981
+ limitInfo.hardLimitAmount = hardLimitAmount;
982
+ limitInfo.lastUpdateIn = BlocknumberLib.current();
983
+
984
+ // logging
985
+ emit IStaking.LogStakingLimitsSet(targetNftId, limitInfo.marginAmount , limitInfo.hardLimitAmount, lastUpdateIn);
986
+ }
256
987
 
257
- if (lastUpdatedIn.eqz()) {
258
- revert ErrorStakingStoreBalanceNotInitialized(nftId);
988
+
989
+ function _spendRewardReserves(
990
+ NftId targetNftId,
991
+ IStaking.TargetInfo storage targetInfo,
992
+ Amount dipAmount
993
+ )
994
+ private
995
+ {
996
+ Blocknumber lastUpdateIn = _decreaseReserves(targetNftId, targetInfo, dipAmount);
997
+
998
+ // logging
999
+ emit IStaking.LogStakingRewardReservesSpent(
1000
+ targetNftId,
1001
+ dipAmount,
1002
+ targetInfo.reserveAmount,
1003
+ lastUpdateIn);
1004
+ }
1005
+
1006
+
1007
+ function _decreaseReserves(
1008
+ NftId targetNftId,
1009
+ IStaking.TargetInfo storage targetInfo,
1010
+ Amount dipAmount
1011
+ )
1012
+ private
1013
+ returns ( Blocknumber lastUpdateIn)
1014
+ {
1015
+ lastUpdateIn = targetInfo.lastUpdateIn;
1016
+
1017
+ // check if reserves are sufficient
1018
+ if (dipAmount > targetInfo.reserveAmount) {
1019
+ revert ErrorStakingStoreRewardReservesInsufficient(
1020
+ targetNftId,
1021
+ targetInfo.reserveAmount,
1022
+ dipAmount);
259
1023
  }
260
1024
 
261
- // determine the unstakeable amount
262
- if (maxUnstakeAmount > _rewardBalance[nftId]) {
263
- unstakedAmount = _rewardBalance[nftId];
264
- } else {
265
- unstakedAmount = maxUnstakeAmount;
1025
+ // effects
1026
+ targetInfo.reserveAmount = targetInfo.reserveAmount - dipAmount;
1027
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
1028
+ }
1029
+
1030
+
1031
+ function _updateRewards(
1032
+ NftId stakeNftId,
1033
+ IStaking.StakeInfo storage stakeInfo,
1034
+ IStaking.TargetInfo storage targetInfo
1035
+ )
1036
+ internal
1037
+ returns (Amount rewardIncreaseAmount)
1038
+ {
1039
+ // return if reward rate is zero
1040
+ if (targetInfo.rewardRate.eqz()) {
1041
+ return rewardIncreaseAmount;
266
1042
  }
267
1043
 
268
- // determine the claimable rewards amount
269
- if (maxClaimAmount > _rewardBalance[nftId]) {
270
- claimedAmount = _rewardBalance[nftId];
271
- } else {
272
- claimedAmount = maxClaimAmount;
1044
+ // get seconds since last update on stake
1045
+ Seconds duration = SecondsLib.toSeconds(
1046
+ block.timestamp - stakeInfo.lastUpdateAt.toInt());
1047
+
1048
+ // return if duration is zero
1049
+ if (duration.eqz()) {
1050
+ return AmountLib.zero();
273
1051
  }
1052
+
1053
+ // calculate reward increase since
1054
+ rewardIncreaseAmount = StakingLib.calculateRewardAmount(
1055
+ targetInfo.rewardRate,
1056
+ duration,
1057
+ stakeInfo.stakedAmount);
1058
+
1059
+ // update target + stake
1060
+ targetInfo.rewardAmount = targetInfo.rewardAmount + rewardIncreaseAmount;
1061
+ stakeInfo.rewardAmount = stakeInfo.rewardAmount + rewardIncreaseAmount;
1062
+ Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
1063
+
1064
+ // logging
1065
+ emit IStaking.LogStakingStakeRewardsUpdated(
1066
+ stakeNftId,
1067
+ rewardIncreaseAmount,
1068
+ stakeInfo.stakedAmount,
1069
+ stakeInfo.rewardAmount,
1070
+ stakeInfo.lockedUntil,
1071
+ lastUpdateIn);
1072
+ }
274
1073
 
275
- // decrease amounts
276
- _stakeBalance[nftId] = _stakeBalance[nftId] - unstakedAmount;
277
- _rewardBalance[nftId] = _rewardBalance[nftId] - claimedAmount;
278
1074
 
279
- _lastUpdatedAt[nftId] = TimestampLib.blockTimestamp();
280
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
1075
+ function _restakeRewards(
1076
+ NftId stakeNftId,
1077
+ IStaking.StakeInfo storage stakeInfo,
1078
+ IStaking.TargetInfo storage targetInfo
1079
+ )
1080
+ internal
1081
+ returns (Amount restakeAmount)
1082
+ {
1083
+ restakeAmount = stakeInfo.rewardAmount;
281
1084
 
282
- emit LogStakingStoreStakesDecreased(nftId, unstakedAmount, _stakeBalance[nftId], lastUpdatedIn);
283
- emit LogStakingStoreRewardsDecreased(nftId, claimedAmount, _rewardBalance[nftId], lastUpdatedIn);
1085
+ // return if reward amount is zero
1086
+ if (restakeAmount.eqz()) {
1087
+ return restakeAmount;
1088
+ }
1089
+
1090
+ // check restaking amount does not exceed target max staked amount
1091
+ _checkMaxStakedAmount(stakeInfo.targetNftId, targetInfo, restakeAmount);
1092
+
1093
+ // use up reserves for newly staked dips
1094
+ _spendRewardReserves(stakeInfo.targetNftId, targetInfo, restakeAmount);
1095
+
1096
+ // update target + stake
1097
+ targetInfo.stakedAmount = targetInfo.stakedAmount + restakeAmount;
1098
+ targetInfo.rewardAmount = targetInfo.rewardAmount - restakeAmount;
1099
+ stakeInfo.stakedAmount = stakeInfo.stakedAmount + restakeAmount;
1100
+ stakeInfo.rewardAmount = AmountLib.zero();
1101
+ Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
1102
+
1103
+ // logging
1104
+ emit IStaking.LogStakingRewardsRestaked(
1105
+ stakeNftId,
1106
+ restakeAmount,
1107
+ stakeInfo.stakedAmount,
1108
+ AmountLib.zero(),
1109
+ stakeInfo.lockedUntil,
1110
+ lastUpdateIn);
284
1111
  }
285
1112
 
286
- //--- view functions -----------------------------------------------//
287
1113
 
288
- function getStakingReader() external view returns (StakingReader stakingReader){
289
- return _reader;
1114
+ function _stake(
1115
+ NftId stakeNftId,
1116
+ IStaking.StakeInfo storage stakeInfo,
1117
+ IStaking.TargetInfo storage targetInfo,
1118
+ Seconds maxAdditionalLockingPeriod,
1119
+ Amount stakeAmount
1120
+ )
1121
+ internal
1122
+ {
1123
+ // return if reward amount is zero
1124
+ if (stakeAmount.eqz()) {
1125
+ return;
1126
+ }
1127
+
1128
+ // check restaking amount does not exceed target max staked amount
1129
+ _checkMaxStakedAmount(stakeInfo.targetNftId, targetInfo, stakeAmount);
1130
+
1131
+ // update target + stake
1132
+ targetInfo.stakedAmount = targetInfo.stakedAmount + stakeAmount;
1133
+ stakeInfo.stakedAmount = stakeInfo.stakedAmount + stakeAmount;
1134
+
1135
+ // increase locked until if applicable
1136
+ Seconds additionalLockingPeriod = SecondsLib.min(maxAdditionalLockingPeriod, targetInfo.lockingPeriod);
1137
+ if (stakeAmount.gtz() && additionalLockingPeriod.gtz()) {
1138
+ stakeInfo.lockedUntil = stakeInfo.lockedUntil.addSeconds(additionalLockingPeriod);
1139
+ }
1140
+
1141
+ Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
1142
+
1143
+ // logging
1144
+ emit IStaking.LogStakingStaked(
1145
+ stakeNftId,
1146
+ stakeAmount,
1147
+ stakeInfo.stakedAmount,
1148
+ stakeInfo.rewardAmount,
1149
+ stakeInfo.lockedUntil,
1150
+ lastUpdateIn);
1151
+ }
1152
+
1153
+
1154
+ function _claimRewards(
1155
+ NftId stakeNftId,
1156
+ IStaking.StakeInfo storage stakeInfo,
1157
+ IStaking.TargetInfo storage targetInfo,
1158
+ Amount maxClaimAmount
1159
+ )
1160
+ internal
1161
+ returns (Amount claimAmount)
1162
+ {
1163
+ claimAmount = AmountLib.min(maxClaimAmount, stakeInfo.rewardAmount);
1164
+
1165
+ // return if no rewards to claim
1166
+ if (claimAmount.eqz()) {
1167
+ return claimAmount;
1168
+ }
1169
+
1170
+ // effects
1171
+ // use up reserves for claimed rewards
1172
+ _spendRewardReserves(stakeInfo.targetNftId, targetInfo, claimAmount);
1173
+
1174
+ // update target + stake
1175
+ targetInfo.rewardAmount = targetInfo.rewardAmount - claimAmount;
1176
+ stakeInfo.rewardAmount = stakeInfo.rewardAmount - claimAmount;
1177
+ Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
1178
+
1179
+ // logging
1180
+ emit IStaking.LogStakingRewardsClaimed(
1181
+ stakeNftId,
1182
+ claimAmount,
1183
+ stakeInfo.stakedAmount,
1184
+ stakeInfo.rewardAmount,
1185
+ stakeInfo.lockedUntil,
1186
+ lastUpdateIn);
1187
+ }
1188
+
1189
+
1190
+ function _unstake(
1191
+ NftId stakeNftId,
1192
+ IStaking.StakeInfo storage stakeInfo,
1193
+ IStaking.TargetInfo storage targetInfo,
1194
+ Amount maxUnstakeAmount
1195
+ )
1196
+ internal
1197
+ returns (Amount unstakedAmount)
1198
+ {
1199
+ unstakedAmount = AmountLib.min(maxUnstakeAmount, stakeInfo.stakedAmount);
1200
+
1201
+ // return if no stakes to claim
1202
+ if (unstakedAmount.eqz()) {
1203
+ return unstakedAmount;
1204
+ }
1205
+
1206
+ // check if stake is still locked
1207
+ if (isStakeLocked(stakeNftId)) {
1208
+ revert IStaking.ErrorStakingStakeLocked(stakeNftId, stakeInfo.lockedUntil);
1209
+ }
1210
+
1211
+ // update target + stake
1212
+ targetInfo.stakedAmount = targetInfo.stakedAmount - unstakedAmount;
1213
+ stakeInfo.stakedAmount = stakeInfo.stakedAmount - unstakedAmount;
1214
+ Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
1215
+
1216
+ // logging
1217
+ emit IStaking.LogStakingUnstaked(
1218
+ stakeNftId,
1219
+ unstakedAmount,
1220
+ stakeInfo.stakedAmount,
1221
+ stakeInfo.rewardAmount,
1222
+ stakeInfo.lockedUntil,
1223
+ lastUpdateIn);
290
1224
  }
291
1225
 
292
- function getTargetManager() external view returns (NftIdSetManager targetManager){
293
- return _targetManager;
1226
+
1227
+ function _setLastUpdatesToCurrent(
1228
+ IStaking.StakeInfo storage stakeInfo,
1229
+ IStaking.TargetInfo storage targetInfo
1230
+ )
1231
+ internal
1232
+ returns (Blocknumber lastUpdateIn)
1233
+ {
1234
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
1235
+ lastUpdateIn = _setStakeLastUpdatesToCurrent(stakeInfo);
294
1236
  }
295
1237
 
296
- function exists(NftId stakeNftId) external view returns (bool) {
297
- return exists(stakeNftId.toKey32(STAKE()));
1238
+
1239
+ function _setStakeLastUpdatesToCurrent(
1240
+ IStaking.StakeInfo storage stakeInfo
1241
+ )
1242
+ internal
1243
+ returns (Blocknumber lastUpdateIn)
1244
+ {
1245
+ lastUpdateIn = stakeInfo.lastUpdateIn;
1246
+ stakeInfo.lastUpdateIn = BlocknumberLib.current();
1247
+ stakeInfo.lastUpdateAt = TimestampLib.current();
298
1248
  }
299
1249
 
300
- function getStakeBalance(NftId nftId) external view returns (Amount balanceAmount) { return _stakeBalance[nftId]; }
301
- function getRewardBalance(NftId nftId) external view returns (Amount rewardAmount) { return _rewardBalance[nftId]; }
302
- function getBalanceUpdatedAt(NftId nftId) external view returns (Timestamp updatedAt) { return _lastUpdatedAt[nftId]; }
1250
+ //--- private stake and target functions --------------------------------//
303
1251
 
304
- function getBalanceAndLastUpdatedAt(NftId nftId)
305
- external
1252
+
1253
+ function _getAndVerifyStake(
1254
+ NftId stakeNftId
1255
+ )
1256
+ private
1257
+ view
1258
+ returns (
1259
+ IStaking.StakeInfo storage stakeInfo
1260
+ )
1261
+ {
1262
+ stakeInfo = _stakeInfo[stakeNftId];
1263
+ if (stakeInfo.lastUpdateIn.eqz()) {
1264
+ revert ErrorStakingStoreStakeNotInitialized(stakeNftId);
1265
+ }
1266
+ }
1267
+
1268
+
1269
+ function _checkMaxStakedAmount(
1270
+ NftId targetNftId,
1271
+ IStaking.TargetInfo storage targetInfo,
1272
+ Amount additionalstakedAmount
1273
+ )
1274
+ private
1275
+ {
1276
+ if (targetInfo.stakedAmount + additionalstakedAmount > targetInfo.limitAmount) {
1277
+ revert IStaking.ErrorStakingTargetMaxStakedAmountExceeded(
1278
+ targetNftId,
1279
+ targetInfo.limitAmount,
1280
+ targetInfo.stakedAmount + additionalstakedAmount);
1281
+ }
1282
+
1283
+ // TODO add check for tvl dependent maximum, see #628
1284
+ }
1285
+
1286
+
1287
+ function _getAndVerifyTarget(
1288
+ NftId targetNftId
1289
+ )
1290
+ private
1291
+ view
1292
+ returns (
1293
+ IStaking.TargetInfo storage targetInfo
1294
+ )
1295
+ {
1296
+ targetInfo = _targetInfo[targetNftId];
1297
+
1298
+ if (targetInfo.lastUpdateIn.eqz()) {
1299
+ revert ErrorStakingStoreTargetNotInitialized(targetNftId);
1300
+ }
1301
+ }
1302
+
1303
+
1304
+ function _getAndVerifyLimit(
1305
+ NftId targetNftId
1306
+ )
1307
+ private
306
1308
  view
307
1309
  returns (
308
- Amount stakeBalance,
309
- Timestamp lastUpdatedAt
1310
+ IStaking.LimitInfo storage limitInfo
310
1311
  )
311
1312
  {
312
- stakeBalance = _stakeBalance[nftId];
313
- lastUpdatedAt = _lastUpdatedAt[nftId];
1313
+ limitInfo = _limitInfo[targetNftId];
1314
+
1315
+ if (limitInfo.lastUpdateIn.eqz()) {
1316
+ revert ErrorStakingStoreLimitNotInitialized(targetNftId);
1317
+ }
314
1318
  }
315
1319
 
316
- //--- private functions -------------------------------------------//
1320
+ //--- private tvl functions ------------------------------------------------//
317
1321
 
318
- function _createBalance(NftId nftId, Amount amount) private {
319
- if (_lastUpdatedIn[nftId].gtz()) {
320
- revert ErrorStakingStoreBalanceAlreadyInitialized(nftId);
1322
+ /// @dev Initializes token balance handling for the specified target.
1323
+ function _createTvlBalance(NftId targetNftId, address token)
1324
+ private
1325
+ {
1326
+ IStaking.TvlInfo storage info = _tvlInfo[targetNftId][token];
1327
+
1328
+ if (info.lastUpdateIn.gtz()) {
1329
+ revert ErrorStakingStoreTvlBalanceAlreadyInitialized(targetNftId, token);
321
1330
  }
322
1331
 
323
- _stakeBalance[nftId] = amount;
324
- _rewardBalance[nftId] = AmountLib.zero();
1332
+ // set tvl balances to 0 and update last updated in
1333
+ info.tvlAmount = AmountLib.zero();
1334
+ info.lastUpdateIn = BlocknumberLib.current();
1335
+ }
1336
+
1337
+
1338
+ function _updateTvlBalance(
1339
+ NftId targetNftId,
1340
+ address token,
1341
+ Amount newTvlAmount
1342
+ )
1343
+ private
1344
+ returns (
1345
+ Amount oldTvlAmount,
1346
+ Blocknumber lastUpdatedIn
1347
+ )
1348
+ {
1349
+ IStaking.TvlInfo storage tvlInfo = _getAndVerifyTvl(targetNftId, token);
1350
+ oldTvlAmount = tvlInfo.tvlAmount;
1351
+ lastUpdatedIn = tvlInfo.lastUpdateIn;
325
1352
 
326
- _lastUpdatedAt[nftId] = TimestampLib.blockTimestamp();
327
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
1353
+ tvlInfo.tvlAmount = newTvlAmount;
1354
+ tvlInfo.lastUpdateIn = BlocknumberLib.current();
1355
+ }
1356
+
1357
+
1358
+ function _getAndVerifyTvl(NftId targetNftId, address token)
1359
+ private
1360
+ view
1361
+ returns (IStaking.TvlInfo storage tvlInfo)
1362
+ {
1363
+ tvlInfo = _tvlInfo[targetNftId][token];
1364
+ if (tvlInfo.lastUpdateIn.eqz()) {
1365
+ revert ErrorStakingStoreTvlBalanceNotInitialized(targetNftId, token);
1366
+ }
328
1367
  }
329
1368
  }