UNPKG

14.4 kBJavaScriptView Raw
1import { assertContractParameterType, common, IOHelper, JSONHelper, toJSONContractParameterType, } from '@neo-one/client-common-esnext-esm';
2import { assertContractPropertyState, ContractModel } from '@neo-one/client-full-common-esnext-esm';
3import { ContractPropertyState } from './ContractPropertyState';
4import { BinaryReader, utils } from './utils';
5export class Contract extends ContractModel {
6 constructor() {
7 super(...arguments);
8 this.equals = utils.equals(Contract, this, (other) => common.uInt160Equal(this.hash, other.hash));
9 this.toKeyString = utils.toKeyString(Contract, () => this.hashHex);
10 this.contractSizeInternal = utils.lazy(() => sizeOfContract({
11 script: this.script,
12 parameterList: this.parameterList,
13 name: this.name,
14 codeVersion: this.codeVersion,
15 author: this.author,
16 email: this.email,
17 description: this.description,
18 }));
19 }
20 static deserializeWireBase(options) {
21 return deserializeContractWireBase({
22 context: options.context,
23 reader: options.reader,
24 });
25 }
26 static deserializeWire(options) {
27 return this.deserializeWireBase({
28 context: options.context,
29 reader: new BinaryReader(options.buffer),
30 });
31 }
32 get size() {
33 return this.contractSizeInternal();
34 }
35 serializeJSON(_context) {
36 return {
37 version: this.version,
38 hash: JSONHelper.writeUInt160(this.hash),
39 script: JSONHelper.writeBuffer(this.script),
40 parameters: this.parameterList.map(toJSONContractParameterType),
41 returntype: toJSONContractParameterType(this.returnType),
42 name: this.name,
43 code_version: this.codeVersion,
44 author: this.author,
45 email: this.email,
46 description: this.description,
47 properties: {
48 storage: this.hasStorage,
49 dynamic_invoke: this.hasDynamicInvoke,
50 payable: this.payable,
51 },
52 };
53 }
54}
55export const sizeOfContract = ({ script, parameterList, name, codeVersion, author, email, description, publishVersion, }) => IOHelper.sizeOfVarBytesLE(script) +
56 IOHelper.sizeOfVarBytesLE(Buffer.from(parameterList)) +
57 IOHelper.sizeOfUInt8 +
58 (publishVersion === undefined ? IOHelper.sizeOfBoolean : 0) +
59 IOHelper.sizeOfVarString(name) +
60 IOHelper.sizeOfVarString(codeVersion) +
61 IOHelper.sizeOfVarString(author) +
62 IOHelper.sizeOfVarString(email) +
63 IOHelper.sizeOfVarString(description);
64export const deserializeContractWireBase = ({ reader, publishVersion, }) => {
65 const script = reader.readVarBytesLE();
66 const parameterList = [...reader.readVarBytesLE()].map(assertContractParameterType);
67 const returnType = assertContractParameterType(reader.readUInt8());
68 const contractProperties = publishVersion === undefined || publishVersion >= 1
69 ? assertContractPropertyState(reader.readUInt8())
70 : ContractPropertyState.NoProperty;
71 const name = reader.readVarString(252);
72 const codeVersion = reader.readVarString(252);
73 const author = reader.readVarString(252);
74 const email = reader.readVarString(252);
75 const description = reader.readVarString(65536);
76 return new Contract({
77 script,
78 parameterList,
79 returnType,
80 contractProperties,
81 name,
82 codeVersion,
83 author,
84 email,
85 description,
86 });
87};
88
89//# sourceMappingURL=data:application/json;charset=utf8;base64,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akQsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqRCxDQUFDLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoRCxPQUFPLElBQUksUUFBUSxDQUFDO1FBQ2xCLE1BQU07UUFDTixhQUFhO1FBQ2IsVUFBVTtRQUNWLGtCQUFrQjtRQUNsQixJQUFJO1FBQ0osV0FBVztRQUNYLE1BQU07UUFDTixLQUFLO1FBQ0wsV0FBVztLQUNaLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29yZS9zcmMvQ29udHJhY3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBhc3NlcnRDb250cmFjdFBhcmFtZXRlclR5cGUsXG4gIGNvbW1vbixcbiAgQ29udHJhY3RKU09OLFxuICBJT0hlbHBlcixcbiAgSlNPTkhlbHBlcixcbiAgdG9KU09OQ29udHJhY3RQYXJhbWV0ZXJUeXBlLFxuICBVSW50MTYwLFxufSBmcm9tICdAbmVvLW9uZS9jbGllbnQtY29tbW9uLWVzbmV4dC1lc20nO1xuaW1wb3J0IHsgYXNzZXJ0Q29udHJhY3RQcm9wZXJ0eVN0YXRlLCBDb250cmFjdE1vZGVsIH0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWZ1bGwtY29tbW9uLWVzbmV4dC1lc20nO1xuaW1wb3J0IHsgQ29udHJhY3RQYXJhbWV0ZXJUeXBlIH0gZnJvbSAnLi9jb250cmFjdFBhcmFtZXRlcic7XG5pbXBvcnQgeyBDb250cmFjdFByb3BlcnR5U3RhdGUgfSBmcm9tICcuL0NvbnRyYWN0UHJvcGVydHlTdGF0ZSc7XG5pbXBvcnQgeyBFcXVhbHMsIEVxdWF0YWJsZUtleSB9IGZyb20gJy4vRXF1YXRhYmxlJztcbmltcG9ydCB7XG4gIERlc2VyaWFsaXplV2lyZUJhc2VPcHRpb25zLFxuICBEZXNlcmlhbGl6ZVdpcmVPcHRpb25zLFxuICBTZXJpYWxpemFibGVKU09OLFxuICBTZXJpYWxpemVKU09OQ29udGV4dCxcbn0gZnJvbSAnLi9TZXJpYWxpemFibGUnO1xuaW1wb3J0IHsgQmluYXJ5UmVhZGVyLCB1dGlscyB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYWN0S2V5IHtcbiAgcmVhZG9ubHkgaGFzaDogVUludDE2MDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJhY3RBZGQge1xuICByZWFkb25seSBoYXNoPzogVUludDE2MDtcbiAgcmVhZG9ubHkgdmVyc2lvbj86IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NyaXB0OiBCdWZmZXI7XG4gIHJlYWRvbmx5IHBhcmFtZXRlckxpc3Q6IFJlYWRvbmx5QXJyYXk8Q29udHJhY3RQYXJhbWV0ZXJUeXBlPjtcbiAgcmVhZG9ubHkgcmV0dXJuVHlwZTogQ29udHJhY3RQYXJhbWV0ZXJUeXBlO1xuICByZWFkb25seSBjb250cmFjdFByb3BlcnRpZXM6IENvbnRyYWN0UHJvcGVydHlTdGF0ZTtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBjb2RlVmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBhdXRob3I6IHN0cmluZztcbiAgcmVhZG9ubHkgZW1haWw6IHN0cmluZztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIENvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3RNb2RlbCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZUpTT048Q29udHJhY3RKU09OPiwgRXF1YXRhYmxlS2V5IHtcbiAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZVdpcmVCYXNlKG9wdGlvbnM6IERlc2VyaWFsaXplV2lyZUJhc2VPcHRpb25zKTogQ29udHJhY3Qge1xuICAgIHJldHVybiBkZXNlcmlhbGl6ZUNvbnRyYWN0V2lyZUJhc2Uoe1xuICAgICAgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LFxuICAgICAgcmVhZGVyOiBvcHRpb25zLnJlYWRlcixcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemVXaXJlKG9wdGlvbnM6IERlc2VyaWFsaXplV2lyZU9wdGlvbnMpOiBDb250cmFjdCB7XG4gICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemVXaXJlQmFzZSh7XG4gICAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gICAgICByZWFkZXI6IG5ldyBCaW5hcnlSZWFkZXIob3B0aW9ucy5idWZmZXIpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGVxdWFsczogRXF1YWxzID0gdXRpbHMuZXF1YWxzKENvbnRyYWN0LCB0aGlzLCAob3RoZXIpID0+IGNvbW1vbi51SW50MTYwRXF1YWwodGhpcy5oYXNoLCBvdGhlci5oYXNoKSk7XG4gIHB1YmxpYyByZWFkb25seSB0b0tleVN0cmluZyA9IHV0aWxzLnRvS2V5U3RyaW5nKENvbnRyYWN0LCAoKSA9PiB0aGlzLmhhc2hIZXgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyYWN0U2l6ZUludGVybmFsID0gdXRpbHMubGF6eSgoKSA9PlxuICAgIHNpemVPZkNvbnRyYWN0KHtcbiAgICAgIHNjcmlwdDogdGhpcy5zY3JpcHQsXG4gICAgICBwYXJhbWV0ZXJMaXN0OiB0aGlzLnBhcmFtZXRlckxpc3QsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBjb2RlVmVyc2lvbjogdGhpcy5jb2RlVmVyc2lvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICBlbWFpbDogdGhpcy5lbWFpbCxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgIH0pLFxuICApO1xuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRyYWN0U2l6ZUludGVybmFsKCk7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplSlNPTihfY29udGV4dDogU2VyaWFsaXplSlNPTkNvbnRleHQpOiBDb250cmFjdEpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBoYXNoOiBKU09OSGVscGVyLndyaXRlVUludDE2MCh0aGlzLmhhc2gpLFxuICAgICAgc2NyaXB0OiBKU09OSGVscGVyLndyaXRlQnVmZmVyKHRoaXMuc2NyaXB0KSxcbiAgICAgIHBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVyTGlzdC5tYXAodG9KU09OQ29udHJhY3RQYXJhbWV0ZXJUeXBlKSxcblxuICAgICAgcmV0dXJudHlwZTogdG9KU09OQ29udHJhY3RQYXJhbWV0ZXJUeXBlKHRoaXMucmV0dXJuVHlwZSksXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBjb2RlX3ZlcnNpb246IHRoaXMuY29kZVZlcnNpb24sXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgZW1haWw6IHRoaXMuZW1haWwsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc3RvcmFnZTogdGhpcy5oYXNTdG9yYWdlLFxuICAgICAgICBkeW5hbWljX2ludm9rZTogdGhpcy5oYXNEeW5hbWljSW52b2tlLFxuICAgICAgICBwYXlhYmxlOiB0aGlzLnBheWFibGUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNpemVPZkNvbnRyYWN0ID0gKHtcbiAgc2NyaXB0LFxuICBwYXJhbWV0ZXJMaXN0LFxuICBuYW1lLFxuICBjb2RlVmVyc2lvbixcbiAgYXV0aG9yLFxuICBlbWFpbCxcbiAgZGVzY3JpcHRpb24sXG4gIHB1Ymxpc2hWZXJzaW9uLFxufToge1xuICByZWFkb25seSBzY3JpcHQ6IEJ1ZmZlcjtcbiAgcmVhZG9ubHkgcGFyYW1ldGVyTGlzdDogUmVhZG9ubHlBcnJheTxDb250cmFjdFBhcmFtZXRlclR5cGU+O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvZGVWZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF1dGhvcjogc3RyaW5nO1xuICByZWFkb25seSBlbWFpbDogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBwdWJsaXNoVmVyc2lvbj86IG51bWJlcjtcbn0pID0+XG4gIElPSGVscGVyLnNpemVPZlZhckJ5dGVzTEUoc2NyaXB0KSArXG4gIElPSGVscGVyLnNpemVPZlZhckJ5dGVzTEUoQnVmZmVyLmZyb20ocGFyYW1ldGVyTGlzdCBhcyBDb250cmFjdFBhcmFtZXRlclR5cGVbXSkpICtcbiAgSU9IZWxwZXIuc2l6ZU9mVUludDggK1xuICAocHVibGlzaFZlcnNpb24gPT09IHVuZGVmaW5lZCA/IElPSGVscGVyLnNpemVPZkJvb2xlYW4gOiAwKSArXG4gIElPSGVscGVyLnNpemVPZlZhclN0cmluZyhuYW1lKSArXG4gIElPSGVscGVyLnNpemVPZlZhclN0cmluZyhjb2RlVmVyc2lvbikgK1xuICBJT0hlbHBlci5zaXplT2ZWYXJTdHJpbmcoYXV0aG9yKSArXG4gIElPSGVscGVyLnNpemVPZlZhclN0cmluZyhlbWFpbCkgK1xuICBJT0hlbHBlci5zaXplT2ZWYXJTdHJpbmcoZGVzY3JpcHRpb24pO1xuXG5leHBvcnQgY29uc3QgZGVzZXJpYWxpemVDb250cmFjdFdpcmVCYXNlID0gKHtcbiAgcmVhZGVyLFxuICBwdWJsaXNoVmVyc2lvbixcbn06IHtcbiAgcmVhZG9ubHkgcHVibGlzaFZlcnNpb24/OiBudW1iZXI7XG59ICYgRGVzZXJpYWxpemVXaXJlQmFzZU9wdGlvbnMpOiBDb250cmFjdCA9PiB7XG4gIGNvbnN0IHNjcmlwdCA9IHJlYWRlci5yZWFkVmFyQnl0ZXNMRSgpO1xuICBjb25zdCBwYXJhbWV0ZXJMaXN0ID0gWy4uLnJlYWRlci5yZWFkVmFyQnl0ZXNMRSgpXS5tYXAoYXNzZXJ0Q29udHJhY3RQYXJhbWV0ZXJUeXBlKTtcblxuICBjb25zdCByZXR1cm5UeXBlID0gYXNzZXJ0Q29udHJhY3RQYXJhbWV0ZXJUeXBlKHJlYWRlci5yZWFkVUludDgoKSk7XG4gIGNvbnN0IGNvbnRyYWN0UHJvcGVydGllcyA9XG4gICAgcHVibGlzaFZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBwdWJsaXNoVmVyc2lvbiA+PSAxXG4gICAgICA/IGFzc2VydENvbnRyYWN0UHJvcGVydHlTdGF0ZShyZWFkZXIucmVhZFVJbnQ4KCkpXG4gICAgICA6IENvbnRyYWN0UHJvcGVydHlTdGF0ZS5Ob1Byb3BlcnR5O1xuICBjb25zdCBuYW1lID0gcmVhZGVyLnJlYWRWYXJTdHJpbmcoMjUyKTtcbiAgY29uc3QgY29kZVZlcnNpb24gPSByZWFkZXIucmVhZFZhclN0cmluZygyNTIpO1xuICBjb25zdCBhdXRob3IgPSByZWFkZXIucmVhZFZhclN0cmluZygyNTIpO1xuICBjb25zdCBlbWFpbCA9IHJlYWRlci5yZWFkVmFyU3RyaW5nKDI1Mik7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gcmVhZGVyLnJlYWRWYXJTdHJpbmcoNjU1MzYpO1xuXG4gIHJldHVybiBuZXcgQ29udHJhY3Qoe1xuICAgIHNjcmlwdCxcbiAgICBwYXJhbWV0ZXJMaXN0LFxuICAgIHJldHVyblR5cGUsXG4gICAgY29udHJhY3RQcm9wZXJ0aWVzLFxuICAgIG5hbWUsXG4gICAgY29kZVZlcnNpb24sXG4gICAgYXV0aG9yLFxuICAgIGVtYWlsLFxuICAgIGRlc2NyaXB0aW9uLFxuICB9KTtcbn07XG4iXX0=