Cleanup and get better RPC checking

This commit is contained in:
ligi 2019-05-17 03:21:51 +02:00
parent 51632aec61
commit 85734fbff2
No known key found for this signature in database
GPG Key ID: 8E81894010ABF23D
4 changed files with 63 additions and 54 deletions

View File

@ -27,16 +27,17 @@ repositories {
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:${KOTLIN_VERSION}"
compile "com.github.ethereum-lists:cilib:1.0"
implementation "org.jetbrains.kotlin:kotlin-stdlib:${KOTLIN_VERSION}"
implementation "com.github.ethereum-lists:cilib:1.0"
compile "com.github.komputing.kethereum:erc55:${KETHEREUM_VERSION}"
compile "com.github.komputing.kethereum:model:${KETHEREUM_VERSION}"
compile "com.github.komputing.kethereum:functions:${KETHEREUM_VERSION}"
compile "com.github.komputing.kethereum:crypto_impl_bouncycastle:${KETHEREUM_VERSION}"
implementation "com.github.komputing.kethereum:rpc:${KETHEREUM_VERSION}"
implementation "com.github.komputing.kethereum:model:${KETHEREUM_VERSION}"
implementation "com.github.komputing.kethereum:functions:${KETHEREUM_VERSION}"
implementation "com.github.komputing.kethereum:crypto_impl_bouncycastle:${KETHEREUM_VERSION}"
compile 'com.beust:klaxon:5.0.5'
compile 'com.squareup.moshi:moshi-kotlin:1.8.0'
implementation 'com.beust:klaxon:5.0.5'
implementation 'com.squareup.moshi:moshi-kotlin:1.8.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
testImplementation "org.jetbrains.kotlin:kotlin-test"
testImplementation "org.jetbrains.kotlin:kotlin-test-junit"

View File

@ -2,7 +2,9 @@ package org.ethereum.lists.chains
import com.beust.klaxon.JsonObject
import com.beust.klaxon.Klaxon
import org.kethereum.rpc.EthereumRPC
import java.io.File
import java.math.BigInteger
val all_fields = listOf(
"name",
@ -16,9 +18,12 @@ val all_fields = listOf(
"info_url"
)
class FileNameMustMatchChainId: Exception("chain_id must match the filename")
class ShouldHaveNoExtraFields(fields: Set<String>): Exception("should have no extra field $fields")
class ShouldHaveNoMissingFields(fields: Set<String>): Exception("missing field(s) $fields")
class FileNameMustMatchChainId : Exception("chain_id must match the filename")
class ExtensionMustBeJSON : Exception("filename extension must be json")
class ShouldHaveNoExtraFields(fields: Set<String>) : Exception("should have no extra field $fields")
class ShouldHaveNoMissingFields(fields: Set<String>) : Exception("missing field(s) $fields")
class RPCMustBeList : Exception("rpc must be a list")
class RPCMustBeListOfStrings : Exception("rpc must be a list of strings")
fun checkChain(it: File) {
println("processing $it")
@ -29,6 +34,10 @@ fun checkChain(it: File) {
throw(FileNameMustMatchChainId())
}
if (it.extension != "json") {
throw(ExtensionMustBeJSON())
}
getNumber(jsonObject, "network_id")
val extraFields = jsonObject.map.keys.subtract(all_fields)
@ -40,29 +49,25 @@ fun checkChain(it: File) {
if (missingFields.isNotEmpty()) {
throw ShouldHaveNoMissingFields(missingFields)
}
}
private fun getNumber(jsonObject: JsonObject, field: String): Long {
return when (val chainId = jsonObject[field]) {
is Int -> chainId.toLong()
is Long -> chainId
else -> throw(Exception("chain_id must be a number"))
if (jsonObject["rpc"] is List<*>) {
(jsonObject["rpc"] as List<*>).forEach {
if (it !is String) {
throw(RPCMustBeListOfStrings())
} else {
println("connecting to $it")
val ethereumRPC = EthereumRPC(it)
println("Client:" + ethereumRPC.clientVersion()?.result)
println("BlockNumber:" + ethereumRPC.blockNumber()?.result?.tryBigint())
println("GasPrice:" + ethereumRPC.gasPrice()?.result?.tryBigint())
}
}
println()
} else {
throw(RPCMustBeList())
}
}
/*
open class InvalidTokenException(message: String) : IllegalArgumentException(message)
class InvalidChecksum(message: String) : InvalidTokenException("The address is not valid with ERC-55 checksum $message")
class InvalidAddress(address: Address) : InvalidTokenException("The address is not valid $address")
class InvalidDecimals : InvalidTokenException("Decimals must be a number")
class InvalidFileName : InvalidTokenException("Filename must be the address + .json")
class InvalidWebsite : InvalidTokenException("Website invalid")
class InvalidJSON(message: String?) : InvalidTokenException("JSON invalid $message")
class InvalidDeprecationMigrationType : InvalidTokenException("Invalid Deprecation Migration type - currently only auto and instructions: is allowed")
class InvalidDeprecationTime : InvalidTokenException("Invalid Deprecation Time - Must be ISO8601")
fun String.tryBigint() = if (startsWith("0x")) {
try {
@ -73,25 +78,10 @@ fun String.tryBigint() = if (startsWith("0x")) {
} else {
null
}
fun checkChainsFile(file: File) {
val moshi = Moshi.Builder().build()
val listMyData = Types.newParameterizedType(List::class.java, Chain::class.java)
val foo: JsonAdapter<List<Chain>> = moshi.adapter(listMyData)
foo.fromJson(Okio.buffer(Okio.source(file)))?.forEach {
println()
println(it.name)
for (s in it.rpc) {
val ethereumRPC = EthereumRPC(s)
println("Client:" + ethereumRPC.clientVersion()?.result)
println("BlockNumber:" + ethereumRPC.blockNumber()?.result?.tryBigint())
println("GasPrice:" + ethereumRPC.gasPrice()?.result?.tryBigint())
}
private fun getNumber(jsonObject: JsonObject, field: String): Long {
return when (val chainId = jsonObject[field]) {
is Int -> chainId.toLong()
is Long -> chainId
else -> throw(Exception("chain_id must be a number"))
}
}
*/

View File

@ -1,8 +1,5 @@
import org.ethereum.lists.chains.FileNameMustMatchChainId
import org.ethereum.lists.chains.ShouldHaveNoExtraFields
import org.ethereum.lists.chains.ShouldHaveNoMissingFields
import org.ethereum.lists.chains.checkChain
import org.ethereum.lists.chains.*
import org.junit.Test
import java.io.File
@ -43,6 +40,13 @@ class TheChainChecker {
checkChain(file)
}
@Test(expected = ExtensionMustBeJSON::class)
fun shouldFailFoNonJSON() {
val file = getFile("invalid/1.nojson")
checkChain(file)
}
private fun getFile(s: String) = File(javaClass.classLoader.getResource("test_chains/$s").file)

View File

@ -0,0 +1,14 @@
{
"name": "Ethereum Mainnet",
"short_name": "eth",
"chain": "ETH",
"network": "mainnet",
"chain_id": 1,
"network_id": 1,
"rpc": [
"https://mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://api.mycryptoapi.com/eth"
],
"faucets": [],
"info_url": "https://ethereum.org"
}