@etherisc/gif-next 0.0.2-83889c4-030 → 0.0.2-839c4b8-393

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 (604) hide show
  1. package/README.md +137 -9
  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 +790 -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 +1664 -0
  10. package/artifacts/contracts/authorization/AccessAdminLib.sol/AccessAdminLib.dbg.json +4 -0
  11. package/artifacts/contracts/authorization/AccessAdminLib.sol/AccessAdminLib.json +1289 -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 +790 -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/{shared/IAccessManagerExtended.sol/IAccessManagerExtended.json → authorization/IAccessAdmin.sol/IAccessAdmin.json} +605 -795
  20. package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.dbg.json +4 -0
  21. package/artifacts/contracts/authorization/IAuthorization.sol/IAuthorization.json +455 -0
  22. package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.dbg.json +4 -0
  23. package/artifacts/contracts/authorization/IServiceAuthorization.sol/IServiceAuthorization.json +397 -0
  24. package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.dbg.json +4 -0
  25. package/artifacts/contracts/authorization/ServiceAuthorization.sol/ServiceAuthorization.json +646 -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 +805 -0
  30. package/artifacts/contracts/distribution/Distribution.sol/Distribution.dbg.json +1 -1
  31. package/artifacts/contracts/distribution/Distribution.sol/Distribution.json +139 -616
  32. package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.dbg.json +1 -1
  33. package/artifacts/contracts/distribution/DistributionService.sol/DistributionService.json +763 -303
  34. package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  35. package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.json +235 -123
  36. package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.dbg.json +1 -1
  37. package/artifacts/contracts/distribution/IDistributionComponent.sol/IDistributionComponent.json +145 -282
  38. package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.dbg.json +1 -1
  39. package/artifacts/contracts/distribution/IDistributionService.sol/IDistributionService.json +547 -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 +805 -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 +805 -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 +805 -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 +805 -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 +805 -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 -195
  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 +594 -101
  74. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  75. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +510 -68
  76. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  77. package/artifacts/contracts/instance/Instance.sol/Instance.json +600 -235
  78. package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.dbg.json +1 -1
  79. package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.json +1889 -313
  80. package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.dbg.json +4 -0
  81. package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.json +837 -0
  82. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  83. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +1663 -845
  84. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  85. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +498 -213
  86. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  87. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +141 -103
  88. package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.dbg.json +1 -1
  89. package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.json +1500 -2103
  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 +1 -1
  99. package/artifacts/contracts/instance/base/ObjectCounter.sol/ObjectCounter.json +2 -2
  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 +810 -0
  117. package/artifacts/contracts/oracle/IOracle.sol/IOracle.dbg.json +1 -1
  118. package/artifacts/contracts/oracle/IOracle.sol/IOracle.json +43 -1
  119. package/artifacts/contracts/oracle/IOracleComponent.sol/IOracleComponent.dbg.json +1 -1
  120. package/artifacts/contracts/oracle/IOracleComponent.sol/IOracleComponent.json +142 -139
  121. package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.dbg.json +1 -1
  122. package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.json +110 -10
  123. package/artifacts/contracts/oracle/Oracle.sol/Oracle.dbg.json +1 -1
  124. package/artifacts/contracts/oracle/Oracle.sol/Oracle.json +140 -423
  125. package/artifacts/contracts/oracle/OracleService.sol/OracleService.dbg.json +1 -1
  126. package/artifacts/contracts/oracle/OracleService.sol/OracleService.json +222 -177
  127. package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.dbg.json +1 -1
  128. package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.json +184 -92
  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 +805 -0
  133. package/artifacts/contracts/pool/BundleService.sol/BundleService.dbg.json +1 -1
  134. package/artifacts/contracts/pool/BundleService.sol/BundleService.json +576 -243
  135. package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
  136. package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.json +223 -103
  137. package/artifacts/contracts/pool/IBundleService.sol/IBundleService.dbg.json +1 -1
  138. package/artifacts/contracts/pool/IBundleService.sol/IBundleService.json +395 -52
  139. package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  140. package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.json +147 -406
  141. package/artifacts/contracts/pool/IPoolService.sol/IPoolService.dbg.json +1 -1
  142. package/artifacts/contracts/pool/IPoolService.sol/IPoolService.json +756 -372
  143. package/artifacts/contracts/pool/Pool.sol/Pool.dbg.json +1 -1
  144. package/artifacts/contracts/pool/Pool.sol/Pool.json +144 -694
  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 +934 -533
  149. package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  150. package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.json +230 -102
  151. package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.dbg.json +1 -1
  152. package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.json +372 -170
  153. package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
  154. package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.json +166 -98
  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 +805 -0
  159. package/artifacts/contracts/product/ClaimService.sol/ClaimService.dbg.json +1 -1
  160. package/artifacts/contracts/product/ClaimService.sol/ClaimService.json +489 -231
  161. package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
  162. package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.json +195 -119
  163. package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.dbg.json +1 -1
  164. package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.json +313 -8
  165. package/artifacts/contracts/product/IClaimService.sol/IClaimService.dbg.json +1 -1
  166. package/artifacts/contracts/product/IClaimService.sol/IClaimService.json +362 -17
  167. package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.dbg.json +1 -1
  168. package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.json +429 -100
  169. package/artifacts/contracts/product/IPricingService.sol/IPricingService.dbg.json +1 -1
  170. package/artifacts/contracts/product/IPricingService.sol/IPricingService.json +195 -79
  171. package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  172. package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.json +282 -271
  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} +289 -150
  175. package/artifacts/contracts/product/PolicyService.sol/PolicyService.dbg.json +1 -1
  176. package/artifacts/contracts/product/PolicyService.sol/PolicyService.json +567 -309
  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 +203 -103
  181. package/artifacts/contracts/product/PricingService.sol/PricingService.dbg.json +1 -1
  182. package/artifacts/contracts/product/PricingService.sol/PricingService.json +258 -309
  183. package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.dbg.json +1 -1
  184. package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.json +165 -129
  185. package/artifacts/contracts/product/Product.sol/Product.dbg.json +1 -1
  186. package/artifacts/contracts/product/Product.sol/Product.json +316 -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 +774 -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 +384 -69
  195. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  196. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +109 -147
  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 +617 -133
  203. package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.dbg.json +1 -1
  204. package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.json +1908 -155
  205. package/artifacts/contracts/registry/RegistryAuthorization.sol/RegistryAuthorization.dbg.json +4 -0
  206. package/artifacts/contracts/registry/RegistryAuthorization.sol/RegistryAuthorization.json +1074 -0
  207. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  208. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +159 -276
  209. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  210. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +148 -84
  211. package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.dbg.json +4 -0
  212. package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.json +2152 -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 +1389 -0
  217. package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.dbg.json +4 -0
  218. package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.json +683 -0
  219. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  220. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +120 -60
  221. package/artifacts/contracts/shared/Component.sol/Component.dbg.json +1 -1
  222. package/artifacts/contracts/shared/Component.sol/Component.json +86 -287
  223. package/artifacts/contracts/shared/ComponentService.sol/ComponentService.dbg.json +1 -1
  224. package/artifacts/contracts/shared/ComponentService.sol/ComponentService.json +620 -559
  225. package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.dbg.json +1 -1
  226. package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.json +197 -127
  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 +92 -103
  237. package/artifacts/contracts/shared/IComponentService.sol/IComponentService.dbg.json +1 -1
  238. package/artifacts/contracts/shared/IComponentService.sol/IComponentService.json +545 -237
  239. package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.dbg.json +1 -1
  240. package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.json +131 -139
  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 +35 -0
  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 +167 -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 +96 -1
  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 +125 -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 +41 -57
  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 +141 -97
  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 +92 -104
  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 +1513 -204
  278. package/artifacts/contracts/staking/IStakingService.sol/IStakingService.dbg.json +1 -1
  279. package/artifacts/contracts/staking/IStakingService.sol/IStakingService.json +261 -107
  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 +1653 -523
  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 +186 -116
  288. package/artifacts/contracts/staking/StakingReader.sol/StakingReader.dbg.json +1 -1
  289. package/artifacts/contracts/staking/StakingReader.sol/StakingReader.json +295 -183
  290. package/artifacts/contracts/staking/StakingService.sol/StakingService.dbg.json +1 -1
  291. package/artifacts/contracts/staking/StakingService.sol/StakingService.json +315 -295
  292. package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.dbg.json +1 -1
  293. package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.json +144 -104
  294. package/artifacts/contracts/staking/StakingStore.sol/StakingStore.dbg.json +1 -1
  295. package/artifacts/contracts/staking/StakingStore.sol/StakingStore.json +1725 -817
  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 +184 -76
  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 +63 -10
  304. package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  305. package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.json +45 -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 +23 -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 +140 -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 +1 -1
  329. package/artifacts/contracts/type/RequestId.sol/RequestIdLib.json +4 -4
  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 +93 -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 +24 -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 +656 -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 +780 -0
  364. package/contracts/authorization/AccessAdminLib.sol +396 -0
  365. package/contracts/authorization/AccessManagerCloneable.sol +158 -0
  366. package/contracts/authorization/Authorization.sol +169 -0
  367. package/contracts/authorization/IAccess.sol +67 -0
  368. package/contracts/authorization/IAccessAdmin.sol +144 -0
  369. package/contracts/authorization/IAuthorization.sol +26 -0
  370. package/contracts/authorization/IServiceAuthorization.sol +78 -0
  371. package/contracts/authorization/ServiceAuthorization.sol +320 -0
  372. package/contracts/distribution/BasicDistribution.sol +140 -0
  373. package/contracts/distribution/BasicDistributionAuthorization.sol +67 -0
  374. package/contracts/distribution/Distribution.sol +125 -141
  375. package/contracts/distribution/DistributionService.sol +287 -137
  376. package/contracts/distribution/DistributionServiceManager.sol +8 -11
  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 +121 -47
  396. package/contracts/instance/IInstanceService.sol +80 -42
  397. package/contracts/instance/Instance.sol +251 -136
  398. package/contracts/instance/InstanceAdmin.sol +297 -249
  399. package/contracts/instance/InstanceAuthorizationV3.sol +275 -0
  400. package/contracts/instance/InstanceReader.sol +478 -256
  401. package/contracts/instance/InstanceService.sol +389 -237
  402. package/contracts/instance/InstanceServiceManager.sol +8 -13
  403. package/contracts/instance/InstanceStore.sol +163 -121
  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 +1 -2
  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 +25 -4
  422. package/contracts/oracle/IOracleComponent.sol +2 -1
  423. package/contracts/oracle/IOracleService.sol +2 -1
  424. package/contracts/oracle/Oracle.sol +60 -53
  425. package/contracts/oracle/OracleService.sol +120 -87
  426. package/contracts/oracle/OracleServiceManager.sol +8 -11
  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 +97 -77
  434. package/contracts/pool/Pool.sol +196 -164
  435. package/contracts/pool/PoolLib.sol +341 -0
  436. package/contracts/pool/PoolService.sol +424 -263
  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 -212
  443. package/contracts/product/ClaimServiceManager.sol +6 -6
  444. package/contracts/product/IApplicationService.sol +29 -3
  445. package/contracts/product/IClaimService.sol +48 -11
  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 -280
  451. package/contracts/product/PolicyServiceLib.sol +139 -0
  452. package/contracts/product/PolicyServiceManager.sol +6 -9
  453. package/contracts/product/PricingService.sol +93 -88
  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 -40
  459. package/contracts/registry/IRegistry.sol +84 -36
  460. package/contracts/registry/IRegistryService.sol +3 -10
  461. package/contracts/registry/IRelease.sol +29 -0
  462. package/contracts/registry/ITransferInterceptor.sol +1 -2
  463. package/contracts/registry/Registry.sol +378 -218
  464. package/contracts/registry/RegistryAdmin.sol +125 -171
  465. package/contracts/registry/RegistryAuthorization.sol +336 -0
  466. package/contracts/registry/RegistryService.sol +47 -72
  467. package/contracts/registry/RegistryServiceManager.sol +5 -10
  468. package/contracts/registry/ReleaseAdmin.sol +195 -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 +61 -59
  473. package/contracts/shared/Component.sol +71 -142
  474. package/contracts/shared/ComponentService.sol +462 -389
  475. package/contracts/shared/ComponentServiceManager.sol +10 -7
  476. package/contracts/shared/ContractLib.sol +312 -0
  477. package/contracts/shared/IComponent.sol +6 -18
  478. package/contracts/shared/IComponentService.sol +50 -41
  479. package/contracts/shared/IInstanceLinkedComponent.sol +10 -26
  480. package/contracts/shared/ILifecycle.sol +3 -2
  481. package/contracts/shared/INftOwnable.sol +4 -0
  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 -48
  487. package/contracts/shared/Lifecycle.sol +30 -72
  488. package/contracts/shared/{NftIdSetManager.sol → NftIdSet.sol} +1 -1
  489. package/contracts/shared/NftOwnable.sol +33 -11
  490. package/contracts/shared/PolicyHolder.sol +20 -59
  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 +272 -73
  497. package/contracts/staking/IStakingService.sol +54 -76
  498. package/contracts/staking/ITargetLimitHandler.sol +17 -0
  499. package/contracts/staking/Staking.sol +540 -294
  500. package/contracts/staking/{StakeManagerLib.sol → StakingLib.sol} +72 -56
  501. package/contracts/staking/StakingManager.sol +14 -15
  502. package/contracts/staking/StakingReader.sol +72 -88
  503. package/contracts/staking/StakingService.sol +90 -175
  504. package/contracts/staking/StakingServiceManager.sol +9 -8
  505. package/contracts/staking/StakingStore.sol +1131 -335
  506. package/contracts/staking/TargetHandler.sol +132 -0
  507. package/contracts/staking/TargetManagerLib.sol +73 -46
  508. package/contracts/type/Amount.sol +31 -5
  509. package/contracts/type/Blocknumber.sol +22 -16
  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 +7 -0
  516. package/contracts/type/ObjectType.sol +200 -61
  517. package/contracts/type/PayoutId.sol +10 -10
  518. package/contracts/type/Referral.sol +1 -0
  519. package/contracts/type/RiskId.sol +38 -6
  520. package/contracts/type/RoleId.sol +121 -87
  521. package/contracts/type/Seconds.sol +40 -1
  522. package/contracts/type/Selector.sol +107 -0
  523. package/contracts/type/StateId.sol +15 -1
  524. package/contracts/type/String.sol +65 -0
  525. package/contracts/type/Timestamp.sol +14 -7
  526. package/contracts/type/UFixed.sol +62 -125
  527. package/contracts/type/Version.sol +57 -6
  528. package/contracts/{shared → upgradeability}/IVersionable.sol +3 -0
  529. package/contracts/{shared → upgradeability}/ProxyManager.sol +96 -49
  530. package/contracts/upgradeability/UpgradableProxyWithAdmin.sol +24 -0
  531. package/contracts/{shared → upgradeability}/Versionable.sol +8 -5
  532. package/package.json +10 -7
  533. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +0 -4
  534. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +0 -778
  535. package/artifacts/contracts/instance/InstanceAuthorizationsLib.sol/InstanceAuthorizationsLib.dbg.json +0 -4
  536. package/artifacts/contracts/instance/InstanceAuthorizationsLib.sol/InstanceAuthorizationsLib.json +0 -228
  537. package/artifacts/contracts/instance/base/ObjectManager.sol/ObjectManager.dbg.json +0 -4
  538. package/artifacts/contracts/instance/base/ObjectManager.sol/ObjectManager.json +0 -256
  539. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +0 -4
  540. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +0 -129
  541. package/artifacts/contracts/product/IProductService.sol/IProductService.dbg.json +0 -4
  542. package/artifacts/contracts/product/IProductService.sol/IProductService.json +0 -387
  543. package/artifacts/contracts/product/ProductService.sol/ProductService.dbg.json +0 -4
  544. package/artifacts/contracts/product/ProductService.sol/ProductService.json +0 -679
  545. package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.dbg.json +0 -4
  546. package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.json +0 -694
  547. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +0 -4
  548. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +0 -1292
  549. package/artifacts/contracts/registry/ServiceAuthorizationsLib.sol/ServiceAuthorizationsLib.dbg.json +0 -4
  550. package/artifacts/contracts/registry/ServiceAuthorizationsLib.sol/ServiceAuthorizationsLib.json +0 -137
  551. package/artifacts/contracts/shared/AccessManagerCustom.sol/AccessManagerCustom.dbg.json +0 -4
  552. package/artifacts/contracts/shared/AccessManagerCustom.sol/AccessManagerCustom.json +0 -1193
  553. package/artifacts/contracts/shared/AccessManagerExtended.sol/AccessManagerExtended.dbg.json +0 -4
  554. package/artifacts/contracts/shared/AccessManagerExtended.sol/AccessManagerExtended.json +0 -1715
  555. package/artifacts/contracts/shared/AccessManagerExtendedInitializeable.sol/AccessManagerExtendedInitializeable.dbg.json +0 -4
  556. package/artifacts/contracts/shared/AccessManagerExtendedInitializeable.sol/AccessManagerExtendedInitializeable.json +0 -1728
  557. package/artifacts/contracts/shared/AccessManagerExtendedWithDisable.sol/AccessManagerExtendedWithDisable.dbg.json +0 -4
  558. package/artifacts/contracts/shared/AccessManagerExtendedWithDisable.sol/AccessManagerExtendedWithDisable.json +0 -1806
  559. package/artifacts/contracts/shared/AccessManagerExtendedWithDisableInitializeable.sol/AccessManagerExtendedWithDisableInitializeable.dbg.json +0 -4
  560. package/artifacts/contracts/shared/AccessManagerExtendedWithDisableInitializeable.sol/AccessManagerExtendedWithDisableInitializeable.json +0 -1824
  561. package/artifacts/contracts/shared/ComponentVerifyingService.sol/ComponentVerifyingService.dbg.json +0 -4
  562. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +0 -4
  563. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +0 -73
  564. package/artifacts/contracts/shared/IAccessManagerExtended.sol/IAccessManagerExtended.dbg.json +0 -4
  565. package/artifacts/contracts/shared/IAccessManagerExtendedWithDisable.sol/IAccessManagerExtendedWithDisable.dbg.json +0 -4
  566. package/artifacts/contracts/shared/IAccessManagerExtendedWithDisable.sol/IAccessManagerExtendedWithDisable.json +0 -1600
  567. package/artifacts/contracts/shared/IKeyValueStore.sol/IKeyValueStore.dbg.json +0 -4
  568. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +0 -4
  569. package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.dbg.json +0 -4
  570. package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.json +0 -39
  571. package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.dbg.json +0 -4
  572. package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.json +0 -571
  573. package/artifacts/contracts/shared/NftIdSetManager.sol/NftIdSetManager.dbg.json +0 -4
  574. package/artifacts/contracts/shared/NftIdSetManager.sol/NftIdSetManager.json +0 -306
  575. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +0 -4
  576. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +0 -617
  577. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +0 -4
  578. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +0 -129
  579. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +0 -4
  580. package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.dbg.json +0 -4
  581. package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.json +0 -444
  582. package/artifacts/contracts/type/UFixed.sol/MathLib.dbg.json +0 -4
  583. package/artifacts/contracts/type/UFixed.sol/MathLib.json +0 -10
  584. package/contracts/instance/BundleManager.sol +0 -126
  585. package/contracts/instance/InstanceAuthorizationsLib.sol +0 -377
  586. package/contracts/instance/base/ObjectManager.sol +0 -82
  587. package/contracts/instance/module/IAccess.sol +0 -46
  588. package/contracts/product/IProductService.sol +0 -33
  589. package/contracts/product/ProductService.sol +0 -124
  590. package/contracts/product/ProductServiceManager.sol +0 -42
  591. package/contracts/registry/ReleaseManager.sol +0 -600
  592. package/contracts/registry/ServiceAuthorizationsLib.sol +0 -173
  593. package/contracts/shared/AccessManagerCustom.sol +0 -736
  594. package/contracts/shared/AccessManagerExtended.sol +0 -470
  595. package/contracts/shared/AccessManagerExtendedInitializeable.sol +0 -13
  596. package/contracts/shared/AccessManagerExtendedWithDisable.sol +0 -137
  597. package/contracts/shared/AccessManagerExtendedWithDisableInitializeable.sol +0 -14
  598. package/contracts/shared/ComponentVerifyingService.sol +0 -117
  599. package/contracts/shared/IAccessManagerExtended.sol +0 -74
  600. package/contracts/shared/IAccessManagerExtendedWithDisable.sol +0 -18
  601. package/contracts/shared/IKeyValueStore.sol +0 -53
  602. package/contracts/shared/InitializableCustom.sol +0 -177
  603. package/contracts/shared/KeyValueStore.sol +0 -127
  604. package/contracts/shared/UpgradableProxyWithAdmin.sol +0 -16
