1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const client_common_1 = require("@neo-one/client-common");
|
4 | const errors_1 = require("../errors");
|
5 | const utils_1 = require("../utils");
|
6 | const common_1 = require("./common");
|
7 | const Input_1 = require("./Input");
|
8 | const TransactionBase_1 = require("./TransactionBase");
|
9 | const TransactionType_1 = require("./TransactionType");
|
10 | class 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 | }
|
86 | exports.ClaimTransaction = ClaimTransaction;
|
87 |
|
88 |
|