@etherisc/gif-next 0.0.2-d16f92c-416 → 0.0.2-d18e1c5-511

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 (642) hide show
  1. package/README.md +130 -8
  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 → authorization}/IAccessAdmin.sol/IAccessAdmin.json +525 -342
  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 +754 -323
  34. package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.dbg.json +1 -1
  35. package/artifacts/contracts/distribution/DistributionServiceManager.sol/DistributionServiceManager.json +228 -124
  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 +535 -78
  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/flight/FlightLib.sol/FlightLib.dbg.json +4 -0
  53. package/artifacts/contracts/examples/flight/FlightLib.sol/FlightLib.json +408 -0
  54. package/artifacts/contracts/examples/flight/FlightOracle.sol/FlightOracle.dbg.json +4 -0
  55. package/artifacts/contracts/examples/flight/FlightOracle.sol/FlightOracle.json +1198 -0
  56. package/artifacts/contracts/examples/flight/FlightOracleAuthorization.sol/FlightOracleAuthorization.dbg.json +4 -0
  57. package/artifacts/contracts/examples/flight/FlightOracleAuthorization.sol/FlightOracleAuthorization.json +805 -0
  58. package/artifacts/contracts/examples/flight/FlightPool.sol/FlightPool.dbg.json +4 -0
  59. package/artifacts/contracts/examples/flight/FlightPool.sol/FlightPool.json +1466 -0
  60. package/artifacts/contracts/examples/flight/FlightPoolAuthorization.sol/FlightPoolAuthorization.dbg.json +4 -0
  61. package/artifacts/contracts/examples/flight/FlightPoolAuthorization.sol/FlightPoolAuthorization.json +805 -0
  62. package/artifacts/contracts/examples/flight/FlightProduct.sol/FlightProduct.dbg.json +4 -0
  63. package/artifacts/contracts/examples/flight/FlightProduct.sol/FlightProduct.json +2185 -0
  64. package/artifacts/contracts/examples/flight/FlightProductAuthorization.sol/FlightProductAuthorization.dbg.json +4 -0
  65. package/artifacts/contracts/examples/flight/FlightProductAuthorization.sol/FlightProductAuthorization.json +805 -0
  66. package/artifacts/contracts/examples/flight/FlightUSD.sol/FlightUSD.dbg.json +4 -0
  67. package/artifacts/contracts/examples/flight/FlightUSD.sol/FlightUSD.json +376 -0
  68. package/artifacts/contracts/examples/flight/originalV1.sol/FlightDelayChainlink.dbg.json +4 -0
  69. package/artifacts/contracts/examples/flight/originalV1.sol/FlightDelayChainlink.json +901 -0
  70. package/artifacts/contracts/examples/unpermissioned/SimpleDistribution.sol/SimpleDistribution.dbg.json +4 -0
  71. package/artifacts/contracts/examples/unpermissioned/SimpleDistribution.sol/SimpleDistribution.json +1429 -0
  72. package/artifacts/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol/SimpleDistributionAuthorization.dbg.json +4 -0
  73. package/artifacts/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol/SimpleDistributionAuthorization.json +805 -0
  74. package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.dbg.json +4 -0
  75. package/artifacts/contracts/examples/unpermissioned/SimpleOracle.sol/SimpleOracle.json +1161 -0
  76. package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.dbg.json +4 -0
  77. package/artifacts/contracts/examples/unpermissioned/SimplePool.sol/SimplePool.json +1637 -0
  78. package/artifacts/contracts/examples/unpermissioned/SimplePoolAuthorization.sol/SimplePoolAuthorization.dbg.json +4 -0
  79. package/artifacts/contracts/examples/unpermissioned/SimplePoolAuthorization.sol/SimplePoolAuthorization.json +805 -0
  80. package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.dbg.json +4 -0
  81. package/artifacts/contracts/examples/unpermissioned/SimpleProduct.sol/SimpleProduct.json +2575 -0
  82. package/artifacts/contracts/examples/unpermissioned/SimpleProductAuthorization.sol/SimpleProductAuthorization.dbg.json +4 -0
  83. package/artifacts/contracts/examples/unpermissioned/SimpleProductAuthorization.sol/SimpleProductAuthorization.json +805 -0
  84. package/artifacts/contracts/instance/BaseStore.sol/BaseStore.dbg.json +4 -0
  85. package/artifacts/contracts/{shared/IKeyValueStore.sol/IKeyValueStore.json → instance/BaseStore.sol/BaseStore.json} +59 -195
  86. package/artifacts/contracts/instance/BundleSet.sol/BundleSet.dbg.json +4 -0
  87. package/artifacts/contracts/instance/BundleSet.sol/BundleSet.json +851 -0
  88. package/artifacts/contracts/instance/IBaseStore.sol/IBaseStore.dbg.json +4 -0
  89. package/artifacts/contracts/instance/IBaseStore.sol/IBaseStore.json +304 -0
  90. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  91. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +580 -80
  92. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.dbg.json +1 -1
  93. package/artifacts/contracts/instance/IInstanceService.sol/IInstanceService.json +398 -75
  94. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  95. package/artifacts/contracts/instance/Instance.sol/Instance.json +590 -218
  96. package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.dbg.json +1 -1
  97. package/artifacts/contracts/instance/InstanceAdmin.sol/InstanceAdmin.json +1889 -313
  98. package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.dbg.json +4 -0
  99. package/artifacts/contracts/instance/InstanceAuthorizationV3.sol/InstanceAuthorizationV3.json +837 -0
  100. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.dbg.json +1 -1
  101. package/artifacts/contracts/instance/InstanceReader.sol/InstanceReader.json +1760 -840
  102. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.dbg.json +1 -1
  103. package/artifacts/contracts/instance/InstanceService.sol/InstanceService.json +392 -274
  104. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.dbg.json +1 -1
  105. package/artifacts/contracts/instance/InstanceServiceManager.sol/InstanceServiceManager.json +141 -127
  106. package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.dbg.json +1 -1
  107. package/artifacts/contracts/instance/InstanceStore.sol/InstanceStore.json +1298 -1857
  108. package/artifacts/contracts/instance/ProductStore.sol/ProductStore.dbg.json +4 -0
  109. package/artifacts/contracts/instance/ProductStore.sol/ProductStore.json +3427 -0
  110. package/artifacts/contracts/instance/RiskSet.sol/RiskSet.dbg.json +4 -0
  111. package/artifacts/contracts/instance/RiskSet.sol/RiskSet.json +866 -0
  112. package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.dbg.json +1 -1
  113. package/artifacts/contracts/instance/base/BalanceStore.sol/BalanceStore.json +8 -8
  114. package/artifacts/contracts/instance/base/Cloneable.sol/Cloneable.dbg.json +1 -1
  115. package/artifacts/contracts/instance/base/ObjectCounter.sol/ObjectCounter.dbg.json +1 -1
  116. package/artifacts/contracts/instance/base/ObjectCounter.sol/ObjectCounter.json +2 -2
  117. package/artifacts/contracts/instance/base/ObjectLifecycle.sol/ObjectLifecycle.dbg.json +4 -0
  118. package/artifacts/contracts/instance/base/ObjectLifecycle.sol/ObjectLifecycle.json +223 -0
  119. package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.dbg.json +4 -0
  120. package/artifacts/contracts/instance/base/ObjectSet.sol/ObjectSet.json +192 -0
  121. package/artifacts/contracts/instance/base/ObjectSetHelperLib.sol/ObjectSetHelperLib.dbg.json +4 -0
  122. package/artifacts/contracts/instance/base/ObjectSetHelperLib.sol/ObjectSetHelperLib.json +168 -0
  123. package/artifacts/contracts/instance/module/IBundle.sol/IBundle.dbg.json +1 -1
  124. package/artifacts/contracts/instance/module/IComponents.sol/IComponents.dbg.json +1 -1
  125. package/artifacts/contracts/instance/module/IDistribution.sol/IDistribution.dbg.json +1 -1
  126. package/artifacts/contracts/instance/module/IPolicy.sol/IPolicy.dbg.json +1 -1
  127. package/artifacts/contracts/instance/module/IRisk.sol/IRisk.dbg.json +1 -1
  128. package/artifacts/contracts/mock/Dip.sol/Dip.dbg.json +1 -1
  129. package/artifacts/contracts/mock/Dip.sol/Dip.json +2 -2
  130. package/artifacts/contracts/oracle/BasicOracle.sol/BasicOracle.dbg.json +4 -0
  131. package/artifacts/contracts/oracle/BasicOracle.sol/BasicOracle.json +947 -0
  132. package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.dbg.json +4 -0
  133. package/artifacts/contracts/oracle/BasicOracleAuthorization.sol/BasicOracleAuthorization.json +805 -0
  134. package/artifacts/contracts/oracle/IOracle.sol/IOracle.dbg.json +1 -1
  135. package/artifacts/contracts/oracle/IOracle.sol/IOracle.json +43 -1
  136. package/artifacts/contracts/oracle/IOracleComponent.sol/IOracleComponent.dbg.json +1 -1
  137. package/artifacts/contracts/oracle/IOracleComponent.sol/IOracleComponent.json +142 -139
  138. package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.dbg.json +1 -1
  139. package/artifacts/contracts/oracle/IOracleService.sol/IOracleService.json +98 -11
  140. package/artifacts/contracts/oracle/Oracle.sol/Oracle.dbg.json +1 -1
  141. package/artifacts/contracts/oracle/Oracle.sol/Oracle.json +140 -423
  142. package/artifacts/contracts/oracle/OracleService.sol/OracleService.dbg.json +1 -1
  143. package/artifacts/contracts/oracle/OracleService.sol/OracleService.json +198 -190
  144. package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.dbg.json +1 -1
  145. package/artifacts/contracts/oracle/OracleServiceManager.sol/OracleServiceManager.json +177 -97
  146. package/artifacts/contracts/pool/BasicPool.sol/BasicPool.dbg.json +4 -0
  147. package/artifacts/contracts/pool/BasicPool.sol/BasicPool.json +1232 -0
  148. package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.dbg.json +4 -0
  149. package/artifacts/contracts/pool/BasicPoolAuthorization.sol/BasicPoolAuthorization.json +805 -0
  150. package/artifacts/contracts/pool/BundleService.sol/BundleService.dbg.json +1 -1
  151. package/artifacts/contracts/pool/BundleService.sol/BundleService.json +569 -265
  152. package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.dbg.json +1 -1
  153. package/artifacts/contracts/pool/BundleServiceManager.sol/BundleServiceManager.json +216 -104
  154. package/artifacts/contracts/pool/IBundleService.sol/IBundleService.dbg.json +1 -1
  155. package/artifacts/contracts/pool/IBundleService.sol/IBundleService.json +383 -53
  156. package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.dbg.json +1 -1
  157. package/artifacts/contracts/pool/IPoolComponent.sol/IPoolComponent.json +147 -406
  158. package/artifacts/contracts/pool/IPoolService.sol/IPoolService.dbg.json +1 -1
  159. package/artifacts/contracts/pool/IPoolService.sol/IPoolService.json +711 -340
  160. package/artifacts/contracts/pool/Pool.sol/Pool.dbg.json +1 -1
  161. package/artifacts/contracts/pool/Pool.sol/Pool.json +144 -694
  162. package/artifacts/contracts/pool/PoolLib.sol/PoolLib.dbg.json +4 -0
  163. package/artifacts/contracts/pool/PoolLib.sol/PoolLib.json +522 -0
  164. package/artifacts/contracts/pool/PoolService.sol/PoolService.dbg.json +1 -1
  165. package/artifacts/contracts/pool/PoolService.sol/PoolService.json +925 -545
  166. package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.dbg.json +1 -1
  167. package/artifacts/contracts/pool/PoolServiceManager.sol/PoolServiceManager.json +230 -106
  168. package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.dbg.json +1 -1
  169. package/artifacts/contracts/product/ApplicationService.sol/ApplicationService.json +353 -180
  170. package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.dbg.json +1 -1
  171. package/artifacts/contracts/product/ApplicationServiceManager.sol/ApplicationServiceManager.json +159 -99
  172. package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.dbg.json +4 -0
  173. package/artifacts/contracts/product/BasicProduct.sol/BasicProduct.json +1149 -0
  174. package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.dbg.json +4 -0
  175. package/artifacts/contracts/product/BasicProductAuthorization.sol/BasicProductAuthorization.json +805 -0
  176. package/artifacts/contracts/product/ClaimService.sol/ClaimService.dbg.json +1 -1
  177. package/artifacts/contracts/product/ClaimService.sol/ClaimService.json +466 -245
  178. package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.dbg.json +1 -1
  179. package/artifacts/contracts/product/ClaimServiceManager.sol/ClaimServiceManager.json +187 -123
  180. package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.dbg.json +1 -1
  181. package/artifacts/contracts/product/IApplicationService.sol/IApplicationService.json +301 -9
  182. package/artifacts/contracts/product/IClaimService.sol/IClaimService.dbg.json +1 -1
  183. package/artifacts/contracts/product/IClaimService.sol/IClaimService.json +350 -18
  184. package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.dbg.json +1 -1
  185. package/artifacts/contracts/product/IPolicyService.sol/IPolicyService.json +417 -101
  186. package/artifacts/contracts/product/IPricingService.sol/IPricingService.dbg.json +1 -1
  187. package/artifacts/contracts/product/IPricingService.sol/IPricingService.json +183 -80
  188. package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.dbg.json +1 -1
  189. package/artifacts/contracts/product/IProductComponent.sol/IProductComponent.json +282 -271
  190. package/artifacts/contracts/product/IRiskService.sol/IRiskService.dbg.json +4 -0
  191. package/artifacts/contracts/{shared/ComponentVerifyingService.sol/ComponentVerifyingService.json → product/IRiskService.sol/IRiskService.json} +283 -157
  192. package/artifacts/contracts/product/PolicyService.sol/PolicyService.dbg.json +1 -1
  193. package/artifacts/contracts/product/PolicyService.sol/PolicyService.json +532 -311
  194. package/artifacts/contracts/product/PolicyServiceLib.sol/PolicyServiceLib.dbg.json +4 -0
  195. package/artifacts/contracts/product/PolicyServiceLib.sol/PolicyServiceLib.json +783 -0
  196. package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.dbg.json +1 -1
  197. package/artifacts/contracts/product/PolicyServiceManager.sol/PolicyServiceManager.json +196 -108
  198. package/artifacts/contracts/product/PricingService.sol/PricingService.dbg.json +1 -1
  199. package/artifacts/contracts/product/PricingService.sol/PricingService.json +249 -329
  200. package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.dbg.json +1 -1
  201. package/artifacts/contracts/product/PricingServiceManager.sol/PricingServiceManager.json +165 -137
  202. package/artifacts/contracts/product/Product.sol/Product.dbg.json +1 -1
  203. package/artifacts/contracts/product/Product.sol/Product.json +316 -606
  204. package/artifacts/contracts/product/RiskService.sol/RiskService.dbg.json +4 -0
  205. package/artifacts/contracts/product/RiskService.sol/RiskService.json +873 -0
  206. package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.dbg.json +4 -0
  207. package/artifacts/contracts/product/RiskServiceManager.sol/RiskServiceManager.json +774 -0
  208. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  209. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +59 -16
  210. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  211. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +384 -69
  212. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.dbg.json +1 -1
  213. package/artifacts/contracts/registry/IRegistryService.sol/IRegistryService.json +97 -148
  214. package/artifacts/contracts/registry/IRelease.sol/IRelease.dbg.json +4 -0
  215. package/artifacts/contracts/registry/IRelease.sol/IRelease.json +24 -0
  216. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.dbg.json +1 -1
  217. package/artifacts/contracts/registry/ITransferInterceptor.sol/ITransferInterceptor.json +5 -18
  218. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  219. package/artifacts/contracts/registry/Registry.sol/Registry.json +617 -133
  220. package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.dbg.json +1 -1
  221. package/artifacts/contracts/registry/RegistryAdmin.sol/RegistryAdmin.json +796 -537
  222. package/artifacts/contracts/registry/RegistryAuthorization.sol/RegistryAuthorization.dbg.json +4 -0
  223. package/artifacts/contracts/registry/RegistryAuthorization.sol/RegistryAuthorization.json +1074 -0
  224. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.dbg.json +1 -1
  225. package/artifacts/contracts/registry/RegistryService.sol/RegistryService.json +136 -290
  226. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.dbg.json +1 -1
  227. package/artifacts/contracts/registry/RegistryServiceManager.sol/RegistryServiceManager.json +141 -89
  228. package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.dbg.json +4 -0
  229. package/artifacts/contracts/registry/ReleaseAdmin.sol/ReleaseAdmin.json +2152 -0
  230. package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.dbg.json +4 -0
  231. package/artifacts/contracts/registry/ReleaseLifecycle.sol/ReleaseLifecycle.json +205 -0
  232. package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.dbg.json +4 -0
  233. package/artifacts/contracts/registry/ReleaseRegistry.sol/ReleaseRegistry.json +1389 -0
  234. package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.dbg.json +1 -1
  235. package/artifacts/contracts/registry/ServiceAuthorizationV3.sol/ServiceAuthorizationV3.json +523 -27
  236. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.dbg.json +1 -1
  237. package/artifacts/contracts/registry/TokenRegistry.sol/TokenRegistry.json +120 -60
  238. package/artifacts/contracts/shared/Component.sol/Component.dbg.json +1 -1
  239. package/artifacts/contracts/shared/Component.sol/Component.json +86 -287
  240. package/artifacts/contracts/shared/ComponentService.sol/ComponentService.dbg.json +1 -1
  241. package/artifacts/contracts/shared/ComponentService.sol/ComponentService.json +609 -569
  242. package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.dbg.json +1 -1
  243. package/artifacts/contracts/shared/ComponentServiceManager.sol/ComponentServiceManager.json +197 -131
  244. package/artifacts/contracts/shared/ContractLib.sol/ContractLib.dbg.json +4 -0
  245. package/artifacts/contracts/shared/ContractLib.sol/ContractLib.json +632 -0
  246. package/artifacts/contracts/shared/ContractLib.sol/IInstanceAdminHelper.dbg.json +4 -0
  247. package/artifacts/contracts/shared/ContractLib.sol/IInstanceAdminHelper.json +24 -0
  248. package/artifacts/contracts/shared/ContractLib.sol/ITargetHelper.dbg.json +4 -0
  249. package/artifacts/contracts/shared/ContractLib.sol/ITargetHelper.json +30 -0
  250. package/artifacts/contracts/shared/ContractLib.sol/ITokenRegistryHelper.dbg.json +4 -0
  251. package/artifacts/contracts/shared/ContractLib.sol/ITokenRegistryHelper.json +40 -0
  252. package/artifacts/contracts/shared/IComponent.sol/IComponent.dbg.json +1 -1
  253. package/artifacts/contracts/shared/IComponent.sol/IComponent.json +92 -103
  254. package/artifacts/contracts/shared/IComponentService.sol/IComponentService.dbg.json +1 -1
  255. package/artifacts/contracts/shared/IComponentService.sol/IComponentService.json +535 -240
  256. package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.dbg.json +1 -1
  257. package/artifacts/contracts/shared/IInstanceLinkedComponent.sol/IInstanceLinkedComponent.json +131 -139
  258. package/artifacts/contracts/shared/ILifecycle.sol/ILifecycle.dbg.json +1 -1
  259. package/artifacts/contracts/shared/ILifecycle.sol/ILifecycle.json +34 -3
  260. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.dbg.json +1 -1
  261. package/artifacts/contracts/shared/INftOwnable.sol/INftOwnable.json +35 -0
  262. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.dbg.json +1 -1
  263. package/artifacts/contracts/shared/IPolicyHolder.sol/IPolicyHolder.json +15 -47
  264. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.dbg.json +1 -1
  265. package/artifacts/contracts/shared/IRegisterable.sol/IRegisterable.json +167 -0
  266. package/artifacts/contracts/shared/IRegistryLinked.sol/IRegistryLinked.dbg.json +1 -1
  267. package/artifacts/contracts/shared/IService.sol/IService.dbg.json +1 -1
  268. package/artifacts/contracts/shared/IService.sol/IService.json +84 -2
  269. package/artifacts/contracts/shared/InitializableERC165.sol/InitializableERC165.dbg.json +4 -0
  270. package/artifacts/contracts/shared/InitializableERC165.sol/InitializableERC165.json +53 -0
  271. package/artifacts/contracts/shared/InstanceLinkedComponent.sol/InstanceLinkedComponent.dbg.json +1 -1
  272. package/artifacts/contracts/shared/InstanceLinkedComponent.sol/InstanceLinkedComponent.json +125 -376
  273. package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.dbg.json +1 -1
  274. package/artifacts/contracts/shared/Lifecycle.sol/Lifecycle.json +42 -62
  275. package/artifacts/contracts/shared/NftIdSet.sol/NftIdSet.dbg.json +4 -0
  276. package/artifacts/contracts/shared/NftIdSet.sol/NftIdSet.json +306 -0
  277. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.dbg.json +1 -1
  278. package/artifacts/contracts/shared/NftOwnable.sol/NftOwnable.json +41 -57
  279. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.dbg.json +1 -1
  280. package/artifacts/contracts/shared/PolicyHolder.sol/PolicyHolder.json +19 -141
  281. package/artifacts/contracts/shared/Registerable.sol/Registerable.dbg.json +1 -1
  282. package/artifacts/contracts/shared/Registerable.sol/Registerable.json +141 -97
  283. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.dbg.json +1 -1
  284. package/artifacts/contracts/shared/RegistryLinked.sol/RegistryLinked.json +2 -15
  285. package/artifacts/contracts/shared/Service.sol/Service.dbg.json +1 -1
  286. package/artifacts/contracts/shared/Service.sol/Service.json +86 -111
  287. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.dbg.json +1 -1
  288. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandler.json +585 -12
  289. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandlerBase.dbg.json +4 -0
  290. package/artifacts/contracts/shared/TokenHandler.sol/TokenHandlerBase.json +484 -0
  291. package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.dbg.json +4 -0
  292. package/artifacts/contracts/shared/TokenHandlerDeployerLib.sol/TokenHandlerDeployerLib.json +172 -0
  293. package/artifacts/contracts/staking/IStaking.sol/IStaking.dbg.json +1 -1
  294. package/artifacts/contracts/staking/IStaking.sol/IStaking.json +1513 -204
  295. package/artifacts/contracts/staking/IStakingService.sol/IStakingService.dbg.json +1 -1
  296. package/artifacts/contracts/staking/IStakingService.sol/IStakingService.json +235 -123
  297. package/artifacts/contracts/staking/ITargetLimitHandler.sol/ITargetLimitHandler.dbg.json +4 -0
  298. package/artifacts/contracts/staking/ITargetLimitHandler.sol/ITargetLimitHandler.json +50 -0
  299. package/artifacts/contracts/staking/Staking.sol/Staking.dbg.json +1 -1
  300. package/artifacts/contracts/staking/Staking.sol/Staking.json +1635 -465
  301. package/artifacts/contracts/staking/StakingLib.sol/StakingLib.dbg.json +4 -0
  302. package/artifacts/contracts/staking/StakingLib.sol/StakingLib.json +470 -0
  303. package/artifacts/contracts/staking/StakingManager.sol/StakingManager.dbg.json +1 -1
  304. package/artifacts/contracts/staking/StakingManager.sol/StakingManager.json +191 -105
  305. package/artifacts/contracts/staking/StakingReader.sol/StakingReader.dbg.json +1 -1
  306. package/artifacts/contracts/staking/StakingReader.sol/StakingReader.json +295 -183
  307. package/artifacts/contracts/staking/StakingService.sol/StakingService.dbg.json +1 -1
  308. package/artifacts/contracts/staking/StakingService.sol/StakingService.json +282 -281
  309. package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.dbg.json +1 -1
  310. package/artifacts/contracts/staking/StakingServiceManager.sol/StakingServiceManager.json +144 -96
  311. package/artifacts/contracts/staking/StakingStore.sol/StakingStore.dbg.json +1 -1
  312. package/artifacts/contracts/staking/StakingStore.sol/StakingStore.json +1637 -801
  313. package/artifacts/contracts/staking/TargetHandler.sol/TargetHandler.dbg.json +4 -0
  314. package/artifacts/contracts/staking/TargetHandler.sol/TargetHandler.json +309 -0
  315. package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.dbg.json +1 -1
  316. package/artifacts/contracts/staking/TargetManagerLib.sol/TargetManagerLib.json +184 -76
  317. package/artifacts/contracts/type/AddressSet.sol/LibAddressSet.dbg.json +1 -1
  318. package/artifacts/contracts/type/AddressSet.sol/LibAddressSet.json +2 -2
  319. package/artifacts/contracts/type/Amount.sol/AmountLib.dbg.json +1 -1
  320. package/artifacts/contracts/type/Amount.sol/AmountLib.json +63 -10
  321. package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  322. package/artifacts/contracts/type/Blocknumber.sol/BlocknumberLib.json +45 -19
  323. package/artifacts/contracts/type/ChainId.sol/ChainIdLib.dbg.json +4 -0
  324. package/artifacts/contracts/type/ChainId.sol/ChainIdLib.json +193 -0
  325. package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.dbg.json +1 -1
  326. package/artifacts/contracts/type/ClaimId.sol/ClaimIdLib.json +28 -4
  327. package/artifacts/contracts/type/DistributorType.sol/DistributorTypeLib.dbg.json +1 -1
  328. package/artifacts/contracts/type/DistributorType.sol/DistributorTypeLib.json +4 -4
  329. package/artifacts/contracts/type/Fee.sol/FeeLib.dbg.json +1 -1
  330. package/artifacts/contracts/type/Fee.sol/FeeLib.json +98 -37
  331. package/artifacts/contracts/type/Key32.sol/Key32Lib.dbg.json +1 -1
  332. package/artifacts/contracts/type/Key32.sol/Key32Lib.json +2 -2
  333. package/artifacts/contracts/type/Key32Set.sol/LibKey32Set.dbg.json +4 -0
  334. package/artifacts/contracts/type/Key32Set.sol/LibKey32Set.json +33 -0
  335. package/artifacts/contracts/type/NftId.sol/NftIdLib.dbg.json +1 -1
  336. package/artifacts/contracts/type/NftId.sol/NftIdLib.json +23 -4
  337. package/artifacts/contracts/type/NftIdSet.sol/LibNftIdSet.dbg.json +1 -1
  338. package/artifacts/contracts/type/NftIdSet.sol/LibNftIdSet.json +2 -2
  339. package/artifacts/contracts/type/ObjectType.sol/ObjectTypeLib.dbg.json +1 -1
  340. package/artifacts/contracts/type/ObjectType.sol/ObjectTypeLib.json +61 -9
  341. package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.dbg.json +1 -1
  342. package/artifacts/contracts/type/PayoutId.sol/PayoutIdLib.json +19 -19
  343. package/artifacts/contracts/type/Referral.sol/ReferralLib.dbg.json +1 -1
  344. package/artifacts/contracts/type/Referral.sol/ReferralLib.json +23 -4
  345. package/artifacts/contracts/type/RequestId.sol/RequestIdLib.dbg.json +1 -1
  346. package/artifacts/contracts/type/RequestId.sol/RequestIdLib.json +4 -4
  347. package/artifacts/contracts/type/RequestIdSet.sol/RequestIdSet.dbg.json +4 -0
  348. package/artifacts/contracts/type/RequestIdSet.sol/RequestIdSet.json +33 -0
  349. package/artifacts/contracts/type/RiskId.sol/RiskIdLib.dbg.json +1 -1
  350. package/artifacts/contracts/type/RiskId.sol/RiskIdLib.json +125 -7
  351. package/artifacts/contracts/type/RoleId.sol/RoleIdLib.dbg.json +1 -1
  352. package/artifacts/contracts/type/RoleId.sol/RoleIdLib.json +79 -91
  353. package/artifacts/contracts/type/Seconds.sol/SecondsLib.dbg.json +1 -1
  354. package/artifacts/contracts/type/Seconds.sol/SecondsLib.json +112 -2
  355. package/artifacts/contracts/type/Selector.sol/SelectorLib.dbg.json +1 -1
  356. package/artifacts/contracts/type/Selector.sol/SelectorLib.json +21 -2
  357. package/artifacts/contracts/type/Selector.sol/SelectorSetLib.dbg.json +1 -1
  358. package/artifacts/contracts/type/Selector.sol/SelectorSetLib.json +2 -2
  359. package/artifacts/contracts/type/StateId.sol/StateIdLib.dbg.json +1 -1
  360. package/artifacts/contracts/type/StateId.sol/StateIdLib.json +15 -2
  361. package/artifacts/contracts/type/String.sol/StrLib.dbg.json +1 -1
  362. package/artifacts/contracts/type/String.sol/StrLib.json +69 -2
  363. package/artifacts/contracts/type/Timestamp.sol/TimestampLib.dbg.json +1 -1
  364. package/artifacts/contracts/type/Timestamp.sol/TimestampLib.json +56 -5
  365. package/artifacts/contracts/type/UFixed.sol/UFixedLib.dbg.json +1 -1
  366. package/artifacts/contracts/type/UFixed.sol/UFixedLib.json +126 -33
  367. package/artifacts/contracts/type/Version.sol/VersionLib.dbg.json +1 -1
  368. package/artifacts/contracts/type/Version.sol/VersionLib.json +2 -21
  369. package/artifacts/contracts/type/Version.sol/VersionPartLib.dbg.json +1 -1
  370. package/artifacts/contracts/type/Version.sol/VersionPartLib.json +120 -2
  371. package/artifacts/contracts/upgradeability/IVersionable.sol/IVersionable.dbg.json +4 -0
  372. package/artifacts/contracts/{shared → upgradeability}/IVersionable.sol/IVersionable.json +11 -1
  373. package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.dbg.json +4 -0
  374. package/artifacts/contracts/upgradeability/ProxyManager.sol/ProxyManager.json +656 -0
  375. package/artifacts/contracts/upgradeability/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +4 -0
  376. package/artifacts/contracts/upgradeability/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +142 -0
  377. package/artifacts/contracts/upgradeability/Versionable.sol/Versionable.dbg.json +4 -0
  378. package/artifacts/contracts/{shared → upgradeability}/Versionable.sol/Versionable.json +11 -1
  379. package/contracts/accounting/AccountingService.sol +274 -0
  380. package/contracts/accounting/AccountingServiceManager.sol +38 -0
  381. package/contracts/accounting/IAccountingService.sol +47 -0
  382. package/contracts/authorization/AccessAdmin.sol +780 -0
  383. package/contracts/authorization/AccessAdminLib.sol +396 -0
  384. package/contracts/authorization/AccessManagerCloneable.sol +158 -0
  385. package/contracts/authorization/Authorization.sol +169 -0
  386. package/contracts/authorization/IAccess.sol +67 -0
  387. package/contracts/authorization/IAccessAdmin.sol +144 -0
  388. package/contracts/authorization/IAuthorization.sol +26 -0
  389. package/contracts/authorization/IServiceAuthorization.sol +78 -0
  390. package/contracts/authorization/ServiceAuthorization.sol +320 -0
  391. package/contracts/distribution/BasicDistribution.sol +140 -0
  392. package/contracts/distribution/BasicDistributionAuthorization.sol +67 -0
  393. package/contracts/distribution/Distribution.sol +125 -141
  394. package/contracts/distribution/DistributionService.sol +284 -133
  395. package/contracts/distribution/DistributionServiceManager.sol +8 -11
  396. package/contracts/distribution/IDistributionComponent.sol +21 -42
  397. package/contracts/distribution/IDistributionService.sol +60 -26
  398. package/contracts/examples/fire/DamageLevel.sol +59 -0
  399. package/contracts/examples/fire/FirePool.sol +86 -0
  400. package/contracts/examples/fire/FirePoolAuthorization.sol +35 -0
  401. package/contracts/examples/fire/FireProduct.sol +433 -0
  402. package/contracts/examples/fire/FireProductAuthorization.sol +45 -0
  403. package/contracts/examples/fire/FireUSD.sol +26 -0
  404. package/contracts/examples/flight/FlightLib.sol +279 -0
  405. package/contracts/examples/flight/FlightOracle.sol +167 -0
  406. package/contracts/examples/flight/FlightOracleAuthorization.sol +34 -0
  407. package/contracts/examples/flight/FlightPool.sol +89 -0
  408. package/contracts/examples/flight/FlightPoolAuthorization.sol +37 -0
  409. package/contracts/examples/flight/FlightProduct.sol +470 -0
  410. package/contracts/examples/flight/FlightProductAuthorization.sol +44 -0
  411. package/contracts/examples/flight/FlightUSD.sol +26 -0
  412. package/contracts/examples/flight/originalV1.sol +396 -0
  413. package/contracts/examples/unpermissioned/SimpleDistribution.sol +81 -0
  414. package/contracts/examples/unpermissioned/SimpleDistributionAuthorization.sol +28 -0
  415. package/contracts/examples/unpermissioned/SimpleOracle.sol +133 -0
  416. package/contracts/examples/unpermissioned/SimplePool.sol +102 -0
  417. package/contracts/examples/unpermissioned/SimplePoolAuthorization.sol +28 -0
  418. package/contracts/examples/unpermissioned/SimpleProduct.sol +437 -0
  419. package/contracts/examples/unpermissioned/SimpleProductAuthorization.sol +28 -0
  420. package/contracts/instance/BaseStore.sol +93 -0
  421. package/contracts/instance/BundleSet.sol +130 -0
  422. package/contracts/instance/IBaseStore.sol +37 -0
  423. package/contracts/instance/IInstance.sol +118 -49
  424. package/contracts/instance/IInstanceService.sol +68 -46
  425. package/contracts/instance/Instance.sol +221 -133
  426. package/contracts/instance/InstanceAdmin.sol +297 -249
  427. package/contracts/instance/InstanceAuthorizationV3.sol +275 -0
  428. package/contracts/instance/InstanceReader.sol +498 -256
  429. package/contracts/instance/InstanceService.sol +340 -265
  430. package/contracts/instance/InstanceServiceManager.sol +8 -13
  431. package/contracts/instance/InstanceStore.sol +163 -109
  432. package/contracts/instance/ProductStore.sol +290 -0
  433. package/contracts/instance/RiskSet.sol +126 -0
  434. package/contracts/instance/TargetNames.sol +10 -0
  435. package/contracts/instance/base/BalanceStore.sol +4 -6
  436. package/contracts/instance/base/ObjectCounter.sol +1 -2
  437. package/contracts/instance/base/ObjectLifecycle.sol +109 -0
  438. package/contracts/instance/base/ObjectSet.sol +77 -0
  439. package/contracts/instance/base/ObjectSetHelperLib.sol +30 -0
  440. package/contracts/instance/module/IBundle.sol +6 -5
  441. package/contracts/instance/module/IComponents.sol +29 -21
  442. package/contracts/instance/module/IDistribution.sol +21 -9
  443. package/contracts/instance/module/IPolicy.sol +50 -29
  444. package/contracts/instance/module/IRisk.sol +5 -0
  445. package/contracts/mock/Dip.sol +1 -1
  446. package/contracts/oracle/BasicOracle.sol +44 -0
  447. package/contracts/oracle/BasicOracleAuthorization.sol +52 -0
  448. package/contracts/oracle/IOracle.sol +25 -4
  449. package/contracts/oracle/IOracleComponent.sol +2 -1
  450. package/contracts/oracle/IOracleService.sol +14 -13
  451. package/contracts/oracle/Oracle.sol +60 -53
  452. package/contracts/oracle/OracleService.sol +119 -87
  453. package/contracts/oracle/OracleServiceManager.sol +8 -11
  454. package/contracts/pool/BasicPool.sol +161 -0
  455. package/contracts/pool/BasicPoolAuthorization.sol +81 -0
  456. package/contracts/pool/BundleService.sol +222 -132
  457. package/contracts/pool/BundleServiceManager.sol +8 -11
  458. package/contracts/pool/IBundleService.sol +43 -33
  459. package/contracts/pool/IPoolComponent.sol +20 -70
  460. package/contracts/pool/IPoolService.sol +97 -77
  461. package/contracts/pool/Pool.sol +196 -164
  462. package/contracts/pool/PoolLib.sol +341 -0
  463. package/contracts/pool/PoolService.sol +419 -257
  464. package/contracts/pool/PoolServiceManager.sol +6 -9
  465. package/contracts/product/ApplicationService.sol +154 -81
  466. package/contracts/product/ApplicationServiceManager.sol +6 -6
  467. package/contracts/product/BasicProduct.sol +48 -0
  468. package/contracts/product/BasicProductAuthorization.sol +64 -0
  469. package/contracts/product/ClaimService.sol +391 -207
  470. package/contracts/product/ClaimServiceManager.sol +6 -6
  471. package/contracts/product/IApplicationService.sol +29 -3
  472. package/contracts/product/IClaimService.sol +48 -11
  473. package/contracts/product/IPolicyService.sol +61 -37
  474. package/contracts/product/IPricingService.sol +11 -10
  475. package/contracts/product/IProductComponent.sol +29 -9
  476. package/contracts/product/IRiskService.sol +48 -0
  477. package/contracts/product/PolicyService.sol +445 -275
  478. package/contracts/product/PolicyServiceLib.sol +139 -0
  479. package/contracts/product/PolicyServiceManager.sol +6 -9
  480. package/contracts/product/PricingService.sol +90 -84
  481. package/contracts/product/PricingServiceManager.sol +6 -9
  482. package/contracts/product/Product.sol +261 -147
  483. package/contracts/product/RiskService.sol +189 -0
  484. package/contracts/product/RiskServiceManager.sol +39 -0
  485. package/contracts/registry/ChainNft.sol +72 -40
  486. package/contracts/registry/IRegistry.sol +84 -36
  487. package/contracts/registry/IRegistryService.sol +3 -10
  488. package/contracts/registry/IRelease.sol +29 -0
  489. package/contracts/registry/ITransferInterceptor.sol +1 -2
  490. package/contracts/registry/Registry.sol +378 -224
  491. package/contracts/registry/RegistryAdmin.sol +119 -261
  492. package/contracts/registry/RegistryAuthorization.sol +336 -0
  493. package/contracts/registry/RegistryService.sol +42 -67
  494. package/contracts/registry/RegistryServiceManager.sol +5 -5
  495. package/contracts/registry/ReleaseAdmin.sol +195 -0
  496. package/contracts/registry/ReleaseLifecycle.sol +32 -0
  497. package/contracts/registry/ReleaseRegistry.sol +525 -0
  498. package/contracts/registry/ServiceAuthorizationV3.sol +213 -71
  499. package/contracts/registry/TokenRegistry.sol +61 -59
  500. package/contracts/shared/Component.sol +71 -142
  501. package/contracts/shared/ComponentService.sol +459 -385
  502. package/contracts/shared/ComponentServiceManager.sol +10 -7
  503. package/contracts/shared/ContractLib.sol +312 -0
  504. package/contracts/shared/IComponent.sol +6 -18
  505. package/contracts/shared/IComponentService.sol +50 -41
  506. package/contracts/shared/IInstanceLinkedComponent.sol +10 -26
  507. package/contracts/shared/ILifecycle.sol +3 -2
  508. package/contracts/shared/INftOwnable.sol +4 -0
  509. package/contracts/shared/IPolicyHolder.sol +12 -22
  510. package/contracts/shared/IRegisterable.sol +22 -1
  511. package/contracts/shared/IService.sol +4 -6
  512. package/contracts/shared/{ERC165.sol → InitializableERC165.sol} +11 -3
  513. package/contracts/shared/InstanceLinkedComponent.sol +145 -57
  514. package/contracts/shared/Lifecycle.sol +30 -72
  515. package/contracts/shared/{NftIdSetManager.sol → NftIdSet.sol} +1 -1
  516. package/contracts/shared/NftOwnable.sol +33 -11
  517. package/contracts/shared/PolicyHolder.sol +20 -59
  518. package/contracts/shared/Registerable.sol +52 -21
  519. package/contracts/shared/RegistryLinked.sol +9 -14
  520. package/contracts/shared/Service.sol +22 -38
  521. package/contracts/shared/TokenHandler.sol +310 -26
  522. package/contracts/shared/TokenHandlerDeployerLib.sol +20 -0
  523. package/contracts/staking/IStaking.sol +272 -73
  524. package/contracts/staking/IStakingService.sol +48 -74
  525. package/contracts/staking/ITargetLimitHandler.sol +17 -0
  526. package/contracts/staking/Staking.sol +534 -250
  527. package/contracts/staking/StakingLib.sol +195 -0
  528. package/contracts/staking/StakingManager.sol +14 -15
  529. package/contracts/staking/StakingReader.sol +72 -88
  530. package/contracts/staking/StakingService.sol +62 -152
  531. package/contracts/staking/StakingServiceManager.sol +9 -7
  532. package/contracts/staking/StakingStore.sol +1096 -341
  533. package/contracts/staking/TargetHandler.sol +132 -0
  534. package/contracts/staking/TargetManagerLib.sol +73 -46
  535. package/contracts/type/Amount.sol +31 -5
  536. package/contracts/type/Blocknumber.sol +22 -16
  537. package/contracts/type/ChainId.sol +101 -0
  538. package/contracts/type/ClaimId.sol +6 -1
  539. package/contracts/type/Fee.sol +8 -8
  540. package/contracts/type/Key32.sol +2 -2
  541. package/contracts/type/Key32Set.sol +62 -0
  542. package/contracts/type/NftId.sol +7 -0
  543. package/contracts/type/ObjectType.sol +91 -54
  544. package/contracts/type/PayoutId.sol +10 -10
  545. package/contracts/type/Referral.sol +7 -0
  546. package/contracts/type/RequestIdSet.sol +62 -0
  547. package/contracts/type/RiskId.sol +38 -6
  548. package/contracts/type/RoleId.sol +93 -114
  549. package/contracts/type/Seconds.sol +44 -1
  550. package/contracts/type/Selector.sol +5 -0
  551. package/contracts/type/StateId.sol +15 -1
  552. package/contracts/type/String.sol +42 -0
  553. package/contracts/type/Timestamp.sol +24 -8
  554. package/contracts/type/UFixed.sol +62 -125
  555. package/contracts/type/Version.sol +57 -6
  556. package/contracts/{shared → upgradeability}/IVersionable.sol +3 -0
  557. package/contracts/{shared → upgradeability}/ProxyManager.sol +96 -49
  558. package/contracts/upgradeability/UpgradableProxyWithAdmin.sol +24 -0
  559. package/contracts/{shared → upgradeability}/Versionable.sol +8 -5
  560. package/package.json +9 -6
  561. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.dbg.json +0 -4
  562. package/artifacts/contracts/instance/BundleManager.sol/BundleManager.json +0 -709
  563. package/artifacts/contracts/instance/InstanceAuthorizationsLib.sol/InstanceAuthorizationsLib.dbg.json +0 -4
  564. package/artifacts/contracts/instance/InstanceAuthorizationsLib.sol/InstanceAuthorizationsLib.json +0 -228
  565. package/artifacts/contracts/instance/base/ObjectManager.sol/ObjectManager.dbg.json +0 -4
  566. package/artifacts/contracts/instance/base/ObjectManager.sol/ObjectManager.json +0 -187
  567. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.dbg.json +0 -4
  568. package/artifacts/contracts/instance/module/IAccess.sol/IAccess.json +0 -129
  569. package/artifacts/contracts/product/IProductService.sol/IProductService.dbg.json +0 -4
  570. package/artifacts/contracts/product/IProductService.sol/IProductService.json +0 -400
  571. package/artifacts/contracts/product/ProductService.sol/ProductService.dbg.json +0 -4
  572. package/artifacts/contracts/product/ProductService.sol/ProductService.json +0 -708
  573. package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.dbg.json +0 -4
  574. package/artifacts/contracts/product/ProductServiceManager.sol/ProductServiceManager.json +0 -702
  575. package/artifacts/contracts/registry/IServiceAuthorization.sol/IServiceAuthorization.dbg.json +0 -4
  576. package/artifacts/contracts/registry/IServiceAuthorization.sol/IServiceAuthorization.json +0 -129
  577. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.dbg.json +0 -4
  578. package/artifacts/contracts/registry/ReleaseManager.sol/ReleaseManager.json +0 -1218
  579. package/artifacts/contracts/registry/ServiceAuthorization.sol/ServiceAuthorization.dbg.json +0 -4
  580. package/artifacts/contracts/registry/ServiceAuthorization.sol/ServiceAuthorization.json +0 -171
  581. package/artifacts/contracts/shared/AccessAdmin.sol/AccessAdmin.dbg.json +0 -4
  582. package/artifacts/contracts/shared/AccessAdmin.sol/AccessAdmin.json +0 -1559
  583. package/artifacts/contracts/shared/AccessManagerCustom.sol/AccessManagerCustom.dbg.json +0 -4
  584. package/artifacts/contracts/shared/AccessManagerCustom.sol/AccessManagerCustom.json +0 -1193
  585. package/artifacts/contracts/shared/AccessManagerExtended.sol/AccessManagerExtended.dbg.json +0 -4
  586. package/artifacts/contracts/shared/AccessManagerExtended.sol/AccessManagerExtended.json +0 -1747
  587. package/artifacts/contracts/shared/AccessManagerExtendedInitializeable.sol/AccessManagerExtendedInitializeable.dbg.json +0 -4
  588. package/artifacts/contracts/shared/AccessManagerExtendedInitializeable.sol/AccessManagerExtendedInitializeable.json +0 -1760
  589. package/artifacts/contracts/shared/AccessManagerExtendedWithDisable.sol/AccessManagerExtendedWithDisable.dbg.json +0 -4
  590. package/artifacts/contracts/shared/AccessManagerExtendedWithDisable.sol/AccessManagerExtendedWithDisable.json +0 -1838
  591. package/artifacts/contracts/shared/AccessManagerExtendedWithDisableInitializeable.sol/AccessManagerExtendedWithDisableInitializeable.dbg.json +0 -4
  592. package/artifacts/contracts/shared/AccessManagerExtendedWithDisableInitializeable.sol/AccessManagerExtendedWithDisableInitializeable.json +0 -1856
  593. package/artifacts/contracts/shared/ComponentVerifyingService.sol/ComponentVerifyingService.dbg.json +0 -4
  594. package/artifacts/contracts/shared/ERC165.sol/ERC165.dbg.json +0 -4
  595. package/artifacts/contracts/shared/ERC165.sol/ERC165.json +0 -73
  596. package/artifacts/contracts/shared/IAccessAdmin.sol/IAccessAdmin.dbg.json +0 -4
  597. package/artifacts/contracts/shared/IAccessManagerExtended.sol/IAccessManagerExtended.dbg.json +0 -4
  598. package/artifacts/contracts/shared/IAccessManagerExtended.sol/IAccessManagerExtended.json +0 -1562
  599. package/artifacts/contracts/shared/IAccessManagerExtendedWithDisable.sol/IAccessManagerExtendedWithDisable.dbg.json +0 -4
  600. package/artifacts/contracts/shared/IAccessManagerExtendedWithDisable.sol/IAccessManagerExtendedWithDisable.json +0 -1600
  601. package/artifacts/contracts/shared/IKeyValueStore.sol/IKeyValueStore.dbg.json +0 -4
  602. package/artifacts/contracts/shared/IVersionable.sol/IVersionable.dbg.json +0 -4
  603. package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.dbg.json +0 -4
  604. package/artifacts/contracts/shared/InitializableCustom.sol/InitializableCustom.json +0 -39
  605. package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.dbg.json +0 -4
  606. package/artifacts/contracts/shared/KeyValueStore.sol/KeyValueStore.json +0 -571
  607. package/artifacts/contracts/shared/NftIdSetManager.sol/NftIdSetManager.dbg.json +0 -4
  608. package/artifacts/contracts/shared/NftIdSetManager.sol/NftIdSetManager.json +0 -306
  609. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.dbg.json +0 -4
  610. package/artifacts/contracts/shared/ProxyManager.sol/ProxyManager.json +0 -617
  611. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.dbg.json +0 -4
  612. package/artifacts/contracts/shared/UpgradableProxyWithAdmin.sol/UpgradableProxyWithAdmin.json +0 -129
  613. package/artifacts/contracts/shared/Versionable.sol/Versionable.dbg.json +0 -4
  614. package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.dbg.json +0 -4
  615. package/artifacts/contracts/staking/StakeManagerLib.sol/StakeManagerLib.json +0 -460
  616. package/artifacts/contracts/type/UFixed.sol/MathLib.dbg.json +0 -4
  617. package/artifacts/contracts/type/UFixed.sol/MathLib.json +0 -10
  618. package/contracts/instance/BundleManager.sol +0 -126
  619. package/contracts/instance/InstanceAuthorizationsLib.sol +0 -377
  620. package/contracts/instance/base/ObjectManager.sol +0 -80
  621. package/contracts/instance/module/IAccess.sol +0 -46
  622. package/contracts/product/IProductService.sol +0 -33
  623. package/contracts/product/ProductService.sol +0 -124
  624. package/contracts/product/ProductServiceManager.sol +0 -42
  625. package/contracts/registry/IServiceAuthorization.sol +0 -35
  626. package/contracts/registry/ReleaseManager.sol +0 -527
  627. package/contracts/registry/ServiceAuthorization.sol +0 -86
  628. package/contracts/shared/AccessAdmin.sol +0 -759
  629. package/contracts/shared/AccessManagerCustom.sol +0 -741
  630. package/contracts/shared/AccessManagerExtended.sol +0 -481
  631. package/contracts/shared/AccessManagerExtendedInitializeable.sol +0 -13
  632. package/contracts/shared/AccessManagerExtendedWithDisable.sol +0 -137
  633. package/contracts/shared/AccessManagerExtendedWithDisableInitializeable.sol +0 -14
  634. package/contracts/shared/ComponentVerifyingService.sol +0 -117
  635. package/contracts/shared/IAccessAdmin.sol +0 -168
  636. package/contracts/shared/IAccessManagerExtended.sol +0 -74
  637. package/contracts/shared/IAccessManagerExtendedWithDisable.sol +0 -18
  638. package/contracts/shared/IKeyValueStore.sol +0 -53
  639. package/contracts/shared/InitializableCustom.sol +0 -177
  640. package/contracts/shared/KeyValueStore.sol +0 -127
  641. package/contracts/shared/UpgradableProxyWithAdmin.sol +0 -16
  642. package/contracts/staking/StakeManagerLib.sol +0 -231