@@ -2,189 +2,527 @@
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
-
30
- import {RegistryAdmin} from "../registry/RegistryAdmin.sol";
31
24
 
32
25
 
33
26
  contract StakingStore is
34
- AccessManaged,
35
- KeyValueStore
27
+ Initializable,
28
+ AccessManaged
36
29
  {
37
30
 
38
- event LogStakingStoreReserveBalanceIncreased(NftId targetNftId, Amount dipAmount, Amount reserveBalance, Blocknumber lastUpdatedIn);
39
- event LogStakingStoreReserveBalanceDecreased(NftId targetNftId, Amount dipAmount, Amount reserveBalance, 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);
40
35
 
41
- event LogStakingStoreTotalValueLockedIncreased(NftId targetNftId, address token, Amount amount, Amount newBalance, Blocknumber lastUpdatedIn);
42
- event LogStakingStoreTotalValueLockedDecreased(NftId targetNftId, address token, Amount amount, Amount newBalance, Blocknumber lastUpdatedIn);
43
-
44
- event LogStakingStoreStakesIncreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
45
- event LogStakingStoreStakesDecreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
46
-
47
- event LogStakingStoreRewardsIncreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
48
- event LogStakingStoreRewardsDecreased(NftId nftId, Amount addedAmount, Amount newBalance, Blocknumber lastUpdatedIn);
49
-
50
- event LogStakingStoreRewardsRestaked(NftId nftId, Amount amount, Amount rewardAmount, Amount rewardIncrementAmount, Amount newBalance, Blocknumber lastUpdatedIn);
36
+ // target
37
+ error ErrorStakingStoreTargetNotInitialized(NftId targetNftId);
38
+ error ErrorStakingStoreLimitNotInitialized(NftId targetNftId);
51
39
 
52
40
  // in/decreasing reward reserves
53
41
  error ErrorStakingStoreNotTarget(NftId targetNftId);
54
- error ErrorStakingStoreRewardReservesInsufficient(NftId targetNftId, Amount dipAmount, Amount reservesBalanceAmount);
42
+ error ErrorStakingStoreRewardReservesInsufficient(NftId targetNftId, Amount reserveAmount, Amount claimedAmount);
55
43
 
56
- // creating and updating of balance
57
- error ErrorStakingStoreBalanceAlreadyInitialized(NftId nftId);
58
- error ErrorStakingStoreBalanceNotInitialized(NftId nftId);
44
+ // stakes
45
+ error ErrorStakingStoreStakesExceedingTargetMaxAmount(NftId targetNftId, Amount stakeLimitAmount, Amount newIStaking);
46
+ error ErrorStakingStoreStakeNotInitialized(NftId nftId);
59
47
 
60
- // update balance
61
- error ErrorStakingStoreTvlBalanceNotInitialized(NftId nftId);
48
+ // creating and updating of staking balance
49
+ error ErrorStakingStoreStakeBalanceAlreadyInitialized(NftId nftId);
50
+ error ErrorStakingStoreStakeBalanceNotInitialized(NftId nftI);
51
+
52
+ // creating and updating of tvl balance
53
+ error ErrorStakingStoreTvlBalanceAlreadyInitialized(NftId nftId, address token);
54
+ error ErrorStakingStoreTvlBalanceNotInitialized(NftId nftId, address token);
62
55
 
63
56
  IRegistry private _registry;
64
- NftIdSetManager private _targetManager;
57
+ ITargetLimitHandler private _targetLimitHandler;
65
58
  StakingReader private _reader;
59
+ NftIdSet private _targetNftIdSet;
66
60
 
67
- // staking rate
68
- mapping(uint256 chainId => mapping(address token => UFixed stakingRate)) private _stakingRate;
61
+ // target support
62
+ mapping(ObjectType targetType => IStaking.SupportInfo) private _supportInfo;
69
63
 
70
- // total, stake and reward balances
71
- mapping(NftId nftId => Amount stakes) private _stakeBalance;
72
- mapping(NftId nftId => Amount rewards) private _rewardBalance;
73
- mapping(NftId nftId => Amount reserves) private _reserveBalance;
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;
74
69
 
75
- mapping(NftId nftId => Timestamp lastUpdatedAt) private _lastUpdatedAt;
76
- mapping(NftId nftId => Blocknumber lastUpdatedIn) private _lastUpdatedIn;
70
+ // staking rate
71
+ mapping(ChainId chainId => mapping(address token => IStaking.TokenInfo)) private _tokenInfo;
77
72
 
78
- // total value locked balance
79
- mapping(NftId nftId => mapping(address token => Amount tvl)) private _tvlBalance;
80
- mapping(NftId nftId => mapping(address token => Amount tvlInDip)) private _tvlInDip;
81
- mapping(NftId nftId => Amount tvlRequiredDip) private _tvlRequiredDip;
82
- mapping(NftId nftId => Blocknumber lastUpdatedIn) private _tvlLastUpdatedIn;
73
+ // stakes
74
+ mapping(NftId stakeNftId => IStaking.StakeInfo) private _stakeInfo;
83
75
 
84
76
 
85
- constructor(IRegistry registry, StakingReader reader)
77
+ constructor(
78
+ IRegistry registry,
79
+ StakingReader reader
80
+ )
86
81
  AccessManaged(msg.sender)
87
82
  {
88
- _registry = registry; //TODO if keeps registry -> RegistryLinked and checks registry address
89
- address authority = _registry.getAuthority();
90
- setAuthority(authority);
91
-
83
+ // set final authority
84
+ setAuthority(registry.getAuthority());
85
+
86
+ // set internal variables
87
+ _registry = registry;
92
88
  _reader = reader;
93
- _targetManager = new NftIdSetManager();
89
+ _targetNftIdSet = new NftIdSet();
90
+
91
+ _createInitialSetup();
92
+ // register protocol target
93
+ }
94
+
95
+
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);
94
265
  }
