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

Sign up to get free protection for your applications and to get access to all the features.
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
  }