@ocap/asset 1.16.16 → 1.17.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. package/lib/index.d.ts +54 -34
  2. package/lib/index.js +218 -268
  3. package/package.json +28 -32
package/lib/index.d.ts CHANGED
@@ -1,40 +1,60 @@
1
- // Generate by [js2dts@0.3.3](https://github.com/whxaxes/js2dts#readme)
2
-
3
- declare const _Lib: _Lib.T107;
4
- declare namespace _Lib {
5
- export interface T101 {
6
- factory: any;
7
- inputs: any;
1
+ declare type $TSFixMe = any;
2
+ export declare const isValidHook: (hook: $TSFixMe, quota?: $TSFixMe, throwOnError?: boolean) => boolean;
3
+ export declare const isValidFactory: (props: $TSFixMe) => boolean;
4
+ /**
5
+ * Find credentialSubject path in the object
6
+ * Because they need prerender
7
+ *
8
+ * @param {object} obj
9
+ * @param {string} keyword
10
+ * @return {string} list of keys
11
+ */
12
+ export declare const findPrerenderKeys: (obj: $TSFixMe, keyword: string) => string[];
13
+ /**
14
+ * Mint from an asset factory, used on server side
15
+ *
16
+ * @param {object} params { factory, inputs, issuer }
17
+ * @param {object} params.factory factory object
18
+ * @param {object} params.inputs factory input variables
19
+ * @param {string} params.owner owner did for the new asset
20
+ * @param {object} params.issuer issuer object
21
+ */
22
+ export declare const mintFromFactory: ({ factory, inputs, owner, issuer, }: {
23
+ factory: $TSFixMe;
24
+ inputs: $TSFixMe;
8
25
  owner: string;
9
- issuer: any;
10
- }
11
- export interface T102 {
26
+ issuer: $TSFixMe;
27
+ }) => {
12
28
  asset: any;
13
29
  address: string;
14
- }
15
- export interface T103 {
16
- address: any;
17
- output: any;
18
- data: any;
19
- }
20
- export interface T105 {
21
- id: any;
22
- pk: string;
23
- name: any;
24
- }
25
- export interface T106 {
30
+ };
31
+ /**
32
+ * Simulate minting from an asset factory, used for client side
33
+ *
34
+ * @param {object} params { factory, inputs, issuer }
35
+ * @param {object} params.factory factory object
36
+ * @param {object} params.inputs factory input variables
37
+ * @param {string} params.owner owner did for the new asset
38
+ * @param {object} params.issuer factory issuer wallet and name
39
+ */
40
+ export declare const preMintFromFactory: ({ factory, inputs, owner, issuer, }: {
41
+ factory?: $TSFixMe;
42
+ inputs: $TSFixMe;
43
+ owner?: string;
44
+ issuer?: $TSFixMe;
45
+ }) => {
26
46
  address: string;
27
- issuer: _Lib.T105;
47
+ issuer: {
48
+ id: any;
49
+ pk: string;
50
+ name: any;
51
+ };
28
52
  variables: any;
29
53
  asset: any;
30
- }
31
- export interface T107 {
32
- isValidFactory: (props: any) => boolean;
33
- isValidHook: (hook: any, quota: any, throwOnError?: boolean) => boolean;
34
- findPrerenderKeys: (obj: any, keyword: string) => string;
35
- mintFromFactory: (T100: _Lib.T101) => _Lib.T102;
36
- formatFactoryState: (state: any) => _Lib.T103;
37
- preMintFromFactory: (T104: _Lib.T101) => _Lib.T106;
38
- }
39
- }
40
- export = _Lib;
54
+ };
55
+ export declare const formatFactoryState: (state: $TSFixMe) => {
56
+ address: any;
57
+ output: any;
58
+ data: any;
59
+ };
60
+ export {};
package/lib/index.js CHANGED
@@ -1,143 +1,132 @@
1
- /* eslint-disable no-restricted-syntax */
2
- const get = require('lodash/get');
3
- const set = require('lodash/set');
4
- const uniq = require('lodash/uniq');
5
- const uniqBy = require('lodash/uniqBy');
6
- const flatten = require('flat');
7
- const mustache = require('mustache');
8
- const isEmpty = require('empty-value');
9
- const isAbsoluteUrl = require('is-absolute-url');
10
-
11
- const cloneDeep = require('lodash/cloneDeep');
12
- const { toTypeInfo, fromPublicKeyHash } = require('@arcblock/did');
13
- const { verify, stableStringify, proofTypes } = require('@arcblock/vc');
14
- const { toAssetAddress } = require('@arcblock/did-util');
15
- const { types } = require('@ocap/mcrypto');
16
- const { BN, toBase58, toBase64 } = require('@ocap/util');
17
- const { compile, validate, getQuota } = require('@ocap/contract');
18
-
19
- const debug = require('debug')(require('../package.json').name);
20
-
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.formatFactoryState = exports.preMintFromFactory = exports.mintFromFactory = exports.findPrerenderKeys = exports.isValidFactory = exports.isValidHook = void 0;
7
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
8
+ const get_1 = __importDefault(require("lodash/get"));
9
+ const set_1 = __importDefault(require("lodash/set"));
10
+ const uniq_1 = __importDefault(require("lodash/uniq"));
11
+ const uniqBy_1 = __importDefault(require("lodash/uniqBy"));
12
+ const flat_1 = __importDefault(require("flat"));
13
+ const mustache_1 = __importDefault(require("mustache"));
14
+ const is_absolute_url_1 = __importDefault(require("is-absolute-url"));
15
+ const cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
16
+ const did_1 = require("@arcblock/did");
17
+ const vc_1 = require("@arcblock/vc");
18
+ const did_util_1 = require("@arcblock/did-util");
19
+ const mcrypto_1 = require("@ocap/mcrypto");
20
+ const util_1 = require("@ocap/util");
21
+ const contract_1 = require("@ocap/contract");
22
+ const debug_1 = __importDefault(require("debug"));
23
+ const lodash_1 = require("lodash");
24
+ const debug = (0, debug_1.default)('@ocap/asset');
21
25
  const SUPPORTED_HOOK_NAMES = ['mint', 'postMint'];