95
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
+ }
96
275
 
97
- //--- staking rate specific functions -----------------------------------//
276
+ //--- token management --------------------------------------------------//
98
277
 
99
- function setStakingRate(uint256 chainId, address token, UFixed stakingRate)
278
+ /// @dev Registers a token for tvl management.
279
+ function addToken(
280
+ ChainId chainId,
281
+ address token
282
+ )
100
283
  external
284
+ restricted() // token registry via staking
101
285
  {
102
- _stakingRate[chainId][token] = stakingRate;
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);
103
299
  }
104
300
 
105
- //--- target specific functions -----------------------------------------//
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 -------------------------------------------------//
106
330
 
107
331
  function createTarget(
108
332
  NftId targetNftId,
109
- IStaking.TargetInfo memory targetInfo
333
+ ObjectType objectType,
334
+ Seconds lockingPeriod,
335
+ UFixed rewardRate
110
336
  )
111
337
  external
338
+ restricted() // staking
112
339
  {
113
- _create(
114
- targetNftId.toKey32(TARGET()),
115
- abi.encode(targetInfo));
340
+ _createTarget(targetNftId, objectType, lockingPeriod, rewardRate, true);
341
+ }
116
342
 
117
- // initialize tvl and stake balance
118
- _tvlLastUpdatedIn[targetNftId]= BlocknumberLib.currentBlocknumber();
119
- _createTargetBalance(targetNftId);
120
343
 
