UNPKG

14.1 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const client_common_1 = require("@neo-one/client-common");
4const errors_1 = require("../errors");
5const utils_1 = require("../utils");
6const TransactionBase_1 = require("./TransactionBase");
7const TransactionType_1 = require("./TransactionType");
8const MAX_SCRIPT_SIZE = 65536;
9class InvocationTransaction extends TransactionBase_1.TransactionBase(client_common_1.InvocationTransactionModel) {
10 constructor() {
11 super(...arguments);
12 this.sizeExclusive = utils_1.utils.lazy(() => client_common_1.IOHelper.sizeOfUInt8 + client_common_1.IOHelper.sizeOfVarBytesLE(this.script));
13 }
14 static deserializeWireBase(options) {
15 const { reader } = options;
16 const { type, version } = super.deserializeTransactionBaseStartWireBase(options);
17 if (type !== TransactionType_1.TransactionType.Invocation) {
18 throw new client_common_1.InvalidFormatError(`Expected transaction type to be ${TransactionType_1.TransactionType.Invocation}. Received: ${type}`);
19 }
20 const script = reader.readVarBytesLE(MAX_SCRIPT_SIZE);
21 if (script.length === 0) {
22 throw new client_common_1.InvalidFormatError('Expected invocation script length to not be 0');
23 }
24 let gas = utils_1.utils.ZERO;
25 if (version >= 1) {
26 gas = reader.readFixed8();
27 }
28 const { attributes, inputs, outputs, scripts } = super.deserializeTransactionBaseEndWireBase(options);
29 return new this({
30 version,
31 attributes,
32 inputs,
33 outputs,
34 scripts,
35 script,
36 gas,
37 });
38 }
39 async serializeJSON(context) {
40 const transactionBaseJSON = await super.serializeTransactionBaseJSON(context);
41 const data = await context.tryGetInvocationData(this);
42 let invocationDataJSON;
43 if (data !== undefined) {
44 const { asset, contracts, deletedContractHashes, migratedContractHashes, voteUpdates, actions, result, storageChanges, } = data;
45 invocationDataJSON = {
46 result: result.serializeJSON(context),
47 asset: asset === undefined ? undefined : asset.serializeJSON(context),
48 contracts: contracts.map((contract) => contract.serializeJSON(context)),
49 deletedContractHashes: deletedContractHashes.map((hash) => client_common_1.common.uInt160ToString(hash)),
50 migratedContractHashes: migratedContractHashes.map(([from, to]) => [client_common_1.common.uInt160ToString(from), client_common_1.common.uInt160ToString(to)]),
51 voteUpdates: voteUpdates.map(([address, votes]) => [
52 client_common_1.crypto.scriptHashToAddress({
53 addressVersion: context.addressVersion,
54 scriptHash: address,
55 }),
56 votes.map((vote) => client_common_1.common.ecPointToString(vote)),
57 ]),
58 actions: actions.map((action) => action.serializeJSON(context)),
59 storageChanges: storageChanges.map((storageChange) => storageChange.serializeJSON(context)),
60 };
61 }
62 return Object.assign({}, transactionBaseJSON, { type: 'InvocationTransaction', script: client_common_1.JSONHelper.writeBuffer(this.script), gas: client_common_1.JSONHelper.writeFixed8(this.gas), invocationData: invocationDataJSON });
63 }
64 getSystemFee(_context) {
65 return this.gas;
66 }
67 async verify(options) {
68 if (!this.gas.mod(utils_1.utils.ONE_HUNDRED_MILLION).eq(utils_1.utils.ZERO)) {
69 throw new errors_1.VerifyError('Invalid GAS amount');
70 }
71 return super.verify(options);
72 }
73}
74exports.InvocationTransaction = InvocationTransaction;
75
76//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWlDO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNELE1BQU0sSUFBSSxvQkFBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDN0M7UUFFRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBcEdELHNEQW9HQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29yZS9zcmMvdHJhbnNhY3Rpb24vSW52b2NhdGlvblRyYW5zYWN0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY29tbW9uLFxuICBjcnlwdG8sXG4gIEludmFsaWRGb3JtYXRFcnJvcixcbiAgSW52b2NhdGlvbkRhdGFKU09OLFxuICBJbnZvY2F0aW9uVHJhbnNhY3Rpb25KU09OLFxuICBJbnZvY2F0aW9uVHJhbnNhY3Rpb25Nb2RlbCxcbiAgSW52b2NhdGlvblRyYW5zYWN0aW9uTW9kZWxBZGQsXG4gIElPSGVscGVyLFxuICBKU09OSGVscGVyLFxufSBmcm9tICdAbmVvLW9uZS9jbGllbnQtY29tbW9uJztcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSAnQG5lby1vbmUvdXRpbHMnO1xuaW1wb3J0IHsgQk4gfSBmcm9tICdibi5qcyc7XG5pbXBvcnQgeyBWZXJpZnlFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZVdpcmVCYXNlT3B0aW9ucywgU2VyaWFsaXplSlNPTkNvbnRleHQgfSBmcm9tICcuLi9TZXJpYWxpemFibGUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBWZXJpZnlTY3JpcHRSZXN1bHQgfSBmcm9tICcuLi92bSc7XG5pbXBvcnQgeyBXaXRuZXNzIH0gZnJvbSAnLi4vV2l0bmVzcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGUgfSBmcm9tICcuL2F0dHJpYnV0ZSc7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnLi9PdXRwdXQnO1xuaW1wb3J0IHsgRmVlQ29udGV4dCwgVHJhbnNhY3Rpb25CYXNlLCBUcmFuc2FjdGlvblZlcmlmeU9wdGlvbnMgfSBmcm9tICcuL1RyYW5zYWN0aW9uQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICcuL1RyYW5zYWN0aW9uVHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2NhdGlvblRyYW5zYWN0aW9uQWRkIGV4dGVuZHMgSW52b2NhdGlvblRyYW5zYWN0aW9uTW9kZWxBZGQ8QXR0cmlidXRlLCBJbnB1dCwgT3V0cHV0LCBXaXRuZXNzPiB7fVxuXG5jb25zdCBNQVhfU0NSSVBUX1NJWkUgPSA2NTUzNjtcblxuZXhwb3J0IGNsYXNzIEludm9jYXRpb25UcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uQmFzZTxcbiAgVHJhbnNhY3Rpb25UeXBlLkludm9jYXRpb24sXG4gIEludm9jYXRpb25UcmFuc2FjdGlvbkpTT04sXG4gIENvbnN0cnVjdG9yPEludm9jYXRpb25UcmFuc2FjdGlvbk1vZGVsPEF0dHJpYnV0ZSwgSW5wdXQsIE91dHB1dCwgV2l0bmVzcz4+XG4+KEludm9jYXRpb25UcmFuc2FjdGlvbk1vZGVsKSB7XG4gIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemVXaXJlQmFzZShvcHRpb25zOiBEZXNlcmlhbGl6ZVdpcmVCYXNlT3B0aW9ucyk6IEludm9jYXRpb25UcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgeyByZWFkZXIgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHR5cGUsIHZlcnNpb24gfSA9IHN1cGVyLmRlc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlU3RhcnRXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIGlmICh0eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuSW52b2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRGb3JtYXRFcnJvcihgRXhwZWN0ZWQgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSAke1RyYW5zYWN0aW9uVHlwZS5JbnZvY2F0aW9ufS4gUmVjZWl2ZWQ6ICR7dHlwZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JpcHQgPSByZWFkZXIucmVhZFZhckJ5dGVzTEUoTUFYX1NDUklQVF9TSVpFKTtcbiAgICBpZiAoc2NyaXB0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRGb3JtYXRFcnJvcignRXhwZWN0ZWQgaW52b2NhdGlvbiBzY3JpcHQgbGVuZ3RoIHRvIG5vdCBiZSAwJyk7XG4gICAgfVxuXG4gICAgbGV0IGdhcyA9IHV0aWxzLlpFUk87XG4gICAgaWYgKHZlcnNpb24gPj0gMSkge1xuICAgICAgZ2FzID0gcmVhZGVyLnJlYWRGaXhlZDgoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGlucHV0cywgb3V0cHV0cywgc2NyaXB0cyB9ID0gc3VwZXIuZGVzZXJpYWxpemVUcmFuc2FjdGlvbkJhc2VFbmRXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIHJldHVybiBuZXcgdGhpcyh7XG4gICAgICB2ZXJzaW9uLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBzY3JpcHRzLFxuICAgICAgc2NyaXB0LFxuICAgICAgZ2FzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpemVFeGNsdXNpdmU6ICgpID0+IG51bWJlciA9IHV0aWxzLmxhenkoXG4gICAgKCkgPT4gSU9IZWxwZXIuc2l6ZU9mVUludDggKyBJT0hlbHBlci5zaXplT2ZWYXJCeXRlc0xFKHRoaXMuc2NyaXB0KSxcbiAgKTtcblxuICBwdWJsaWMgYXN5bmMgc2VyaWFsaXplSlNPTihjb250ZXh0OiBTZXJpYWxpemVKU09OQ29udGV4dCk6IFByb21pc2U8SW52b2NhdGlvblRyYW5zYWN0aW9uSlNPTj4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uQmFzZUpTT04gPSBhd2FpdCBzdXBlci5zZXJpYWxpemVUcmFuc2FjdGlvbkJhc2VKU09OKGNvbnRleHQpO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGNvbnRleHQudHJ5R2V0SW52b2NhdGlvbkRhdGEodGhpcyk7XG4gICAgbGV0IGludm9jYXRpb25EYXRhSlNPTjogSW52b2NhdGlvbkRhdGFKU09OIHwgdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYXNzZXQsXG4gICAgICAgIGNvbnRyYWN0cyxcbiAgICAgICAgZGVsZXRlZENvbnRyYWN0SGFzaGVzLFxuICAgICAgICBtaWdyYXRlZENvbnRyYWN0SGFzaGVzLFxuICAgICAgICB2b3RlVXBkYXRlcyxcbiAgICAgICAgYWN0aW9ucyxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBzdG9yYWdlQ2hhbmdlcyxcbiAgICAgIH0gPSBkYXRhO1xuICAgICAgaW52b2NhdGlvbkRhdGFKU09OID0ge1xuICAgICAgICByZXN1bHQ6IHJlc3VsdC5zZXJpYWxpemVKU09OKGNvbnRleHQpLFxuICAgICAgICBhc3NldDogYXNzZXQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGFzc2V0LnNlcmlhbGl6ZUpTT04oY29udGV4dCksXG4gICAgICAgIGNvbnRyYWN0czogY29udHJhY3RzLm1hcCgoY29udHJhY3QpID0+IGNvbnRyYWN0LnNlcmlhbGl6ZUpTT04oY29udGV4dCkpLFxuICAgICAgICBkZWxldGVkQ29udHJhY3RIYXNoZXM6IGRlbGV0ZWRDb250cmFjdEhhc2hlcy5tYXAoKGhhc2gpID0+IGNvbW1vbi51SW50MTYwVG9TdHJpbmcoaGFzaCkpLFxuICAgICAgICBtaWdyYXRlZENvbnRyYWN0SGFzaGVzOiBtaWdyYXRlZENvbnRyYWN0SGFzaGVzLm1hcDxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPihcbiAgICAgICAgICAoW2Zyb20sIHRvXSkgPT4gW2NvbW1vbi51SW50MTYwVG9TdHJpbmcoZnJvbSksIGNvbW1vbi51SW50MTYwVG9TdHJpbmcodG8pXSBhcyBjb25zdCxcbiAgICAgICAgKSxcbiAgICAgICAgdm90ZVVwZGF0ZXM6IHZvdGVVcGRhdGVzLm1hcDxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmdbXV0+KFxuICAgICAgICAgIChbYWRkcmVzcywgdm90ZXNdKSA9PlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBjcnlwdG8uc2NyaXB0SGFzaFRvQWRkcmVzcyh7XG4gICAgICAgICAgICAgICAgYWRkcmVzc1ZlcnNpb246IGNvbnRleHQuYWRkcmVzc1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgc2NyaXB0SGFzaDogYWRkcmVzcyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHZvdGVzLm1hcCgodm90ZSkgPT4gY29tbW9uLmVjUG9pbnRUb1N0cmluZyh2b3RlKSksXG4gICAgICAgICAgICBdIGFzIGNvbnN0LFxuICAgICAgICApLFxuICAgICAgICBhY3Rpb25zOiBhY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiBhY3Rpb24uc2VyaWFsaXplSlNPTihjb250ZXh0KSksXG4gICAgICAgIHN0b3JhZ2VDaGFuZ2VzOiBzdG9yYWdlQ2hhbmdlcy5tYXAoKHN0b3JhZ2VDaGFuZ2UpID0+IHN0b3JhZ2VDaGFuZ2Uuc2VyaWFsaXplSlNPTihjb250ZXh0KSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi50cmFuc2FjdGlvbkJhc2VKU09OLFxuICAgICAgdHlwZTogJ0ludm9jYXRpb25UcmFuc2FjdGlvbicsXG4gICAgICBzY3JpcHQ6IEpTT05IZWxwZXIud3JpdGVCdWZmZXIodGhpcy5zY3JpcHQpLFxuICAgICAgZ2FzOiBKU09OSGVscGVyLndyaXRlRml4ZWQ4KHRoaXMuZ2FzKSxcbiAgICAgIGludm9jYXRpb25EYXRhOiBpbnZvY2F0aW9uRGF0YUpTT04sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTeXN0ZW1GZWUoX2NvbnRleHQ6IEZlZUNvbnRleHQpOiBCTiB7XG4gICAgcmV0dXJuIHRoaXMuZ2FzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHZlcmlmeShvcHRpb25zOiBUcmFuc2FjdGlvblZlcmlmeU9wdGlvbnMpOiBQcm9taXNlPHJlYWRvbmx5IFZlcmlmeVNjcmlwdFJlc3VsdFtdPiB7XG4gICAgaWYgKCF0aGlzLmdhcy5tb2QodXRpbHMuT05FX0hVTkRSRURfTUlMTElPTikuZXEodXRpbHMuWkVSTykpIHtcbiAgICAgIHRocm93IG5ldyBWZXJpZnlFcnJvcignSW52YWxpZCBHQVMgYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnZlcmlmeShvcHRpb25zKTtcbiAgfVxufVxuIl19