@@ -2,148 +2,479 @@
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
83
  // set final authority
89
84
  setAuthority(registry.getAuthority());
90
85
 
91
86
  // set internal variables
92
- _registry = registry; //TODO if keeps registry -> RegistryLinked and checks registry address
87
+ _registry = registry;
93
88
  _reader = reader;
94
- _targetManager = new NftIdSetManager();
89
+ _targetNftIdSet = new NftIdSet();
95
90
 
91
+ _createInitialSetup();
96
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
97
113
  _createTarget(
98
114
  NftIdLib.toNftId(1101),
99
- IStaking.TargetInfo({
100
- objectType: PROTOCOL(),
101
- chainId: 1,
102
- lockingPeriod: TargetManagerLib.getDefaultLockingPeriod(),
103
- rewardRate: TargetManagerLib.getDefaultRewardRate()}));
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);
104
265
  }
105
266
 
267
+ /// @dev Returns the support info for the specified target type.
268
+ function getSupportInfo(ObjectType targetType)
269
+ external
270
+ view
271
+ returns (IStaking.SupportInfo memory supportInfo)
272
+ {
273
+ return _supportInfo[targetType];
274
+ }
275
+
276
+ //--- token management --------------------------------------------------//
277
+
278
+ /// @dev Registers a token for tvl management.
279
+ function addToken(
280
+ ChainId chainId,
281
+ address token
282
+ )
283
+ external
284
+ restricted() // token registry via staking
285
+ {
286
+ // checks
287
+ IStaking.TokenInfo storage info = _tokenInfo[chainId][token];
288
+
289
+ // check token is not yet registered
290
+ if (info.lastUpdateIn.gtz()) {
291
+ revert ErrorStakingStoreTokenAlreadyAdded(chainId, token);
292
+ }
293
+
294
+ info.stakingRate = UFixedLib.zero();
295
+ info.lastUpdateIn = BlocknumberLib.current();
296
+
297
+ // logging
298
+ emit IStaking.LogStakingTokenAdded(chainId, token);
299
+ }
106
300
 
