1 | ;
|
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({}, 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 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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LENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUM5QztJQUNILENBQUM7Q0FDRjtBQTdIRCw0Q0E2SEMiLCJmaWxlIjoibmVvLW9uZS1ub2RlLWNvcmUvc3JjL3RyYW5zYWN0aW9uL0NsYWltVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDbGFpbVRyYW5zYWN0aW9uSlNPTixcbiAgQ2xhaW1UcmFuc2FjdGlvbk1vZGVsLFxuICBDbGFpbVRyYW5zYWN0aW9uTW9kZWxBZGQsXG4gIGNvbW1vbixcbiAgSW52YWxpZEZvcm1hdEVycm9yLFxuICBJT0hlbHBlcixcbiAgVUludDE2MEhleCxcbn0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWNvbW1vbic7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IHsgVmVyaWZ5RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVXaXJlQmFzZU9wdGlvbnMsIFNlcmlhbGl6ZUpTT05Db250ZXh0IH0gZnJvbSAnLi4vU2VyaWFsaXphYmxlJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVmVyaWZ5U2NyaXB0UmVzdWx0IH0gZnJvbSAnLi4vdm0nO1xuaW1wb3J0IHsgV2l0bmVzcyB9IGZyb20gJy4uL1dpdG5lc3MnO1xuaW1wb3J0IHsgQXR0cmlidXRlIH0gZnJvbSAnLi9hdHRyaWJ1dGUnO1xuaW1wb3J0IHsgaGFzRHVwbGljYXRlSW5wdXRzLCBoYXNJbnRlcnNlY3RpbmdJbnB1dHMgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnLi9PdXRwdXQnO1xuaW1wb3J0IHtcbiAgRmVlQ29udGV4dCxcbiAgR2V0UmVmZXJlbmNlc09wdGlvbnMsXG4gIFRyYW5zYWN0aW9uQmFzZSxcbiAgVHJhbnNhY3Rpb25HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zLFxuICBUcmFuc2FjdGlvblZlcmlmeU9wdGlvbnMsXG59IGZyb20gJy4vVHJhbnNhY3Rpb25CYXNlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJy4vVHJhbnNhY3Rpb25UeXBlJztcblxuZXhwb3J0IGludGVyZmFjZSBDbGFpbVRyYW5zYWN0aW9uQWRkIGV4dGVuZHMgQ2xhaW1UcmFuc2FjdGlvbk1vZGVsQWRkPEF0dHJpYnV0ZSwgSW5wdXQsIE91dHB1dCwgV2l0bmVzcz4ge31cblxuZXhwb3J0IGNsYXNzIENsYWltVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbkJhc2U8XG4gIFRyYW5zYWN0aW9uVHlwZS5DbGFpbSxcbiAgQ2xhaW1UcmFuc2FjdGlvbkpTT04sXG4gIENvbnN0cnVjdG9yPENsYWltVHJhbnNhY3Rpb25Nb2RlbDxBdHRyaWJ1dGUsIElucHV0LCBPdXRwdXQsIFdpdG5lc3M+PlxuPihDbGFpbVRyYW5zYWN0aW9uTW9kZWwpIHtcbiAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZVdpcmVCYXNlKG9wdGlvbnM6IERlc2VyaWFsaXplV2lyZUJhc2VPcHRpb25zKTogQ2xhaW1UcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgeyByZWFkZXIgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHR5cGUsIHZlcnNpb24gfSA9IHN1cGVyLmRlc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlU3RhcnRXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIGlmICh0eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuQ2xhaW0pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRm9ybWF0RXJyb3IoYEV4cGVjdGVkIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgJHtUcmFuc2FjdGlvblR5cGUuQ2xhaW19LiBSZWNlaXZlZDogJHt0eXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNsYWltcyA9IHJlYWRlci5yZWFkQXJyYXkoKCkgPT4gSW5wdXQuZGVzZXJpYWxpemVXaXJlQmFzZShvcHRpb25zKSk7XG5cbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGlucHV0cywgb3V0cHV0cywgc2NyaXB0cyB9ID0gc3VwZXIuZGVzZXJpYWxpemVUcmFuc2FjdGlvbkJhc2VFbmRXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIHJldHVybiBuZXcgdGhpcyh7XG4gICAgICB2ZXJzaW9uLFxuICAgICAgY2xhaW1zLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBzY3JpcHRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGNsYWltcyE6IHJlYWRvbmx5IElucHV0W107XG4gIHByb3RlY3RlZCByZWFkb25seSBzaXplRXhjbHVzaXZlOiAoKSA9PiBudW1iZXIgPSB1dGlscy5sYXp5KFxuICAgICgpID0+IElPSGVscGVyLnNpemVPZlVJbnQ4ICsgSU9IZWxwZXIuc2l6ZU9mQXJyYXkodGhpcy5jbGFpbXMsIChjbGFpbSkgPT4gY2xhaW0uc2l6ZSksXG4gICk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xhaW1HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbDogKFxuICAgIG9wdGlvbnM6IFRyYW5zYWN0aW9uR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucyxcbiAgKSA9PiBQcm9taXNlPFNldDxVSW50MTYwSGV4Pj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFkZDogQ2xhaW1UcmFuc2FjdGlvbkFkZCkge1xuICAgIHN1cGVyKGFkZCk7XG5cbiAgICBjb25zdCBnZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcgPSBzdXBlci5nZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsYWltR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nSW50ZXJuYWwgPSB1dGlscy5sYXp5QXN5bmMoXG4gICAgICBhc3luYyAob3B0aW9uczogVHJhbnNhY3Rpb25HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZ2V0T3V0cHV0IH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBbaGFzaGVzU2V0LCBoYXNoZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyhvcHRpb25zKSxcbiAgICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRoaXMuY2xhaW1zLm1hcChhc3luYyAoY2xhaW0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZ2V0T3V0cHV0KGNsYWltKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY29tbW9uLnVJbnQxNjBUb0hleChvdXRwdXQuYWRkcmVzcyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNldChbLi4uaGFzaGVzU2V0LCAuLi5oYXNoZXNdKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXROZXR3b3JrRmVlKF9jb250ZXh0OiBGZWVDb250ZXh0KTogUHJvbWlzZTxCTj4ge1xuICAgIHJldHVybiB1dGlscy5aRVJPO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENsYWltUmVmZXJlbmNlcyh7IGdldE91dHB1dCB9OiBHZXRSZWZlcmVuY2VzT3B0aW9ucyk6IFByb21pc2U8cmVhZG9ubHkgT3V0cHV0W10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5jbGFpbXMubWFwKGFzeW5jIChpbnB1dCkgPT4gZ2V0T3V0cHV0KGlucHV0KSkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyhcbiAgICBvcHRpb25zOiBUcmFuc2FjdGlvbkdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ09wdGlvbnMsXG4gICk6IFByb21pc2U8U2V0PFVJbnQxNjBIZXg+PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xhaW1HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbChvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnkob3B0aW9uczogVHJhbnNhY3Rpb25WZXJpZnlPcHRpb25zKTogUHJvbWlzZTxyZWFkb25seSBWZXJpZnlTY3JpcHRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IFtyZXN1bHRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtzdXBlci52ZXJpZnkob3B0aW9ucyksIHRoaXMudmVyaWZ5SW50ZXJuYWwob3B0aW9ucyldKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNlcmlhbGl6ZUpTT04oY29udGV4dDogU2VyaWFsaXplSlNPTkNvbnRleHQpOiBQcm9taXNlPENsYWltVHJhbnNhY3Rpb25KU09OPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25CYXNlSlNPTiA9IGF3YWl0IHN1cGVyLnNlcmlhbGl6ZVRyYW5zYWN0aW9uQmFzZUpTT04oY29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udHJhbnNhY3Rpb25CYXNlSlNPTixcbiAgICAgIHR5cGU6ICdDbGFpbVRyYW5zYWN0aW9uJyxcbiAgICAgIGNsYWltczogdGhpcy5jbGFpbXMubWFwKChjbGFpbSkgPT4gY2xhaW0uc2VyaWFsaXplSlNPTihjb250ZXh0KSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5SW50ZXJuYWwob3B0aW9uczogVHJhbnNhY3Rpb25WZXJpZnlPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBjYWxjdWxhdGVDbGFpbUFtb3VudCwgZ2V0T3V0cHV0LCB1dGlsaXR5VG9rZW4sIG1lbVBvb2wgPSBbXSB9ID0gb3B0aW9ucztcbiAgICBpZiAoaGFzRHVwbGljYXRlSW5wdXRzKHRoaXMuY2xhaW1zKSkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmeUVycm9yKCdEdXBsaWNhdGUgY2xhaW1zJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgbWVtUG9vbC5zb21lKFxuICAgICAgICAodHJhbnNhY3Rpb24pID0+XG4gICAgICAgICAgdHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBDbGFpbVRyYW5zYWN0aW9uICYmXG4gICAgICAgICAgdHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkNsYWltICYmXG4gICAgICAgICAgaGFzSW50ZXJzZWN0aW5nSW5wdXRzKHRoaXMuY2xhaW1zLCB0cmFuc2FjdGlvbi5jbGFpbXMpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmeUVycm9yKCdEdXBsaWNhdGUgY2xhaW1zIGluIG1lbXBvb2wnKTtcbiAgICB9XG4gICAgY29uc3QgW3Jlc3VsdHMsIGNsYWltQW1vdW50XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25SZXN1bHRzKHsgZ2V0T3V0cHV0IH0pLFxuICAgICAgY2FsY3VsYXRlQ2xhaW1BbW91bnQodGhpcy5jbGFpbXMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVmVyaWZ5RXJyb3IoYEludmFsaWQgY2xhaW1zOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9KSxcbiAgICBdKTtcblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWRcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhyZXN1bHRzKS5maW5kKChbYXNzZXRIZXgsIF92YWx1ZV0pID0+XG4gICAgICBjb21tb24udUludDI1NkVxdWFsKGNvbW1vbi5oZXhUb1VJbnQyNTYoYXNzZXRIZXgpLCB1dGlsaXR5VG9rZW4uaGFzaCksXG4gICAgKTtcblxuICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHRbMV0uZ3QodXRpbHMuWkVSTykpIHtcbiAgICAgIHRocm93IG5ldyBWZXJpZnlFcnJvcignSW52YWxpZCBjbGFpbSB2YWx1ZScpO1xuICAgIH1cblxuICAgIGlmICghY2xhaW1BbW91bnQuZXEocmVzdWx0WzFdLm5lZygpKSkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmeUVycm9yKCdJbnZhbGlkIGNsYWltIHZhbHVlJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|