121
- _targetManager.add(targetNftId);
344
+ function setLockingPeriod(
345
+ NftId targetNftId,
346
+ Seconds lockingPeriod
347
+ )
348
+ external
349
+ restricted() // staking
350
+ {
351
+ // checks
352
+ (
353
+ IStaking.TargetInfo storage targetInfo,
354
+ Blocknumber lastUpdateIn
355
+ ) = _verifyAndUpdateTarget(targetNftId);
356
+
357
+ TargetManagerLib.checkLockingPeriod(_reader, targetNftId, targetInfo.objectType, lockingPeriod);
358
+
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);
122
366
  }
123
367
 
124
368
 
125
- function updateTarget(
126
- NftId targetNftId,
127
- IStaking.TargetInfo memory targetInfo
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
128
398
  )
129
399
  external
400
+ restricted() // staking
401
+ returns (
402
+ Amount oldLimitAmount,
403
+ Blocknumber lastUpdatedIn
404
+ )
130
405
  {
131
- _update(
132
- targetNftId.toKey32(TARGET()),
133
- abi.encode(targetInfo), KEEP_STATE());
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
+
134
414
  }
135
415
 
136
416
 
137
- function increaseReserves(
417
+ function setTargetLimits(
138
418
  NftId targetNftId,
139
- Amount dipAmount
419
+ Amount marginAmount,
420
+ Amount hardLimitAmount
140
421
  )
141
422
  external
142
- returns (Amount newReserveBalance)
423
+ virtual
424
+ restricted()
143
425
  {
144
- newReserveBalance = _reserveBalance[targetNftId] + dipAmount;
145
- Blocknumber lastUpdatedIn = _updateReserves(targetNftId, newReserveBalance);
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();
146
434
 
147
- emit LogStakingStoreReserveBalanceIncreased(targetNftId, dipAmount, newReserveBalance, lastUpdatedIn);
435
+ // logging
436
+ emit IStaking.LogStakingTargetLimitsUpdated(
437
+ targetNftId,
438
+ marginAmount,
439
+ hardLimitAmount,
440
+ lastUpdateIn);
148
441
  }
149
442
 
150
443
 
151
- function decreaseReserves(
444
+ function addTargetToken(
445
+ NftId targetNftId,
446
+ address token
447
+ )
448
+ external
449
+ restricted()
450
+ {
451
+ // checks
452
+
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);
474
+ }
475
+
476
+
477
+ function refillRewardReserves(
152
478
  NftId targetNftId,
153
479
  Amount dipAmount
154
480
  )
155
481
  external
482
+ restricted()
156
483
  returns (Amount newReserveBalance)
157
484
  {
158
- Amount reserveAmount = _reserveBalance[targetNftId];
159
- if (dipAmount > reserveAmount) {
160
- revert ErrorStakingStoreRewardReservesInsufficient(
161
- targetNftId,
162
- dipAmount,
163
- reserveAmount);
164
- }
485
+ // checks
486
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
487
+ Blocknumber lastUpdateIn = targetInfo.lastUpdateIn;
165
488
 
166
- newReserveBalance = _reserveBalance[targetNftId] - dipAmount;
167
- Blocknumber lastUpdatedIn = _updateReserves(targetNftId, newReserveBalance);
489
+ // effects
490
+ targetInfo.reserveAmount = targetInfo.reserveAmount + dipAmount;
491
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
168
492
 
169
- emit LogStakingStoreReserveBalanceDecreased(targetNftId, dipAmount, newReserveBalance, lastUpdatedIn);
493
+ // logging
494
+ newReserveBalance = targetInfo.reserveAmount;
495
+ emit IStaking.LogStakingRewardReservesRefilled(
496
+ targetNftId,
497
+ dipAmount,
498
+ _registry.ownerOf(targetNftId),
499
+ newReserveBalance,
500
+ lastUpdateIn);
170
501
  }
171
502
 
172
503
 
173
- function _updateReserves(
504
+ function withdrawRewardReserves(
174
505
  NftId targetNftId,
175
- Amount newRewardBalance
506
+ Amount dipAmount
176
507
  )
177
- internal
178
- returns (Blocknumber lastUpdatedIn)
508
+ external
509
+ restricted()
510
+ returns (Amount newReserveBalance)
179
511
  {
180
- if (_lastUpdatedIn[targetNftId].eqz()) {
181
- revert ErrorStakingStoreNotTarget(targetNftId);
182
- }
512
+ // checks
513
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
183
514
 
184
- lastUpdatedIn = _lastUpdatedIn[targetNftId];
515
+ // effects
516
+ Blocknumber lastUpdateIn = _decreaseReserves(targetNftId, targetInfo, dipAmount);
185
517
 
186
- _reserveBalance[targetNftId] = newRewardBalance;
187
- _lastUpdatedIn[targetNftId] = BlocknumberLib.currentBlocknumber();
518
+ // logging
519
+ newReserveBalance = targetInfo.reserveAmount;
520
+ emit IStaking.LogStakingRewardReservesWithdrawn(
521
+ targetNftId,
522
+ dipAmount,
523
+ _registry.ownerOf(targetNftId),
524
+ newReserveBalance,
525
+ lastUpdateIn);
188
526
  }
189
527
 
190
528
 
@@ -192,381 +530,839 @@ contract StakingStore is
192
530
 
193
531
  function increaseTotalValueLocked(
194
532
  NftId targetNftId,
195
- UFixed stakingRate,
196
533
  address token,
197
534
  Amount amount
198
535
  )
199
536
  external
537
+ restricted()
200
538
  returns (Amount newBalance)
201
539
  {
202
- (
203
- Blocknumber tvlLastUpdatedIn,
204
- Amount oldBalance,
205
- Amount oldDipBalance
206
- ) = _getAndVerifyTvl(targetNftId, token);
207
-
208
- newBalance = oldBalance + amount;
209
- Amount newDipBalance = newBalance.multiplyWith(stakingRate);
210
-
211
- // update new tvl balances
212
- _tvlBalance[targetNftId][token] = newBalance;
213
- _tvlInDip[targetNftId][token] = newDipBalance;
214
-
215
- // update new amount of required dip
216
- _tvlRequiredDip[targetNftId] = _tvlRequiredDip[targetNftId] - oldDipBalance + newDipBalance;
217
-
218
- // update last updated in
219
- _tvlLastUpdatedIn[targetNftId] = BlocknumberLib.currentBlocknumber();
220
-
221
- emit LogStakingStoreTotalValueLockedIncreased(targetNftId, token, amount, newBalance, tvlLastUpdatedIn);
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);
222
553
  }
223
554
 
224
555
 
225
556
  function decreaseTotalValueLocked(
226
557
  NftId targetNftId,
227
- UFixed stakingRate,
228
558
  address token,
229
559
  Amount amount
230
560
  )
231
561
  external
562
+ restricted()
232
563
  returns (Amount newBalance)
233
564
  {
234
- (
235
- Blocknumber tvlLastUpdatedIn,
236
- Amount oldBalance,
237
- Amount oldDipBalance
238
- ) = _getAndVerifyTvl(targetNftId, token);
239
-
240
- newBalance = oldBalance - amount;
241
- Amount newDipBalance = AmountLib.toAmount((
242
- stakingRate * newBalance.toUFixed()).toInt());
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
+ }
243
579
 
244
- // update new tvl balances
245
- _tvlBalance[targetNftId][token] = newBalance;
246
- _tvlInDip[targetNftId][token] = newDipBalance;
247
580
 
248
- // update new amount of required dip
249
- _tvlRequiredDip[targetNftId] = _tvlRequiredDip[targetNftId] - oldDipBalance + newDipBalance;
581
+ function updateTargetLimit(NftId targetNftId)
582
+ external
583
+ restricted()
584
+ returns (Amount stakeLimitAmount)
585
+ {
586
+ return _updateTargetLimit(targetNftId);
587
+ }
250
588
 
251
- // update last updated in
252
- _tvlLastUpdatedIn[targetNftId] = BlocknumberLib.currentBlocknumber();
253
589
 
254
- emit LogStakingStoreTotalValueLockedDecreased(targetNftId, token, amount, newBalance, tvlLastUpdatedIn);
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);
615
+ }
255
616
  }