107
- //--- staking rate specific functions -----------------------------------//
108
301
 
302
+ /// @dev Sets the staking rate for the token.
109
303
  function setStakingRate(
110
- uint256 chainId,
304
+ ChainId chainId,
111
305
  address token,
112
306
  UFixed stakingRate
113
307
  )
114
308
  external
115
- restricted()
309
+ restricted() // staking
310
+ returns (
311
+ UFixed oldStakingRate,
312
+ Blocknumber lastUpdatedIn
313
+ )
116
314
  {
117
- _stakingRate[chainId][token] = stakingRate;
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();
118
327
  }
119
328
 
120
- //--- target specific functions -----------------------------------------//
329
+ //--- target management -------------------------------------------------//
121
330
 
122
331
  function createTarget(
123
332
  NftId targetNftId,
124
- IStaking.TargetInfo memory targetInfo
333
+ ObjectType objectType,
334
+ Seconds lockingPeriod,
335
+ UFixed rewardRate
125
336
  )
126
337
  external
127
- restricted()
338
+ restricted() // staking
128
339
  {
129
- _createTarget(targetNftId, targetInfo);
340
+ _createTarget(targetNftId, objectType, lockingPeriod, rewardRate, true);
341
+ }
342
+
343
+
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);
130
366
  }
131
367
 
