2020-03-06 13:58:50 -08:00

71 lines
1.8 KiB
TypeScript

import joi from '@hapi/joi';
import { Tezos } from '@taquito/taquito';
import { Request, Response } from 'express';
import { CompilerError, LigoCompiler } from '../ligo-compiler';
import { logger } from '../logger';
import { fetchRandomPrivateKey } from '../services/key';
interface DeployBody {
syntax: string;
code: string;
entrypoint: string;
storage: string;
}
Tezos.setProvider({ rpc: 'https://api.tez.ie/rpc/carthagenet' });
const validateRequest = (body: any): { value: DeployBody; error: any } => {
return joi
.object({
syntax: joi.string().required(),
code: joi.string().required(),
entrypoint: joi.string().required(),
storage: joi.string().required()
})
.validate(body);
};
export async function deployHandler(req: Request, res: Response) {
const { error, value: body } = validateRequest(req.body);
if (error) {
res.status(400).json({ error: error.message });
} else {
try {
const michelsonCode = await new LigoCompiler().compileContract(
body.syntax,
body.code,
body.entrypoint,
'json'
);
const michelsonStorage = await new LigoCompiler().compileStorage(
body.syntax,
body.code,
body.entrypoint,
'json',
body.storage
);
await Tezos.importKey(await fetchRandomPrivateKey());
const op = await Tezos.contract.originate({
code: JSON.parse(michelsonCode),
init: JSON.parse(michelsonStorage)
});
const contract = await op.contract();
res.send({ address: contract.address, storage: michelsonStorage });
} catch (ex) {
if (ex instanceof CompilerError) {
res.status(400).json({ error: ex.message });
} else {
logger.error(ex);
res.status(500).json({ error: ex.message });
}
}
}
}