@etherisc/gif-next 0.0.2-bafc958-412 → 0.0.2-bb3faee-097

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