@ocap/asset 1.17.11 → 1.17.12
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/lib/index.d.ts +1 -0
- package/lib/index.js +21 -33
- package/package.json +12 -11
package/lib/index.d.ts
CHANGED
|
@@ -28,6 +28,7 @@ export declare type TPreMintResult = TMintResult & {
|
|
|
28
28
|
variables: TInputMap;
|
|
29
29
|
issuer: TIssuerInput;
|
|
30
30
|
};
|
|
31
|
+
export declare const isValidNotation: (notation: string) => boolean;
|
|
31
32
|
export declare const isValidHook: (hook: THook, quota?: $TSFixMe, throwOnError?: boolean) => boolean;
|
|
32
33
|
export declare const isValidFactory: (props: $TSFixMe) => boolean;
|
|
33
34
|
/**
|
package/lib/index.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.formatFactoryState = exports.preMintFromFactory = exports.mintFromFactory = exports.findPrerenderKeys = exports.isValidFactory = exports.isValidHook = void 0;
|
|
6
|
+
exports.formatFactoryState = exports.preMintFromFactory = exports.mintFromFactory = exports.findPrerenderKeys = exports.isValidFactory = exports.isValidHook = exports.isValidNotation = void 0;
|
|
7
7
|
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
8
8
|
const get_1 = __importDefault(require("lodash/get"));
|
|
9
9
|
const set_1 = __importDefault(require("lodash/set"));
|
|
@@ -16,6 +16,7 @@ const is_absolute_url_1 = __importDefault(require("is-absolute-url"));
|
|
|
16
16
|
const cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
|
|
17
17
|
const did_1 = require("@arcblock/did");
|
|
18
18
|
const vc_1 = require("@arcblock/vc");
|
|
19
|
+
const validator_1 = require("@arcblock/validator");
|
|
19
20
|
const did_util_1 = require("@arcblock/did-util");
|
|
20
21
|
const mcrypto_1 = require("@ocap/mcrypto");
|
|
21
22
|
const util_1 = require("@ocap/util");
|
|
@@ -24,6 +25,8 @@ const debug_1 = __importDefault(require("debug"));
|
|
|
24
25
|
const debug = (0, debug_1.default)('@ocap/asset');
|
|
25
26
|
const SUPPORTED_HOOK_NAMES = ['mint', 'postMint'];
|
|
26
27
|
const SUPPORTED_HOOK_TYPES = ['contract', 'url'];
|
|
28
|
+
const isValidNotation = (notation) => ['ctx', 'data', 'input'].includes(notation.split('.').shift());
|
|
29
|
+
exports.isValidNotation = isValidNotation;
|
|
27
30
|
const isValidHook = (hook, quota, throwOnError = false) => {
|
|
28
31
|
if (SUPPORTED_HOOK_TYPES.includes(hook.type) === false) {
|
|
29
32
|
return false;
|
|
@@ -53,68 +56,53 @@ const isValidHook = (hook, quota, throwOnError = false) => {
|
|
|
53
56
|
return false;
|
|
54
57
|
};
|
|
55
58
|
exports.isValidHook = isValidHook;
|
|
56
|
-
// FIXME: we should use Joi to validate the schema
|
|
57
59
|
// @link https://github.com/improbable-eng/ts-protoc-gen
|
|
58
60
|
const isValidFactory = (props) => {
|
|
59
61
|
if (!props) {
|
|
60
62
|
throw new Error('Factory props should not be empty');
|
|
61
63
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
throw new Error(`Factory ${missingProp} prop should not be empty`);
|
|
66
|
-
}
|
|
67
|
-
if (['instant', 'periodic'].includes(props.settlement) === false) {
|
|
68
|
-
throw new Error('Factory settlement prop should only be instant or periodic');
|
|
64
|
+
const { value, error } = validator_1.schemas.factorySchema.validate(props);
|
|
65
|
+
if (error) {
|
|
66
|
+
throw new Error(`Invalid factory: ${error.details.map((x) => x.message).join(', ')}`);
|
|
69
67
|
}
|
|
70
68
|
// input.tokens and input.assets should not be empty
|
|
71
|
-
if (['
|
|
69
|
+
if (['tokens', 'assets'].every((x) => (0, isEmpty_1.default)(value.input[x])) && value.input.value <= 0) {
|
|
72
70
|
throw new Error('Factory input should contain at least one token or asset');
|
|
73
71
|
}
|
|
74
|
-
if ((0, uniqBy_1.default)(
|
|
72
|
+
if ((0, uniqBy_1.default)(value.input.tokens, 'address').length !== value.input.tokens.length) {
|
|
75
73
|
throw new Error('Factory token input should not contains duplicate address');
|
|
76
74
|
}
|
|
77
|
-
if ((0, uniq_1.default)(
|
|
75
|
+
if ((0, uniq_1.default)(value.input.assets).length !== value.input.assets.length) {
|
|
78
76
|
throw new Error('Factory asset input should not contains duplicate address');
|
|
79
77
|
}
|
|
80
|
-
for (const token of props.input.tokens) {
|
|
81
|
-
try {
|
|
82
|
-
// eslint-disable-next-line no-new
|
|
83
|
-
new util_1.BN(token.value);
|
|
84
|
-
}
|
|
85
|
-
catch (err) {
|
|
86
|
-
throw new Error(`Factory token ${token.address} is invalid: token value is not valid big number`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// validate output
|
|
90
|
-
if (!props.output || typeof props.output !== 'object') {
|
|
91
|
-
throw new Error('Factory output should be an object');
|
|
92
|
-
}
|
|
93
78
|
try {
|
|
94
79
|
// should be a valid mustache template when serialized as json
|
|
95
|
-
const template = JSON.stringify(
|
|
96
|
-
mustache_1.default.parse(template);
|
|
80
|
+
const template = JSON.stringify(value.output, null, 2);
|
|
81
|
+
const result = mustache_1.default.parse(template);
|
|
82
|
+
if (result.filter(([type]) => type === 'name').some(([, notation]) => (0, exports.isValidNotation)(notation) === false)) {
|
|
83
|
+
throw new Error('Invalid tags found in the output template');
|
|
84
|
+
}
|
|
97
85
|
}
|
|
98
86
|
catch (err) {
|
|
99
87
|
throw new Error('Factory output should be a valid mustache template when serialized as json');
|
|
100
88
|
}
|
|
101
89
|
// validate hooks
|
|
102
|
-
const quota = (0, contract_1.getQuota)(
|
|
103
|
-
if (Array.isArray(
|
|
104
|
-
const invalidHook =
|
|
90
|
+
const quota = (0, contract_1.getQuota)(value.input);
|
|
91
|
+
if (Array.isArray(value.hooks)) {
|
|
92
|
+
const invalidHook = value.hooks.find((x) => (0, exports.isValidHook)(x, quota, true) === false);
|
|
105
93
|
if (invalidHook) {
|
|
106
94
|
throw new Error(`Factory hook ${invalidHook.name} is invalid`);
|
|
107
95
|
}
|
|
108
96
|
}
|
|
109
97
|
// ensure input and hook are zero-sum for factories that consumes token
|
|
110
|
-
if (
|
|
98
|
+
if (value.settlement === 'instant') {
|
|
111
99
|
if (quota.value <= 0 && Object.keys(quota.tokens).every((x) => quota[x] <= 0)) {
|
|
112
100
|
return true;
|
|
113
101
|
}
|
|
114
|
-
if ((0, isEmpty_1.default)(
|
|
102
|
+
if ((0, isEmpty_1.default)(value.hooks)) {
|
|
115
103
|
throw new Error('Factory hooks should not be empty for instant settlement');
|
|
116
104
|
}
|
|
117
|
-
const mintHook =
|
|
105
|
+
const mintHook = value.hooks.find((x) => x.name === 'mint');
|
|
118
106
|
if (!mintHook) {
|
|
119
107
|
throw new Error('Factory hook mint should not be empty for instant settlement that consumes token');
|
|
120
108
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ocap/asset",
|
|
3
3
|
"description": "Utility to work with asset and factory on ArcBlock blockchain",
|
|
4
|
-
"version": "1.17.
|
|
4
|
+
"version": "1.17.12",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "wangshijun",
|
|
7
7
|
"email": "shijun@arcblock.io",
|
|
@@ -18,14 +18,15 @@
|
|
|
18
18
|
"wangshijun <shijun@arcblock.io> (https://github.com/wangshijun)"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@arcblock/did": "1.17.
|
|
22
|
-
"@arcblock/did-util": "1.17.
|
|
23
|
-
"@arcblock/
|
|
24
|
-
"@
|
|
25
|
-
"@ocap/
|
|
26
|
-
"@ocap/
|
|
27
|
-
"@ocap/
|
|
28
|
-
"@ocap/
|
|
21
|
+
"@arcblock/did": "1.17.12",
|
|
22
|
+
"@arcblock/did-util": "1.17.12",
|
|
23
|
+
"@arcblock/validator": "1.17.12",
|
|
24
|
+
"@arcblock/vc": "1.17.12",
|
|
25
|
+
"@ocap/contract": "1.17.12",
|
|
26
|
+
"@ocap/mcrypto": "1.17.12",
|
|
27
|
+
"@ocap/types": "1.17.12",
|
|
28
|
+
"@ocap/util": "1.17.12",
|
|
29
|
+
"@ocap/wallet": "1.17.12",
|
|
29
30
|
"debug": "^4.3.4",
|
|
30
31
|
"flat": "^5.0.2",
|
|
31
32
|
"is-absolute-url": "^3.0.3",
|
|
@@ -35,7 +36,7 @@
|
|
|
35
36
|
"type-fest": "^2.18.0"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
|
-
"@arcblock/eslint-config-ts": "0.2.
|
|
39
|
+
"@arcblock/eslint-config-ts": "0.2.3",
|
|
39
40
|
"@types/flat": "^5.0.2",
|
|
40
41
|
"@types/jest": "^28.1.6",
|
|
41
42
|
"@types/mustache": "^4.2.1",
|
|
@@ -73,5 +74,5 @@
|
|
|
73
74
|
"build": "tsc",
|
|
74
75
|
"build:watch": "npm run build -- -w"
|
|
75
76
|
},
|
|
76
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "9209d3e84008ba758810a607b1c6a4b4fd5e7bc0"
|
|
77
78
|
}
|