256
617
 
257
- //--- stake specific functions -------------------------------------//
258
618
 
259
- function create(
260
- NftId stakeNftId,
261
- IStaking.StakeInfo memory stakeInfo
262
- )
263
- external
619
+ function _updateTargetLimit(NftId targetNftId)
620
+ internal
621
+ returns (Amount limitAmount)
264
622
  {
265
- _create(
266
- stakeNftId.toKey32(STAKE()),
267
- abi.encode(stakeInfo));
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();
268
642
 
269
- _createStakeBalance(stakeNftId);
643
+ // logging
644
+ emit IStaking.LogStakingTargetLimitUpdated(
645
+ targetNftId,
646
+ targetInfo.limitAmount,
647
+ limitInfo.hardLimitAmount,
648
+ requiredStakeAmount,
649
+ targetInfo.stakedAmount,
650
+ lastUpdateIn);
270
651
  }
271
652
 
272
- function update(
653
+ //--- stake specific functions -------------------------------------//
654
+
655
+ function createStake(
273
656
  NftId stakeNftId,
274
- IStaking.StakeInfo memory stakeInfo
657
+ NftId targetNftId,
658
+ address stakeOwner,
659
+ Amount stakeAmount
275
660
  )
276
661
  external
662
+ restricted()
663
+ returns (Timestamp lockedUntil)
277
664
  {
278
- _update(
279
- stakeNftId.toKey32(STAKE()),
280
- abi.encode(stakeInfo),
281
- KEEP_STATE());
282
- }
665
+ // checks
666
+ IStaking.StakeInfo storage stakeInfo = _stakeInfo[stakeNftId];
667
+ if (stakeInfo.lastUpdateIn.gtz()) {
668
+ revert ErrorStakingStoreStakeBalanceAlreadyInitialized(stakeNftId);
669
+ }
283
670
 
284
- //--- general functions --------------------------------------------//
671
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
672
+ _checkMaxStakedAmount(targetNftId, targetInfo, stakeAmount);
285
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);
286
680
 
