1- export { eth_sendRawTransaction } from "./src/eth_sendRawTransaction.js" ;
2- export { eth_gasPrice } from "./src/eth_gasPrice.js" ;
3- export { start } from "./bin/start.js" ;
4- export { claim } from "./bin/claim.js" ;
5- export { open } from "./bin/open.js" ;
6- export { powerup } from "./bin/powerup.js" ;
1+ import { JSONRPCServer } from "json-rpc-2.0" ;
2+ import { Session } from "@wharfkit/session" ;
3+ import { DEFAULT_HOSTNAME , DEFAULT_PORT , HOSTNAME , LOCK_GAS_PRICE , PORT , PROMETHEUS_PORT , DEFAULT_PROMETHEUS_PORT , createSession , METRICS_DISABLED , DEFAULT_METRICS_DISABLED , DEFAULT_VERBOSE , VERBOSE } from "./src/config.js" ;
4+ import { logger } from "./src/logger.js" ;
5+ import { DefaultOptions } from "./bin/cli.js" ;
6+ import { eth_sendRawTransaction } from "./src/eth_sendRawTransaction.js" ;
7+ import { eth_gasPrice } from "./src/eth_gasPrice.js" ;
8+ import * as prometheus from "./src/prometheus.js"
9+
10+ export interface StartOptions extends DefaultOptions {
11+ port ?: number ;
12+ metricsListenPort ?: number ;
13+ hostname ?: string ;
14+ verbose ?: boolean ;
15+ lockGasPrice ?: string ;
16+ metricsDisabled ?: boolean ;
17+ }
18+
19+ export default function ( options : StartOptions ) {
20+ const port = options . port ?? PORT ?? DEFAULT_PORT ;
21+ const hostname = options . hostname ?? HOSTNAME ;
22+ const metricsDisabled = options . metricsDisabled ?? METRICS_DISABLED ?? DEFAULT_METRICS_DISABLED ;
23+ const metricsListenPort = options . metricsListenPort ?? PROMETHEUS_PORT ?? DEFAULT_PROMETHEUS_PORT ;
24+ const lockGasPrice = options . lockGasPrice ?? LOCK_GAS_PRICE ;
25+ const verbose = options . verbose ?? VERBOSE ?? DEFAULT_VERBOSE ;
26+
27+ // create Wharfkit session
28+ const session = createSession ( options ) ;
29+ const server = new JSONRPCServer ( ) ;
30+
31+ // enable logging if verbose enabled
32+ if ( verbose ) {
33+ logger . settings . type = "json" ;
34+ console . log ( banner ( session , port , hostname , metricsListenPort , metricsDisabled ) ) ;
35+ }
36+
37+ server . addMethod ( "eth_sendRawTransaction" , async params => {
38+ prometheus . sendRawTransaction . requests ?. inc ( ) ;
39+ const result = await eth_sendRawTransaction ( session , params )
40+ prometheus . sendRawTransaction . success ?. inc ( ) ;
41+ return result ;
42+ } ) ;
43+ server . addMethod ( "eth_gasPrice" , async ( ) => {
44+ prometheus . gasPrice . requests ?. inc ( ) ;
45+ const result = eth_gasPrice ( session , lockGasPrice )
46+ prometheus . gasPrice . success ?. inc ( ) ;
47+ return result ;
48+ } ) ;
49+
50+ if ( ! options . metricsDisabled ) {
51+ prometheus . listen ( metricsListenPort , hostname ) ;
52+ }
53+
54+ return Bun . serve ( {
55+ port,
56+ hostname,
57+ development : true ,
58+ fetch : async ( request : Request ) => {
59+ const url = new URL ( request . url ) ;
60+ if ( request . method == "GET" ) {
61+ if ( url . pathname == "/" ) return new Response ( banner ( session , port , hostname , metricsListenPort , metricsDisabled ) ) ;
62+ const info = await session . client . v1 . chain . get_info ( ) ;
63+ return toJSON ( info . toJSON ( ) ) ;
64+ }
65+ const jsonRPCRequest = await request . json < any > ( ) ;
66+ if ( ! jsonRPCRequest ) return new Response ( "invalid request" , { status : 400 } )
67+ // server.receive takes a JSON-RPC request and returns a promise of a JSON-RPC response.
68+ // It can also receive an array of requests, in which case it may return an array of responses.
69+ // Alternatively, you can use server.receiveJSON, which takes JSON string as is (in this case req.body).
70+ const jsonRPCResponse = await server . receive ( jsonRPCRequest )
71+ if ( jsonRPCResponse ) return new Response ( JSON . stringify ( jsonRPCResponse ) , { headers : { 'Content-Type' : 'application/json' } } ) ;
72+ // If response is absent, it was a JSON-RPC notification method.
73+ // Respond with no content status (204).
74+ return new Response ( "no content" , { status : 204 } )
75+ }
76+ } )
77+ }
78+
79+ function toJSON ( obj : any , status : number = 200 ) {
80+ const headers = { 'Content-Type' : 'application/json' } ;
81+ const body = JSON . stringify ( obj ) ;
82+ return new Response ( body , { status, headers } ) ;
83+ }
84+
85+ function banner ( session : Session , port : number , hostname ?: string , metricsListenPort ?: number , metricsDisabled ?: boolean ) {
86+ let text = `
87+
88+ ███████╗ ██████╗ ███████╗ ███████╗██╗ ██╗███╗ ███╗
89+ ██╔════╝██╔═══██╗██╔════╝ ██╔════╝██║ ██║████╗ ████║
90+ █████╗ ██║ ██║███████╗ █████╗ ██║ ██║██╔████╔██║
91+ ██╔══╝ ██║ ██║╚════██║ ██╔══╝ ╚██╗ ██╔╝██║╚██╔╝██║
92+ ███████╗╚██████╔╝███████║ ███████╗ ╚████╔╝ ██║ ╚═╝ ██║
93+ ╚══════╝ ╚═════╝ ╚══════╝ ╚══════╝ ╚═══╝ ╚═╝ ╚═╝
94+ `
95+ text += ` EOS EVM Miner listening @ ${ hostname ?? DEFAULT_HOSTNAME } :${ port . toString ( ) } \n`
96+ if ( ! metricsDisabled ) text += ` Prometheus metrics listening @ ${ hostname ?? DEFAULT_HOSTNAME } :${ metricsListenPort ?. toString ( ) } \n` ;
97+ text += ` Your miner account is ${ session . actor . toString ( ) } \n` ;
98+ text += ` ${ session . walletPlugin . metadata . publicKey } \n`
99+ return text ;
100+ }
0 commit comments