@etherisc/gif-next 0.0.2-9620cae-586 → 0.0.2-9628b30-648

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