132
368
 
133
- function updateTarget(
369
+ function setRewardRate(
370
+ NftId targetNftId,
371
+ UFixed rewardRate
372
+ )
373
+ external
374
+ restricted() // staking
375
+ {
376
+ // checks
377
+ (
378
+ IStaking.TargetInfo storage targetInfo,
379
+ Blocknumber lastUpdateIn
380
+ ) = _verifyAndUpdateTarget(targetNftId);
381
+
382
+ TargetManagerLib.checkRewardRate(_reader, targetNftId, targetInfo.objectType, rewardRate);
383
+
384
+ // effects
385
+ UFixed oldRewardRate = targetInfo.rewardRate;
386
+ targetInfo.rewardRate = rewardRate;
387
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
388
+
389
+ // logging
390
+ emit IStaking.LogStakingTargetRewardRateSet(targetNftId, rewardRate, oldRewardRate, lastUpdateIn);
391
+ }
392
+
393
+
394
+ // TODO refactor to set limits functionality
395
+ function setMaxStakedAmount(
396
+ NftId targetNftId,
397
+ Amount stakeLimitAmount
398
+ )
399
+ external
400
+ restricted() // staking
401
+ returns (
402
+ Amount oldLimitAmount,
403
+ Blocknumber lastUpdatedIn
404
+ )
405
+ {
406
+ IStaking.TargetInfo storage targetInfo;
407
+ (targetInfo, lastUpdatedIn) = _verifyAndUpdateTarget(targetNftId);
408
+
409
+ oldLimitAmount = targetInfo.limitAmount;
410
+ targetInfo.limitAmount = stakeLimitAmount;
411
+
412
+ emit IStaking.LogStakingTargetMaxStakedAmountSet(targetNftId, stakeLimitAmount, lastUpdatedIn);
413
+
414
+ }
415
+
416
+
417
+ function setTargetLimits(
134
418
  NftId targetNftId,
135
- IStaking.TargetInfo memory targetInfo
419
+ Amount marginAmount,
420
+ Amount hardLimitAmount
136
421
  )
137
422
  external
423
+ virtual
138
424
  restricted()
139
425
  {
140
- _update(
141
- targetNftId.toKey32(TARGET()),
142
- abi.encode(targetInfo), KEEP_STATE());
426
+ // checks
427
+ IStaking.LimitInfo storage limitInfo = _getAndVerifyLimit(targetNftId);
428
+ Blocknumber lastUpdateIn = limitInfo.lastUpdateIn;
429
+
430
+ // effects
431
+ limitInfo.marginAmount = marginAmount;
432
+ limitInfo.hardLimitAmount = hardLimitAmount;
433
+ limitInfo.lastUpdateIn = BlocknumberLib.current();
434
+
435
+ // logging
436
+ emit IStaking.LogStakingTargetLimitsUpdated(
437
+ targetNftId,
438
+ marginAmount,
439
+ hardLimitAmount,
440
+ lastUpdateIn);
143
441
  }
144
442
 
145
443
 
146
- function increaseReserves(
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(
147
478
  NftId targetNftId,
148
479
  Amount dipAmount
149
480
  )
@@ -151,14 +482,26 @@ contract StakingStore is
151
482
  restricted()
152
483
  returns (Amount newReserveBalance)
153
484
  {
154
- newReserveBalance = _reserveBalance[targetNftId] + dipAmount;
155
- Blocknumber lastUpdatedIn = _updateReserves(targetNftId, newReserveBalance);
485
+ // checks
486
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
487
+ Blocknumber lastUpdateIn = targetInfo.lastUpdateIn;
488
+
489
+ // effects
490
+ targetInfo.reserveAmount = targetInfo.reserveAmount + dipAmount;
491
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
156
492
 
157
- emit LogStakingStoreReserveBalanceIncreased(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);
158
501
  }
159
502
 
160
503
 
161
- function decreaseReserves(
504
+ function withdrawRewardReserves(
162
505
  NftId targetNftId,
163
506
  Amount dipAmount
164
507
  )
@@ -166,18 +509,20 @@ contract StakingStore is
166
509
  restricted()
167
510
  returns (Amount newReserveBalance)
168
511
  {
169
- Amount reserveAmount = _reserveBalance[targetNftId];
170
- if (dipAmount > reserveAmount) {
171
- revert ErrorStakingStoreRewardReservesInsufficient(
172
- targetNftId,
173
- dipAmount,
174
- reserveAmount);
175
- }
512
+ // checks
513
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
176
514
 
177
- newReserveBalance = _reserveBalance[targetNftId] - dipAmount;
178
- Blocknumber lastUpdatedIn = _updateReserves(targetNftId, newReserveBalance);
515
+ // effects
516
+ Blocknumber lastUpdateIn = _decreaseReserves(targetNftId, targetInfo, dipAmount);
179
517
 
180
- emit LogStakingStoreReserveBalanceDecreased(targetNftId, dipAmount, newReserveBalance, lastUpdatedIn);
518
+ // logging
519
+ newReserveBalance = targetInfo.reserveAmount;
520
+ emit IStaking.LogStakingRewardReservesWithdrawn(
521
+ targetNftId,
522
+ dipAmount,
523
+ _registry.ownerOf(targetNftId),
524
+ newReserveBalance,
525
+ lastUpdateIn);
181
526
  }
182
527
 
183
528
 
@@ -185,7 +530,6 @@ contract StakingStore is
185
530
 
186
531
  function increaseTotalValueLocked(
187
532
  NftId targetNftId,
188
- UFixed stakingRate,
189
533
  address token,
190
534
  Amount amount
191
535
  )
@@ -193,32 +537,24 @@ contract StakingStore is
193
537
  restricted()
194
538
  returns (Amount newBalance)
195
539
  {
196
- (
197
- Blocknumber tvlLastUpdatedIn,
198
- Amount oldBalance,
199
- Amount oldDipBalance
200
- ) = _getAndVerifyTvl(targetNftId, token);
201
-
202
- newBalance = oldBalance + amount;
203
- Amount newDipBalance = newBalance.multiplyWith(stakingRate);
204
-
205
- // update new tvl balances
206
- _tvlBalance[targetNftId][token] = newBalance;
207
- _tvlInDip[targetNftId][token] = newDipBalance;
208
-
209
- // update new amount of required dip
210
- _tvlRequiredDip[targetNftId] = _tvlRequiredDip[targetNftId] - oldDipBalance + newDipBalance;
211
-
212
- // update last updated in
213
- _tvlLastUpdatedIn[targetNftId] = BlocknumberLib.currentBlocknumber();
214
-
215
- 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);
216
553
  }
217
554
 
218
555
 
219
556
  function decreaseTotalValueLocked(
220
557
  NftId targetNftId,
221
- UFixed stakingRate,
222
558
  address token,
223
559
  Amount amount
224
560
  )
@@ -226,388 +562,807 @@ contract StakingStore is
226
562
  restricted()
227
563
  returns (Amount newBalance)
228
564
  {
229
- (
230
- Blocknumber tvlLastUpdatedIn,
231
- Amount oldBalance,
232
- Amount oldDipBalance
233
- ) = _getAndVerifyTvl(targetNftId, token);
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
+ }
234
579
 
235
- newBalance = oldBalance - amount;
236
- Amount newDipBalance = AmountLib.toAmount((
237
- stakingRate * newBalance.toUFixed()).toInt());
238
580
 
239
- // update new tvl balances
240
- _tvlBalance[targetNftId][token] = newBalance;
241
- _tvlInDip[targetNftId][token] = newDipBalance;
581
+ function updateTargetLimit(NftId targetNftId)
582
+ external
583
+ restricted()
584
+ returns (Amount stakeLimitAmount)
585
+ {
586
+ return _updateTargetLimit(targetNftId);
587
+ }
242
588
 
243
- // update new amount of required dip
244
- _tvlRequiredDip[targetNftId] = _tvlRequiredDip[targetNftId] - oldDipBalance + newDipBalance;
245
589
 
246
- // update last updated in
247
- _tvlLastUpdatedIn[targetNftId] = BlocknumberLib.currentBlocknumber();
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
+ }
616
+ }
248
617
 
