UNPKG

4.36 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 common_1 = require("./common");
7const Input_1 = require("./Input");
8const TransactionBase_1 = require("./TransactionBase");
9const TransactionType_1 = require("./TransactionType");
10class ClaimTransaction extends TransactionBase_1.TransactionBase(client_common_1.ClaimTransactionModel) {
11 constructor(add) {
12 super(add);
13 this.sizeExclusive = utils_1.utils.lazy(() => client_common_1.IOHelper.sizeOfUInt8 + client_common_1.IOHelper.sizeOfArray(this.claims, (claim) => claim.size));
14 const getScriptHashesForVerifying = super.getScriptHashesForVerifying.bind(this);
15 this.claimGetScriptHashesForVerifyingInternal = utils_1.utils.lazyAsync(async (options) => {
16 const { getOutput } = options;
17 const [hashesSet, hashes] = await Promise.all([
18 getScriptHashesForVerifying(options),
19 Promise.all(this.claims.map(async (claim) => {
20 const output = await getOutput(claim);
21 return client_common_1.common.uInt160ToHex(output.address);
22 })),
23 ]);
24 return new Set([...hashesSet, ...hashes]);
25 });
26 }
27 static deserializeWireBase(options) {
28 const { reader } = options;
29 const { type, version } = super.deserializeTransactionBaseStartWireBase(options);
30 if (type !== TransactionType_1.TransactionType.Claim) {
31 throw new client_common_1.InvalidFormatError(`Expected transaction type to be ${TransactionType_1.TransactionType.Claim}. Received: ${type}`);
32 }
33 const claims = reader.readArray(() => Input_1.Input.deserializeWireBase(options));
34 const { attributes, inputs, outputs, scripts } = super.deserializeTransactionBaseEndWireBase(options);
35 return new this({
36 version,
37 claims,
38 attributes,
39 inputs,
40 outputs,
41 scripts,
42 });
43 }
44 async getNetworkFee(_context) {
45 return utils_1.utils.ZERO;
46 }
47 async getClaimReferences({ getOutput }) {
48 return Promise.all(this.claims.map(async (input) => getOutput(input)));
49 }
50 async getScriptHashesForVerifying(options) {
51 return this.claimGetScriptHashesForVerifyingInternal(options);
52 }
53 async verify(options) {
54 const [results] = await Promise.all([super.verify(options), this.verifyInternal(options)]);
55 return results;
56 }
57 async serializeJSON(context) {
58 const transactionBaseJSON = await super.serializeTransactionBaseJSON(context);
59 return Object.assign(Object.assign({}, transactionBaseJSON), { type: 'ClaimTransaction', claims: this.claims.map((claim) => claim.serializeJSON(context)) });
60 }
61 async verifyInternal(options) {
62 const { calculateClaimAmount, getOutput, utilityToken, memPool = [] } = options;
63 if (common_1.hasDuplicateInputs(this.claims)) {
64 throw new errors_1.VerifyError('Duplicate claims');
65 }
66 if (memPool.some((transaction) => transaction instanceof ClaimTransaction &&
67 transaction.type === TransactionType_1.TransactionType.Claim &&
68 common_1.hasIntersectingInputs(this.claims, transaction.claims))) {
69 throw new errors_1.VerifyError('Duplicate claims in mempool');
70 }
71 const [results, claimAmount] = await Promise.all([
72 this.getTransactionResults({ getOutput }),
73 calculateClaimAmount(this.claims).catch((error) => {
74 throw new errors_1.VerifyError(`Invalid claims: ${error.message}`);
75 }),
76 ]);
77 const result = Object.entries(results).find(([assetHex, _value]) => client_common_1.common.uInt256Equal(client_common_1.common.hexToUInt256(assetHex), utilityToken.hash));
78 if (result === undefined || result[1].gt(utils_1.utils.ZERO)) {
79 throw new errors_1.VerifyError('Invalid claim value');
80 }
81 if (!claimAmount.eq(result[1].neg())) {
82 throw new errors_1.VerifyError('Invalid claim value');
83 }
84 }
85}
86exports.ClaimTransaction = ClaimTransaction;
87
88//# sourceMappingURL=ClaimTransaction.js.map