UNPKG

12.7 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");
8class EnrollmentTransaction extends TransactionBase_1.TransactionBase(client_common_1.TransactionBaseModel) {
9 constructor({ version, attributes, inputs, outputs, scripts, hash, publicKey }) {
10 super({
11 version,
12 type: TransactionType_1.TransactionType.Enrollment,
13 attributes,
14 inputs,
15 outputs,
16 scripts,
17 hash,
18 });
19 this.sizeExclusive = utils_1.utils.lazy(() => client_common_1.IOHelper.sizeOfUInt8 + client_common_1.IOHelper.sizeOfECPoint(this.publicKey));
20 this.publicKey = publicKey;
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.enrollmentGetScriptHashesForVerifyingInternal = utils_1.utils.lazyAsync(async (options) => {
26 const hashes = await getScriptHashesForVerifying(options);
27 return new Set([...hashes, client_common_1.common.uInt160ToHex(client_common_1.crypto.getVerificationScriptHash(this.publicKey))]);
28 });
29 }
30 static deserializeWireBase(options) {
31 const { reader } = options;
32 const { type, version } = super.deserializeTransactionBaseStartWireBase(options);
33 if (type !== TransactionType_1.TransactionType.Enrollment) {
34 throw new client_common_1.InvalidFormatError(`Expected transaction type ${TransactionType_1.TransactionType.Enrollment}. Received: ${type}`);
35 }
36 const publicKey = reader.readECPoint();
37 const { attributes, inputs, outputs, scripts } = super.deserializeTransactionBaseEndWireBase(options);
38 return new this({
39 version,
40 publicKey,
41 attributes,
42 inputs,
43 outputs,
44 scripts,
45 });
46 }
47 clone({ scripts = this.scripts, attributes = this.attributes, inputs = this.inputs, outputs = this.outputs, }) {
48 return new this.constructor({
49 version: this.version,
50 attributes,
51 inputs,
52 outputs,
53 scripts,
54 publicKey: this.publicKey,
55 });
56 }
57 serializeExclusiveBase(writer) {
58 writer.writeECPoint(this.publicKey);
59 }
60 async serializeJSON(context) {
61 const transactionBaseJSON = await super.serializeTransactionBaseJSON(context);
62 return Object.assign({}, transactionBaseJSON, { type: 'EnrollmentTransaction', pubkey: client_common_1.JSONHelper.writeECPoint(this.publicKey) });
63 }
64 async getScriptHashesForVerifying(options) {
65 return this.enrollmentGetScriptHashesForVerifyingInternal(options);
66 }
67 async verify(_options) {
68 throw new errors_1.VerifyError('Enrollment transactions are obsolete');
69 }
70}
71exports.EnrollmentTransaction = EnrollmentTransaction;
72
73//# sourceMappingURL=data:application/json;charset=utf8;base64,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TixPQUFPO1lBQ1AsT0FBTztZQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUMxQixDQUFTLENBQUM7SUFDYixDQUFDO0lBRU0sc0JBQXNCLENBQUMsTUFBb0I7UUFDaEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBNkI7UUFDdEQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5RSx5QkFDSyxtQkFBbUIsSUFDdEIsSUFBSSxFQUFFLHVCQUF1QixFQUM3QixNQUFNLEVBQUUsMEJBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUMvQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsMkJBQTJCLENBQ3RDLE9BQXNEO1FBRXRELE9BQU8sSUFBSSxDQUFDLDZDQUE2QyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWtDO1FBQ3BELE1BQU0sSUFBSSxvQkFBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNGO0FBN0dELHNEQTZHQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29yZS9zcmMvdHJhbnNhY3Rpb24vRW5yb2xsbWVudFRyYW5zYWN0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmluYXJ5V3JpdGVyLFxuICBjb21tb24sXG4gIGNyeXB0byxcbiAgRUNQb2ludCxcbiAgRW5yb2xsbWVudFRyYW5zYWN0aW9uSlNPTixcbiAgSW52YWxpZEZvcm1hdEVycm9yLFxuICBJT0hlbHBlcixcbiAgSlNPTkhlbHBlcixcbiAgVHJhbnNhY3Rpb25CYXNlTW9kZWwsXG4gIFVJbnQxNjBIZXgsXG59IGZyb20gJ0BuZW8tb25lL2NsaWVudC1jb21tb24nO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tICdAbmVvLW9uZS91dGlscyc7XG5pbXBvcnQgeyBWZXJpZnlFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZVdpcmVCYXNlT3B0aW9ucywgU2VyaWFsaXplSlNPTkNvbnRleHQgfSBmcm9tICcuLi9TZXJpYWxpemFibGUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBWZXJpZnlTY3JpcHRSZXN1bHQgfSBmcm9tICcuLi92bSc7XG5pbXBvcnQgeyBXaXRuZXNzIH0gZnJvbSAnLi4vV2l0bmVzcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGUgfSBmcm9tICcuL2F0dHJpYnV0ZSc7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnLi9PdXRwdXQnO1xuaW1wb3J0IHtcbiAgVHJhbnNhY3Rpb25CYXNlLFxuICBUcmFuc2FjdGlvbkJhc2VBZGQsXG4gIFRyYW5zYWN0aW9uR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25WZXJpZnlPcHRpb25zLFxufSBmcm9tICcuL1RyYW5zYWN0aW9uQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICcuL1RyYW5zYWN0aW9uVHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5yb2xsbWVudFRyYW5zYWN0aW9uQWRkIGV4dGVuZHMgVHJhbnNhY3Rpb25CYXNlQWRkIHtcbiAgcmVhZG9ubHkgcHVibGljS2V5OiBFQ1BvaW50O1xufVxuXG5leHBvcnQgY2xhc3MgRW5yb2xsbWVudFRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb25CYXNlPFxuICBUcmFuc2FjdGlvblR5cGUuRW5yb2xsbWVudCxcbiAgRW5yb2xsbWVudFRyYW5zYWN0aW9uSlNPTixcbiAgQ29uc3RydWN0b3I8VHJhbnNhY3Rpb25CYXNlTW9kZWw8VHJhbnNhY3Rpb25UeXBlLkVucm9sbG1lbnQsIEF0dHJpYnV0ZSwgSW5wdXQsIE91dHB1dCwgV2l0bmVzcz4+XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbj4oVHJhbnNhY3Rpb25CYXNlTW9kZWwgYXMgYW55KSB7XG4gIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemVXaXJlQmFzZShvcHRpb25zOiBEZXNlcmlhbGl6ZVdpcmVCYXNlT3B0aW9ucyk6IEVucm9sbG1lbnRUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgeyByZWFkZXIgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IHR5cGUsIHZlcnNpb24gfSA9IHN1cGVyLmRlc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlU3RhcnRXaXJlQmFzZShvcHRpb25zKTtcblxuICAgIGlmICh0eXBlICE9PSBUcmFuc2FjdGlvblR5cGUuRW5yb2xsbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRGb3JtYXRFcnJvcihgRXhwZWN0ZWQgdHJhbnNhY3Rpb24gdHlwZSAke1RyYW5zYWN0aW9uVHlwZS5FbnJvbGxtZW50fS4gUmVjZWl2ZWQ6ICR7dHlwZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdWJsaWNLZXkgPSByZWFkZXIucmVhZEVDUG9pbnQoKTtcblxuICAgIGNvbnN0IHsgYXR0cmlidXRlcywgaW5wdXRzLCBvdXRwdXRzLCBzY3JpcHRzIH0gPSBzdXBlci5kZXNlcmlhbGl6ZVRyYW5zYWN0aW9uQmFzZUVuZFdpcmVCYXNlKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIG5ldyB0aGlzKHtcbiAgICAgIHZlcnNpb24sXG4gICAgICBwdWJsaWNLZXksXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgaW5wdXRzLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIHNjcmlwdHMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljS2V5OiBFQ1BvaW50O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2l6ZUV4Y2x1c2l2ZTogKCkgPT4gbnVtYmVyID0gdXRpbHMubGF6eShcbiAgICAoKSA9PiBJT0hlbHBlci5zaXplT2ZVSW50OCArIElPSGVscGVyLnNpemVPZkVDUG9pbnQodGhpcy5wdWJsaWNLZXkpLFxuICApO1xuICBwcml2YXRlIHJlYWRvbmx5IGVucm9sbG1lbnRHZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbDogKFxuICAgIG9wdGlvbnM6IFRyYW5zYWN0aW9uR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucyxcbiAgKSA9PiBQcm9taXNlPFNldDxVSW50MTYwSGV4Pj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHsgdmVyc2lvbiwgYXR0cmlidXRlcywgaW5wdXRzLCBvdXRwdXRzLCBzY3JpcHRzLCBoYXNoLCBwdWJsaWNLZXkgfTogRW5yb2xsbWVudFRyYW5zYWN0aW9uQWRkKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdmVyc2lvbixcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5FbnJvbGxtZW50LFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBzY3JpcHRzLFxuICAgICAgaGFzaCxcbiAgICB9KTtcblxuICAgIHRoaXMucHVibGljS2V5ID0gcHVibGljS2V5O1xuXG4gICAgaWYgKHRoaXMudmVyc2lvbiAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRGb3JtYXRFcnJvcihgRXhwZWN0ZWQgdmVyc2lvbiB0byBiZSAwLiBSZWNlaXZlZDogJHt0aGlzLnZlcnNpb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nID0gc3VwZXIuZ2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nLmJpbmQodGhpcyk7XG4gICAgdGhpcy5lbnJvbGxtZW50R2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nSW50ZXJuYWwgPSB1dGlscy5sYXp5QXN5bmMoXG4gICAgICBhc3luYyAob3B0aW9uczogVHJhbnNhY3Rpb25HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc2hlcyA9IGF3YWl0IGdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyhvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNldChbLi4uaGFzaGVzLCBjb21tb24udUludDE2MFRvSGV4KGNyeXB0by5nZXRWZXJpZmljYXRpb25TY3JpcHRIYXNoKHRoaXMucHVibGljS2V5KSldKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSh7XG4gICAgc2NyaXB0cyA9IHRoaXMuc2NyaXB0cyxcbiAgICBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLFxuICAgIGlucHV0cyA9IHRoaXMuaW5wdXRzLFxuICAgIG91dHB1dHMgPSB0aGlzLm91dHB1dHMsXG4gIH06IHtcbiAgICByZWFkb25seSBzY3JpcHRzPzogcmVhZG9ubHkgV2l0bmVzc1tdO1xuICAgIHJlYWRvbmx5IGF0dHJpYnV0ZXM/OiByZWFkb25seSBBdHRyaWJ1dGVbXTtcbiAgICByZWFkb25seSBpbnB1dHM/OiByZWFkb25seSBJbnB1dFtdO1xuICAgIHJlYWRvbmx5IG91dHB1dHM/OiByZWFkb25seSBPdXRwdXRbXTtcbiAgfSk6IHRoaXMge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgICByZXR1cm4gbmV3ICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkoe1xuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBzY3JpcHRzLFxuICAgICAgcHVibGljS2V5OiB0aGlzLnB1YmxpY0tleSxcbiAgICB9KSBhcyB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZUV4Y2x1c2l2ZUJhc2Uod3JpdGVyOiBCaW5hcnlXcml0ZXIpOiB2b2lkIHtcbiAgICB3cml0ZXIud3JpdGVFQ1BvaW50KHRoaXMucHVibGljS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXJpYWxpemVKU09OKGNvbnRleHQ6IFNlcmlhbGl6ZUpTT05Db250ZXh0KTogUHJvbWlzZTxFbnJvbGxtZW50VHJhbnNhY3Rpb25KU09OPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25CYXNlSlNPTiA9IGF3YWl0IHN1cGVyLnNlcmlhbGl6ZVRyYW5zYWN0aW9uQmFzZUpTT04oY29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udHJhbnNhY3Rpb25CYXNlSlNPTixcbiAgICAgIHR5cGU6ICdFbnJvbGxtZW50VHJhbnNhY3Rpb24nLFxuICAgICAgcHVia2V5OiBKU09OSGVscGVyLndyaXRlRUNQb2ludCh0aGlzLnB1YmxpY0tleSksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmcoXG4gICAgb3B0aW9uczogVHJhbnNhY3Rpb25HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zLFxuICApOiBQcm9taXNlPFNldDxVSW50MTYwSGV4Pj4ge1xuICAgIHJldHVybiB0aGlzLmVucm9sbG1lbnRHZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbChvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnkoX29wdGlvbnM6IFRyYW5zYWN0aW9uVmVyaWZ5T3B0aW9ucyk6IFByb21pc2U8cmVhZG9ubHkgVmVyaWZ5U2NyaXB0UmVzdWx0W10+IHtcbiAgICB0aHJvdyBuZXcgVmVyaWZ5RXJyb3IoJ0Vucm9sbG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBvYnNvbGV0ZScpO1xuICB9XG59XG4iXX0=