@etherisc/gif-next 0.0.2-b9b3e89 → 0.0.2-c4efd5e
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 +25 -0
- package/artifacts/contracts/components/Component.sol/Component.dbg.json +1 -1
- package/artifacts/contracts/components/Component.sol/Component.json +7 -7
- 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 +6 -6
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.dbg.json +1 -1
- package/artifacts/contracts/components/IProduct.sol/IProductComponent.json +8 -8
- package/artifacts/contracts/components/Pool.sol/Pool.dbg.json +1 -1
- package/artifacts/contracts/components/Pool.sol/Pool.json +29 -11
- package/artifacts/contracts/components/Product.sol/Product.dbg.json +1 -1
- package/artifacts/contracts/components/Product.sol/Product.json +31 -13
- 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 +4 -0
- package/artifacts/contracts/experiment/inheritance/A.sol/A.json +128 -0
- package/artifacts/contracts/experiment/inheritance/A.sol/AShared.dbg.json +4 -0
- package/artifacts/contracts/experiment/inheritance/A.sol/AShared.json +42 -0
- package/artifacts/contracts/experiment/inheritance/B.sol/B.dbg.json +4 -0
- package/artifacts/contracts/experiment/inheritance/B.sol/B.json +76 -0
- package/artifacts/contracts/experiment/inheritance/C.sol/C.dbg.json +4 -0
- package/artifacts/contracts/experiment/inheritance/C.sol/C.json +89 -0
- package/artifacts/contracts/experiment/inheritance/IA.sol/IA.dbg.json +4 -0
- package/artifacts/contracts/experiment/inheritance/IA.sol/IA.json +128 -0
- package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.dbg.json +4 -0
- package/artifacts/contracts/experiment/inheritance/IA.sol/ISharedA.json +37 -0
- package/artifacts/contracts/experiment/inheritance/IB.sol/IB.dbg.json +4 -0
- package/artifacts/contracts/experiment/inheritance/IB.sol/IB.json +50 -0
- package/artifacts/contracts/experiment/inheritance/IC.sol/IC.dbg.json +4 -0
- package/artifacts/contracts/experiment/inheritance/IC.sol/IC.json +63 -0
- package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.dbg.json +4 -0
- package/artifacts/contracts/experiment/types/TypeA.sol/TypeALib.json +10 -0
- package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.dbg.json +4 -0
- package/artifacts/contracts/experiment/types/TypeB.sol/TypeBLib.json +10 -0
- package/artifacts/contracts/instance/IInstance.sol/IInstance.dbg.json +1 -1
- package/artifacts/contracts/instance/IInstance.sol/IInstance.json +60 -60
- package/artifacts/contracts/instance/Instance.sol/Instance.dbg.json +1 -1
- package/artifacts/contracts/instance/Instance.sol/Instance.json +122 -64
- 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 +24 -24
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/component/ComponentModule.sol/ComponentOwnerService.json +48 -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 +6 -6
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.dbg.json +1 -1
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentModule.json +26 -26
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.dbg.json +1 -1
- package/artifacts/contracts/instance/component/IComponent.sol/IComponentOwnerService.json +3 -3
- package/artifacts/contracts/instance/component/IComponent.sol/IInstanceLinked.dbg.json +1 -1
- 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 +18 -18
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.dbg.json +1 -1
- package/artifacts/contracts/instance/policy/PolicyModule.sol/PolicyModule.json +18 -18
- 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 +10 -10
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.dbg.json +1 -1
- package/artifacts/contracts/instance/pool/PoolModule.sol/PoolModule.json +10 -10
- 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 +8 -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 +54 -12
- 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 +6 -6
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.dbg.json +1 -1
- package/artifacts/contracts/registry/IRegistry.sol/IRegistry.json +41 -33
- 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 +7 -7
- package/artifacts/contracts/registry/Registry.sol/Registry.dbg.json +1 -1
- package/artifacts/contracts/registry/Registry.sol/Registry.json +100 -42
- 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 +4 -0
- package/artifacts/contracts/types/ChainId.sol/ChainIdLib.json +10 -0
- 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/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 +17 -19
- package/contracts/components/IPool.sol +3 -3
- package/contracts/components/IProduct.sol +4 -6
- package/contracts/components/Pool.sol +6 -13
- package/contracts/components/Product.sol +12 -22
- package/contracts/experiment/errors/Require.sol +38 -0
- package/contracts/experiment/errors/Revert.sol +44 -0
- package/contracts/experiment/inheritance/A.sol +53 -0
- package/contracts/experiment/inheritance/B.sol +28 -0
- package/contracts/experiment/inheritance/C.sol +34 -0
- package/contracts/experiment/inheritance/IA.sol +13 -0
- package/contracts/experiment/inheritance/IB.sol +10 -0
- package/contracts/experiment/inheritance/IC.sol +12 -0
- package/contracts/experiment/types/TypeA.sol +47 -0
- package/contracts/experiment/types/TypeB.sol +29 -0
- package/contracts/instance/IInstance.sol +4 -6
- package/contracts/instance/Instance.sol +15 -14
- package/contracts/instance/access/Access.sol +63 -116
- package/contracts/instance/access/IAccess.sol +28 -48
- package/contracts/instance/component/ComponentModule.sol +84 -130
- package/contracts/instance/component/IComponent.sol +32 -53
- package/contracts/instance/policy/IPolicy.sol +12 -27
- package/contracts/instance/policy/PolicyModule.sol +25 -40
- package/contracts/instance/pool/IPoolModule.sol +10 -21
- package/contracts/instance/pool/PoolModule.sol +28 -38
- package/contracts/instance/product/IProductService.sol +9 -18
- package/contracts/instance/product/ProductService.sol +54 -47
- package/contracts/registry/ChainNft.sol +135 -0
- package/contracts/registry/IChainNft.sol +21 -0
- package/contracts/registry/IRegistry.sol +52 -38
- package/contracts/registry/Registry.sol +107 -95
- package/contracts/types/Blocknumber.sol +118 -0
- package/contracts/types/ChainId.sol +38 -0
- package/contracts/types/NftId.sol +51 -0
- package/contracts/types/Timestamp.sol +102 -0
- package/contracts/types/UFixed.sol +205 -0
- package/package.json +7 -3
@@ -1,27 +1,27 @@
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
2
2
|
pragma solidity ^0.8.19;
|
3
3
|
|
4
|
-
|
5
4
|
// import {IOwnable, IRegistryLinked, IRegisterable} from "../../registry/IRegistry.sol";
|
6
5
|
import {IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
|
7
6
|
|
8
7
|
import {IProductService} from "../product/IProductService.sol";
|
9
8
|
import {IPolicy, IPolicyModule} from "./IPolicy.sol";
|
9
|
+
import {NftId, NftIdLib} from "../../types/NftId.sol";
|
10
10
|
|
11
|
+
abstract contract PolicyModule is IRegistryLinked, IPolicyModule {
|
12
|
+
using NftIdLib for NftId;
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
IPolicyModule
|
15
|
-
{
|
16
|
-
|
17
|
-
mapping(uint256 nftId => PolicyInfo info) private _policyInfo;
|
18
|
-
mapping(uint256 nftId => uint256 bundleNftId) private _bundleForPolicy;
|
14
|
+
mapping(NftId nftId => PolicyInfo info) private _policyInfo;
|
15
|
+
mapping(NftId nftId => NftId bundleNftId) private _bundleForPolicy;
|
19
16
|
|
20
17
|
IProductService private _productService;
|
21
18
|
|
22
19
|
// TODO find a better place to avoid dupliation
|
23
20
|
modifier onlyProductService2() {
|
24
|
-
require(
|
21
|
+
require(
|
22
|
+
address(_productService) == msg.sender,
|
23
|
+
"ERROR:POL-001:NOT_PRODUCT_SERVICE"
|
24
|
+
);
|
25
25
|
_;
|
26
26
|
}
|
27
27
|
|
@@ -29,30 +29,27 @@ abstract contract PolicyModule is
|
|
29
29
|
_productService = IProductService(productService);
|
30
30
|
}
|
31
31
|
|
32
|
-
|
33
32
|
function createApplication(
|
34
33
|
IRegistry.RegistryInfo memory productInfo,
|
35
34
|
address applicationOwner,
|
36
35
|
uint256 sumInsuredAmount,
|
37
36
|
uint256 premiumAmount,
|
38
37
|
uint256 lifetime,
|
39
|
-
|
40
|
-
)
|
41
|
-
external
|
42
|
-
override
|
43
|
-
onlyProductService2
|
44
|
-
returns(uint256 nftId)
|
45
|
-
{
|
38
|
+
NftId bundleNftId
|
39
|
+
) external override onlyProductService2 returns (NftId nftId) {
|
46
40
|
// TODO add parameter validation
|
47
|
-
if(bundleNftId
|
48
|
-
IRegistry.RegistryInfo memory bundleInfo = this
|
49
|
-
|
41
|
+
if (bundleNftId.gtz()) {
|
42
|
+
IRegistry.RegistryInfo memory bundleInfo = this
|
43
|
+
.getRegistry()
|
44
|
+
.getInfo(bundleNftId);
|
45
|
+
// IRegistry.RegistryInfo memory poolInfo = this.getRegistry().getInfo(bundleInfo.parentNftId);
|
50
46
|
}
|
51
47
|
|
52
48
|
nftId = this.getRegistry().registerObjectForInstance(
|
53
49
|
productInfo.nftId,
|
54
50
|
this.getRegistry().POLICY(),
|
55
|
-
applicationOwner
|
51
|
+
applicationOwner
|
52
|
+
);
|
56
53
|
|
57
54
|
_policyInfo[nftId] = PolicyInfo(
|
58
55
|
nftId,
|
@@ -71,12 +68,7 @@ abstract contract PolicyModule is
|
|
71
68
|
// add logging
|
72
69
|
}
|
73
70
|
|
74
|
-
|
75
|
-
function activate(uint256 nftId)
|
76
|
-
external
|
77
|
-
override
|
78
|
-
onlyProductService2
|
79
|
-
{
|
71
|
+
function activate(NftId nftId) external override onlyProductService2 {
|
80
72
|
PolicyInfo storage info = _policyInfo[nftId];
|
81
73
|
info.activatedAt = block.timestamp;
|
82
74
|
info.expiredAt = block.timestamp + info.lifetime;
|
@@ -85,22 +77,15 @@ abstract contract PolicyModule is
|
|
85
77
|
// add logging
|
86
78
|
}
|
87
79
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
external
|
92
|
-
view
|
93
|
-
returns(uint256 bundleNft)
|
94
|
-
{
|
80
|
+
function getBundleNftForPolicy(
|
81
|
+
NftId nftId
|
82
|
+
) external view returns (NftId bundleNft) {
|
95
83
|
return _bundleForPolicy[nftId];
|
96
84
|
}
|
97
85
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
view
|
102
|
-
returns(PolicyInfo memory info)
|
103
|
-
{
|
86
|
+
function getPolicyInfo(
|
87
|
+
NftId nftId
|
88
|
+
) external view returns (PolicyInfo memory info) {
|
104
89
|
return _policyInfo[nftId];
|
105
90
|
}
|
106
91
|
}
|
@@ -2,11 +2,11 @@
|
|
2
2
|
pragma solidity ^0.8.19;
|
3
3
|
|
4
4
|
import {IOwnable, IRegistry, IRegistryLinked} from "../../registry/IRegistry.sol";
|
5
|
+
import {NftId} from "../../types/NftId.sol";
|
5
6
|
|
6
7
|
interface IPool {
|
7
|
-
|
8
8
|
struct PoolInfo {
|
9
|
-
|
9
|
+
NftId nftId;
|
10
10
|
address wallet;
|
11
11
|
address token;
|
12
12
|
uint256 capital;
|
@@ -14,27 +14,16 @@ interface IPool {
|
|
14
14
|
}
|
15
15
|
}
|
16
16
|
|
17
|
-
interface IPoolModule is
|
18
|
-
|
19
|
-
IRegistryLinked,
|
20
|
-
IPool
|
21
|
-
{
|
22
|
-
|
23
|
-
function underwrite(
|
24
|
-
uint256 poolNftId,
|
25
|
-
uint256 policyNftId
|
26
|
-
)
|
27
|
-
external;
|
17
|
+
interface IPoolModule is IOwnable, IRegistryLinked, IPool {
|
18
|
+
function underwrite(NftId poolNftId, NftId policyNftId) external;
|
28
19
|
|
29
20
|
function createPoolInfo(
|
30
|
-
|
21
|
+
NftId nftId,
|
31
22
|
address wallet,
|
32
23
|
address token
|
33
|
-
)
|
34
|
-
external;
|
24
|
+
) external;
|
35
25
|
|
36
|
-
function getPoolInfo(
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
}
|
26
|
+
function getPoolInfo(
|
27
|
+
NftId nftId
|
28
|
+
) external view returns (PoolInfo memory info);
|
29
|
+
}
|
@@ -5,18 +5,22 @@ 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
7
|
import {IPoolModule} from "./IPoolModule.sol";
|
8
|
+
import {NftId, NftIdLib} from "../../types/NftId.sol";
|
8
9
|
|
9
|
-
abstract contract PoolModule is
|
10
|
-
|
11
|
-
{
|
12
|
-
uint256 public constant INITIAL_CAPITAL = 10000*10**6;
|
10
|
+
abstract contract PoolModule is IPoolModule {
|
11
|
+
using NftIdLib for NftId;
|
13
12
|
|
14
|
-
|
13
|
+
uint256 public constant INITIAL_CAPITAL = 10000 * 10 ** 6;
|
14
|
+
|
15
|
+
mapping(NftId nftId => PoolInfo info) private _poolInfo;
|
15
16
|
|
16
17
|
IProductService private _productService;
|
17
18
|
|
18
19
|
modifier onlyProductService() {
|
19
|
-
require(
|
20
|
+
require(
|
21
|
+
address(_productService) == msg.sender,
|
22
|
+
"ERROR:POL-001:NOT_PRODUCT_SERVICE"
|
23
|
+
);
|
20
24
|
_;
|
21
25
|
}
|
22
26
|
|
@@ -25,16 +29,11 @@ abstract contract PoolModule is
|
|
25
29
|
}
|
26
30
|
|
27
31
|
function createPoolInfo(
|
28
|
-
|
32
|
+
NftId nftId,
|
29
33
|
address wallet,
|
30
34
|
address token
|
31
|
-
)
|
32
|
-
|
33
|
-
override
|
34
|
-
{
|
35
|
-
require(
|
36
|
-
_poolInfo[nftId].nftId == 0,
|
37
|
-
"ERROR:PL-001:ALREADY_CREATED");
|
35
|
+
) public override {
|
36
|
+
require(_poolInfo[nftId].nftId.eqz(), "ERROR:PL-001:ALREADY_CREATED");
|
38
37
|
|
39
38
|
_poolInfo[nftId] = PoolInfo(
|
40
39
|
nftId,
|
@@ -43,41 +42,32 @@ abstract contract PoolModule is
|
|
43
42
|
INITIAL_CAPITAL,
|
44
43
|
0 // locked capital
|
45
44
|
);
|
46
|
-
|
47
45
|
}
|
48
46
|
|
49
|
-
|
50
47
|
function underwrite(
|
51
|
-
|
52
|
-
|
53
|
-
)
|
54
|
-
external
|
55
|
-
override
|
56
|
-
onlyProductService
|
57
|
-
{
|
48
|
+
NftId poolNftId,
|
49
|
+
NftId policyNftId
|
50
|
+
) external override onlyProductService {
|
58
51
|
PoolInfo storage poolInfo = _poolInfo[poolNftId];
|
59
|
-
require(
|
60
|
-
poolInfo.nftId == poolNftId,
|
61
|
-
"ERROR:PL-002:POOL_UNKNOWN");
|
52
|
+
require(poolInfo.nftId == poolNftId, "ERROR:PL-002:POOL_UNKNOWN");
|
62
53
|
|
63
54
|
IPolicyModule policyModule = IPolicyModule(address(this));
|
64
|
-
IPolicy.PolicyInfo memory policyInfo = policyModule.getPolicyInfo(
|
55
|
+
IPolicy.PolicyInfo memory policyInfo = policyModule.getPolicyInfo(
|
56
|
+
policyNftId
|
57
|
+
);
|
65
58
|
|
66
59
|
require(
|
67
|
-
poolInfo.capital - poolInfo.lockedCapital >=
|
68
|
-
|
60
|
+
poolInfo.capital - poolInfo.lockedCapital >=
|
61
|
+
policyInfo.sumInsuredAmount,
|
62
|
+
"ERROR:PL-003:CAPACITY_TOO_LOW"
|
63
|
+
);
|
69
64
|
|
70
65
|
poolInfo.lockedCapital += policyInfo.sumInsuredAmount;
|
71
66
|
}
|
72
67
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
view
|
77
|
-
override
|
78
|
-
returns(PoolInfo memory info)
|
79
|
-
{
|
68
|
+
function getPoolInfo(
|
69
|
+
NftId nftId
|
70
|
+
) external view override returns (PoolInfo memory info) {
|
80
71
|
info = _poolInfo[nftId];
|
81
72
|
}
|
82
|
-
|
83
|
-
}
|
73
|
+
}
|
@@ -1,32 +1,27 @@
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
2
2
|
pragma solidity ^0.8.19;
|
3
3
|
|
4
|
-
|
5
4
|
import {IOwnable, IRegistryLinked, IRegisterable} from "../../registry/IRegistry.sol";
|
6
5
|
import {IInstance} from "../IInstance.sol";
|
7
|
-
|
6
|
+
import {NftId} from "../../types/NftId.sol";
|
8
7
|
|
9
8
|
// TODO or name this IProtectionService to have Product be something more generic (loan, savings account, ...)
|
10
|
-
interface IProductService is
|
11
|
-
IRegistryLinked
|
12
|
-
{
|
13
|
-
|
9
|
+
interface IProductService is IRegistryLinked {
|
14
10
|
function createApplication(
|
15
11
|
address applicationOwner,
|
16
12
|
uint256 sumInsuredAmount,
|
17
13
|
uint256 premiumAmount,
|
18
14
|
uint256 lifetime,
|
19
|
-
|
20
|
-
)
|
21
|
-
external
|
22
|
-
returns(uint256 nftId);
|
15
|
+
NftId bundleNftId
|
16
|
+
) external returns (NftId nftId);
|
23
17
|
|
24
18
|
// function revoke(unit256 nftId) external;
|
25
19
|
|
26
|
-
function underwrite(
|
20
|
+
function underwrite(NftId nftId) external;
|
21
|
+
|
27
22
|
// function decline(uint256 nftId) external;
|
28
23
|
// function expire(uint256 nftId) external;
|
29
|
-
function close(
|
24
|
+
function close(NftId nftId) external;
|
30
25
|
|
31
26
|
// function collectPremium(uint256 nftId, uint256 premiumAmount) external;
|
32
27
|
|
@@ -36,10 +31,6 @@ interface IProductService is
|
|
36
31
|
// function closeClaim(uint256 nftId, uint256 claimId) external;
|
37
32
|
}
|
38
33
|
|
39
|
-
|
40
|
-
|
41
|
-
IOwnable,
|
42
|
-
IRegistryLinked
|
43
|
-
{
|
44
|
-
function getProductService() external view returns(IProductService);
|
34
|
+
interface IProductModule is IOwnable, IRegistryLinked {
|
35
|
+
function getProductService() external view returns (IProductService);
|
45
36
|
}
|
@@ -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";
|
@@ -11,37 +10,40 @@ import {RegistryLinked} from "../../registry/Registry.sol";
|
|
11
10
|
import {IProductService, IProductModule} from "./IProductService.sol";
|
12
11
|
import {IComponentModule} from "../../instance/component/IComponent.sol";
|
13
12
|
import {IPoolModule} from "../../instance/pool/IPoolModule.sol";
|
13
|
+
import {NftId, NftIdLib} from "../../types/NftId.sol";
|
14
14
|
|
15
15
|
// 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
|
-
{ }
|
16
|
+
contract ProductService is RegistryLinked, IProductService {
|
17
|
+
using NftIdLib for NftId;
|
23
18
|
|
19
|
+
constructor(address registry) RegistryLinked(registry) {}
|
24
20
|
|
25
21
|
function createApplication(
|
26
22
|
address applicationOwner,
|
27
23
|
uint256 sumInsuredAmount,
|
28
24
|
uint256 premiumAmount,
|
29
25
|
uint256 lifetime,
|
30
|
-
|
31
|
-
)
|
32
|
-
external
|
33
|
-
override
|
34
|
-
returns(uint256 nftId)
|
35
|
-
{
|
26
|
+
NftId bundleNftId
|
27
|
+
) external override returns (NftId nftId) {
|
36
28
|
// same as only registered product
|
37
|
-
|
38
|
-
require(productNftId
|
39
|
-
IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
29
|
+
NftId productNftId = _registry.getNftId(msg.sender);
|
30
|
+
require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
|
31
|
+
IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
|
32
|
+
productNftId
|
33
|
+
);
|
34
|
+
require(
|
35
|
+
productInfo.objectType == _registry.PRODUCT(),
|
36
|
+
"ERROR_NOT_PRODUCT"
|
37
|
+
);
|
38
|
+
|
39
|
+
IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
|
40
|
+
productInfo.parentNftId
|
41
|
+
);
|
42
|
+
require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
|
43
|
+
require(
|
44
|
+
instanceInfo.objectType == _registry.INSTANCE(),
|
45
|
+
"ERROR_NOT_INSTANCE"
|
46
|
+
);
|
45
47
|
|
46
48
|
IPolicyModule policyModule = IPolicyModule(instanceInfo.objectAddress);
|
47
49
|
nftId = policyModule.createApplication(
|
@@ -50,34 +52,42 @@ 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
|
-
external
|
60
|
-
override
|
61
|
-
{
|
61
|
+
function underwrite(NftId nftId) external override {
|
62
62
|
// same as only registered product
|
63
|
-
|
64
|
-
require(productNftId
|
65
|
-
IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
63
|
+
NftId productNftId = _registry.getNftId(msg.sender);
|
64
|
+
require(productNftId.gtz(), "ERROR_PRODUCT_UNKNOWN");
|
65
|
+
IRegistry.RegistryInfo memory productInfo = _registry.getInfo(
|
66
|
+
productNftId
|
67
|
+
);
|
68
|
+
require(
|
69
|
+
productInfo.objectType == _registry.PRODUCT(),
|
70
|
+
"ERROR_NOT_PRODUCT"
|
71
|
+
);
|
72
|
+
|
73
|
+
IRegistry.RegistryInfo memory instanceInfo = _registry.getInfo(
|
74
|
+
productInfo.parentNftId
|
75
|
+
);
|
76
|
+
require(instanceInfo.nftId.gtz(), "ERROR_INSTANCE_UNKNOWN");
|
77
|
+
require(
|
78
|
+
instanceInfo.objectType == _registry.INSTANCE(),
|
79
|
+
"ERROR_NOT_INSTANCE"
|
80
|
+
);
|
71
81
|
|
72
82
|
// get responsible pool
|
73
|
-
IComponentModule componentModule = IComponentModule(
|
74
|
-
|
83
|
+
IComponentModule componentModule = IComponentModule(
|
84
|
+
instanceInfo.objectAddress
|
85
|
+
);
|
86
|
+
NftId poolNftId = componentModule.getPoolNftId(productNftId);
|
75
87
|
|
76
88
|
// lock capital (and update pool accounting)
|
77
89
|
IPoolModule poolModule = IPoolModule(instanceInfo.objectAddress);
|
78
|
-
poolModule.underwrite(
|
79
|
-
poolNftId,
|
80
|
-
nftId);
|
90
|
+
poolModule.underwrite(poolNftId, nftId);
|
81
91
|
|
82
92
|
// activate policy
|
83
93
|
IPolicyModule policyModule = IPolicyModule(instanceInfo.objectAddress);
|
@@ -86,20 +96,17 @@ contract ProductService is
|
|
86
96
|
// add logging
|
87
97
|
}
|
88
98
|
|
89
|
-
function close(
|
99
|
+
function close(NftId nftId) external override {}
|
90
100
|
}
|
91
101
|
|
92
|
-
abstract contract ProductModule is
|
93
|
-
IProductModule
|
94
|
-
{
|
102
|
+
abstract contract ProductModule is IProductModule {
|
95
103
|
IProductService private _productService;
|
96
104
|
|
97
105
|
constructor(address productService) {
|
98
106
|
_productService = IProductService(productService);
|
99
107
|
}
|
100
108
|
|
101
|
-
function getProductService() external view returns(IProductService) {
|
109
|
+
function getProductService() external view returns (IProductService) {
|
102
110
|
return _productService;
|
103
111
|
}
|
104
|
-
|
105
|
-
}
|
112
|
+
}
|
@@ -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
|
+
}
|