249
- emit LogStakingStoreTotalValueLockedDecreased(targetNftId, token, amount, newBalance, tvlLastUpdatedIn);
618
+
619
+ function _updateTargetLimit(NftId targetNftId)
620
+ internal
621
+ returns (Amount limitAmount)
622
+ {
623
+ // checks
624
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
625
+ IStaking.LimitInfo storage limitInfo = _getAndVerifyLimit(targetNftId);
626
+ Blocknumber lastUpdateIn = limitInfo.lastUpdateIn;
627
+
628
+ // calculate max stake amount
629
+ Amount requiredStakeAmount = getRequiredStakeBalance(targetNftId, false);
630
+ // limitAmount = AmountLib.min(
631
+ // targetInfo.limitAmount,
632
+ // requiredStakeAmount + limitInfo.marginAmount);
633
+
634
+ // add margin to required stakes
635
+ limitAmount = requiredStakeAmount + limitInfo.marginAmount;
636
+ // cap at hard limit
637
+ limitAmount = AmountLib.min(limitAmount, limitInfo.hardLimitAmount);
638
+
639
+ // effects
640
+ targetInfo.limitAmount = limitAmount;
641
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
642
+
643
+ // logging
644
+ emit IStaking.LogStakingTargetLimitUpdated(
645
+ targetNftId,
646
+ targetInfo.limitAmount,
647
+ limitInfo.hardLimitAmount,
648
+ requiredStakeAmount,
649
+ targetInfo.stakedAmount,
650
+ lastUpdateIn);
250
651
  }
