1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const client_common_1 = require("@neo-one/client-common");
|
4 | const utils_1 = require("../utils");
|
5 | const state_1 = require("./state");
|
6 | const TransactionBase_1 = require("./TransactionBase");
|
7 | const TransactionType_1 = require("./TransactionType");
|
8 | class StateTransaction extends TransactionBase_1.TransactionBase(client_common_1.TransactionBaseModel) {
|
9 | constructor({ version, attributes, inputs, outputs, scripts, hash, descriptors }) {
|
10 | super({
|
11 | version,
|
12 | type: TransactionType_1.TransactionType.State,
|
13 | attributes,
|
14 | inputs,
|
15 | outputs,
|
16 | scripts,
|
17 | hash,
|
18 | });
|
19 | this.sizeExclusive = utils_1.utils.lazy(() => client_common_1.IOHelper.sizeOfArray(this.descriptors, (descriptor) => descriptor.size));
|
20 | this.descriptors = descriptors;
|
21 | if (this.version !== 0) {
|
22 | throw new client_common_1.InvalidFormatError(`Expected version to be 0. Received: ${this.version}`);
|
23 | }
|
24 | const getScriptHashesForVerifying = super.getScriptHashesForVerifying.bind(this);
|
25 | this.stateGetScriptHashesForVerifyingInternal = utils_1.utils.lazyAsync(async (options) => {
|
26 | const mutableHashes = await getScriptHashesForVerifying(options);
|
27 | this.descriptors.forEach((descriptor) => {
|
28 | descriptor.getScriptHashesForVerifying().forEach((scriptHash) => {
|
29 | mutableHashes.add(scriptHash);
|
30 | });
|
31 | });
|
32 | return mutableHashes;
|
33 | });
|
34 | }
|
35 | static deserializeWireBase(options) {
|
36 | const { reader } = options;
|
37 | const { type, version } = super.deserializeTransactionBaseStartWireBase(options);
|
38 | if (type !== TransactionType_1.TransactionType.State) {
|
39 | throw new client_common_1.InvalidFormatError(`Expected transaction type ${TransactionType_1.TransactionType.State}. Received: ${type}`);
|
40 | }
|
41 | const descriptors = reader.readArray(() => state_1.StateDescriptor.deserializeWireBase(options));
|
42 | const { attributes, inputs, outputs, scripts } = super.deserializeTransactionBaseEndWireBase(options);
|
43 | return new this({
|
44 | version,
|
45 | attributes,
|
46 | inputs,
|
47 | outputs,
|
48 | scripts,
|
49 | descriptors,
|
50 | });
|
51 | }
|
52 | getSystemFee(context) {
|
53 | return this.descriptors.reduce((value, descriptor) => value.add(descriptor.getSystemFee(context)), utils_1.utils.ZERO);
|
54 | }
|
55 | async getScriptHashesForVerifying(options) {
|
56 | return this.stateGetScriptHashesForVerifyingInternal(options);
|
57 | }
|
58 | clone({ scripts = this.scripts, attributes = this.attributes, inputs = this.inputs, outputs = this.outputs, }) {
|
59 | return new this.constructor({
|
60 | version: this.version,
|
61 | attributes,
|
62 | inputs,
|
63 | outputs,
|
64 | scripts,
|
65 | descriptors: this.descriptors,
|
66 | });
|
67 | }
|
68 | serializeExclusiveBase(writer) {
|
69 | writer.writeArray(this.descriptors, (descriptor) => {
|
70 | descriptor.serializeWireBase(writer);
|
71 | });
|
72 | }
|
73 | async serializeJSON(context) {
|
74 | const transactionBaseJSON = await super.serializeTransactionBaseJSON(context);
|
75 | return Object.assign(Object.assign({}, transactionBaseJSON), { type: 'StateTransaction', descriptors: this.descriptors.map((descriptor) => descriptor.serializeJSON(context)) });
|
76 | }
|
77 | async verify(options) {
|
78 | const [results] = await Promise.all([super.verify(options), this.verifyInternal(options)]);
|
79 | return results;
|
80 | }
|
81 | async verifyInternal(options) {
|
82 | await Promise.all(this.descriptors.map(async (descriptor) => descriptor.verify(options)));
|
83 | }
|
84 | }
|
85 | exports.StateTransaction = StateTransaction;
|
86 |
|
87 |
|