@neo-one/server-plugin-compiler
Version:
NEO•ONE Server compiler plugin.
105 lines (97 loc) • 3.03 kB
text/typescript
import { ABI } from '@neo-one/client';
import { disassembleByteCode } from '@neo-one/client-core';
import {
CRUD,
DeleteCRUD,
DescribeCRUD,
DescribeTable,
GetCRUD,
ListTable,
MasterResourceAdapter,
MasterResourceAdapterOptions,
ResourceState,
ResourceType,
} from '@neo-one/server-plugin';
import _ from 'lodash';
import { CompilerPlugin } from './CompilerPlugin';
import { constants } from './constants';
import { CreateContractCRUD } from './crud';
import { MasterContractResourceAdapter } from './MasterContractResourceAdapter';
export interface Contract {
readonly plugin: string;
readonly resourceType: string;
readonly name: string;
readonly baseName: string;
readonly state: ResourceState;
readonly avmPath: string;
readonly script: string;
readonly abi: ABI;
readonly hasStorage: boolean;
readonly hasDynamicInvoke: boolean;
readonly payable: boolean;
}
export interface ContractResourceOptions {
readonly scPath?: string;
readonly abi?: ABI;
readonly hasStorage?: boolean;
readonly hasDynamicInvoke?: boolean;
readonly payable?: boolean;
}
export class ContractResourceType extends ResourceType<Contract, ContractResourceOptions> {
public constructor({ plugin }: { readonly plugin: CompilerPlugin }) {
super({
plugin,
name: constants.CONTRACT_RESOURCE_TYPE,
names: {
capital: 'Contract',
capitalPlural: 'Contracts',
lower: 'contract',
lowerPlural: 'contracts',
},
});
}
public async createMasterResourceAdapter({
binary,
}: MasterResourceAdapterOptions): Promise<MasterResourceAdapter<Contract, ContractResourceOptions>> {
return new MasterContractResourceAdapter({
resourceType: this,
binary,
});
}
public getCRUD(): CRUD<Contract, ContractResourceOptions> {
return new CRUD({
resourceType: this,
start: undefined,
stop: undefined,
create: new CreateContractCRUD({ resourceType: this }),
delete: new DeleteCRUD({
resourceType: this,
aliases: ['delete csc'],
}),
get: new GetCRUD({
resourceType: this,
aliases: ['get csc'],
}),
describe: new DescribeCRUD({
resourceType: this,
aliases: ['describe csc'],
}),
});
}
public getListTable(resources: ReadonlyArray<Contract>): ListTable {
return [['Name', 'Smart Contract']].concat(
_.sortBy(resources, (resource) => resource.name).map((resource) => [resource.name, resource.avmPath]),
);
}
public getDescribeTable(resource: Contract): DescribeTable {
return [
['Name', resource.name],
['Smart Contract', resource.avmPath],
['Storage', resource.hasStorage ? 'Yes' : 'No'],
['Dynamic Invoke', resource.hasDynamicInvoke ? 'Yes' : 'No'],
['Payable', resource.payable ? 'Yes' : 'No'],
['ABI', JSON.stringify(resource.abi, undefined, 2)],
['Contract', `\n${disassembleByteCode(Buffer.from(resource.script, 'hex')).join('\n')}`],
];
}
}