251
652
 
252
653
  //--- stake specific functions -------------------------------------//
253
654
 
254
- function create(
655
+ function createStake(
255
656
  NftId stakeNftId,
256
- IStaking.StakeInfo memory stakeInfo
657
+ NftId targetNftId,
658
+ address stakeOwner,
659
+ Amount stakeAmount
257
660
  )
258
661
  external
259
662
  restricted()
663
+ returns (Timestamp lockedUntil)
260
664
  {
261
- _create(
262
- stakeNftId.toKey32(STAKE()),
263
- abi.encode(stakeInfo));
665
+ // checks
666
+ IStaking.StakeInfo storage stakeInfo = _stakeInfo[stakeNftId];
667
+ if (stakeInfo.lastUpdateIn.gtz()) {
668
+ revert ErrorStakingStoreStakeBalanceAlreadyInitialized(stakeNftId);
669
+ }
670
+
671
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(targetNftId);
672
+ _checkMaxStakedAmount(targetNftId, targetInfo, stakeAmount);
673
+
674
+ // effects
675
+ stakeInfo.targetNftId = targetNftId;
676
+ stakeInfo.stakedAmount = AmountLib.zero();
677
+ stakeInfo.rewardAmount = AmountLib.zero();
678
+ stakeInfo.lockedUntil = TimestampLib.current();
679
+ _setStakeLastUpdatesToCurrent(stakeInfo);
680
+
681
+ // logging for creation of empty stake
682
+ emit IStaking.LogStakingStakeCreated(stakeNftId, stakeInfo.targetNftId, stakeInfo.stakedAmount, stakeInfo.lockedUntil, stakeOwner);
264
683
 
265
- _createStakeBalance(stakeNftId);
684
+ // process stake amount
685
+ _stake(stakeNftId, stakeInfo, targetInfo, targetInfo.lockingPeriod, stakeAmount);
686
+
687
+ return stakeInfo.lockedUntil;
266
688
  }
267
689
 
268
- function update(
269
- NftId stakeNftId,
270
- IStaking.StakeInfo memory stakeInfo
690
+
691
+ function stake(
692
+ NftId stakeNftId,
693
+ bool updateRewards,
694
+ bool restakeRewards,
695
+ Seconds additionalLockingPeriod,
696
+ Amount stakeAmount
271
697
  )
272
698
  external
273
699
  restricted()
274
700
  {
275
- _update(
276
- stakeNftId.toKey32(STAKE()),
277
- abi.encode(stakeInfo),
278
- KEEP_STATE());
279
- }
701
+ // checks
702
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
703
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
280
704
 
281
- //--- general functions --------------------------------------------//
705
+ if (updateRewards) {
706
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
707
+ }
282
708
 
709
+ if (restakeRewards) {
710
+ _restakeRewards(stakeNftId, stakeInfo, targetInfo);
711
+ }
283
712
 
284
- function increaseStake(
285
- NftId nftId,
286
- NftId targetNftId,
287
- Amount amount
713
+ _stake(stakeNftId, stakeInfo, targetInfo, additionalLockingPeriod, stakeAmount);
714
+ }
715
+
716
+
717
+ function unstake(
718
+ NftId stakeNftId,
719
+ bool updateRewards,
720
+ bool restakeRewards,
721
+ Amount maxUnstakeAmount
288
722
  )
289
723
  external
290
724
  restricted()
725
+ returns (Amount unstakedAmount)
291
726
  {
292
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
727
+ // checks
728
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
729
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
293
730
 
294
- _updateStakeBalance(
295
- nftId,
296
- _stakeBalance[nftId] + amount, // new stake balance
297
- _rewardBalance[nftId]); // unchanged reward balance
731
+ if (updateRewards) {
732
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
733
+ }
298
734
 
299
- _updateTargetBalance(
300
- targetNftId,
301
- _stakeBalance[targetNftId] + amount,
302
- _rewardBalance[targetNftId]);
735
+ if (restakeRewards) {
736
+ _restakeRewards(stakeNftId, stakeInfo, targetInfo);
737
+ }
303
738
 
304
- emit LogStakingStoreStakesIncreased(nftId, amount, _stakeBalance[nftId], lastUpdatedIn);
739
+ return _unstake(stakeNftId, stakeInfo, targetInfo, maxUnstakeAmount);
305
740
  }
306
741
 
307
742
 
308
- function restakeRewards(
309
- NftId nftId,
310
- NftId targetNftId,
311
- Amount rewardIncrementAmount
312
- )
743
+ function updateRewards(NftId stakeNftId)
313
744
  external
314
745
  restricted()
315
746
  {
316
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
317
- Amount stakeAmount = _stakeBalance[nftId];
318
- Amount rewardAmount = _rewardBalance[nftId];
319
-
320
- // move all rewards to stake balance
321
- _updateStakeBalance(
322
- nftId,
323
- stakeAmount + rewardAmount + rewardIncrementAmount, // new stake balance
324
- AmountLib.zero()); // new reward balance
325
-
326
- _updateTargetBalance(
327
- targetNftId,
328
- _stakeBalance[targetNftId] + rewardAmount + rewardIncrementAmount,
329
- _rewardBalance[targetNftId] - rewardAmount);
330
-
331
- emit LogStakingStoreRewardsRestaked(nftId, stakeAmount, rewardAmount, rewardIncrementAmount, _stakeBalance[nftId], lastUpdatedIn);
747
+ // checks
748
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
749
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
750
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
332
751
  }
333
752
 
334
753
 
335
- function updateRewards(
336
- NftId nftId,
337
- NftId targetNftId,
338
- Amount rewardIncrementAmount
754
+ function restakeRewards(
755
+ NftId stakeNftId,
756
+ bool updateRewards
339
757
  )
340
758
  external
341
759
  restricted()
342
760
  {
343
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
344
-
345
- // increse rewards by increment
346
- _updateStakeBalance(
347
- nftId,
348
- _stakeBalance[nftId], // unchanged stake balance
349
- _rewardBalance[nftId] + rewardIncrementAmount); // new reward balance
761
+ // checks
762
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
763
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
350
764
 
351
- _updateTargetBalance(
352
- targetNftId,
353
- _stakeBalance[targetNftId],
354
- _rewardBalance[targetNftId] + rewardIncrementAmount);
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
366
779
  restricted()
367
780
  returns (Amount claimedAmount)
368
781
  {
369
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
782
+ // checks
783
+ IStaking.StakeInfo storage stakeInfo = _getAndVerifyStake(stakeNftId);
784
+ IStaking.TargetInfo storage targetInfo = _getAndVerifyTarget(stakeInfo.targetNftId);
370
785
 
371
- // determine the claimable rewards amount
372
- claimedAmount = AmountLib.min(maxClaimAmount, _rewardBalance[nftId]);
786
+ if (updateRewards) {
787
+ _updateRewards(stakeNftId, stakeInfo, targetInfo);
788
+ }
373
789
 
374
- // decrease rewards by claimed amount
375
- _updateStakeBalance(
376
- nftId,
377
- _stakeBalance[nftId], // unchanged stake balance
378
- _rewardBalance[nftId] - claimedAmount); // new reward balance
790
+ claimedAmount = _claimRewards(stakeNftId, stakeInfo, targetInfo, maxClaimAmount);
791
+ }
379
792
 
380
- _updateTargetBalance(
381
- targetNftId,
382
- _stakeBalance[targetNftId],
383
- _rewardBalance[targetNftId] - claimedAmount);
793
+ //--- view functions -----------------------------------------------//
384
794
 
385
- emit LogStakingStoreRewardsDecreased(nftId, claimedAmount, _rewardBalance[nftId], lastUpdatedIn);
795
+ function getStakingReader() external view returns (StakingReader stakingReader){
796
+ return _reader;
386
797
  }
387
798
 
799
+ function getTargetManager() external view returns (ITargetLimitHandler targetLimitHandler ){
800
+ return _targetLimitHandler;
801
+ }
388
802
 
389
- function unstakeUpTo(
390
- NftId nftId,
391
- NftId targetNftId,
392
- Amount maxUnstakeAmount,
393
- Amount maxClaimAmount
803
+
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
394
812
  )
395
- external
396
- restricted()
397
- returns (
398
- Amount unstakedAmount,
399
- Amount claimedAmount
400
- )
813
+ public
814
+ view
815
+ returns (Amount requiredStakeAmount)
401
816
  {
402
- Blocknumber lastUpdatedIn = _checkBalanceExists(nftId);
817
+ address [] memory tokens = _targetToken[targetNftId];
818
+ if (tokens.length == 0) {
819
+ return AmountLib.zero();
820
+ }
403
821
 
404
- // determine amounts
405
- unstakedAmount = AmountLib.min(maxUnstakeAmount, _stakeBalance[nftId]);
406
- 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;
407
828
 
408
- // decrease stakes and rewards as determined
409
- _updateStakeBalance(
410
- nftId,
411
- _stakeBalance[nftId] - unstakedAmount, // unchanged stake balance
412
- _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; }
413
833
 
414
- _updateTargetBalance(
415
- targetNftId,
416
- _stakeBalance[targetNftId] - unstakedAmount,
417
- _rewardBalance[targetNftId] - claimedAmount);
834
+ stakingRate = _tokenInfo[targetChainId][token].stakingRate;
835
+ if (stakingRate.eqz()) { continue; }
836
+
837
+ requiredStakeAmount = requiredStakeAmount + tvlAmount.multiplyWith(stakingRate);
838
+ }
418
839
 
419
- emit LogStakingStoreStakesDecreased(nftId, unstakedAmount, _stakeBalance[nftId], lastUpdatedIn);
420
- emit LogStakingStoreRewardsDecreased(nftId, claimedAmount, _rewardBalance[nftId], lastUpdatedIn);
840
+ // update required amount based on target type
841
+ if (includeTargetTypeRequirements) {
842
+ ObjectType targetType = _targetInfo[targetNftId].objectType;
843
+ IStaking.SupportInfo storage supportInfo = _supportInfo[targetType];
844
+
845
+ if (requiredStakeAmount < supportInfo.minStakingAmount) {
846
+ requiredStakeAmount = supportInfo.minStakingAmount;
847
+ } else if (requiredStakeAmount > supportInfo.maxStakingAmount) {
848
+ requiredStakeAmount = supportInfo.maxStakingAmount;
849
+ }
850
+ }
421
851
  }
422
852
 
423
- //--- view functions -----------------------------------------------//
424
853
 
425
- function getStakingReader() external view returns (StakingReader stakingReader){
426
- 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();
427
857
  }
428
858
 
429
- function getTargetManager() external view returns (NftIdSetManager targetManager){
430
- 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];
431
863
  }
432
864
 
433
- function getStakingRate(uint256 chainId, address token) external view returns (UFixed stakingRate) { return _stakingRate[chainId][token]; }
434
865
 
435
- 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
+ }
436
870
 
437
- function getTotalValueLocked(NftId nftId, address token) external view returns (Amount tvlBalanceAmount) { return _tvlBalance[nftId][token]; }
438
- function getRequiredStakeBalance(NftId nftId) external view returns (Amount requiredAmount) { return _tvlRequiredDip[nftId]; }
439
871
 
440
- function getReserveBalance(NftId nftId) external view returns (Amount balanceAmount) { return _reserveBalance[nftId]; }
441
- function getStakeBalance(NftId nftId) external view returns (Amount balanceAmount) { return _stakeBalance[nftId]; }
442
- function getRewardBalance(NftId nftId) external view returns (Amount rewardAmount) { return _rewardBalance[nftId]; }
443
- function getBalanceUpdatedAt(NftId nftId) external view returns (Timestamp updatedAt) { return _lastUpdatedAt[nftId]; }
444
- 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
+ }
445
876
 
