@etherisc/gif-next 0.0.2-f9905e1 → 0.0.2-f99f1d2-109
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 +33 -0
- package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
- package/artifacts/contracts/components/Component.sol/Component.json +35 -9
- 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 +84 -8
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +34 -152
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.json +146 -13
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +148 -15
- package/artifacts/contracts/experiment/errors/Require.sol/Require.dbg.json +4 -0
- package/artifacts/contracts/experiment/errors/Require.sol/Require.json +105 -0
- package/artifacts/contracts/experiment/errors/Revert.sol/Revert.dbg.json +4 -0
- package/artifacts/contracts/experiment/errors/Revert.sol/Revert.json +105 -0
- 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 +714 -127
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +845 -129
- 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 +31 -59
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +103 -6
- 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 +34 -8
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +1 -1
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +31 -59
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +50 -3
- 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 +44 -21
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +44 -21
- 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 +23 -43
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +28 -35
- 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 +21 -8
- 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 +85 -14
- 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 +4 -0
- package/artifacts/contracts/registry/ChainNft.sol/ChainNft.json +534 -0
- package/artifacts/contracts/registry/IChainNft.sol/IChainNft.dbg.json +4 -0
- package/artifacts/contracts/registry/IChainNft.sol/IChainNft.json +452 -0
- 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 +8 -8
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +45 -128
- 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 +9 -9
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.json +95 -128
- 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 +4 -0
- package/artifacts/contracts/types/Blocknumber.sol/BlocknumberLib.json +174 -0
- 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 +4 -0
- package/artifacts/contracts/types/NftId.sol/NftIdLib.json +92 -0
- 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 +4 -0
- package/artifacts/contracts/types/Timestamp.sol/TimestampLib.json +174 -0
- package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.dbg.json +4 -0
- package/artifacts/contracts/types/UFixed.sol/UFixedMathLib.json +453 -0
- package/contracts/components/Component.sol +39 -24
- package/contracts/components/IPool.sol +9 -3
- package/contracts/components/IProduct.sol +11 -6
- package/contracts/components/Pool.sol +37 -14
- package/contracts/components/Product.sol +48 -24
- package/contracts/experiment/errors/Require.sol +38 -0
- package/contracts/experiment/errors/Revert.sol +44 -0
- package/contracts/experiment/inheritance/A.sol +8 -11
- package/contracts/experiment/inheritance/B.sol +10 -5
- package/contracts/experiment/inheritance/C.sol +11 -5
- package/contracts/experiment/inheritance/IA.sol +2 -7
- package/contracts/experiment/inheritance/IB.sol +3 -2
- package/contracts/experiment/inheritance/IC.sol +4 -3
- 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/experiment/types/TypeA.sol +14 -9
- package/contracts/experiment/types/TypeB.sol +14 -9
- package/contracts/instance/IInstance.sol +9 -4
- package/contracts/instance/Instance.sol +24 -15
- package/contracts/instance/access/Access.sol +63 -116
- package/contracts/instance/access/IAccess.sol +28 -48
- package/contracts/instance/component/ComponentModule.sol +162 -147
- package/contracts/instance/component/IComponent.sol +41 -61
- package/contracts/instance/lifecycle/ILifecycle.sol +47 -0
- package/contracts/instance/lifecycle/LifecycleModule.sol +88 -0
- package/contracts/instance/policy/IPolicy.sol +19 -35
- package/contracts/instance/policy/PolicyModule.sol +52 -44
- package/contracts/instance/pool/IPoolModule.sol +9 -26
- package/contracts/instance/pool/PoolModule.sol +43 -45
- package/contracts/instance/product/IProductService.sol +10 -19
- package/contracts/instance/product/ProductService.sol +86 -55
- 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/ChainNft.sol +135 -0
- package/contracts/registry/IChainNft.sol +21 -0
- package/contracts/registry/IRegistry.sol +41 -40
- package/contracts/registry/Registry.sol +82 -97
- package/contracts/types/Blocknumber.sol +118 -0
- package/contracts/types/ChainId.sol +24 -10
- package/contracts/types/Fee.sol +32 -0
- package/contracts/types/NftId.sol +51 -0
- package/contracts/types/ObjectType.sol +107 -0
- package/contracts/types/StateId.sol +91 -0
- package/contracts/types/Timestamp.sol +102 -0
- package/contracts/types/UFixed.sol +206 -0
- package/package.json +13 -5
@@ -1,7 +1,6 @@
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
2
2
|
pragma solidity ^0.8.19;
|
3
3
|
|
4
|
-
|
5
4
|
// import {IProduct} from "../../components/IProduct.sol";
|
6
5
|
// import {IOwnable, IRegistryLinked, IRegisterable, IRegistry} from "../../registry/IRegistry.sol";
|
7
6
|
// import {IInstance} from "../IInstance.sol";
|
@@ -9,39 +8,42 @@ import {IRegistry} from "../../registry/IRegistry.sol";
|
|
9
8
|
import {IPolicyModule} from "../policy/IPolicy.sol";
|
10
9
|
import {RegistryLinked} from "../../registry/Registry.sol";
|
11
10
|
import {IProductService, IProductModule} from "./IProductService.sol";
|
12
|
-
import {
|
11
|
+
import {ITreasuryModule} from "../../instance/treasury/ITreasury.sol";
|
13
12
|
import {IPoolModule} from "../../instance/pool/IPoolModule.sol";
|
13
|
+
import {ObjectType, INSTANCE, PRODUCT} from "../../types/ObjectType.sol";
|
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
|
-
contract ProductService is
|
17
|
-
|
18
|
-
IProductService
|
19
|
-
{
|
20
|
-
constructor(address registry)
|
21
|
-
RegistryLinked(registry)
|
22
|
-
{ }
|
17
|
+
contract ProductService is RegistryLinked, IProductService {
|
18
|
+
using NftIdLib for NftId;
|
23
19
|
|
20
|
+
constructor(
|
21
|
+
address registry
|
22
|
+
) RegistryLinked(registry) // solhint-disable-next-line no-empty-blocks
|
23
|
+
{
|
24
|
+
|
25
|
+
}
|
24
26
|
|
25
27
|
function createApplication(
|
26
28
|
address applicationOwner,
|
27
29
|
uint256 sumInsuredAmount,
|
28
30
|
uint256 premiumAmount,
|
29
31
|
uint256 lifetime,
|
30
|
-
|
31
|
-
)
|
32
|
-
external
|
33
|
-
override
|
34
|
-
returns(uint256 nftId)
|
35
|
-
{
|
32
|
+
NftId bundleNftId
|
33
|
+
) external override returns (NftId nftId) {
|
36
34
|
// same as only registered product
|
37
|
-
|
38
|
-
require(productNftId
|
39
|
-
IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
35
|
+
NftId productNftId = _registry.getNftId(msg.sender);
|
36
|
+
require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
|
37
|
+
IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
|
38
|
+
productNftId
|
39
|
+
);
|
40
|
+
require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
|
41
|
+
|
42
|
+
IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
|
43
|
+
productInfo.parentNftId
|
44
|
+
);
|
45
|
+
require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
|
46
|
+
require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
|
45
47
|
|
46
48
|
IPolicyModule policyModule = IPolicyModule(instanceInfo.objectAddress);
|
47
49
|
nftId = policyModule.createApplication(
|
@@ -50,56 +52,85 @@ contract ProductService is
|
|
50
52
|
sumInsuredAmount,
|
51
53
|
premiumAmount,
|
52
54
|
lifetime,
|
53
|
-
bundleNftId
|
55
|
+
bundleNftId
|
56
|
+
);
|
54
57
|
|
55
58
|
// add logging
|
56
59
|
}
|
57
60
|
|
58
|
-
function underwrite(
|
59
|
-
|
60
|
-
override
|
61
|
-
{
|
61
|
+
function underwrite(NftId policyNftId) external override {
|
62
|
+
// validation
|
62
63
|
// same as only registered product
|
63
|
-
|
64
|
-
require(productNftId
|
65
|
-
IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
//
|
77
|
-
|
78
|
-
poolModule
|
79
|
-
|
80
|
-
nftId);
|
64
|
+
NftId productNftId = _registry.getNftId(msg.sender);
|
65
|
+
require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
|
66
|
+
IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
|
67
|
+
productNftId
|
68
|
+
);
|
69
|
+
require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
|
70
|
+
|
71
|
+
IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
|
72
|
+
productInfo.parentNftId
|
73
|
+
);
|
74
|
+
require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
|
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
81
|
|
82
82
|
// activate policy
|
83
|
-
IPolicyModule policyModule = IPolicyModule(
|
84
|
-
policyModule.activate(
|
83
|
+
IPolicyModule policyModule = IPolicyModule(instanceAddress);
|
84
|
+
policyModule.activate(policyNftId);
|
85
85
|
|
86
86
|
// add logging
|
87
87
|
}
|
88
88
|
|
89
|
-
function
|
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
|
97
|
+
);
|
98
|
+
require(productInfo.objectType == PRODUCT(), "ERROR_NOT_PRODUCT");
|
99
|
+
|
100
|
+
IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
|
101
|
+
productInfo.parentNftId
|
102
|
+
);
|
103
|
+
require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
|
104
|
+
require(instanceInfo.objectType == INSTANCE(), "ERROR_NOT_INSTANCE");
|
105
|
+
|
106
|
+
// process/collect premium: book keeping for policy
|
107
|
+
address instanceAddress = instanceInfo.objectAddress;
|
108
|
+
IPolicyModule policyModule = IPolicyModule(instanceAddress);
|
109
|
+
policyModule.processPremium(policyNftId);
|
110
|
+
|
111
|
+
// process/collect premium: actual token transfer
|
112
|
+
ITreasuryModule treasuryModule = ITreasuryModule(instanceAddress);
|
113
|
+
treasuryModule.processPremium(policyNftId, productNftId);
|
114
|
+
|
115
|
+
// TODO add logging
|
116
|
+
}
|
117
|
+
|
118
|
+
function close(
|
119
|
+
NftId policyNftId
|
120
|
+
) external override // solhint-disable-next-line no-empty-blocks
|
121
|
+
{
|
122
|
+
|
123
|
+
}
|
90
124
|
}
|
91
125
|
|
92
|
-
abstract contract ProductModule is
|
93
|
-
IProductModule
|
94
|
-
{
|
126
|
+
abstract contract ProductModule is IProductModule {
|
95
127
|
IProductService private _productService;
|
96
128
|
|
97
129
|
constructor(address productService) {
|
98
130
|
_productService = IProductService(productService);
|
99
131
|
}
|
100
132
|
|
101
|
-
function getProductService() external view returns(IProductService) {
|
133
|
+
function getProductService() external view returns (IProductService) {
|
102
134
|
return _productService;
|
103
135
|
}
|
104
|
-
|
105
|
-
}
|
136
|
+
}
|
@@ -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
|
+
}
|
@@ -0,0 +1,135 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.19;
|
3
|
+
|
4
|
+
import {ERC721, ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
|
5
|
+
import {IChainNft} from "./IChainNft.sol";
|
6
|
+
|
7
|
+
contract ChainNft is ERC721Enumerable, IChainNft {
|
8
|
+
string public constant NAME = "Dezentralized Insurance Protocol Registry";
|
9
|
+
string public constant SYMBOL = "DIPR";
|
10
|
+
|
11
|
+
// remember token uri
|
12
|
+
mapping(uint256 tokenId => string uri) private _uri;
|
13
|
+
|
14
|
+
// remember registry
|
15
|
+
address private _registry;
|
16
|
+
|
17
|
+
// only used for _getNextTokenId
|
18
|
+
uint256 internal _chainIdInt;
|
19
|
+
uint256 internal _chainIdDigits;
|
20
|
+
uint256 internal _chainIdMultiplier;
|
21
|
+
uint256 internal _idNext;
|
22
|
+
uint256 internal _totalMinted;
|
23
|
+
|
24
|
+
modifier onlyRegistry() {
|
25
|
+
require(msg.sender == _registry, "ERROR:NFT-001:CALLER_NOT_REGISTRY");
|
26
|
+
_;
|
27
|
+
}
|
28
|
+
|
29
|
+
constructor(address registry) ERC721(NAME, SYMBOL) {
|
30
|
+
require(registry != address(0), "ERROR:NFT-010:REGISTRY_ZERO");
|
31
|
+
|
32
|
+
_registry = registry;
|
33
|
+
|
34
|
+
_chainIdInt = block.chainid;
|
35
|
+
_chainIdDigits = _countDigits(_chainIdInt);
|
36
|
+
_chainIdMultiplier = 10 ** _chainIdDigits;
|
37
|
+
|
38
|
+
// on mainnet/goerli start /1 (reserved for protocol nft) on other chains with 2
|
39
|
+
if (block.chainid == 1 || block.chainid == 5) {
|
40
|
+
_idNext = 1;
|
41
|
+
} else {
|
42
|
+
_idNext = 2;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
function mint(
|
47
|
+
address to,
|
48
|
+
string memory uri
|
49
|
+
) external override onlyRegistry returns (uint256 tokenId) {
|
50
|
+
tokenId = _getNextTokenId();
|
51
|
+
_totalMinted++;
|
52
|
+
|
53
|
+
_safeMint(to, tokenId);
|
54
|
+
|
55
|
+
if (bytes(uri).length > 0) {
|
56
|
+
_uri[tokenId] = uri;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
function burn(uint256 tokenId) external override onlyRegistry {
|
61
|
+
_requireMinted(tokenId);
|
62
|
+
_burn(tokenId);
|
63
|
+
delete _uri[tokenId];
|
64
|
+
}
|
65
|
+
|
66
|
+
function setURI(
|
67
|
+
uint256 tokenId,
|
68
|
+
string memory uri
|
69
|
+
) external override onlyRegistry {
|
70
|
+
require(bytes(uri).length > 0, "ERROR:CRG-011:URI_EMPTY");
|
71
|
+
|
72
|
+
_requireMinted(tokenId);
|
73
|
+
_uri[tokenId] = uri;
|
74
|
+
}
|
75
|
+
|
76
|
+
function exists(uint256 tokenId) external view override returns (bool) {
|
77
|
+
return _exists(tokenId);
|
78
|
+
}
|
79
|
+
|
80
|
+
function tokenURI(
|
81
|
+
uint256 tokenId
|
82
|
+
) public view override returns (string memory) {
|
83
|
+
_requireMinted(tokenId);
|
84
|
+
return _uri[tokenId];
|
85
|
+
}
|
86
|
+
|
87
|
+
function getRegistryAddress() external view override returns (address) {
|
88
|
+
return _registry;
|
89
|
+
}
|
90
|
+
|
91
|
+
function totalMinted() external view override returns (uint256) {
|
92
|
+
return _totalMinted;
|
93
|
+
}
|
94
|
+
|
95
|
+
// requirement: each chain registry produces token ids that
|
96
|
+
// are guaranteed to not collide with any token id genereated
|
97
|
+
// on a different chain
|
98
|
+
//
|
99
|
+
// format concat(counter,chainid,2 digits for len-of-chain-id)
|
100
|
+
// restriction chainid up to 99 digits
|
101
|
+
// decode: from right to left:
|
102
|
+
// - 2 right most digits encode length of chainid
|
103
|
+
// - move number of digits to left as determined above (-> chainid)
|
104
|
+
// - the reminder to the left is the counter
|
105
|
+
// examples
|
106
|
+
// 1101
|
107
|
+
// ^^ ^
|
108
|
+
// || +- 1-digit chain id
|
109
|
+
// |+-- chain id = 1 (mainnet)
|
110
|
+
// +-- 1st token id on mainnet
|
111
|
+
// (1 * 10 ** 1 + 1) * 100 + 1
|
112
|
+
// 42987654321010
|
113
|
+
// ^ ^ ^
|
114
|
+
// | | +- 10-digit chain id
|
115
|
+
// | +-- chain id = 9876543210 (hypothetical chainid)
|
116
|
+
// +-- 42nd token id on this chain
|
117
|
+
// (42 * 10 ** 10 + 9876543210) * 100 + 10
|
118
|
+
// (index * 10 ** digits + chainid) * 100 + digits (1 < digits < 100)
|
119
|
+
|
120
|
+
function _getNextTokenId() private returns (uint256 id) {
|
121
|
+
id =
|
122
|
+
(_idNext * _chainIdMultiplier + _chainIdInt) *
|
123
|
+
100 +
|
124
|
+
_chainIdDigits;
|
125
|
+
_idNext++;
|
126
|
+
}
|
127
|
+
|
128
|
+
function _countDigits(uint256 num) private pure returns (uint256 count) {
|
129
|
+
count = 0;
|
130
|
+
while (num != 0) {
|
131
|
+
count++;
|
132
|
+
num /= 10;
|
133
|
+
}
|
134
|
+
}
|
135
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
2
|
+
pragma solidity ^0.8.19;
|
3
|
+
|
4
|
+
import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
|
5
|
+
|
6
|
+
interface IChainNft is IERC721Enumerable {
|
7
|
+
function mint(
|
8
|
+
address to,
|
9
|
+
string memory uri
|
10
|
+
) external returns (uint256 tokenId);
|
11
|
+
|
12
|
+
function burn(uint256 tokenId) external;
|
13
|
+
|
14
|
+
function setURI(uint256 tokenId, string memory uri) external;
|
15
|
+
|
16
|
+
function exists(uint256 tokenId) external view returns (bool);
|
17
|
+
|
18
|
+
function totalMinted() external view returns (uint256);
|
19
|
+
|
20
|
+
function getRegistryAddress() external view returns (address registry);
|
21
|
+
}
|