1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const client_common_1 = require("@neo-one/client-common");
|
4 | const client_full_common_1 = require("@neo-one/client-full-common");
|
5 | const errors_1 = require("../errors");
|
6 | const utils_1 = require("../utils");
|
7 | const TransactionBase_1 = require("./TransactionBase");
|
8 | const TransactionType_1 = require("./TransactionType");
|
9 | class 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 | }
|
86 | exports.IssueTransaction = IssueTransaction;
|
87 |
|
88 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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QkFBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7YUFDL0M7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBaklELDRDQWlJQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29yZS9zcmMvdHJhbnNhY3Rpb24vSXNzdWVUcmFuc2FjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbW1vbiwgSW52YWxpZEZvcm1hdEVycm9yLCBJT0hlbHBlciwgSXNzdWVUcmFuc2FjdGlvbkpTT04sIFVJbnQxNjBIZXggfSBmcm9tICdAbmVvLW9uZS9jbGllbnQtY29tbW9uJztcbmltcG9ydCB7IElzc3VlVHJhbnNhY3Rpb25Nb2RlbCB9IGZyb20gJ0BuZW8tb25lL2NsaWVudC1mdWxsLWNvbW1vbic7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IHsgVmVyaWZ5RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVXaXJlQmFzZU9wdGlvbnMsIFNlcmlhbGl6ZUpTT05Db250ZXh0IH0gZnJvbSAnLi4vU2VyaWFsaXphYmxlJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVmVyaWZ5U2NyaXB0UmVzdWx0IH0gZnJvbSAnLi4vdm0nO1xuaW1wb3J0IHsgV2l0bmVzcyB9IGZyb20gJy4uL1dpdG5lc3MnO1xuaW1wb3J0IHsgQXR0cmlidXRlIH0gZnJvbSAnLi9hdHRyaWJ1dGUnO1xuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICcuL0lucHV0JztcbmltcG9ydCB7IE91dHB1dCB9IGZyb20gJy4vT3V0cHV0JztcbmltcG9ydCB7XG4gIEZlZUNvbnRleHQsXG4gIFRyYW5zYWN0aW9uQmFzZSxcbiAgVHJhbnNhY3Rpb25CYXNlQWRkLFxuICBUcmFuc2FjdGlvbkdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ09wdGlvbnMsXG4gIFRyYW5zYWN0aW9uVmVyaWZ5T3B0aW9ucyxcbn0gZnJvbSAnLi9UcmFuc2FjdGlvbkJhc2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnLi9UcmFuc2FjdGlvblR5cGUnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVUcmFuc2FjdGlvbkFkZCBleHRlbmRzIFRyYW5zYWN0aW9uQmFzZUFkZCB7fVxuXG5leHBvcnQgY2xhc3MgSXNzdWVUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uQmFzZTxcbiAgVHJhbnNhY3Rpb25UeXBlLklzc3VlLFxuICBJc3N1ZVRyYW5zYWN0aW9uSlNPTixcbiAgQ29uc3RydWN0b3I8SXNzdWVUcmFuc2FjdGlvbk1vZGVsPEF0dHJpYnV0ZSwgSW5wdXQsIE91dHB1dCwgV2l0bmVzcz4+XG4+KElzc3VlVHJhbnNhY3Rpb25Nb2RlbCkge1xuICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplV2lyZUJhc2Uob3B0aW9uczogRGVzZXJpYWxpemVXaXJlQmFzZU9wdGlvbnMpOiBJc3N1ZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCB7IHR5cGUsIHZlcnNpb24gfSA9IHN1cGVyLmRlc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlU3RhcnRXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIGlmICh0eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuSXNzdWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRm9ybWF0RXJyb3IoYEV4cGVjdGVkIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgJHtUcmFuc2FjdGlvblR5cGUuSXNzdWV9LiBSZWNlaXZlZDogJHt0eXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXR0cmlidXRlcywgaW5wdXRzLCBvdXRwdXRzLCBzY3JpcHRzIH0gPSBzdXBlci5kZXNlcmlhbGl6ZVRyYW5zYWN0aW9uQmFzZUVuZFdpcmVCYXNlKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIG5ldyB0aGlzKHtcbiAgICAgIHZlcnNpb24sXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgaW5wdXRzLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIHNjcmlwdHMsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2l6ZUV4Y2x1c2l2ZTogKCkgPT4gbnVtYmVyID0gdXRpbHMubGF6eSgoKSA9PiBJT0hlbHBlci5zaXplT2ZVSW50OCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNzdWVHZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbDogKFxuICAgIG9wdGlvbnM6IFRyYW5zYWN0aW9uR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucyxcbiAgKSA9PiBQcm9taXNlPFNldDxVSW50MTYwSGV4Pj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFkZDogSXNzdWVUcmFuc2FjdGlvbkFkZCkge1xuICAgIHN1cGVyKGFkZCk7XG5cbiAgICBjb25zdCBnZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcgPSBzdXBlci5nZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcuYmluZCh0aGlzKTtcbiAgICB0aGlzLmlzc3VlR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nSW50ZXJuYWwgPSB1dGlscy5sYXp5QXN5bmMoXG4gICAgICBhc3luYyAob3B0aW9uczogVHJhbnNhY3Rpb25HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZ2V0T3V0cHV0LCBnZXRBc3NldCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgW2hhc2hlcywgaXNzdWVySGFzaGVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBnZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcob3B0aW9ucyksXG4gICAgICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvblJlc3VsdHMoeyBnZXRPdXRwdXQgfSkudGhlbihhc3luYyAocmVzdWx0cykgPT5cbiAgICAgICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHRzKVxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWRcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZS5sdCh1dGlscy5aRVJPKSlcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkXG4gICAgICAgICAgICAgICAgLm1hcChhc3luYyAoW2Fzc2V0SGFzaCwgX10pID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgZ2V0QXNzZXQoe1xuICAgICAgICAgICAgICAgICAgICBoYXNoOiBjb21tb24uaGV4VG9VSW50MjU2KGFzc2V0SGFzaCksXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi51SW50MTYwVG9IZXgoYXNzZXQuaXNzdWVyKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoWy4uLmhhc2hlcywgLi4uaXNzdWVySGFzaGVzXSk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2VyaWFsaXplSlNPTihjb250ZXh0OiBTZXJpYWxpemVKU09OQ29udGV4dCk6IFByb21pc2U8SXNzdWVUcmFuc2FjdGlvbkpTT04+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkJhc2VKU09OID0gYXdhaXQgc3VwZXIuc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlSlNPTihjb250ZXh0KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50cmFuc2FjdGlvbkJhc2VKU09OLFxuICAgICAgdHlwZTogJ0lzc3VlVHJhbnNhY3Rpb24nLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0U3lzdGVtRmVlKGNvbnRleHQ6IEZlZUNvbnRleHQpOiBCTiB7XG4gICAgaWYgKHRoaXMudmVyc2lvbiA+PSAxKSB7XG4gICAgICByZXR1cm4gdXRpbHMuWkVSTztcbiAgICB9XG5cbiAgICBjb25zdCB7IGdvdmVybmluZ1Rva2VuLCB1dGlsaXR5VG9rZW4gfSA9IGNvbnRleHQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5vdXRwdXRzLmV2ZXJ5KFxuICAgICAgICAob3V0cHV0KSA9PlxuICAgICAgICAgIGNvbW1vbi51SW50MjU2RXF1YWwob3V0cHV0LmFzc2V0LCBnb3Zlcm5pbmdUb2tlbi5oYXNoKSB8fFxuICAgICAgICAgIGNvbW1vbi51SW50MjU2RXF1YWwob3V0cHV0LmFzc2V0LCB1dGlsaXR5VG9rZW4uaGFzaCksXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gdXRpbHMuWkVSTztcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZ2V0U3lzdGVtRmVlKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyhcbiAgICBvcHRpb25zOiBUcmFuc2FjdGlvbkdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ09wdGlvbnMsXG4gICk6IFByb21pc2U8U2V0PFVJbnQxNjBIZXg+PiB7XG4gICAgcmV0dXJuIHRoaXMuaXNzdWVHZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbChvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnkob3B0aW9uczogVHJhbnNhY3Rpb25WZXJpZnlPcHRpb25zKTogUHJvbWlzZTxyZWFkb25seSBWZXJpZnlTY3JpcHRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IFtyZXN1bHRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzdXBlci52ZXJpZnkob3B0aW9ucyksIHRoaXMudmVyaWZ5SW50ZXJuYWwob3B0aW9ucyldKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2ZXJpZnlJbnRlcm5hbChvcHRpb25zOiBUcmFuc2FjdGlvblZlcmlmeU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGdldE91dHB1dCwgZ2V0QXNzZXQsIG1lbVBvb2wgPSBbXSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvblJlc3VsdHMoeyBnZXRPdXRwdXQgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBPYmplY3QuZW50cmllcyhyZXN1bHRzKS5tYXAoYXN5bmMgKFthc3NldEhleCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBjb21tb24uaGV4VG9VSW50MjU2KGFzc2V0SGV4KTtcbiAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBnZXRBc3NldCh7IGhhc2ggfSk7XG4gICAgICAgIGlmIChhc3NldC5hbW91bnQubHQodXRpbHMuWkVSTykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc3N1ZWQgPSBhc3NldC5hdmFpbGFibGUuYWRkKFxuICAgICAgICAgIG1lbVBvb2xcbiAgICAgICAgICAgIC5maWx0ZXIoKHRyYW5zYWN0aW9uKSA9PiB0cmFuc2FjdGlvbiAhPT0gdGhpcylcbiAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhY2MsIHRyYW5zYWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm91dHB1dHNcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKG91dHB1dCkgPT4gY29tbW9uLnVJbnQyNTZFcXVhbChoYXNoLCBvdXRwdXQuYXNzZXQpKVxuICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoaW5uZXJBY2MsIG91dHB1dCkgPT4gaW5uZXJBY2MuYWRkKG91dHB1dC52YWx1ZSksIGFjYyksXG5cbiAgICAgICAgICAgICAgdXRpbHMuWkVSTyxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFzc2V0LmFtb3VudC5zdWIoaXNzdWVkKS5sdCh2YWx1ZS5uZWcoKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZ5RXJyb3IoJ0ludmFsaWQgaXNzdWUgYW1vdW50Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|