58 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import * as ethUtil from 'ethereumjs-util';
 | |
| import * as request from 'request-promise-native';
 | |
| import {constants} from './constants';
 | |
| 
 | |
| export class RPC {
 | |
|     private host: string;
 | |
|     private port: number;
 | |
|     private id: number;
 | |
|     constructor() {
 | |
|         this.host = constants.RPC_HOST;
 | |
|         this.port = constants.RPC_PORT;
 | |
|         this.id = 0;
 | |
|     }
 | |
|     public async takeSnapshotAsync(): Promise<number> {
 | |
|         const method = 'evm_snapshot';
 | |
|         const params: any[] = [];
 | |
|         const payload = this.toPayload(method, params);
 | |
|         const snapshotIdHex = await this.sendAsync(payload);
 | |
|         const snapshotId = ethUtil.bufferToInt(ethUtil.toBuffer(snapshotIdHex));
 | |
|         return snapshotId;
 | |
|     }
 | |
|     public async revertSnapshotAsync(snapshotId: number): Promise<boolean> {
 | |
|         const method = 'evm_revert';
 | |
|         const params = [snapshotId];
 | |
|         const payload = this.toPayload(method, params);
 | |
|         const didRevert = await this.sendAsync(payload);
 | |
|         return didRevert;
 | |
|     }
 | |
|     public async mineBlockAsync(): Promise<void> {
 | |
|         const method = 'evm_mine';
 | |
|         const params: any[] = [];
 | |
|         const payload = this.toPayload(method, params);
 | |
|         await this.sendAsync(payload);
 | |
|     }
 | |
|     private toPayload(method: string, params: any[] = []): string {
 | |
|         const payload = JSON.stringify({
 | |
|             id: this.id,
 | |
|             method,
 | |
|             params,
 | |
|         });
 | |
|         this.id += 1;
 | |
|         return payload;
 | |
|     }
 | |
|     private async sendAsync(payload: string): Promise<any> {
 | |
|         const opts = {
 | |
|             method: 'POST',
 | |
|             uri: `http://${this.host}:${this.port}`,
 | |
|             body: payload,
 | |
|             headers: {
 | |
|                 'content-type': 'application/json',
 | |
|             },
 | |
|         };
 | |
|         const bodyString = await request(opts);
 | |
|         const body = JSON.parse(bodyString);
 | |
|         return body.result;
 | |
|     }
 | |
| }
 |