@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.
- package/README.md +10 -1
- package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
- package/artifacts/contracts/components/Component.sol/Component.json +28 -2
- package/artifacts/contracts/components/Component.sol/InstanceLinked.dbg.json +1 -1
- package/artifacts/contracts/components/Component.sol/InstanceLinked.json +2 -2
- package/artifacts/contracts/components/IPool.sol/IPoolComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IPool.sol/IPoolComponent.json +78 -2
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +32 -150
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.json +121 -6
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +121 -6
- package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +1 -1
- package/artifacts/contracts/experiment/errors/Require.sol/Require.json +2 -2
- package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +1 -1
- package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +2 -2
- package/artifacts/contracts/experiment/inheritance/A.sol/A.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/A.sol/A.json +2 -2
- package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +2 -2
- package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +1 -1
- package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +1 -1
- package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.dbg.json +4 -0
- package/artifacts/contracts/experiment/statemachine/Dummy.sol/LifeCycleModule.json +59 -0
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.dbg.json +4 -0
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISM.json +124 -0
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.dbg.json +4 -0
- package/artifacts/contracts/experiment/statemachine/ISM.sol/ISMEE.json +74 -0
- package/artifacts/contracts/experiment/statemachine/SM.sol/SM.dbg.json +4 -0
- package/artifacts/contracts/experiment/statemachine/SM.sol/SM.json +124 -0
- package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.dbg.json +4 -0
- package/artifacts/contracts/experiment/statemachine/SimpleStateMachine.sol/SimpleStateMachine.json +207 -0
- package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +1 -1
- package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +2 -2
- package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +1 -1
- package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +2 -2
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +686 -99
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +757 -99
- package/artifacts/contracts/instance/access/Access.sol/AccessModule.dbg.json +1 -1
- package/artifacts/contracts/instance/access/IAccess.sol/IAccess.dbg.json +1 -1
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessCheckRole.dbg.json +1 -1
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessComponentTypeRoles.dbg.json +1 -1
- package/artifacts/contracts/instance/access/IAccess.sol/IAccessModule.dbg.json +1 -1
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.dbg.json +1 -1
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentModule.json +14 -42
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +65 -10
- package/artifacts/contracts/instance/component/IComponent.sol/IComponent.dbg.json +1 -1
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.dbg.json +1 -1
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentContract.json +28 -2
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +1 -1
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +12 -40
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +47 -0
- package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +1 -1
- package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.dbg.json +4 -0
- package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycle.json +134 -0
- package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.dbg.json +4 -0
- package/artifacts/contracts/instance/lifecycle/ILifecycle.sol/ILifecycleModule.json +182 -0
- package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.dbg.json +4 -0
- package/artifacts/contracts/instance/lifecycle/LifecycleModule.sol/LifecycleModule.json +221 -0
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicy.dbg.json +1 -1
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.dbg.json +1 -1
- package/artifacts/contracts/instance/policy/IPolicy.sol/IPolicyModule.json +26 -3
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +26 -3
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPool.dbg.json +1 -1
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.dbg.json +1 -1
- package/artifacts/contracts/instance/pool/IPoolModule.sol/IPoolModule.json +15 -35
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +22 -29
- package/artifacts/contracts/instance/product/IProductService.sol/IProductModule.dbg.json +1 -1
- package/artifacts/contracts/instance/product/IProductService.sol/IProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/product/IProductService.sol/IProductService.json +13 -0
- package/artifacts/contracts/instance/product/ProductService.sol/ProductModule.dbg.json +1 -1
- package/artifacts/contracts/instance/product/ProductService.sol/ProductService.dbg.json +1 -1
- package/artifacts/contracts/instance/product/ProductService.sol/ProductService.json +41 -12
- package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.dbg.json +4 -0
- package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasury.json +10 -0
- package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.dbg.json +4 -0
- package/artifacts/contracts/instance/treasury/ITreasury.sol/ITreasuryModule.json +490 -0
- package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.dbg.json +4 -0
- package/artifacts/contracts/instance/treasury/TokenHandler.sol/TokenHandler.json +45 -0
- package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.dbg.json +4 -0
- package/artifacts/contracts/instance/treasury/TreasuryModule.sol/TreasuryModule.json +490 -0
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +2 -2
- package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IOwnable.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegisterable.json +2 -2
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +4 -95
- package/artifacts/contracts/registry/IRegistry.sol/IRegistryLinked.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registerable.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registerable.json +2 -2
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.json +14 -105
- package/artifacts/contracts/registry/Registry.sol/RegistryLinked.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/RegistryLinked.json +2 -2
- package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.dbg.json +1 -1
- package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +2 -2
- package/artifacts/contracts/types/ChainId.sol/ChainIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +2 -2
- package/artifacts/contracts/types/NftId.sol/NftIdLib.dbg.json +1 -1
- package/artifacts/contracts/types/NftId.sol/NftIdLib.json +2 -2
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.dbg.json +4 -0
- package/artifacts/contracts/types/ObjectType.sol/ObjectTypeLib.json +92 -0
- package/artifacts/contracts/types/StateId.sol/StateIdLib.dbg.json +4 -0
- package/artifacts/contracts/types/StateId.sol/StateIdLib.json +92 -0
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.dbg.json +1 -1
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +2 -2
- package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +1 -1
- package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +37 -11
- package/contracts/components/Component.sol +24 -7
- package/contracts/components/IPool.sol +6 -0
- package/contracts/components/IProduct.sol +9 -2
- package/contracts/components/Pool.sol +34 -4
- package/contracts/components/Product.sol +38 -4
- package/contracts/experiment/statemachine/Dummy.sol +27 -0
- package/contracts/experiment/statemachine/ISM.sol +25 -0
- package/contracts/experiment/statemachine/README.md +112 -0
- package/contracts/experiment/statemachine/SM.sol +57 -0
- package/contracts/experiment/statemachine/SimpleStateMachine.sol +31 -0
- package/contracts/instance/IInstance.sol +9 -2
- package/contracts/instance/Instance.sol +13 -5
- package/contracts/instance/component/ComponentModule.sol +99 -38
- package/contracts/instance/component/IComponent.sol +18 -17
- package/contracts/instance/lifecycle/ILifecycle.sol +47 -0
- package/contracts/instance/lifecycle/LifecycleModule.sol +88 -0
- package/contracts/instance/policy/IPolicy.sol +8 -9
- package/contracts/instance/policy/PolicyModule.sol +32 -9
- package/contracts/instance/pool/IPoolModule.sol +2 -8
- package/contracts/instance/pool/PoolModule.sol +24 -16
- package/contracts/instance/product/IProductService.sol +1 -1
- package/contracts/instance/product/ProductService.sol +54 -30
- package/contracts/instance/treasury/ITreasury.sol +91 -0
- package/contracts/instance/treasury/TokenHandler.sol +24 -0
- package/contracts/instance/treasury/TreasuryModule.sol +168 -0
- package/contracts/registry/IRegistry.sol +4 -17
- package/contracts/registry/Registry.sol +4 -31
- package/contracts/types/Fee.sol +32 -0
- package/contracts/types/ObjectType.sol +107 -0
- package/contracts/types/StateId.sol +91 -0
- package/contracts/types/UFixed.sol +19 -14
- 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
|
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
|
-
|
43
|
+
INITIAL_LOCKED_CAPITAL
|
44
44
|
);
|
45
45
|
}
|
46
46
|
|
47
47
|
function underwrite(
|
48
|
-
NftId
|
49
|
-
NftId
|
48
|
+
NftId policyNftId,
|
49
|
+
NftId productNftId
|
50
50
|
) external override onlyProductService {
|
51
|
-
|
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-
|
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
|
-
|
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 {
|
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(
|
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
|
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
|
-
|
79
|
-
|
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
|
-
|
83
|
-
|
84
|
-
instanceInfo.objectAddress
|
100
|
+
IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
|
101
|
+
productInfo.parentNftId
|
85
102
|
);
|
86
|
-
|
103
|
+
require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
|
104
|
+
require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
|
87
105
|
|
88
|
-
//
|
89
|
-
|
90
|
-
|
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
|
-
//
|
93
|
-
|
94
|
-
|
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(
|
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 (
|
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
|
-
|
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
|
-
|
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 {
|
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
|
-
|
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
|
+
}
|