446
877
 
447
- function getTargetBalances(NftId nftId)
448
- external
449
- view
450
- returns (
451
- Amount stakeBalance,
452
- Amount rewardBalance,
453
- Amount reserveBalance,
454
- Blocknumber lastUpdatedIn
455
- )
456
- {
457
- stakeBalance = _stakeBalance[nftId];
458
- rewardBalance = _rewardBalance[nftId];
459
- reserveBalance = _reserveBalance[nftId];
460
- lastUpdatedIn = _lastUpdatedIn[nftId];
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];
461
881
  }
462
882
 
463
883
 
464
- function getStakeBalances(NftId nftId)
465
- external
466
- view
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
467
908
  returns (
468
- Amount stakeBalance,
469
- Amount rewardBalance,
470
- Timestamp lastUpdatedAt
909
+ IStaking.TargetInfo storage targetInfo,
910
+ Blocknumber lastUpdatedIn
471
911
  )
472
912
  {
473
- stakeBalance = _stakeBalance[nftId];
474
- rewardBalance = _rewardBalance[nftId];
475
- lastUpdatedAt = _lastUpdatedAt[nftId];
913
+ // checks
914
+ targetInfo = _getAndVerifyTarget(targetNftId);
915
+ lastUpdatedIn = targetInfo.lastUpdateIn;
916
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
476
917
  }
477
918
 
478
- //--- private functions -------------------------------------------//
479
919
 
480
920
  function _createTarget(
481
921
  NftId targetNftId,
482
- IStaking.TargetInfo memory targetInfo
922
+ ObjectType objectType,
923
+ Seconds lockingPeriod,
924
+ UFixed rewardRate,
925
+ bool checkParameters
483
926
  )
484
927
  private
485
928
  {
486
- _create(
487
- targetNftId.toKey32(TARGET()),
488
- abi.encode(targetInfo));
929
+ // checks
930
+ if (checkParameters) {
931
+ TargetManagerLib.checkTargetParameters(
932
+ _registry,
933
+ _reader,
934
+ targetNftId,
935
+ objectType,
936
+ lockingPeriod,
937
+ rewardRate);
938
+ }
489
939
 
490
- // initialize tvl and stake balance
491
- _tvlLastUpdatedIn[targetNftId]= BlocknumberLib.currentBlocknumber();
492
- _createTargetBalance(targetNftId);
940
+ // effects
941
+
942
+ // target info
943
+ IStaking.TargetInfo storage targetInfo = _targetInfo[targetNftId];
944
+ targetInfo.stakedAmount = AmountLib.zero();
945
+ targetInfo.rewardAmount = AmountLib.zero();
946
+ targetInfo.reserveAmount = AmountLib.zero();
947
+ targetInfo.limitAmount = AmountLib.max();
948
+
949
+ targetInfo.objectType = objectType;
950
+ targetInfo.lockingPeriod = lockingPeriod;
951
+ targetInfo.rewardRate = rewardRate;
952
+ targetInfo.chainId = ChainIdLib.fromNftId(targetNftId);
953
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
954
+
955
+ // create limit info
956
+ _setLimits(
957
+ _limitInfo[targetNftId],
958
+ targetNftId,
959
+ AmountLib.toAmount(AmountLib.max().toInt() / 2), // margin limit
960
+ AmountLib.max()); // hard limit
961
+
962
+ // add new target to target set
963
+ _targetNftIdSet.add(targetNftId);
964
+
965
+ // logging
966
+ emit IStaking.LogStakingTargetCreated(targetNftId, objectType, lockingPeriod, rewardRate);
967
+ }
493
968
 
494
- _targetManager.add(targetNftId);
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);
495
986
  }
496
987
 