22
26
  const SUPPORTED_HOOK_TYPES = ['contract', 'url'];
23
-
24
27
  const isValidHook = (hook, quota, throwOnError = false) => {
25
- if (SUPPORTED_HOOK_TYPES.includes(hook.type) === false) {
26
- return false;
27
- }
28
- if (SUPPORTED_HOOK_NAMES.includes(hook.name) === false) {
29
- return false;
30
- }
31
-
32
- if (hook.type === 'url') {
33
- return isAbsoluteUrl(hook.hook);
34
- }
35
-
36
- if (hook.type === 'contract') {
37
- try {
38
- const compiled = compile(hook.hook);
39
- validate(compiled, quota);
40
- return true;
41
- } catch (err) {
42
- if (process.env.NODE_ENV !== 'test') {
43
- console.error('invalid contract hook', err.message);
44
- }
45
-
46
- if (throwOnError) {
47
- throw new Error(`Factory hook ${hook.name} is invalid: ${err.message}`);
48
- }
49
-
50
- return false;
28
+ if (SUPPORTED_HOOK_TYPES.includes(hook.type) === false) {
29
+ return false;
30
+ }
31
+ if (SUPPORTED_HOOK_NAMES.includes(hook.name) === false) {
32
+ return false;
51
33
  }
52
- }
53
-
54
- return false;
34
+ if (hook.type === 'url') {
35
+ return (0, is_absolute_url_1.default)(hook.hook);
36
+ }
37
+ if (hook.type === 'contract') {
38
+ try {
39
+ const compiled = (0, contract_1.compile)(hook.hook);
40
+ (0, contract_1.validate)(compiled, quota);
41
+ return true;
42
+ }
43
+ catch (err) {
44
+ if (process.env.NODE_ENV !== 'test') {
45
+ console.error('invalid contract hook', err.message);
46
+ }
47
+ if (throwOnError) {
48
+ throw new Error(`Factory hook ${hook.name} is invalid: ${err.message}`);
49
+ }
50
+ return false;
51
+ }
52
+ }
53
+ return false;
55
54
  };
56
-
55
+ exports.isValidHook = isValidHook;
57
56
  const isValidFactory = (props) => {
58
- if (!props) {
59
- throw new Error('Factory props should not be empty');
60
- }
61
-
62
- // required props
63
- const missingProp = ['name', 'description', 'input', 'output', 'settlement'].find((x) => !props[x]);
64
- if (missingProp) {
65
- throw new Error(`Factory ${missingProp} prop should not be empty`);
66
- }
67
-
68
- if (['instant', 'periodic'].includes(props.settlement) === false) {
69
- throw new Error('Factory settlement prop should only be instant or periodic');
70
- }
71
-
72
- // input.tokens and input.assets should not be empty
73
- if (['value', 'tokens', 'assets'].every((x) => isEmpty(props.input[x]))) {
74
- throw new Error('Factory input should contain at least one token or asset');
75
- }
76
-
77
- if (uniqBy(props.input.tokens, 'address').length !== props.input.tokens.length) {
78
- throw new Error('Factory token input should not contains duplicate address');
79
- }
80
-
81
- if (uniq(props.input.assets).length !== props.input.assets.length) {
82
- throw new Error('Factory asset input should not contains duplicate address');
83
- }
84
-
85
- for (const token of props.input.tokens) {
86
- try {
87
- // eslint-disable-next-line no-new
88
- new BN(token.value);
89
- } catch (err) {
90
- throw new Error(`Factory token ${token.address} is invalid: token value is not valid big number`);
57
+ if (!props) {
58
+ throw new Error('Factory props should not be empty');
59
+ }
60
+ // required props
61
+ const missingProp = ['name', 'description', 'input', 'output', 'settlement'].find((x) => !props[x]);
62
+ if (missingProp) {
63
+ throw new Error(`Factory ${missingProp} prop should not be empty`);
91
64
  }
92
- }
93
-
94
- // validate output
95
- if (!props.output || typeof props.output !== 'object') {
96
- throw new Error('Factory output should be an object');
97
- }
98
- try {
99
- // should be a valid mustache template when serialized as json
100
- const template = JSON.stringify(props.output);
101
- mustache.parse(template);
102
- } catch (err) {
103
- throw new Error('Factory output should be a valid mustache template when serialized as json');
104
- }
105
-
106
- // validate hooks
107
- const quota = getQuota(props.input);
108
- if (Array.isArray(props.hooks)) {
109
- const invalidHook = props.hooks.find((x) => isValidHook(x, quota, true) === false);
110
- if (invalidHook) {
111
- throw new Error(`Factory hook ${invalidHook.name} is invalid`);
65
+ if (['instant', 'periodic'].includes(props.settlement) === false) {
66
+ throw new Error('Factory settlement prop should only be instant or periodic');
112
67
  }
113
- }
114
-
115
- // ensure input and hook are zero-sum for factories that consumes token
116
- if (props.settlement === 'instant') {
117
- if (quota.value <= 0 && Object.keys(quota.tokens).every((x) => quota[x] <= 0)) {
118
- return true;
68
+ // input.tokens and input.assets should not be empty
69
+ if (['value', 'tokens', 'assets'].every((x) => (0, lodash_1.isEmpty)(props.input[x]))) {
70
+ throw new Error('Factory input should contain at least one token or asset');
119
71
  }
120
-
121
- if (isEmpty(props.hooks)) {
122
- throw new Error('Factory hooks should not be empty for instant settlement');
72
+ if ((0, uniqBy_1.default)(props.input.tokens, 'address').length !== props.input.tokens.length) {
73
+ throw new Error('Factory token input should not contains duplicate address');
123
74
  }
124
-
125
- const mintHook = props.hooks.find((x) => x.name === 'mint');
126
- if (!mintHook) {
127
- throw new Error('Factory hook mint should not be empty for instant settlement that consumes token');
75
+ if ((0, uniq_1.default)(props.input.assets).length !== props.input.assets.length) {
76
+ throw new Error('Factory asset input should not contains duplicate address');
77
+ }
78
+ for (const token of props.input.tokens) {
79
+ try {
80
+ // eslint-disable-next-line no-new
81
+ new util_1.BN(token.value);
82
+ }
83
+ catch (err) {
84
+ throw new Error(`Factory token ${token.address} is invalid: token value is not valid big number`);
85
+ }
86
+ }
87
+ // validate output
88
+ if (!props.output || typeof props.output !== 'object') {
89
+ throw new Error('Factory output should be an object');
128
90
  }
129
-
130
91
  try {
131
- const compiled = compile(mintHook.hook);
132
- validate(compiled, quota, true);
133
- } catch (err) {
134
- throw new Error(`Factory hook mint is invalid: ${err.message}`);
92
+ // should be a valid mustache template when serialized as json
93
+ const template = JSON.stringify(props.output);
94
+ mustache_1.default.parse(template);
95
+ }
96
+ catch (err) {
97
+ throw new Error('Factory output should be a valid mustache template when serialized as json');
98
+ }
99
+ // validate hooks
100
+ const quota = (0, contract_1.getQuota)(props.input);
101
+ if (Array.isArray(props.hooks)) {
102
+ const invalidHook = props.hooks.find((x) => (0, exports.isValidHook)(x, quota, true) === false);
103
+ if (invalidHook) {
104
+ throw new Error(`Factory hook ${invalidHook.name} is invalid`);
105
+ }
106
+ }
107
+ // ensure input and hook are zero-sum for factories that consumes token
108
+ if (props.settlement === 'instant') {
109
+ if (quota.value <= 0 && Object.keys(quota.tokens).every((x) => quota[x] <= 0)) {
110
+ return true;
111
+ }
112
+ if ((0, lodash_1.isEmpty)(props.hooks)) {
113
+ throw new Error('Factory hooks should not be empty for instant settlement');
114
+ }
115
+ const mintHook = props.hooks.find((x) => x.name === 'mint');
116
+ if (!mintHook) {
117
+ throw new Error('Factory hook mint should not be empty for instant settlement that consumes token');
118
+ }
119
+ try {
120
+ const compiled = (0, contract_1.compile)(mintHook.hook);
121
+ (0, contract_1.validate)(compiled, quota, true);
122
+ }
123
+ catch (err) {
124
+ throw new Error(`Factory hook mint is invalid: ${err.message}`);
125
+ }
135
126
  }
136
- }
137
-
138
- return true;
127
+ return true;
139
128
  };
140
-
129
+ exports.isValidFactory = isValidFactory;
141
130
  /**
142
131
  * Find credentialSubject path in the object
143
132
  * Because they need prerender
@@ -147,17 +136,16 @@ const isValidFactory = (props) => {
147
136
  * @return {string} list of keys
148
137
  */
149
138
  const findPrerenderKeys = (obj, keyword) => {
150
- const flatObj = flatten(obj, { safe: true });
151
- const keys = Object.keys(flatObj)
152
- .map((x) => x.split('.'))
153
- .filter((x) => x.includes(keyword))
154
- .map((x) => x.slice(0, x.lastIndexOf(keyword) + 1))
155
- .sort((a, b) => b.length - a.length)
156
- .map((x) => x.join('.'));
157
-
158
- return uniq(keys);
139
+ const flatObj = (0, flat_1.default)(obj, { safe: true });
140
+ const keys = Object.keys(flatObj)
141
+ .map((x) => x.split('.'))
142
+ .filter((x) => x.includes(keyword))
143
+ .map((x) => x.slice(0, x.lastIndexOf(keyword) + 1))
144
+ .sort((a, b) => b.length - a.length)
145
+ .map((x) => x.join('.'));
146
+ return (0, uniq_1.default)(keys);
159
147
  };
160
-
148
+ exports.findPrerenderKeys = findPrerenderKeys;
161
149
  /**
162
150
  * Mint from an asset factory, used on server side
163
151
  *
@@ -167,25 +155,19 @@ const findPrerenderKeys = (obj, keyword) => {
167
155
  * @param {string} params.owner owner did for the new asset
168
156
  * @param {object} params.issuer issuer object
169
157
  */
170
- const mintFromFactory = ({ factory, inputs, owner, issuer }) => {
171
- const { output, address: factoryAddress, numMinted, data } = factory;
172
- debug(
173
- 'mintFromFactory.args',
174
- JSON.stringify({ output, factoryAddress, numMinted, inputs, owner, issuer, data }, null, 2)
175
- );
176
- const asset = JSON.parse(
177
- mustache.render(JSON.stringify(output), {
178
- input: inputs,
179
- data: data.value || data,
180
- ctx: { factory: factoryAddress, id: numMinted + 1, owner, issuer },
181
- })
182
- );
183
-
184
- debug('mintFromFactory.result', JSON.stringify(asset, null, 2));
185
- const address = toAssetAddress(asset);
186
- return { asset, address };
158
+ const mintFromFactory = ({ factory, inputs, owner, issuer, }) => {
159
+ const { output, address: factoryAddress, numMinted, data } = factory;
160
+ debug('mintFromFactory.args', JSON.stringify({ output, factoryAddress, numMinted, inputs, owner, issuer, data }, null, 2));
161
+ const asset = JSON.parse(mustache_1.default.render(JSON.stringify(output), {
162
+ input: inputs,
163
+ data: data.value || data,
164
+ ctx: { factory: factoryAddress, id: numMinted + 1, owner, issuer },
165
+ }));
166
+ debug('mintFromFactory.result', JSON.stringify(asset, null, 2));
167
+ const address = (0, did_util_1.toAssetAddress)(asset);
168
+ return { asset, address };
187
169
  };
188
-
170
+ exports.mintFromFactory = mintFromFactory;
189
171
  /**
190
172
  * Simulate minting from an asset factory, used for client side
191
173
  *
@@ -195,124 +177,92 @@ const mintFromFactory = ({ factory, inputs, owner, issuer }) => {
195
177
  * @param {string} params.owner owner did for the new asset
196
178
  * @param {object} params.issuer factory issuer wallet and name
197
179
  */
198
- const preMintFromFactory = ({ factory, inputs, owner, issuer }) => {
199
- if (Object.keys(inputs).some((x) => typeof inputs[x] !== 'string')) {
200
- throw new Error('Failed to mint asset from factory: input values must be strings');
201
- }
202
-
203
- let asset = null;
204
- const { output, numMinted, address: factoryAddress, data } = factory;
205
- const { wallet, name } = issuer;
206
-
207
- debug(
208
- 'preMintFromFactory.args',
209
- JSON.stringify({ output, factoryAddress, numMinted, inputs, owner, issuer, data }, null, 2)
210
- );
211
-
212
- const extra = {};
213
- const issuerObject = { id: wallet.address, pk: toBase58(wallet.publicKey), name };
214
-
215
- const render = (templateObject) =>
216
- JSON.parse(
217
- mustache.render(JSON.stringify(templateObject), {
218
- input: { ...inputs, ...extra },
180
+ const preMintFromFactory = ({ factory, inputs, owner, issuer, }) => {
181
+ if (Object.keys(inputs).some((x) => typeof inputs[x] !== 'string')) {
182
+ throw new Error('Failed to mint asset from factory: input values must be strings');
183
+ }
184
+ let asset = null;
185
+ const { output, numMinted, address: factoryAddress, data } = factory;
186
+ const { wallet, name } = issuer;
187
+ debug('preMintFromFactory.args', JSON.stringify({ output, factoryAddress, numMinted, inputs, owner, issuer, data }, null, 2));
188
+ const extra = {};
189
+ const issuerObject = { id: wallet.address, pk: (0, util_1.toBase58)(wallet.publicKey), name };
190
+ const render = (templateObject) => JSON.parse(mustache_1.default.render(JSON.stringify(templateObject), {
191
+ input: Object.assign(Object.assign({}, inputs), extra),
219
192
  data: data.value || data,
220
193
  ctx: { factory: factoryAddress, id: numMinted + 1, owner, issuer: issuerObject },
221
- })
222
- );
223
-
224
- const template = cloneDeep(output);
225
-
226
- // prerender credentialSubjects if they exists
227
- // then populate their ids
228
- const prerenderKeys = findPrerenderKeys(template, 'credentialSubject');
229
- if (prerenderKeys.length) {
230
- extra.issuanceDate = new Date().toISOString();
231
-
232
- for (const key of prerenderKeys) {
233
- const subjectTemplate = get(template, key);
234
- const subjectObject = Array.isArray(subjectTemplate)
235
- ? subjectTemplate.map((x) => render(x))
236
- : render(subjectTemplate);
237
- set(template, key, subjectObject);
238
-
239
- // calculate credential id from credentialSubject
240
- const vcRootPath = key.split('.').slice(0, -1).join('.');
241
- const vcIdPath = vcRootPath.split('.').concat(['id']).join('.');
242
- const typeInfo = toTypeInfo(issuerObject.id);
243
- const vcType = { ...typeInfo, role: types.RoleType.ROLE_VC };
244
- const vcId = fromPublicKeyHash(wallet.hash(stableStringify(subjectObject)), vcType);
245
-
246
- extra.id = vcId;
247
- extra.proofType = proofTypes[typeInfo.pk];
248
-
249
- // technically we do not support nested vc when minting
250
- // But it is possible to support multiple credentialSubjects when minting
251
- set(template, vcIdPath, vcId);
252
-
253
- // Generate proof signatures
254
- if (!proofTypes[typeInfo.pk]) {
255
- throw new Error('Unsupported signer type when create verifiable credential');
256
- }
257
-
258
- let vcObj = render(get(template, vcRootPath));
259
- delete vcObj.proof;
260
- const vcStr = stableStringify(vcObj);
261
- const signature = toBase64(wallet.sign(vcStr));
262
-
263
- vcObj.proof = {
264
- type: proofTypes[typeInfo.pk],
265
- created: extra.issuanceDate,
266
- proofPurpose: 'assertionMethod',
267
- jws: signature,
268
- };
269
-
270
- extra.signature = signature;
271
-
272
- try {
273
- // Simulate minting from start, so that we can ensure the validity of minted asset
274
- asset = render(cloneDeep(output));
275
- vcObj = get(asset, vcRootPath);
276
-
194
+ }));
195
+ const template = (0, cloneDeep_1.default)(output);
196
+ // prerender credentialSubjects if they exists
197
+ // then populate their ids
198
+ const prerenderKeys = (0, exports.findPrerenderKeys)(template, 'credentialSubject');
199
+ if (prerenderKeys.length) {
200
+ extra.issuanceDate = new Date().toISOString();
201
+ for (const key of prerenderKeys) {
202
+ const subjectTemplate = (0, get_1.default)(template, key);
203
+ const subjectObject = Array.isArray(subjectTemplate)
204
+ ? subjectTemplate.map((x) => render(x))
205
+ : render(subjectTemplate);
206
+ (0, set_1.default)(template, key, subjectObject);
207
+ // calculate credential id from credentialSubject
208
+ const vcRootPath = key.split('.').slice(0, -1).join('.');
209
+ const vcIdPath = vcRootPath.split('.').concat(['id']).join('.');
210
+ const typeInfo = (0, did_1.toTypeInfo)(issuerObject.id);
211
+ const vcType = Object.assign(Object.assign({}, typeInfo), { role: mcrypto_1.types.RoleType.ROLE_VC });
212
+ const vcId = (0, did_1.fromPublicKeyHash)(wallet.hash((0, vc_1.stableStringify)(subjectObject)), vcType);
213
+ extra.id = vcId;
214
+ extra.proofType = vc_1.proofTypes[typeInfo.pk];
215
+ // technically we do not support nested vc when minting
216
+ // But it is possible to support multiple credentialSubjects when minting
217
+ (0, set_1.default)(template, vcIdPath, vcId);
218
+ // Generate proof signatures
219
+ if (!vc_1.proofTypes[typeInfo.pk]) {
220
+ throw new Error('Unsupported signer type when create verifiable credential');
221
+ }
222
+ let vcObj = render((0, get_1.default)(template, vcRootPath));
223
+ delete vcObj.proof;
224
+ const vcStr = (0, vc_1.stableStringify)(vcObj);
225
+ const signature = (0, util_1.toBase64)(wallet.sign(vcStr));
226
+ vcObj.proof = {
227
+ type: vc_1.proofTypes[typeInfo.pk],
228
+ created: extra.issuanceDate,
229
+ proofPurpose: 'assertionMethod',
230
+ jws: signature,
231
+ };
232
+ extra.signature = signature;
233
+ try {
234
+ // Simulate minting from start, so that we can ensure the validity of minted asset
235
+ asset = render((0, cloneDeep_1.default)(output));
236
+ vcObj = (0, get_1.default)(asset, vcRootPath);
237
+ debug('preMintFromFactory.result', JSON.stringify(asset, null, 2));
238
+ (0, vc_1.verify)({ vc: vcObj, trustedIssuers: [issuerObject.id], ownerDid: owner, ignoreExpired: true });
239
+ }
240
+ catch (err) {
241
+ console.error(err);
242
+ throw new Error('Failed to mint asset from factory: invalid verifiable credential minted');
243
+ }
244
+ }
245
+ }
246
+ else {
247
+ // populate other variables into the whole output
248
+ asset = render(template);
277
249
  debug('preMintFromFactory.result', JSON.stringify(asset, null, 2));
278
- verify({ vc: vcObj, trustedIssuers: [issuerObject.id], ownerDid: owner, ignoreExpired: true });
279
- } catch (err) {
280
- console.error(err);
281
- throw new Error('Failed to mint asset from factory: invalid verifiable credential minted');
282
- }
283
250
  }
284
- } else {
285
- // populate other variables into the whole output
286
- asset = render(template);
287
- debug('preMintFromFactory.result', JSON.stringify(asset, null, 2));
288
- }
289
-
290
- // calculate address
291
- const address = toAssetAddress(asset);
292
-
293
- // return extra inputs
294
- return { address, issuer: issuerObject, variables: { ...inputs, ...extra }, asset };
251
+ // calculate address
252
+ const address = (0, did_util_1.toAssetAddress)(asset);
253
+ // return extra inputs
254
+ return { address, issuer: issuerObject, variables: Object.assign(Object.assign({}, inputs), extra), asset };
295
255
  };
296
-
256
+ exports.preMintFromFactory = preMintFromFactory;
297
257
  const formatFactoryState = (state) => {
298
- const { address, output, data } = state;
299
- const outputX = cloneDeep(output);
300
-
301
- outputX.data.value = JSON.parse(outputX.data.value);
302
- outputX.data.type = outputX.data.typeUrl;
303
-
304
- return {
305
- address,
306
- output: outputX,
307
- data: JSON.parse(data.value),
308
- };
309
- };
310
-
311
- module.exports = {
312
- isValidFactory,
313
- isValidHook,
314
- findPrerenderKeys,
315
- mintFromFactory,
316
- formatFactoryState,
317
- preMintFromFactory,
258
+ const { address, output, data } = state;
259
+ const outputX = (0, cloneDeep_1.default)(output);
260
+ outputX.data.value = JSON.parse(outputX.data.value);
261
+ outputX.data.type = outputX.data.typeUrl;
262
+ return {
263
+ address,
264
+ output: outputX,
265
+ data: JSON.parse(data.value),
266
+ };
318
267
  };
268
+ exports.formatFactoryState = formatFactoryState;
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.16.16",
4
+ "version": "1.17.1",
5
5
  "author": {
6
6
  "name": "wangshijun",
7
7
  "email": "shijun@arcblock.io",
@@ -18,15 +18,14 @@
18
18
  "wangshijun <shijun@arcblock.io> (https://github.com/wangshijun)"
19
19
  ],
20
20
  "dependencies": {
21
- "@arcblock/did": "1.16.16",
22
- "@arcblock/did-util": "1.16.16",
23
- "@arcblock/vc": "1.16.16",
24
- "@ocap/contract": "1.16.16",
25
- "@ocap/mcrypto": "1.16.16",
26
- "@ocap/util": "1.16.16",
27
- "@ocap/wallet": "1.16.16",
21
+ "@arcblock/did": "1.17.1",
22
+ "@arcblock/did-util": "1.17.1",
23
+ "@arcblock/vc": "1.17.1",
24
+ "@ocap/contract": "1.17.1",
25
+ "@ocap/mcrypto": "1.17.1",
26
+ "@ocap/util": "1.17.1",
27
+ "@ocap/wallet": "1.17.1",
28
28
  "debug": "^4.3.3",
29
- "empty-value": "^1.0.1",
30
29
  "flat": "^5.0.2",
31
30
  "is-absolute-url": "^3.0.3",
32
31
  "json-stable-stringify": "^1.0.1",
@@ -34,19 +33,16 @@
34
33
  "mustache": "^4.1.0"
35
34
  },
36
35
  "devDependencies": {
37
- "jest": "^27.3.1",
38
- "remark-cli": "^10.0.1",
39
- "remark-preset-github": "^4.0.1"
40
- },
41
- "remarkConfig": {
42
- "plugins": [
43
- "preset-github",
44
- [
45
- {
46
- "repository": "ArcBlock/asset-chain"
47
- }
48
- ]
49
- ]
36
+ "@arcblock/eslint-config-ts": "0.2.2",
37
+ "@types/flat": "^5.0.2",
38
+ "@types/jest": "^28.1.0",
39
+ "@types/mustache": "^4.1.3",
40
+ "@types/node": "^17.0.38",
41
+ "eslint": "^8.17.0",
42
+ "jest": "^28.1.0",
43
+ "prettier": "^2.3.2",
44
+ "ts-jest": "^28.0.3",
45
+ "typescript": "^4.7.3"
50
46
  },
51
47
  "homepage": "https://github.com/ArcBlock/asset-chain/tree/master/core/asset",
52
48
  "keywords": [
@@ -56,7 +52,8 @@
56
52
  "nodejs"
57
53
  ],
58
54
  "license": "Apache-2.0",
59
- "main": "./lib/index.js",
55
+ "main": "lib/index.js",
56
+ "typings": "lib/index.d.ts",
60
57
  "files": [
61
58
  "lib"
62
59
  ],
@@ -65,15 +62,14 @@
65
62
  "url": "https://github.com/ArcBlock/asset-chain/tree/master/core/asset"
66
63
  },
67
64
  "scripts": {
68
- "lint": "eslint lib tests",
69
- "lint:fix": "eslint --fix lib tests",
70
- "docs": "yarn gen-dts && yarn gen-docs && yarn cleanup-docs && yarn format-docs",
71
- "cleanup-docs": "node ../../scripts/cleanup-docs.js docs/README.md $npm_package_name",
72
- "gen-dts": "j2d lib/index.js",
73
- "gen-docs": "jsdoc2md lib/index.js > docs/README.md",
74
- "format-docs": "remark . -o",
65
+ "lint": "eslint src tests",
66
+ "lint:fix": "npm run lint -- --fix",
75
67
  "test": "jest --forceExit --detectOpenHandles",
76
- "coverage": "yarn test -- --coverage"
68
+ "coverage": "yarn test -- --coverage",
69
+ "clean": "rm -fr lib",
70
+ "prebuild": "npm run clean",
71
+ "build": "tsc",
72
+ "build:watch": "npm run build -- -w"
77
73
  },
78
- "gitHead": "051f9620995cf24407374cc4811b0fa6ed6dc7ca"
74
+ "gitHead": "ca2ac264d9d6358680d5be99fcdd4685d0c999fc"
79
75
  }