@etherisc/gif-next 0.0.2-e5ea33d → 0.0.2-e6ad61d-739

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +10 -1
  2. package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
  3. package/artifacts/contracts/components/Component.sol/Component.json +28 -2
  4. package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +1 -1
  5. package/artifacts/contracts/components/Component.sol/InstanceLinked.json +2 -2
  6. package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +1 -1
  7. package/artifacts/contracts/components/IPool.sol/IPoolComponent.json +78 -2
  8. package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +1 -1
  9. package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +32 -150
  10. package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
  11. package/artifacts/contracts/components/Pool.sol/Pool.json +121 -6
  12. package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
  13. package/artifacts/contracts/components/Product.sol/Product.json +121 -6
  14. package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
  15. package/artifacts/contracts/experiment/errors/Require.sol/Require.json +2 -2
  16. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
  17. package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +2 -2
  18. package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
  19. package/artifacts/contracts/experiment/inheritance/A.sol/A.json +2 -2
  20. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
  21. package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +2 -2
  22. package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
  23. package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
  24. package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
  25. package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
  26. package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
  27. package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
  28. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +4 -0
  29. package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +59 -0
  30. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +4 -0
  31. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.json +124 -0
  32. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +4 -0
  33. package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.json +74 -0
  34. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +4 -0
  35. package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +124 -0
  36. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +4 -0
  37. package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +207 -0
  38. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
  39. package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +2 -2
  40. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
  41. package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +2 -2
  42. package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
  43. package/artifacts/contracts/instance/IInstance.sol/IInstance.json +686 -99
  44. package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
  45. package/artifacts/contracts/instance/Instance.sol/Instance.json +757 -99
  46. package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +1 -1
  47. package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +1 -1
  48. package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +1 -1
  49. package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +1 -1
  50. package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +1 -1
  51. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +1 -1
  52. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +14 -42
  53. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +1 -1
  54. package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +65 -10
  55. package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +1 -1
  56. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +1 -1
  57. package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +28 -2
  58. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +1 -1
  59. package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +12 -40
  60. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +1 -1
  61. package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +47 -0
  62. package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +1 -1
  63. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.dbg.json +4 -0
  64. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.json +134 -0
  65. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.dbg.json +4 -0
  66. package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.json +182 -0
  67. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.dbg.json +4 -0
  68. package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.json +221 -0
  69. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +1 -1
  70. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +1 -1
  71. package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +26 -3
  72. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
  73. package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +26 -3
  74. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +1 -1
  75. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +1 -1
  76. package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +15 -35
  77. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
  78. package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +22 -29
  79. package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +1 -1
  80. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +1 -1
  81. package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +13 -0
  82. package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +1 -1
  83. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +1 -1
  84. package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +41 -12
  85. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.dbg.json +4 -0
  86. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.json +10 -0
  87. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.dbg.json +4 -0
  88. package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.json +490 -0
  89. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.dbg.json +4 -0
  90. package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.json +45 -0
  91. package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +4 -0
  92. package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.json +490 -0
  93. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
  94. package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +2 -2
  95. package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
  96. package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +1 -1
  97. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +1 -1
  98. package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +2 -2
  99. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
  100. package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +4 -95
  101. package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +1 -1
  102. package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +1 -1
  103. package/artifacts/contracts/registry/Registry.sol/Registerable.json +2 -2
  104. package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
  105. package/artifacts/contracts/registry/Registry.sol/Registry.json +14 -105
  106. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +1 -1
  107. package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +2 -2
  108. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
  109. package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
  110. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
  111. package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +2 -2
  112. package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
  113. package/artifacts/contracts/types/NftId.sol/NftIdLib.json +2 -2
  114. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +4 -0
  115. package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +92 -0
  116. package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +4 -0
  117. package/artifacts/contracts/types/StateId.sol/StateIdLib.json +92 -0
  118. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
  119. package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +2 -2
  120. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
  121. package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +37 -11
  122. package/contracts/components/Component.sol +24 -7
  123. package/contracts/components/IPool.sol +6 -0
  124. package/contracts/components/IProduct.sol +9 -2
  125. package/contracts/components/Pool.sol +34 -4
  126. package/contracts/components/Product.sol +38 -4
  127. package/contracts/experiment/statemachine/Dummy.sol +27 -0
  128. package/contracts/experiment/statemachine/ISM.sol +25 -0
  129. package/contracts/experiment/statemachine/README.md +112 -0
  130. package/contracts/experiment/statemachine/SM.sol +57 -0
  131. package/contracts/experiment/statemachine/SimpleStateMachine.sol +31 -0
  132. package/contracts/instance/IInstance.sol +9 -2
  133. package/contracts/instance/Instance.sol +13 -5
  134. package/contracts/instance/component/ComponentModule.sol +99 -38
  135. package/contracts/instance/component/IComponent.sol +18 -17
  136. package/contracts/instance/lifecycle/ILifecycle.sol +47 -0
  137. package/contracts/instance/lifecycle/LifecycleModule.sol +88 -0
  138. package/contracts/instance/policy/IPolicy.sol +8 -9
  139. package/contracts/instance/policy/PolicyModule.sol +32 -9
  140. package/contracts/instance/pool/IPoolModule.sol +2 -8
  141. package/contracts/instance/pool/PoolModule.sol +24 -16
  142. package/contracts/instance/product/IProductService.sol +1 -1
  143. package/contracts/instance/product/ProductService.sol +54 -30
  144. package/contracts/instance/treasury/ITreasury.sol +91 -0
  145. package/contracts/instance/treasury/TokenHandler.sol +24 -0
  146. package/contracts/instance/treasury/TreasuryModule.sol +168 -0
  147. package/contracts/registry/IRegistry.sol +4 -17
  148. package/contracts/registry/Registry.sol +4 -31
  149. package/contracts/types/Fee.sol +32 -0
  150. package/contracts/types/ObjectType.sol +107 -0
  151. package/contracts/types/StateId.sol +91 -0
  152. package/contracts/types/UFixed.sol +19 -14
  153. package/package.json +7 -4