287
- function increaseStake(
288
- NftId nftId,
289
- NftId targetNftId,
290
- Amount amount
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
291
697
  )
292
- public
698
+ external
699
+ restricted()
293
700
  {
294
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
701
+ // checks
702
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
703
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
295
704
 
296
- _updateStakeBalance(
297
- nftId,
298
- _stakeBalance[nftId] + amount, // new stake balance
299
- _rewardBalance[nftId]); // unchanged reward balance
705
+ if (updateRewards) {
706
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
707
+ }
300
708
 
301
- _updateTargetBalance(
302
- targetNftId,
303
- _stakeBalance[targetNftId] + amount,
304
- _rewardBalance[targetNftId]);
709
+ if (restakeRewards) {
710
+ _restakeRewards(stakeNftId, stakeInfo, targetInfo);
711
+ }
305
712
 
306
- emit LogStakingStoreStakesIncreased(nftId, amount, _stakeBalance[nftId], lastUpdatedIn);
713
+ _stake(stakeNftId, stakeInfo, targetInfo, additionalLockingPeriod, stakeAmount);
307
714
  }
308
715
 
309
716
 
310
- function restakeRewards(
311
- NftId nftId,
312
- NftId targetNftId,
313
- Amount rewardIncrementAmount
717
+ function unstake(
718
+ NftId stakeNftId,
719
+ bool updateRewards,
720
+ bool restakeRewards,
721
+ Amount maxUnstakeAmount
314
722
  )
315
723
  external
724
+ restricted()
725
+ returns (Amount unstakedAmount)
316
726
  {
317
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
318
- Amount stakeAmount = _stakeBalance[nftId];
319
- Amount rewardAmount = _rewardBalance[nftId];
727
+ // checks
728
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
729
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
320
730
 
321
- // move all rewards to stake balance
322
- _updateStakeBalance(
323
- nftId,
324
- stakeAmount + rewardAmount + rewardIncrementAmount, // new stake balance
325
- AmountLib.zero()); // new reward balance
731
+ if (updateRewards) {
732
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
733
+ }
326
734
 
327
- _updateTargetBalance(
328
- targetNftId,
329
- _stakeBalance[targetNftId] + rewardAmount + rewardIncrementAmount,
330
- _rewardBalance[targetNftId] - rewardAmount);
735
+ if (restakeRewards) {
736
+ _restakeRewards(stakeNftId, stakeInfo, targetInfo);
737
+ }
331
738
 
332
- emit LogStakingStoreRewardsRestaked(nftId, stakeAmount, rewardAmount, rewardIncrementAmount, _stakeBalance[nftId], lastUpdatedIn);
739
+ return _unstake(stakeNftId, stakeInfo, targetInfo, maxUnstakeAmount);
333
740
  }
334
741
 
335
742
 
336
- function updateRewards(
337
- NftId nftId,
338
- NftId targetNftId,
339
- Amount rewardIncrementAmount
340
- )
743
+ function updateRewards(NftId stakeNftId)
341
744
  external
745
+ restricted()
342
746
  {
343
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
747
+ // checks
748
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
749
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
750
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
751
+ }
344
752
 
345
- // increse rewards by increment
346
- _updateStakeBalance(
347
- nftId,
348
- _stakeBalance[nftId], // unchanged stake balance
349
- _rewardBalance[nftId] + rewardIncrementAmount); // new reward balance
350
753
 
351
- _updateTargetBalance(
352
- targetNftId,
353
- _stakeBalance[targetNftId],
354
- _rewardBalance[targetNftId] + rewardIncrementAmount);
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);
764
+
765
+ if (updateRewards) {
766
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
767
+ }
355
768
 
356
- emit LogStakingStoreRewardsIncreased(nftId, rewardIncrementAmount, _rewardBalance[nftId], lastUpdatedIn);
769
+ _restakeRewards(stakeNftId, stakeInfo, targetInfo);
357
770
  }
358
771
 
359
772
 
