@etherisc/gif-next 0.0.2-f9b0591-801 → 0.0.2-fa35bce-363

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