@@ -4,6 +4,7 @@ pragma solidity ^0.8.19;
4
4
  import {IOwnable, IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
5
5
  import {IProductService} from "../product/IProductService.sol";
6
6
  import {IPolicy, IPolicyModule} from "../policy/IPolicy.sol";
7
+ import {ITreasuryModule} from "../treasury/ITreasury.sol";
7
8
  import {IPoolModule} from "./IPoolModule.sol";
8
9
  import {NftId, NftIdLib} from "../../types/NftId.sol";
9
10
 
@@ -11,9 +12,12 @@ abstract contract PoolModule is IPoolModule {
11
12
  using NftIdLib for NftId;
12
13
 
13
14
  uint256 public constant INITIAL_CAPITAL = 10000 * 10 ** 6;
15
+ uint256 public constant INITIAL_LOCKED_CAPITAL = 0;
14
16
 
15
17
  mapping(NftId nftId => PoolInfo info) private _poolInfo;
16
18
 
19
+ IPolicyModule private _policyModule;
20
+ ITreasuryModule private _treasuryModule;
17
21
  IProductService private _productService;
18
22
 
19
23
  modifier onlyProductService() {
@@ -25,41 +29,45 @@ abstract contract PoolModule is IPoolModule {
25
29
  }
26
30
 
27
31
  constructor(address productService) {
32
+ _policyModule = IPolicyModule(address(this));
33
+ _treasuryModule = ITreasuryModule(address(this));
28
34
  _productService = IProductService(productService);
29
35
  }
30
36
 
31
- function createPoolInfo(
32
- NftId nftId,
33
- address wallet,
34
- address token
35
- ) public override {
37
+ function registerPool(NftId nftId) public override {
36
38
  require(_poolInfo[nftId].nftId.eqz(), "ERROR:PL-001:ALREADY_CREATED");
37
39
 
38
40
  _poolInfo[nftId] = PoolInfo(
39
41
  nftId,
40
- wallet,
41
- token,
42
42
  INITIAL_CAPITAL,
43
- 0 // locked capital
43
+ INITIAL_LOCKED_CAPITAL
44
44
  );
45
45
  }
46
46
 
47
47
  function underwrite(
48
- NftId poolNftId,
49
- NftId policyNftId
48
+ NftId policyNftId,
49
+ NftId productNftId
50
50
  ) external override onlyProductService {
51
- PoolInfo storage poolInfo = _poolInfo[poolNftId];
52
- require(poolInfo.nftId == poolNftId, "ERROR:PL-002:POOL_UNKNOWN");
53
-
54
- IPolicyModule policyModule = IPolicyModule(address(this));
55
- IPolicy.PolicyInfo memory policyInfo = policyModule.getPolicyInfo(
51
+ IPolicy.PolicyInfo memory policyInfo = _policyModule.getPolicyInfo(
56
52
  policyNftId
57
53
  );
54
+ require(policyInfo.nftId == policyNftId, "ERROR:PL-002:POLICY_UNKNOWN");
55
+
56
+ ITreasuryModule.ProductSetup memory product = _treasuryModule
57
+ .getProductSetup(productNftId);
58
+ require(
59
+ product.productNftId == productNftId,
60
+ "ERROR:PL-003:PRODUCT_SETUP_MISSING"
61
+ );
62
+
63
+ NftId poolNftId = product.poolNftId;
64
+ PoolInfo storage poolInfo = _poolInfo[poolNftId];
65
+ require(poolInfo.nftId == poolNftId, "ERROR:PL-004:POOL_UNKNOWN");
58
66
 
59
67
  require(
60
68
  poolInfo.capital - poolInfo.lockedCapital >=
61
69
  policyInfo.sumInsuredAmount,
62
- "ERROR:PL-003:CAPACITY_TOO_LOW"
70
+ "ERROR:PL-005:CAPACITY_TOO_LOW"
63
71
  );
64
72
 
65
73
  poolInfo.lockedCapital += policyInfo.sumInsuredAmount;
@@ -23,7 +23,7 @@ interface IProductService is IRegistryLinked {
23
23
  // function expire(uint256 nftId) external;
24
24
  function close(NftId nftId) external;
25
25
 
26
- // function collectPremium(uint256 nftId, uint256 premiumAmount) external;
26
+ function collectPremium(NftId nftId) external;
27
27
 
28
28
  // function createClaim(uint256 nftId, uint256 claimAmount) external;
29
29
  // function confirmClaim(uint256 nftId, uint256 claimId, uint256 claimAmount) external;
@@ -8,15 +8,21 @@ import {IRegistry} from "../../registry/IRegistry.sol";
8
8
  import {IPolicyModule} from "../policy/IPolicy.sol";
9
9
  import {RegistryLinked} from "../../registry/Registry.sol";
10
10
  import {IProductService, IProductModule} from "./IProductService.sol";
11
- import {IComponentModule} from "../../instance/component/IComponent.sol";
11
+ import {ITreasuryModule} from "../../instance/treasury/ITreasury.sol";
12
12
  import {IPoolModule} from "../../instance/pool/IPoolModule.sol";
13
+ import {ObjectType, INSTANCE, PRODUCT} from "../../types/ObjectType.sol";
13
14
  import {NftId, NftIdLib} from "../../types/NftId.sol";
14
15
 
15
16
  // TODO or name this ProtectionService to have Product be something more generic (loan, savings account, ...)
16
17
  contract ProductService is RegistryLinked, IProductService {
17
18
  using NftIdLib for NftId;
18
19
 
19
- constructor(address registry) RegistryLinked(registry) {}
20
+ constructor(
21
+ address registry
22
+ ) RegistryLinked(registry) // solhint-disable-next-line no-empty-blocks
23
+ {
24
+
25
+ }
20
26
 
21
27
  function createApplication(
22
28
  address applicationOwner,
@@ -31,19 +37,13 @@ contract ProductService is RegistryLinked, IProductService {
31
37
  IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
32
38
  productNftId
33
39
  );
34
- require(
35
- productInfo.objectType == _registry.PRODUCT(),
36
- "ERROR_NOT_PRODUCT"
37
- );
40
+ require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
38
41
 
39
42
  IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
40
43
  productInfo.parentNftId
41
44
  );
42
45
  require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
43
- require(
44
- instanceInfo.objectType == _registry.INSTANCE(),
45
- "ERROR_NOT_INSTANCE"
46
- );
46
+ require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
47
47
 
48
48
  IPolicyModule policyModule = IPolicyModule(instanceInfo.objectAddress);
49
49
  nftId = policyModule.createApplication(
@@ -58,45 +58,69 @@ contract ProductService is RegistryLinked, IProductService {
58
58
  // add logging
59
59
  }
60
60
 
61
- function underwrite(NftId nftId) external override {
61
+ function underwrite(NftId policyNftId) external override {
62
+ // validation
62
63
  // same as only registered product
63
64
  NftId productNftId = _registry.getNftId(msg.sender);
64
65
  require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
65
66
  IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
66
67
  productNftId
67
68
  );
68
- require(
69
- productInfo.objectType == _registry.PRODUCT(),
70
- "ERROR_NOT_PRODUCT"
71
- );
69
+ require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
72
70
 
73
71
  IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
74
72
  productInfo.parentNftId
75
73
  );
76
74
  require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
77
- require(
78
- instanceInfo.objectType == _registry.INSTANCE(),
79
- "ERROR_NOT_INSTANCE"
75
+ require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
76
+
77
+ // underwrite policy
78
+ address instanceAddress = instanceInfo.objectAddress;
79
+ IPoolModule poolModule = IPoolModule(instanceAddress);
80
+ poolModule.underwrite(policyNftId, productNftId);
81
+
82
+ // activate policy
83
+ IPolicyModule policyModule = IPolicyModule(instanceAddress);
84
+ policyModule.activate(policyNftId);
85
+
86
+ // add logging
87
+ }
88
+
89
+ function collectPremium(NftId policyNftId) external override {
90
+ // validation same as other functions, eg underwrite
91
+ // TODO unify validation into modifier and/or other suitable approaches
92
+ // same as only registered product
93
+ NftId productNftId = _registry.getNftId(msg.sender);
94
+ require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
95
+ IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
96
+ productNftId
80
97
  );
98
+ require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
81
99
 
82
- // get responsible pool
83
- IComponentModule componentModule = IComponentModule(
84
- instanceInfo.objectAddress
100
+ IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
101
+ productInfo.parentNftId
85
102
  );
86
- NftId poolNftId = componentModule.getPoolNftId(productNftId);
103
+ require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
104
+ require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
87
105
 
88
- // lock capital (and update pool accounting)
89
- IPoolModule poolModule = IPoolModule(instanceInfo.objectAddress);
90
- poolModule.underwrite(poolNftId, nftId);
106
+ // process/collect premium: book keeping for policy
107
+ address instanceAddress = instanceInfo.objectAddress;
108
+ IPolicyModule policyModule = IPolicyModule(instanceAddress);
109
+ policyModule.processPremium(policyNftId);
91
110
 
92
- // activate policy
93
- IPolicyModule policyModule = IPolicyModule(instanceInfo.objectAddress);
94
- policyModule.activate(nftId);
111
+ // process/collect premium: actual token transfer
112
+ ITreasuryModule treasuryModule = ITreasuryModule(instanceAddress);
113
+ treasuryModule.processPremium(policyNftId, productNftId);
95
114
 
96
- // add logging
115
+ // TODO add logging
97
116
  }
98
117
 
99
- function close(NftId nftId) external override {}
118
+ function close(
119
+ NftId policyNftId
120
+ ) external override // solhint-disable-next-line no-empty-blocks
121
+ {
122
+
123
+ }
100
124
  }
101
125
 
102
126
  abstract contract ProductModule is IProductModule {
@@ -0,0 +1,91 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5
+
6
+ import {IRegistryLinked} from "../../registry/IRegistry.sol";
7
+
8
+ import {NftId} from "../../types/NftId.sol";
9
+ import {UFixed} from "../../types/UFixed.sol";
10
+ import {Fee} from "../../types/Fee.sol";
11
+
12
+ import {TokenHandler} from "./TokenHandler.sol";
13
+
14
+ interface ITreasury {
15
+ // TODO add events
16
+ // TODO add errors
17
+ }
18
+
19
+ interface ITreasuryModule is IRegistryLinked, ITreasury {
20
+ struct ProductSetup {
21
+ NftId productNftId;
22
+ NftId distributorNftId;
23
+ NftId poolNftId;
24
+ IERC20 token;
25
+ TokenHandler tokenHandler;
26
+ address wallet;
27
+ Fee policyFee;
28
+ Fee processingFee;
29
+ }
30
+
31
+ struct DistributorSetup {
32
+ NftId distributorNftId;
33
+ address wallet;
34
+ Fee commissionFees;
35
+ }
36
+
37
+ struct PoolSetup {
38
+ NftId poolNftId;
39
+ address wallet;
40
+ Fee stakingFee;
41
+ Fee performanceFee;
42
+ }
43
+
44
+ function registerProduct(
45
+ NftId productNftId,
46
+ NftId distributorNftId,
47
+ NftId poolNftId,
48
+ IERC20 token,
49
+ address wallet,
50
+ Fee memory policyFee,
51
+ Fee memory processingFee
52
+ ) external;
53
+
54
+ function setProductFees(
55
+ NftId productNftId,
56
+ Fee memory policyFee,
57
+ Fee memory processingFee
58
+ ) external;
59
+
60
+ function registerPool(
61
+ NftId poolNftId,
62
+ address wallet,
63
+ Fee memory stakingFee,
64
+ Fee memory performanceFee
65
+ ) external;
66
+
67
+ function setPoolFees(
68
+ NftId poolNftId,
69
+ Fee memory stakingFee,
70
+ Fee memory performanceFee
71
+ ) external;
72
+
73
+ function processPremium(NftId policyNftId, NftId productNftId) external;
74
+
75
+ function getTokenHandler(
76
+ NftId productNftId
77
+ ) external view returns (TokenHandler tokenHandler);
78
+
79
+ function getProductSetup(
80
+ NftId productNftId
81
+ ) external view returns (ProductSetup memory setup);
82
+
83
+ function getPoolSetup(
84
+ NftId poolNftId
85
+ ) external view returns (PoolSetup memory setup);
86
+
87
+ function calculateFeeAmount(
88
+ uint256 amount,
89
+ Fee memory fee
90
+ ) external pure returns (uint256 feeAmount, uint256 netAmount);
91
+ }
@@ -0,0 +1,24 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5
+
6
+ contract TokenHandler {
7
+ // TODO use oz safeTransferFrom
8
+
9
+ IERC20 _token;
10
+
11
+ constructor(address token) {
12
+ _token = IERC20(token);
13
+ }
14
+
15
+ // TODO add logging
16
+ function transfer(
17
+ address from,
18
+ address to,
19
+ uint256 amount
20
+ ) external // TODO add authz (only treasury)
21
+ {
22
+ _token.transferFrom(from, to, amount);
23
+ }
24
+ }
@@ -0,0 +1,168 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5
+
6
+ import {NftId} from "../../types/NftId.sol";
7
+ import {Fee, feeIsZero} from "../../types/Fee.sol";
8
+ import {UFixed, UFixedMathLib} from "../../types/UFixed.sol";
9
+ import {IProductComponent} from "../../components/IProduct.sol";
10
+ import {IPolicy, IPolicyModule} from "../policy/IPolicy.sol";
11
+ import {TokenHandler} from "./TokenHandler.sol";
12
+ import {ITreasuryModule} from "./ITreasury.sol";
13
+ import {TokenHandler} from "./TokenHandler.sol";
14
+
15
+ abstract contract TreasuryModule is ITreasuryModule {
16
+ mapping(NftId productNftId => ProductSetup setup) private _productSetup;
17
+ mapping(NftId distributorNftId => DistributorSetup setup)
18
+ private _distributorSetup;
19
+ mapping(NftId poolNftId => PoolSetup setup) private _poolSetup;
20
+
21
+ IPolicyModule private _policyModule;
22
+
23
+ constructor() {
24
+ _policyModule = IPolicyModule(address(this));
25
+ }
26
+
27
+ function registerProduct(
28
+ NftId productNftId,
29
+ NftId distributorNftId,
30
+ NftId poolNftId,
31
+ IERC20 token,
32
+ address wallet,
33
+ Fee memory policyFee,
34
+ Fee memory processingFee
35
+ ) external override // TODO add authz (only component module)
36
+ {
37
+ // TODO add validation
38
+
39
+ // deploy product specific handler contract
40
+ TokenHandler tokenHandler = new TokenHandler(address(token));
41
+
42
+ _productSetup[productNftId] = ProductSetup(
43
+ productNftId,
44
+ distributorNftId,
45
+ poolNftId,
46
+ token,
47
+ tokenHandler,
48
+ wallet,
49
+ policyFee,
50
+ processingFee
51
+ );
52
+
53
+ // TODO add logging
54
+ }
55
+
56
+ function setProductFees(
57
+ NftId productNftId,
58
+ Fee memory policyFee,
59
+ Fee memory processingFee
60
+ ) external override // TODO add authz (only component owner service)
61
+ {
62
+ // TODO add validation
63
+
64
+ ProductSetup storage setup = _productSetup[productNftId];
65
+ setup.policyFee = policyFee;
66
+ setup.processingFee = processingFee;
67
+
68
+ // TODO add logging
69
+ }
70
+
71
+ function registerPool(
72
+ NftId poolNftId,
73
+ address wallet,
74
+ Fee memory stakingFee,
75
+ Fee memory performanceFee
76
+ ) external override // TODO add authz (only component module)
77
+ {
78
+ // TODO add validation
79
+
80
+ _poolSetup[poolNftId] = PoolSetup(
81
+ poolNftId,
82
+ wallet,
83
+ stakingFee,
84
+ performanceFee
85
+ );
86
+
87
+ // TODO add logging
88
+ }
89
+
90
+ function setPoolFees(
91
+ NftId poolNftId,
92
+ Fee memory stakingFee,
93
+ Fee memory performanceFee
94
+ ) external override // TODO add authz (only component owner service)
95
+ {
96
+ // TODO add validation
97
+
98
+ PoolSetup storage setup = _poolSetup[poolNftId];
99
+ setup.stakingFee = stakingFee;
100
+ setup.performanceFee = performanceFee;
101
+
102
+ // TODO add logging
103
+ }
104
+
105
+ function getTokenHandler(
106
+ NftId productNftId
107
+ ) external view override returns (TokenHandler tokenHandler) {
108
+ return _productSetup[productNftId].tokenHandler;
109
+ }
110
+
111
+ function getProductSetup(
112
+ NftId productNftId
113
+ ) external view override returns (ProductSetup memory setup) {
114
+ return _productSetup[productNftId];
115
+ }
116
+
117
+ function getPoolSetup(
118
+ NftId poolNftId
119
+ ) external view override returns (PoolSetup memory setup) {
120
+ return _poolSetup[poolNftId];
121
+ }
122
+
123
+ function processPremium(
124
+ NftId policyNftId,
125
+ NftId productNftId
126
+ ) external override // TODO add authz (only product service)
127
+ {
128
+ IPolicy.PolicyInfo memory policyInfo = _policyModule.getPolicyInfo(
129
+ policyNftId
130
+ );
131
+ require(
132
+ policyInfo.nftId == policyNftId,
133
+ "ERROR:TRS-020:POLICY_UNKNOWN"
134
+ );
135
+
136
+ ProductSetup memory product = _productSetup[productNftId];
137
+ TokenHandler tokenHandler = product.tokenHandler;
138
+ address policyOwner = this.getRegistry().getOwner(policyNftId);
139
+ address poolWallet = _poolSetup[product.poolNftId].wallet;
140
+ // TODO add validation
141
+
142
+ if (feeIsZero(product.policyFee)) {
143
+ tokenHandler.transfer(
144
+ policyOwner,
145
+ poolWallet,
146
+ policyInfo.premiumAmount
147
+ );
148
+ } else {
149
+ (uint256 feeAmount, uint256 netAmount) = calculateFeeAmount(
150
+ policyInfo.premiumAmount,
151
+ product.policyFee
152
+ );
153
+
154
+ tokenHandler.transfer(policyOwner, product.wallet, feeAmount);
155
+ tokenHandler.transfer(policyOwner, poolWallet, netAmount);
156
+ }
157
+ }
158
+
159
+ function calculateFeeAmount(
160
+ uint256 amount,
161
+ Fee memory fee
162
+ ) public pure override returns (uint256 feeAmount, uint256 netAmount) {
163
+ UFixed fractionalAmount = UFixedMathLib.itof(amount) *
164
+ fee.fractionalFee;
165
+ feeAmount = UFixedMathLib.ftoi(fractionalAmount) + fee.fixedFee;
166
+ netAmount = amount - feeAmount;
167
+ }
168
+ }
@@ -2,6 +2,7 @@
2
2
  pragma solidity ^0.8.19;
3
3
 
4
4
  import {NftId} from "../types/NftId.sol";
5
+ import {ObjectType} from "../types/ObjectType.sol";
5
6
 
6
7
  interface IOwnable {
7
8
  function getOwner() external view returns (address owner);
@@ -20,7 +21,7 @@ interface IRegisterable is IOwnable, IRegistryLinked {
20
21
 
21
22
  function getParentNftId() external view returns (NftId parentNftId);
22
23
 
23
- function getType() external view returns (uint256 objectType);
24
+ function getType() external view returns (ObjectType objectType);
24
25
 
25
26
  function getData() external view returns (bytes memory data);
26
27
 
@@ -35,30 +36,16 @@ interface IRegistry {
35
36
  struct RegistryInfo {
36
37
  NftId nftId;
37
38
  NftId parentNftId;
38
- uint256 objectType;
39
+ ObjectType objectType;
39
40
  address objectAddress;
40
41
  address initialOwner;
41
42
  }
42
43
 
43
- function TOKEN() external pure returns (uint256);
44
-
45
- function INSTANCE() external pure returns (uint256);
46
-
47
- function PRODUCT() external pure returns (uint256);
48
-
49
- function ORACLE() external pure returns (uint256);
50
-
51
- function POOL() external pure returns (uint256);
52
-
53
- function POLICY() external pure returns (uint256);
54
-
55
- function BUNDLE() external pure returns (uint256);
56
-
57
44
  function register(address objectAddress) external returns (NftId nftId);
58
45
 
59
46
  function registerObjectForInstance(
60
47
  NftId parentNftid,
61
- uint256 objectType,
48
+ ObjectType objectType,
62
49
  address initialOwner
63
50
  ) external returns (NftId nftId);
64
51
 
@@ -3,8 +3,8 @@ pragma solidity ^0.8.19;
3
3
 
4
4
  import {IChainNft} from "./IChainNft.sol";
5
5
  import {IRegistry, IRegistryLinked, IRegisterable} from "./IRegistry.sol";
6
- import {NftId, toNftId} from "../types/NftId.sol";
7
- import {NftIdLib} from "../types/NftId.sol";
6
+ import {NftId, toNftId, NftIdLib} from "../types/NftId.sol";
7
+ import {ObjectType, INSTANCE, POLICY, BUNDLE} from "../types/ObjectType.sol";
8
8
 
9
9
  contract RegistryLinked is IRegistryLinked {
10
10
  IRegistry internal _registry;
@@ -55,6 +55,7 @@ abstract contract Registerable is RegistryLinked, IRegisterable {
55
55
 
56
56
  contract Registry is IRegistry {
57
57
  using NftIdLib for NftId;
58
+
58
59
  string public constant EMPTY_URI = "";
59
60
 
60
61
  mapping(NftId nftId => RegistryInfo info) private _info;
@@ -71,34 +72,6 @@ contract Registry is IRegistry {
71
72
  _chainNft = IChainNft(chainNft);
72
73
  }
73
74
 
74
- function TOKEN() public pure override returns (uint256) {
75
- return 30;
76
- }
77
-
78
- function INSTANCE() public pure override returns (uint256) {
79
- return 40;
80
- }
81
-
82
- function PRODUCT() public pure override returns (uint256) {
83
- return 50;
84
- }
85
-
86
- function ORACLE() public pure override returns (uint256) {
87
- return 60;
88
- }
89
-
90
- function POOL() public pure override returns (uint256) {
91
- return 70;
92
- }
93
-
94
- function POLICY() public pure override returns (uint256) {
95
- return 80;
96
- }
97
-
98
- function BUNDLE() public pure override returns (uint256) {
99
- return 90;
100
- }
101
-
102
75
  function register(
103
76
  address objectAddress
104
77
  ) external override returns (NftId nftId) {
@@ -145,7 +118,7 @@ contract Registry is IRegistry {
145
118
 
146
119
  function registerObjectForInstance(
147
120
  NftId parentNftId,
148
- uint256 objectType,
121
+ ObjectType objectType,
149
122
  address initialOwner
150
123
  )
151
124
  external
@@ -0,0 +1,32 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ pragma solidity ^0.8.19;
3
+
4
+ import {UFixed} from "./UFixed.sol";
5
+
6
+ struct Fee {
7
+ UFixed fractionalFee;
8
+ uint256 fixedFee;
9
+ }
10
+
11
+ // general pure free functions
12
+ /// @dev Converts the uint256 to a NftId.
13
+ function toFee(
14
+ UFixed fractionalFee,
15
+ uint256 fixedFee
16
+ ) pure returns (Fee memory fee) {
17
+ return Fee(fractionalFee, fixedFee);
18
+ }
19
+
20
+ /// @dev Return the NftId zero (0)
21
+ function zeroFee() pure returns (Fee memory fee) {
22
+ return Fee(UFixed.wrap(0), 0);
23
+ }
24
+
25
+ // pure free functions for operators
26
+ function feeIsSame(Fee memory a, Fee memory b) pure returns (bool isSame) {
27
+ return a.fixedFee == b.fixedFee && a.fractionalFee == b.fractionalFee;
28
+ }
29
+
30
+ function feeIsZero(Fee memory fee) pure returns (bool) {
31
+ return fee.fixedFee == 0 && UFixed.unwrap(fee.fractionalFee) == 0;
32
+ }