UNPKG

16.6 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const client_common_1 = require("@neo-one/client-common");
4const client_full_common_1 = require("@neo-one/client-full-common");
5const errors_1 = require("../errors");
6const utils_1 = require("../utils");
7const TransactionBase_1 = require("./TransactionBase");
8const TransactionType_1 = require("./TransactionType");
9class IssueTransaction extends TransactionBase_1.TransactionBase(client_full_common_1.IssueTransactionModel) {
10 constructor(add) {
11 super(add);
12 this.sizeExclusive = utils_1.utils.lazy(() => client_common_1.IOHelper.sizeOfUInt8);
13 const getScriptHashesForVerifying = super.getScriptHashesForVerifying.bind(this);
14 this.issueGetScriptHashesForVerifyingInternal = utils_1.utils.lazyAsync(async (options) => {
15 const { getOutput, getAsset } = options;
16 const [hashes, issuerHashes] = await Promise.all([
17 getScriptHashesForVerifying(options),
18 this.getTransactionResults({ getOutput }).then(async (results) => Promise.all(Object.entries(results)
19 .filter(([_, value]) => value.lt(utils_1.utils.ZERO))
20 .map(async ([assetHash, _]) => {
21 const asset = await getAsset({
22 hash: client_common_1.common.hexToUInt256(assetHash),
23 });
24 return client_common_1.common.uInt160ToHex(asset.issuer);
25 }))),
26 ]);
27 return new Set([...hashes, ...issuerHashes]);
28 });
29 }
30 static deserializeWireBase(options) {
31 const { type, version } = super.deserializeTransactionBaseStartWireBase(options);
32 if (type !== TransactionType_1.TransactionType.Issue) {
33 throw new client_common_1.InvalidFormatError(`Expected transaction type to be ${TransactionType_1.TransactionType.Issue}. Received: ${type}`);
34 }
35 const { attributes, inputs, outputs, scripts } = super.deserializeTransactionBaseEndWireBase(options);
36 return new this({
37 version,
38 attributes,
39 inputs,
40 outputs,
41 scripts,
42 });
43 }
44 async serializeJSON(context) {
45 const transactionBaseJSON = await super.serializeTransactionBaseJSON(context);
46 return Object.assign({}, transactionBaseJSON, { type: 'IssueTransaction' });
47 }
48 getSystemFee(context) {
49 if (this.version >= 1) {
50 return utils_1.utils.ZERO;
51 }
52 const { governingToken, utilityToken } = context;
53 if (this.outputs.every((output) => client_common_1.common.uInt256Equal(output.asset, governingToken.hash) ||
54 client_common_1.common.uInt256Equal(output.asset, utilityToken.hash))) {
55 return utils_1.utils.ZERO;
56 }
57 return super.getSystemFee(context);
58 }
59 async getScriptHashesForVerifying(options) {
60 return this.issueGetScriptHashesForVerifyingInternal(options);
61 }
62 async verify(options) {
63 const [results] = await Promise.all([super.verify(options), this.verifyInternal(options)]);
64 return results;
65 }
66 async verifyInternal(options) {
67 const { getOutput, getAsset, memPool = [] } = options;
68 const results = await this.getTransactionResults({ getOutput });
69 await Promise.all(Object.entries(results).map(async ([assetHex, value]) => {
70 const hash = client_common_1.common.hexToUInt256(assetHex);
71 const asset = await getAsset({ hash });
72 if (asset.amount.lt(utils_1.utils.ZERO)) {
73 return;
74 }
75 const issued = asset.available.add(memPool
76 .filter((transaction) => transaction !== this)
77 .reduce((acc, transaction) => transaction.outputs
78 .filter((output) => client_common_1.common.uInt256Equal(hash, output.asset))
79 .reduce((innerAcc, output) => innerAcc.add(output.value), acc), utils_1.utils.ZERO));
80 if (asset.amount.sub(issued).lt(value.neg())) {
81 throw new errors_1.VerifyError('Invalid issue amount');
82 }
83 }));
84 }
85}
86exports.IssueTransaction = IssueTransaction;
87
88//# sourceMappingURL=data:application/json;charset=utf8;base64,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QkFBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7YUFDL0M7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBaklELDRDQWlJQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29yZS9zcmMvdHJhbnNhY3Rpb24vSXNzdWVUcmFuc2FjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbW1vbiwgSW52YWxpZEZvcm1hdEVycm9yLCBJT0hlbHBlciwgSXNzdWVUcmFuc2FjdGlvbkpTT04sIFVJbnQxNjBIZXggfSBmcm9tICdAbmVvLW9uZS9jbGllbnQtY29tbW9uJztcbmltcG9ydCB7IElzc3VlVHJhbnNhY3Rpb25Nb2RlbCB9IGZyb20gJ0BuZW8tb25lL2NsaWVudC1mdWxsLWNvbW1vbic7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IHsgVmVyaWZ5RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVXaXJlQmFzZU9wdGlvbnMsIFNlcmlhbGl6ZUpTT05Db250ZXh0IH0gZnJvbSAnLi4vU2VyaWFsaXphYmxlJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVmVyaWZ5U2NyaXB0UmVzdWx0IH0gZnJvbSAnLi4vdm0nO1xuaW1wb3J0IHsgV2l0bmVzcyB9IGZyb20gJy4uL1dpdG5lc3MnO1xuaW1wb3J0IHsgQXR0cmlidXRlIH0gZnJvbSAnLi9hdHRyaWJ1dGUnO1xuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICcuL0lucHV0JztcbmltcG9ydCB7IE91dHB1dCB9IGZyb20gJy4vT3V0cHV0JztcbmltcG9ydCB7XG4gIEZlZUNvbnRleHQsXG4gIFRyYW5zYWN0aW9uQmFzZSxcbiAgVHJhbnNhY3Rpb25CYXNlQWRkLFxuICBUcmFuc2FjdGlvbkdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ09wdGlvbnMsXG4gIFRyYW5zYWN0aW9uVmVyaWZ5T3B0aW9ucyxcbn0gZnJvbSAnLi9UcmFuc2FjdGlvbkJhc2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnLi9UcmFuc2FjdGlvblR5cGUnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVUcmFuc2FjdGlvbkFkZCBleHRlbmRzIFRyYW5zYWN0aW9uQmFzZUFkZCB7fVxuXG5leHBvcnQgY2xhc3MgSXNzdWVUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uQmFzZTxcbiAgVHJhbnNhY3Rpb25UeXBlLklzc3VlLFxuICBJc3N1ZVRyYW5zYWN0aW9uSlNPTixcbiAgQ29uc3RydWN0b3I8SXNzdWVUcmFuc2FjdGlvbk1vZGVsPEF0dHJpYnV0ZSwgSW5wdXQsIE91dHB1dCwgV2l0bmVzcz4+XG4+KElzc3VlVHJhbnNhY3Rpb25Nb2RlbCkge1xuICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplV2lyZUJhc2Uob3B0aW9uczogRGVzZXJpYWxpemVXaXJlQmFzZU9wdGlvbnMpOiBJc3N1ZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCB7IHR5cGUsIHZlcnNpb24gfSA9IHN1cGVyLmRlc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlU3RhcnRXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIGlmICh0eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuSXNzdWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRm9ybWF0RXJyb3IoYEV4cGVjdGVkIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgJHtUcmFuc2FjdGlvblR5cGUuSXNzdWV9LiBSZWNlaXZlZDogJHt0eXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cmlidXRlcywgaW5wdXRzLCBvdXRwdXRzLCBzY3JpcHRzIH0gPSBzdXBlci5kZXNlcmlhbGl6ZVRyYW5zYWN0aW9uQmFzZUVuZFdpcmVCYXNlKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIG5ldyB0aGlzKHtcbiAgICAgIHZlcnNpb24sXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgaW5wdXRzLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIHNjcmlwdHMsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2l6ZUV4Y2x1c2l2ZTogKCkgPT4gbnVtYmVyID0gdXRpbHMubGF6eSgoKSA9PiBJT0hlbHBlci5zaXplT2ZVSW50OCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNzdWVHZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbDogKFxuICAgIG9wdGlvbnM6IFRyYW5zYWN0aW9uR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucyxcbiAgKSA9PiBQcm9taXNlPFNldDxVSW50MTYwSGV4Pj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFkZDogSXNzdWVUcmFuc2FjdGlvbkFkZCkge1xuICAgIHN1cGVyKGFkZCk7XG5cbiAgICBjb25zdCBnZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcgPSBzdXBlci5nZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcuYmluZCh0aGlzKTtcbiAgICB0aGlzLmlzc3VlR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nSW50ZXJuYWwgPSB1dGlscy5sYXp5QXN5bmMoXG4gICAgICBhc3luYyAob3B0aW9uczogVHJhbnNhY3Rpb25HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZ2V0T3V0cHV0LCBnZXRBc3NldCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgW2hhc2hlcywgaXNzdWVySGFzaGVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBnZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcob3B0aW9ucyksXG4gICAgICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvblJlc3VsdHMoeyBnZXRPdXRwdXQgfSkudGhlbihhc3luYyAocmVzdWx0cykgPT5cbiAgICAgICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHRzKVxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWRcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZS5sdCh1dGlscy5aRVJPKSlcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkXG4gICAgICAgICAgICAgICAgLm1hcChhc3luYyAoW2Fzc2V0SGFzaCwgX10pID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgZ2V0QXNzZXQoe1xuICAgICAgICAgICAgICAgICAgICBoYXNoOiBjb21tb24uaGV4VG9VSW50MjU2KGFzc2V0SGFzaCksXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi51SW50MTYwVG9IZXgoYXNzZXQuaXNzdWVyKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoWy4uLmhhc2hlcywgLi4uaXNzdWVySGFzaGVzXSk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2VyaWFsaXplSlNPTihjb250ZXh0OiBTZXJpYWxpemVKU09OQ29udGV4dCk6IFByb21pc2U8SXNzdWVUcmFuc2FjdGlvbkpTT04+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkJhc2VKU09OID0gYXdhaXQgc3VwZXIuc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlSlNPTihjb250ZXh0KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50cmFuc2FjdGlvbkJhc2VKU09OLFxuICAgICAgdHlwZTogJ0lzc3VlVHJhbnNhY3Rpb24nLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0U3lzdGVtRmVlKGNvbnRleHQ6IEZlZUNvbnRleHQpOiBCTiB7XG4gICAgaWYgKHRoaXMudmVyc2lvbiA+PSAxKSB7XG4gICAgICByZXR1cm4gdXRpbHMuWkVSTztcbiAgICB9XG5cbiAgICBjb25zdCB7IGdvdmVybmluZ1Rva2VuLCB1dGlsaXR5VG9rZW4gfSA9IGNvbnRleHQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5vdXRwdXRzLmV2ZXJ5KFxuICAgICAgICAob3V0cHV0KSA9PlxuICAgICAgICAgIGNvbW1vbi51SW50MjU2RXF1YWwob3V0cHV0LmFzc2V0LCBnb3Zlcm5pbmdUb2tlbi5oYXNoKSB8fFxuICAgICAgICAgIGNvbW1vbi51SW50MjU2RXF1YWwob3V0cHV0LmFzc2V0LCB1dGlsaXR5VG9rZW4uaGFzaCksXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdXRpbHMuWkVSTztcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZ2V0U3lzdGVtRmVlKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyhcbiAgICBvcHRpb25zOiBUcmFuc2FjdGlvbkdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ09wdGlvbnMsXG4gICk6IFByb21pc2U8U2V0PFVJbnQxNjBIZXg+PiB7XG4gICAgcmV0dXJuIHRoaXMuaXNzdWVHZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbChvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnkob3B0aW9uczogVHJhbnNhY3Rpb25WZXJpZnlPcHRpb25zKTogUHJvbWlzZTxyZWFkb25seSBWZXJpZnlTY3JpcHRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IFtyZXN1bHRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzdXBlci52ZXJpZnkob3B0aW9ucyksIHRoaXMudmVyaWZ5SW50ZXJuYWwob3B0aW9ucyldKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlJbnRlcm5hbChvcHRpb25zOiBUcmFuc2FjdGlvblZlcmlmeU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGdldE91dHB1dCwgZ2V0QXNzZXQsIG1lbVBvb2wgPSBbXSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvblJlc3VsdHMoeyBnZXRPdXRwdXQgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBPYmplY3QuZW50cmllcyhyZXN1bHRzKS5tYXAoYXN5bmMgKFthc3NldEhleCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBjb21tb24uaGV4VG9VSW50MjU2KGFzc2V0SGV4KTtcbiAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBnZXRBc3NldCh7IGhhc2ggfSk7XG4gICAgICAgIGlmIChhc3NldC5hbW91bnQubHQodXRpbHMuWkVSTykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc3N1ZWQgPSBhc3NldC5hdmFpbGFibGUuYWRkKFxuICAgICAgICAgIG1lbVBvb2xcbiAgICAgICAgICAgIC5maWx0ZXIoKHRyYW5zYWN0aW9uKSA9PiB0cmFuc2FjdGlvbiAhPT0gdGhpcylcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhY2MsIHRyYW5zYWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm91dHB1dHNcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKG91dHB1dCkgPT4gY29tbW9uLnVJbnQyNTZFcXVhbChoYXNoLCBvdXRwdXQuYXNzZXQpKVxuICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoaW5uZXJBY2MsIG91dHB1dCkgPT4gaW5uZXJBY2MuYWRkKG91dHB1dC52YWx1ZSksIGFjYyksXG5cbiAgICAgICAgICAgICAgdXRpbHMuWkVSTyxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFzc2V0LmFtb3VudC5zdWIoaXNzdWVkKS5sdCh2YWx1ZS5uZWcoKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZ5RXJyb3IoJ0ludmFsaWQgaXNzdWUgYW1vdW50Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==