360
- function claimUpTo(
361
- NftId nftId,
362
- NftId targetNftId,
773
+ function claimRewards(
774
+ NftId stakeNftId,
775
+ bool updateRewards,
363
776
  Amount maxClaimAmount
364
777
  )
365
778
  external
779
+ restricted()
366
780
  returns (Amount claimedAmount)
367
781
  {
368
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
782
+ // checks
783
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
784
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
369
785
 
370
- // determine the claimable rewards amount
371
- claimedAmount = AmountLib.min(maxClaimAmount, _rewardBalance[nftId]);
786
+ if (updateRewards) {
787
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
788
+ }
372
789
 
373
- // decrease rewards by claimed amount
374
- _updateStakeBalance(
375
- nftId,
376
- _stakeBalance[nftId], // unchanged stake balance
377
- _rewardBalance[nftId] - claimedAmount); // new reward balance
790
+ claimedAmount = _claimRewards(stakeNftId, stakeInfo, targetInfo, maxClaimAmount);
791
+ }
378
792
 
379
- _updateTargetBalance(
380
- targetNftId,
381
- _stakeBalance[targetNftId],
382
- _rewardBalance[targetNftId] - claimedAmount);
793
+ //--- view functions -----------------------------------------------//
794
+
795
+ function getStakingReader() external view returns (StakingReader stakingReader){
796
+ return _reader;
797
+ }
383
798
 
384
- emit LogStakingStoreRewardsDecreased(nftId, claimedAmount, _rewardBalance[nftId], lastUpdatedIn);
799
+ function getTargetManager() external view returns (ITargetLimitHandler targetLimitHandler ){
800
+ return _targetLimitHandler;
385
801
  }
386
802
 
387
803
 
388
- function unstakeUpTo(
389
- NftId nftId,
390
- NftId targetNftId,
391
- Amount maxUnstakeAmount,
392
- Amount maxClaimAmount
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
393
812
  )
394
- external
395
- returns (
396
- Amount unstakedAmount,
397
- Amount claimedAmount
398
- )
813
+ public
814
+ view
815
+ returns (Amount requiredStakeAmount)
399
816
  {
400
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
817
+ address [] memory tokens = _targetToken[targetNftId];
818
+ if (tokens.length == 0) {
819
+ return AmountLib.zero();
820
+ }
401
821
 
402
- // determine amounts
403
- unstakedAmount = AmountLib.min(maxUnstakeAmount, _stakeBalance[nftId]);
404
- claimedAmount = AmountLib.min(maxClaimAmount, _rewardBalance[nftId]);
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;
405
828
 
406
- // decrease stakes and rewards as determined
407
- _updateStakeBalance(
408
- nftId,
409
- _stakeBalance[nftId] - unstakedAmount, // unchanged stake balance
410
- _rewardBalance[nftId] - claimedAmount); // new reward balance
829
+ for (uint256 i = 0; i < tokens.length; i++) {
830
+ token = tokens[i];
831
+ tvlAmount = _tvlInfo[targetNftId][token].tvlAmount;
832
+ if (tvlAmount.eqz()) { continue; }
411
833
 
412
- _updateTargetBalance(
413
- targetNftId,
414
- _stakeBalance[targetNftId] - unstakedAmount,
415
- _rewardBalance[targetNftId] - claimedAmount);
834
+ stakingRate = _tokenInfo[targetChainId][token].stakingRate;
835
+ if (stakingRate.eqz()) { continue; }
836
+
837
+ requiredStakeAmount = requiredStakeAmount + tvlAmount.multiplyWith(stakingRate);
838
+ }
839
+
840
+ // update required amount based on target type
841
+ if (includeTargetTypeRequirements) {
842
+ ObjectType targetType = _targetInfo[targetNftId].objectType;
843
+ IStaking.SupportInfo storage supportInfo = _supportInfo[targetType];
416
844
 
417
- emit LogStakingStoreStakesDecreased(nftId, unstakedAmount, _stakeBalance[nftId], lastUpdatedIn);
418
- emit LogStakingStoreRewardsDecreased(nftId, claimedAmount, _rewardBalance[nftId], lastUpdatedIn);
845
+ if (requiredStakeAmount < supportInfo.minStakingAmount) {
846
+ requiredStakeAmount = supportInfo.minStakingAmount;
847
+ } else if (requiredStakeAmount > supportInfo.maxStakingAmount) {
848
+ requiredStakeAmount = supportInfo.maxStakingAmount;
849
+ }
850
+ }
419
851
  }
420
852
 
421
- //--- view functions -----------------------------------------------//
422
853
 
423
- function getStakingReader() external view returns (StakingReader stakingReader){
424
- return _reader;
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();
425
857
  }
426
858
 
427
- function getTargetManager() external view returns (NftIdSetManager targetManager){
428
- return _targetManager;
859
+
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];
429
863
  }
430
864
 
431
- function getStakingRate(uint256 chainId, address token) external view returns (UFixed stakingRate) { return _stakingRate[chainId][token]; }
432
865
 
433
- function exists(NftId stakeNftId) external view returns (bool) { return exists(stakeNftId.toKey32(STAKE())); }
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
+ }
434
870
 
435
- function getTotalValueLocked(NftId nftId, address token) external view returns (Amount tvlBalanceAmount) { return _tvlBalance[nftId][token]; }
436
- function getRequiredStakeBalance(NftId nftId) external view returns (Amount requiredAmount) { return _tvlRequiredDip[nftId]; }
437
871
 
438
- function getReserveBalance(NftId nftId) external view returns (Amount balanceAmount) { return _reserveBalance[nftId]; }
439
- function getStakeBalance(NftId nftId) external view returns (Amount balanceAmount) { return _stakeBalance[nftId]; }
440
- function getRewardBalance(NftId nftId) external view returns (Amount rewardAmount) { return _rewardBalance[nftId]; }
441
- function getBalanceUpdatedAt(NftId nftId) external view returns (Timestamp updatedAt) { return _lastUpdatedAt[nftId]; }
442
- function getBalanceUpdatedIn(NftId nftId) external view returns (Blocknumber blocknumber) { return _lastUpdatedIn[nftId]; }
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
+ }
443
876
 
444
877
 
445
- function getTargetBalances(NftId nftId)
446
- external
447
- view
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
448
908
  returns (
449
- Amount stakeBalance,
450
- Amount rewardBalance,
451
- Amount reserveBalance,
909
+ IStaking.TargetInfo storage targetInfo,
452
910
  Blocknumber lastUpdatedIn
453
911
  )
454
912
  {
455
- stakeBalance = _stakeBalance[nftId];
456
- rewardBalance = _rewardBalance[nftId];
457
- reserveBalance = _reserveBalance[nftId];
458
- lastUpdatedIn = _lastUpdatedIn[nftId];
913
+ // checks
914
+ targetInfo = _getAndVerifyTarget(targetNftId);
915
+ lastUpdatedIn = targetInfo.lastUpdateIn;
916
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
459
917
  }
460
918
 
461
919
 
462
- function getStakeBalances(NftId nftId)
463
- external
464
- view
465
- returns (
466
- Amount stakeBalance,
467
- Amount rewardBalance,
468
- Timestamp lastUpdatedAt
469
- )
920
+ function _createTarget(
921
+ NftId targetNftId,
922
+ ObjectType objectType,
923
+ Seconds lockingPeriod,
924
+ UFixed rewardRate,
925
+ bool checkParameters
926
+ )
927
+ private
470
928
  {
471
- stakeBalance = _stakeBalance[nftId];
472
- rewardBalance = _rewardBalance[nftId];
473
- lastUpdatedAt = _lastUpdatedAt[nftId];
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);
474
967
  }
