@super-protocol/sdk-js 3.4.0-beta.7 → 3.4.0-beta.8
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Encryption, StorageProviderResource } from '@super-protocol/dto-js';
|
|
2
|
-
import { BlockchainId, OfferInfo, OfferType, OrderArgs, OrderInfo, OrderStatus } from '../../types/index.js';
|
|
2
|
+
import { BlockchainId, OfferInfo, OfferType, OrderArgs, OrderInfo, OrderStatus, VersionedOfferId } from '../../types/index.js';
|
|
3
3
|
export type SolutionOfferProperties = {
|
|
4
4
|
portForwarding?: number;
|
|
5
5
|
groupingOffers?: boolean;
|
|
@@ -19,7 +19,7 @@ export type ValidateOrderParams = {
|
|
|
19
19
|
};
|
|
20
20
|
export type ValidateOrderOptions = {
|
|
21
21
|
isRestrictedByOfferType: (offerId: BlockchainId, type: OfferType) => Promise<boolean>;
|
|
22
|
-
isRestrictionsPermitThatOffer: (offerId: BlockchainId, otherOfferId:
|
|
22
|
+
isRestrictionsPermitThatOffer: (offerId: BlockchainId, otherOfferId: VersionedOfferId) => Promise<boolean>;
|
|
23
23
|
};
|
|
24
24
|
type TerminatedOrderStatus = OrderStatus.Done | OrderStatus.Canceled | OrderStatus.Error;
|
|
25
25
|
export type CompleteOrderParams = {
|
|
@@ -13,7 +13,7 @@ const defaultOptions = {
|
|
|
13
13
|
return new Offer_js_1.default(offerId).isRestrictedByOfferType(type);
|
|
14
14
|
},
|
|
15
15
|
isRestrictionsPermitThatOffer(offerId, otherOfferId) {
|
|
16
|
-
return new Offer_js_1.default(offerId).isRestrictionsPermitThatOffer(otherOfferId);
|
|
16
|
+
return new Offer_js_1.default(offerId).isRestrictionsPermitThatOffer(otherOfferId.id, otherOfferId.version);
|
|
17
17
|
},
|
|
18
18
|
};
|
|
19
19
|
const validatePort = (port) => {
|
|
@@ -50,21 +50,30 @@ const validateOrder = async (params, options = defaultOptions) => {
|
|
|
50
50
|
if (!params.parentOrder)
|
|
51
51
|
throw Error('Offer restricted by TEE, but no parent offer found');
|
|
52
52
|
// Check if parent offer complies with restrictions
|
|
53
|
-
const
|
|
53
|
+
const parentOrderOfferId = {
|
|
54
|
+
id: params.parentOrder.offerId,
|
|
55
|
+
version: 0,
|
|
56
|
+
};
|
|
57
|
+
const restrictionsPermitParentOffer = await options.isRestrictionsPermitThatOffer(params.order.offerId, parentOrderOfferId);
|
|
54
58
|
if (!restrictionsPermitParentOffer)
|
|
55
59
|
throw Error("Parent TEE offer doesn't comply with restrictions");
|
|
56
60
|
if (params.parentOrder.offerType !== index_js_1.OfferType.TeeOffer)
|
|
57
61
|
throw Error('Offer restricted by TEE, but parent offer is not TEE');
|
|
58
62
|
// Check if each input offer (from parent order) complies with restrictions
|
|
59
63
|
const inputOffersTypes = new Map();
|
|
60
|
-
await Promise.all(params.parentOrder.orderArgs.inputOffersIds.map(async (
|
|
61
|
-
if (
|
|
64
|
+
await Promise.all(params.parentOrder.orderArgs.inputOffersIds.map(async (inputOfferId, index) => {
|
|
65
|
+
if (inputOfferId === params.order.offerId)
|
|
62
66
|
return true;
|
|
63
|
-
const
|
|
64
|
-
inputOffersTypes.set(
|
|
65
|
-
const
|
|
67
|
+
const offerType = await new Offer_js_1.default(inputOfferId).getOfferType();
|
|
68
|
+
inputOffersTypes.set(offerType, true);
|
|
69
|
+
const inputOfferVersion = params.parentOrder.orderArgs.inputOffersVersions[index];
|
|
70
|
+
const otherInputOfferId = {
|
|
71
|
+
id: inputOfferId,
|
|
72
|
+
version: inputOfferVersion,
|
|
73
|
+
};
|
|
74
|
+
const restrictionsPermitParentOffer = await options.isRestrictionsPermitThatOffer(params.order.offerId, otherInputOfferId);
|
|
66
75
|
if (!restrictionsPermitParentOffer)
|
|
67
|
-
throw Error(`TEE input offer
|
|
76
|
+
throw Error(`TEE input offer doesn't comply with restrictions (inputOfferId=${inputOfferId}, inputOfferVersion=${inputOfferVersion}, offerType=${offerType}, parentOrderOfferId=${params.parentOrder?.offerId})`);
|
|
68
77
|
}));
|
|
69
78
|
// Check if all required (by restrictions) offer types exist in input offers (from parent order)
|
|
70
79
|
params.order.offerInfo.restrictions.types.forEach((type) => {
|
|
@@ -75,4 +84,4 @@ const validateOrder = async (params, options = defaultOptions) => {
|
|
|
75
84
|
});
|
|
76
85
|
};
|
|
77
86
|
exports.validateOrder = validateOrder;
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvb3JkZXIvdmFsaWRhdGUtb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWdEO0FBQ2hELHFFQUEwQztBQUMxQyxtREFBK0U7QUFHL0UsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLHlCQUFVLENBQUMsQ0FBQztBQUU5QyxNQUFNLGNBQWMsR0FBeUI7SUFDM0MsdUJBQXVCLENBQUMsT0FBZSxFQUFFLElBQWU7UUFDdEQsT0FBTyxJQUFJLGtCQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELDZCQUE2QixDQUFDLE9BQWUsRUFBRSxZQUE4QjtRQUMzRSxPQUFPLElBQUksa0JBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRyxDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBcUIsRUFBVSxFQUFFO0lBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLFVBQVUsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUMzRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLFVBQVUsaUNBQWlDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsT0FBTyxVQUFVLENB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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Encryption, StorageProviderResource } from '@super-protocol/dto-js';
|
|
2
|
-
import { BlockchainId, OfferInfo, OfferType, OrderArgs, OrderInfo, OrderStatus } from '../../types/index.js';
|
|
2
|
+
import { BlockchainId, OfferInfo, OfferType, OrderArgs, OrderInfo, OrderStatus, VersionedOfferId } from '../../types/index.js';
|
|
3
3
|
export type SolutionOfferProperties = {
|
|
4
4
|
portForwarding?: number;
|
|
5
5
|
groupingOffers?: boolean;
|
|
@@ -19,7 +19,7 @@ export type ValidateOrderParams = {
|
|
|
19
19
|
};
|
|
20
20
|
export type ValidateOrderOptions = {
|
|
21
21
|
isRestrictedByOfferType: (offerId: BlockchainId, type: OfferType) => Promise<boolean>;
|
|
22
|
-
isRestrictionsPermitThatOffer: (offerId: BlockchainId, otherOfferId:
|
|
22
|
+
isRestrictionsPermitThatOffer: (offerId: BlockchainId, otherOfferId: VersionedOfferId) => Promise<boolean>;
|
|
23
23
|
};
|
|
24
24
|
type TerminatedOrderStatus = OrderStatus.Done | OrderStatus.Canceled | OrderStatus.Error;
|
|
25
25
|
export type CompleteOrderParams = {
|
|
@@ -7,7 +7,7 @@ const defaultOptions = {
|
|
|
7
7
|
return new Offer(offerId).isRestrictedByOfferType(type);
|
|
8
8
|
},
|
|
9
9
|
isRestrictionsPermitThatOffer(offerId, otherOfferId) {
|
|
10
|
-
return new Offer(offerId).isRestrictionsPermitThatOffer(otherOfferId);
|
|
10
|
+
return new Offer(offerId).isRestrictionsPermitThatOffer(otherOfferId.id, otherOfferId.version);
|
|
11
11
|
},
|
|
12
12
|
};
|
|
13
13
|
const validatePort = (port) => {
|
|
@@ -44,21 +44,30 @@ export const validateOrder = async (params, options = defaultOptions) => {
|
|
|
44
44
|
if (!params.parentOrder)
|
|
45
45
|
throw Error('Offer restricted by TEE, but no parent offer found');
|
|
46
46
|
// Check if parent offer complies with restrictions
|
|
47
|
-
const
|
|
47
|
+
const parentOrderOfferId = {
|
|
48
|
+
id: params.parentOrder.offerId,
|
|
49
|
+
version: 0,
|
|
50
|
+
};
|
|
51
|
+
const restrictionsPermitParentOffer = await options.isRestrictionsPermitThatOffer(params.order.offerId, parentOrderOfferId);
|
|
48
52
|
if (!restrictionsPermitParentOffer)
|
|
49
53
|
throw Error("Parent TEE offer doesn't comply with restrictions");
|
|
50
54
|
if (params.parentOrder.offerType !== OfferType.TeeOffer)
|
|
51
55
|
throw Error('Offer restricted by TEE, but parent offer is not TEE');
|
|
52
56
|
// Check if each input offer (from parent order) complies with restrictions
|
|
53
57
|
const inputOffersTypes = new Map();
|
|
54
|
-
await Promise.all(params.parentOrder.orderArgs.inputOffersIds.map(async (
|
|
55
|
-
if (
|
|
58
|
+
await Promise.all(params.parentOrder.orderArgs.inputOffersIds.map(async (inputOfferId, index) => {
|
|
59
|
+
if (inputOfferId === params.order.offerId)
|
|
56
60
|
return true;
|
|
57
|
-
const
|
|
58
|
-
inputOffersTypes.set(
|
|
59
|
-
const
|
|
61
|
+
const offerType = await new Offer(inputOfferId).getOfferType();
|
|
62
|
+
inputOffersTypes.set(offerType, true);
|
|
63
|
+
const inputOfferVersion = params.parentOrder.orderArgs.inputOffersVersions[index];
|
|
64
|
+
const otherInputOfferId = {
|
|
65
|
+
id: inputOfferId,
|
|
66
|
+
version: inputOfferVersion,
|
|
67
|
+
};
|
|
68
|
+
const restrictionsPermitParentOffer = await options.isRestrictionsPermitThatOffer(params.order.offerId, otherInputOfferId);
|
|
60
69
|
if (!restrictionsPermitParentOffer)
|
|
61
|
-
throw Error(`TEE input offer
|
|
70
|
+
throw Error(`TEE input offer doesn't comply with restrictions (inputOfferId=${inputOfferId}, inputOfferVersion=${inputOfferVersion}, offerType=${offerType}, parentOrderOfferId=${params.parentOrder?.offerId})`);
|
|
62
71
|
}));
|
|
63
72
|
// Check if all required (by restrictions) offer types exist in input offers (from parent order)
|
|
64
73
|
params.order.offerInfo.restrictions.types.forEach((type) => {
|
|
@@ -68,4 +77,4 @@ export const validateOrder = async (params, options = defaultOptions) => {
|
|
|
68
77
|
throw Error(`Offers with type ${type} not found in TEE input offers, but required by restrictions`);
|
|
69
78
|
});
|
|
70
79
|
};
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvb3JkZXIvdmFsaWRhdGUtb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxNQUFNLHVCQUF1QixDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRy9FLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUU5QyxNQUFNLGNBQWMsR0FBeUI7SUFDM0MsdUJBQXVCLENBQUMsT0FBZSxFQUFFLElBQWU7UUFDdEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsNkJBQTZCLENBQUMsT0FBZSxFQUFFLFlBQThCO1FBQzNFLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsNkJBQTZCLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakcsQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLElBQXFCLEVBQVUsRUFBRTtJQUNyRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxJQUFJLENBQUMsSUFBSSxVQUFVLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDM0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFD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
|