497
- function _updateReserves(
988
+
989
+ function _spendRewardReserves(
498
990
  NftId targetNftId,
499
- Amount newRewardBalance
991
+ IStaking.TargetInfo storage targetInfo,
992
+ Amount dipAmount
500
993
  )
501
994
  private
502
- returns (Blocknumber lastUpdatedIn)
503
995
  {
504
- if (_lastUpdatedIn[targetNftId].eqz()) {
505
- revert ErrorStakingStoreNotTarget(targetNftId);
506
- }
507
-
508
- lastUpdatedIn = _lastUpdatedIn[targetNftId];
996
+ Blocknumber lastUpdateIn = _decreaseReserves(targetNftId, targetInfo, dipAmount);
509
997
 
510
- _reserveBalance[targetNftId] = newRewardBalance;
511
- _lastUpdatedIn[targetNftId] = BlocknumberLib.currentBlocknumber();
998
+ // logging
999
+ emit IStaking.LogStakingRewardReservesSpent(
1000
+ targetNftId,
1001
+ dipAmount,
1002
+ targetInfo.reserveAmount,
1003
+ lastUpdateIn);
512
1004
  }
513
1005
 
514
1006
 
515
- function _createTargetBalance(NftId nftId)
1007
+ function _decreaseReserves(
1008
+ NftId targetNftId,
1009
+ IStaking.TargetInfo storage targetInfo,
1010
+ Amount dipAmount
1011
+ )
516
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);
1023
+ }
1024
+
1025
+ // effects
1026
+ targetInfo.reserveAmount = targetInfo.reserveAmount - dipAmount;
1027
+ targetInfo.lastUpdateIn = BlocknumberLib.current();
1028
+ }
1029
+
1030
+
1031
+ function _updateRewards(
1032
+ NftId stakeNftId,
1033
+ IStaking.StakeInfo storage stakeInfo,
1034
+ IStaking.TargetInfo storage targetInfo
1035
+ )
1036
+ internal
1037
+ returns (Amount rewardIncreaseAmount)
517
1038
  {
518
- if (_lastUpdatedIn[nftId].gtz()) {
519
- revert ErrorStakingStoreBalanceAlreadyInitialized(nftId);
1039
+ // return if reward rate is zero
1040
+ if (targetInfo.rewardRate.eqz()) {
1041
+ return rewardIncreaseAmount;
520
1042
  }
521
1043
 
522
- // set target balances to 0
523
- _stakeBalance[nftId] = AmountLib.zero();
524
- _rewardBalance[nftId] = AmountLib.zero();
525
- _reserveBalance[nftId] = AmountLib.zero();
1044
+ // get seconds since last update on stake
1045
+ Seconds duration = SecondsLib.toSeconds(
1046
+ block.timestamp - stakeInfo.lastUpdateAt.toInt());
526
1047
 
527
- // set last updated in to current block number
528
- // we don't need last updated at timestamp for targets
529
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
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);
530
1072
  }
531
1073
 
532
1074
 
533
- function _createStakeBalance(NftId nftId)
534
- private
1075
+ function _restakeRewards(
1076
+ NftId stakeNftId,
1077
+ IStaking.StakeInfo storage stakeInfo,
1078
+ IStaking.TargetInfo storage targetInfo
1079
+ )
1080
+ internal
1081
+ returns (Amount restakeAmount)
535
1082
  {
536
- if (_lastUpdatedIn[nftId].gtz()) {
537
- revert ErrorStakingStoreBalanceAlreadyInitialized(nftId);
1083
+ restakeAmount = stakeInfo.rewardAmount;
1084
+
1085
+ // return if reward amount is zero
1086
+ if (restakeAmount.eqz()) {
1087
+ return restakeAmount;
538
1088
  }
539
1089
 
540
- // set stake balances to 0
541
- _stakeBalance[nftId] = AmountLib.zero();
542
- _rewardBalance[nftId] = AmountLib.zero();
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);
1111
+ }
1112
+
543
1113
 
544
- // set last updated at/in to current timestamp/block number
545
- _lastUpdatedAt[nftId] = TimestampLib.blockTimestamp();
546
- _lastUpdatedIn[nftId] = BlocknumberLib.currentBlocknumber();
1114
+ function _stake(
1115
+ NftId stakeNftId,
1116
+ IStaking.StakeInfo storage stakeInfo,
1117
+ IStaking.TargetInfo storage targetInfo,
1118
+ Seconds maxAdditionalLockingPeriod,
1119
+ Amount stakeAmount
1120
+ )
1121
+ internal
1122
+ {
1123
+ // return if reward amount is zero
1124
+ if (stakeAmount.eqz()) {
1125
+ return;
1126
+ }
1127
+
1128
+ // check restaking amount does not exceed target max staked amount
1129
+ _checkMaxStakedAmount(stakeInfo.targetNftId, targetInfo, stakeAmount);
1130
+
1131
+ // update target + stake
1132
+ targetInfo.stakedAmount = targetInfo.stakedAmount + stakeAmount;
1133
+ stakeInfo.stakedAmount = stakeInfo.stakedAmount + stakeAmount;
1134
+
1135
+ // increase locked until if applicable
1136
+ Seconds additionalLockingPeriod = SecondsLib.min(maxAdditionalLockingPeriod, targetInfo.lockingPeriod);
1137
+ if (stakeAmount.gtz() && additionalLockingPeriod.gtz()) {
1138
+ stakeInfo.lockedUntil = stakeInfo.lockedUntil.addSeconds(additionalLockingPeriod);
1139
+ }
1140
+
1141
+ Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
1142
+
1143
+ // logging
1144
+ emit IStaking.LogStakingStaked(
1145
+ stakeNftId,
1146
+ stakeAmount,
1147
+ stakeInfo.stakedAmount,
1148
+ stakeInfo.rewardAmount,
1149
+ stakeInfo.lockedUntil,
1150
+ lastUpdateIn);
547
1151
  }
548
1152
 
549
1153
 
550
- function _updateStakeBalance(
1154
+ function _claimRewards(
551
1155
  NftId stakeNftId,
552
- Amount newStakeAmount,
553
- Amount newRewardAmount
1156
+ IStaking.StakeInfo storage stakeInfo,
1157
+ IStaking.TargetInfo storage targetInfo,
1158
+ Amount maxClaimAmount
554
1159
  )
555
- private
1160
+ internal
1161
+ returns (Amount claimAmount)
1162
+ {
1163
+ claimAmount = AmountLib.min(maxClaimAmount, stakeInfo.rewardAmount);
1164
+
1165
+ // return if no rewards to claim
1166
+ if (claimAmount.eqz()) {
1167
+ return claimAmount;
1168
+ }
1169
+
1170
+ // effects
1171
+ // use up reserves for claimed rewards
1172
+ _spendRewardReserves(stakeInfo.targetNftId, targetInfo, claimAmount);
1173
+
1174
+ // update target + stake
1175
+ targetInfo.rewardAmount = targetInfo.rewardAmount - claimAmount;
1176
+ stakeInfo.rewardAmount = stakeInfo.rewardAmount - claimAmount;
1177
+ Blocknumber lastUpdateIn = _setLastUpdatesToCurrent(stakeInfo, targetInfo);
1178
+
1179
+ // logging
1180
+ emit IStaking.LogStakingRewardsClaimed(
1181
+ stakeNftId,
1182
+ claimAmount,
1183
+ stakeInfo.stakedAmount,
1184
+ stakeInfo.rewardAmount,
1185
+ stakeInfo.lockedUntil,
1186
+ lastUpdateIn);
1187
+ }
1188
+
1189
+
1190
+ function _unstake(
1191
+ NftId stakeNftId,
1192
+ IStaking.StakeInfo storage stakeInfo,
1193
+ IStaking.TargetInfo storage targetInfo,
1194
+ Amount maxUnstakeAmount
1195
+ )
1196
+ internal
1197
+ returns (Amount unstakedAmount)
556
1198
  {
557
- _stakeBalance[stakeNftId] = newStakeAmount;
558
- _rewardBalance[stakeNftId] = newRewardAmount;
1199
+ unstakedAmount = AmountLib.min(maxUnstakeAmount, stakeInfo.stakedAmount);
1200
+
1201
+ // return if no stakes to claim
1202
+ if (unstakedAmount.eqz()) {
1203
+ return unstakedAmount;
1204
+ }
559
1205
 
560
- _lastUpdatedAt[stakeNftId] = TimestampLib.blockTimestamp();
561
- _lastUpdatedIn[stakeNftId] = BlocknumberLib.currentBlocknumber();
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);
562
1224
  }
563
1225
 
564
1226
 
565
- function _updateTargetBalance(
566
- NftId targetNftId,
567
- Amount newStakeAmount,
568
- Amount newRewardAmount
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
569
1255
  )
570
1256
  private
1257
+ view
1258
+ returns (
1259
+ IStaking.StakeInfo storage stakeInfo
1260
+ )
571
1261
  {
572
- _stakeBalance[targetNftId] = newStakeAmount;
573
- _rewardBalance[targetNftId] = newRewardAmount;
1262
+ stakeInfo = _stakeInfo[stakeNftId];
1263
+ if (stakeInfo.lastUpdateIn.eqz()) {
1264
+ revert ErrorStakingStoreStakeNotInitialized(stakeNftId);
1265
+ }
1266
+ }
1267
+
574
1268
 
575
- // for targets we don't need the timestamp, just the blocknumber
576
- _lastUpdatedIn[targetNftId] = BlocknumberLib.currentBlocknumber();
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
577
1284
  }
578
1285
 
579
- function _checkBalanceExists(NftId nftId)
1286
+
1287
+ function _getAndVerifyTarget(
1288
+ NftId targetNftId
1289
+ )
580
1290
  private
581
1291
  view
582
- returns (Blocknumber lastUpdatedIn)
1292
+ returns (
1293
+ IStaking.TargetInfo storage targetInfo
1294
+ )
583
1295
  {
584
- lastUpdatedIn = _lastUpdatedIn[nftId];
1296
+ targetInfo = _targetInfo[targetNftId];
585
1297
 
586
- if (lastUpdatedIn.eqz()) {
587
- revert ErrorStakingStoreBalanceNotInitialized(nftId);
1298
+ if (targetInfo.lastUpdateIn.eqz()) {
1299
+ revert ErrorStakingStoreTargetNotInitialized(targetNftId);
588
1300
  }
589
1301
  }
590
1302
 
591
1303
 
592
- function _getAndVerifyTvl(
593
- NftId targetNftId,
594
- address token
1304
+ function _getAndVerifyLimit(
1305
+ NftId targetNftId
595
1306
  )
596
1307
  private
597
1308
  view
598
1309
  returns (
599
- Blocknumber tvlLastUpdatedIn,
600
- Amount oldBalance,
601
- Amount oldDipBalance
1310
+ IStaking.LimitInfo storage limitInfo
602
1311
  )
603
1312
  {
604
- tvlLastUpdatedIn = _tvlLastUpdatedIn[targetNftId];
1313
+ limitInfo = _limitInfo[targetNftId];
605
1314
 
606
- if (tvlLastUpdatedIn.eqz()) {
607
- revert ErrorStakingStoreTvlBalanceNotInitialized(targetNftId);
1315
+ if (limitInfo.lastUpdateIn.eqz()) {
1316
+ revert ErrorStakingStoreLimitNotInitialized(targetNftId);
608
1317
  }
1318
+ }
1319
+
1320
+ //--- private tvl functions ------------------------------------------------//
609
1321
 
610
- oldBalance = _tvlBalance[targetNftId][token];
611
- oldDipBalance = _tvlInDip[targetNftId][token];
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);
1330
+ }
1331
+
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
+ }
612
1367
  }
613
1368
  }