475
968
 
476
- //--- private functions -------------------------------------------//
477
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
+ }
478
987
 
479
- function _createTargetBalance(NftId nftId) private {
480
- if (_lastUpdatedIn[nftId].gtz()) {
481
- revert ErrorStakingStoreBalanceAlreadyInitialized(nftId);
482
- }
483
988
 
484
- // set target balances to 0
485
- _stakeBalance[nftId] = AmountLib.zero();
486
- _rewardBalance[nftId] = AmountLib.zero();
487
- _reserveBalance[nftId] = AmountLib.zero();
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);
488
997
 
489
- // set last updated in to current block number
490
- // we don't need last updated at timestamp for targets
491
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
998
+ // logging
999
+ emit IStaking.LogStakingRewardReservesSpent(
1000
+ targetNftId,
1001
+ dipAmount,
1002
+ targetInfo.reserveAmount,
1003
+ lastUpdateIn);
492
1004
  }
493
1005
 
494
1006
 
495
- function _createStakeBalance(NftId nftId) private {
496
- if (_lastUpdatedIn[nftId].gtz()) {
497
- revert ErrorStakingStoreBalanceAlreadyInitialized(nftId);
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);
498
1023
  }
499
1024
 
500
- // set stake balances to 0
501
- _stakeBalance[nftId] = AmountLib.zero();
502
- _rewardBalance[nftId] = AmountLib.zero();
1025
+ // effects
1026
+ targetInfo.reserveAmount = targetInfo.reserveAmount - dipAmount;
1027
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
1028
+ }
1029
+
503
1030
 
504
- // set last updated at/in to current timestamp/block number
505
- _lastUpdatedAt[nftId] = TimestampLib.blockTimestamp();
506
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
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;
1042
+ }
1043
+
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();
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);
507
1072
  }
508
1073
 
509
1074
 
510
- function _updateStakeBalance(
1075
+ function _restakeRewards(
511
1076
  NftId stakeNftId,
512
- Amount newStakeAmount,
513
- Amount newRewardAmount
1077
+ IStaking.StakeInfo storage stakeInfo,
1078
+ IStaking.TargetInfo storage targetInfo
514
1079
  )
515
1080
  internal
1081
+ returns (Amount restakeAmount)
516
1082
  {
517
- _stakeBalance[stakeNftId] = newStakeAmount;
518
- _rewardBalance[stakeNftId] = newRewardAmount;
1083
+ restakeAmount = stakeInfo.rewardAmount;
1084
+
1085
+ // return if reward amount is zero
1086
+ if (restakeAmount.eqz()) {
1087
+ return restakeAmount;
1088
+ }
519
1089
 
520
- _lastUpdatedAt[stakeNftId] = TimestampLib.blockTimestamp();
521
- _lastUpdatedIn[stakeNftId] = BlocknumberLib.currentBlocknumber();
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);
522
1111
  }
523
1112
 
524
1113
 
525
- function _updateTargetBalance(
526
- NftId targetNftId,
527
- Amount newStakeAmount,
528
- Amount newRewardAmount
1114
+ function _stake(
1115
+ NftId stakeNftId,
1116
+ IStaking.StakeInfo storage stakeInfo,
1117
+ IStaking.TargetInfo storage targetInfo,
1118
+ Seconds maxAdditionalLockingPeriod,
1119
+ Amount stakeAmount
529
1120
  )
530
1121
  internal
531
1122
  {
532
- _stakeBalance[targetNftId] = newStakeAmount;
533
- _rewardBalance[targetNftId] = newRewardAmount;
1123
+ // return if reward amount is zero
1124
+ if (stakeAmount.eqz()) {
1125
+ return;
1126
+ }
534
1127
 
535
- // for targets we don't need the timestamp, just the blocknumber
536
- _lastUpdatedIn[targetNftId] = BlocknumberLib.currentBlocknumber();
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);
537
1151
  }
538
1152
 
539
- function _checkBalanceExists(NftId nftId)
1153
+
1154
+ function _claimRewards(
1155
+ NftId stakeNftId,
1156
+ IStaking.StakeInfo storage stakeInfo,
1157
+ IStaking.TargetInfo storage targetInfo,
1158
+ Amount maxClaimAmount
1159
+ )
540
1160
  internal
541
- returns (Blocknumber lastUpdatedIn)
1161
+ returns (Amount claimAmount)
542
1162
  {
543
- lastUpdatedIn = _lastUpdatedIn[nftId];
1163
+ claimAmount = AmountLib.min(maxClaimAmount, stakeInfo.rewardAmount);
544
1164
 
545
- if (lastUpdatedIn.eqz()) {
546
- revert ErrorStakingStoreBalanceNotInitialized(nftId);
1165
+ // return if no rewards to claim
1166
+ if (claimAmount.eqz()) {
1167
+ return claimAmount;
547
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);
548
1187
  }
549
1188
 
550
1189
 
551
- function _getAndVerifyTvl(
552
- NftId targetNftId,
553
- address token
1190
+ function _unstake(
1191
+ NftId stakeNftId,
1192
+ IStaking.StakeInfo storage stakeInfo,
1193
+ IStaking.TargetInfo storage targetInfo,
1194
+ Amount maxUnstakeAmount
554
1195
  )
555
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);
1224
+ }
1225
+
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);
1236
+ }
1237
+
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();
1248
+ }
1249
+
1250
+ //--- private stake and target functions --------------------------------//
1251
+
1252
+
1253
+ function _getAndVerifyStake(
1254
+ NftId stakeNftId
1255
+ )
1256
+ private
556
1257
  view
557
1258
  returns (
558
- Blocknumber tvlLastUpdatedIn,
559
- Amount oldBalance,
560
- Amount oldDipBalance
1259
+ IStaking.StakeInfo storage stakeInfo
561
1260
  )
562
1261
  {
563
- tvlLastUpdatedIn = _tvlLastUpdatedIn[targetNftId];
1262
+ stakeInfo = _stakeInfo[stakeNftId];
1263
+ if (stakeInfo.lastUpdateIn.eqz()) {
1264
+ revert ErrorStakingStoreStakeNotInitialized(stakeNftId);
1265
+ }
1266
+ }
1267
+
564
1268
 
565
- if (tvlLastUpdatedIn.eqz()) {
566
- revert ErrorStakingStoreTvlBalanceNotInitialized(targetNftId);
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
1308
+ view
1309
+ returns (
1310
+ IStaking.LimitInfo storage limitInfo
1311
+ )
1312
+ {
1313
+ limitInfo = _limitInfo[targetNftId];
1314
+
1315
+ if (limitInfo.lastUpdateIn.eqz()) {
1316
+ revert ErrorStakingStoreLimitNotInitialized(targetNftId);
1317
+ }
1318
+ }
1319
+
1320
+ //--- private tvl functions ------------------------------------------------//
1321
+
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);
567
1330
  }
568
1331
 
569
- oldBalance = _tvlBalance[targetNftId][token];
570
- oldDipBalance = _tvlInDip[targetNftId][token];
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;
1352
+
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
+ }
571
1367
  }
572
1368
  }