diff --git a/.gitignore b/.gitignore index a1c2a23..7b31f86 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,14 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +# Maven +pom.xml +maven.gradle + +# NodeJS +node_modules +package-lock.json + +# Aion +fork.properties diff --git a/avm/build.gradle b/avm/build.gradle new file mode 100644 index 0000000..7a8c673 --- /dev/null +++ b/avm/build.gradle @@ -0,0 +1,32 @@ +web3j { + excludedContracts = ['Mortal'] +} + +dependencies { + implementation project(':web3j-aion-common') + + implementation "org.web3j:abi:${versions.web3j}" + + implementation name: 'org-aion-avm-api' + implementation name: 'org-aion-avm-core' + implementation name: 'org-aion-avm-rt' + implementation name: 'org-aion-avm-tooling' + implementation name: 'org-aion-avm-userlib' + + testImplementation project(path: ':web3j-aion-common', configuration: 'testOutput') + integrationTestImplementation project(path: ':web3j-aion-common', configuration: 'integrationTestOutput') + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" +} +repositories { + mavenCentral() +} +compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} diff --git a/src/integration-test/java/com/example/dapp/ERC20Token.java b/avm/src/integration-test/java/com/example/dapp/ERC20Token.java similarity index 100% rename from src/integration-test/java/com/example/dapp/ERC20Token.java rename to avm/src/integration-test/java/com/example/dapp/ERC20Token.java diff --git a/src/integration-test/java/helloavm/HelloAvm.java b/avm/src/integration-test/java/helloavm/HelloAvm.java similarity index 99% rename from src/integration-test/java/helloavm/HelloAvm.java rename to avm/src/integration-test/java/helloavm/HelloAvm.java index 8e843b5..e1c7545 100644 --- a/src/integration-test/java/helloavm/HelloAvm.java +++ b/avm/src/integration-test/java/helloavm/HelloAvm.java @@ -64,7 +64,7 @@ public RemoteCall sayHello() { public RemoteCall greet(String param0) { final Function function = new Function(FUNC_GREET, - Arrays.asList(new org.web3j.abi.datatypes.Utf8String(param0)), + Arrays.asList(new Utf8String(param0)), Arrays.>asList(new TypeReference() { })); return executeRemoteCallSingleValueReturn(function, String.class); @@ -81,7 +81,7 @@ public RemoteCall getString() { public RemoteCall setString(String param0) { final Function function = new Function( FUNC_SETSTRING, - Arrays.asList(new org.web3j.abi.datatypes.Utf8String(param0)), + Arrays.asList(new Utf8String(param0)), Collections.>emptyList()); return executeRemoteCallTransaction(function); } diff --git a/src/integration-test/kotlin/org/web3j/aion/protocol/AvmIntegrationTest.kt b/avm/src/integration-test/kotlin/org/web3j/aion/protocol/AvmIntegrationTest.kt similarity index 100% rename from src/integration-test/kotlin/org/web3j/aion/protocol/AvmIntegrationTest.kt rename to avm/src/integration-test/kotlin/org/web3j/aion/protocol/AvmIntegrationTest.kt diff --git a/src/integration-test/resources/erc20/ERC20Token.abi b/avm/src/integration-test/resources/erc20/ERC20Token.abi similarity index 100% rename from src/integration-test/resources/erc20/ERC20Token.abi rename to avm/src/integration-test/resources/erc20/ERC20Token.abi diff --git a/src/integration-test/resources/erc20/ERC20Token.bin b/avm/src/integration-test/resources/erc20/ERC20Token.bin similarity index 100% rename from src/integration-test/resources/erc20/ERC20Token.bin rename to avm/src/integration-test/resources/erc20/ERC20Token.bin diff --git a/src/integration-test/resources/hello/HelloAvm.abi b/avm/src/integration-test/resources/hello/HelloAvm.abi similarity index 100% rename from src/integration-test/resources/hello/HelloAvm.abi rename to avm/src/integration-test/resources/hello/HelloAvm.abi diff --git a/src/integration-test/resources/hello/HelloAvm.bin b/avm/src/integration-test/resources/hello/HelloAvm.bin similarity index 100% rename from src/integration-test/resources/hello/HelloAvm.bin rename to avm/src/integration-test/resources/hello/HelloAvm.bin diff --git a/src/main/kotlin/org/web3j/aion/abi/AbiFunctionDecoder.kt b/avm/src/main/kotlin/org/web3j/aion/abi/avm/AbiFunctionDecoder.kt similarity index 92% rename from src/main/kotlin/org/web3j/aion/abi/AbiFunctionDecoder.kt rename to avm/src/main/kotlin/org/web3j/aion/abi/avm/AbiFunctionDecoder.kt index 9c98be7..6420081 100644 --- a/src/main/kotlin/org/web3j/aion/abi/AbiFunctionDecoder.kt +++ b/avm/src/main/kotlin/org/web3j/aion/abi/avm/AbiFunctionDecoder.kt @@ -1,4 +1,4 @@ -package org.web3j.aion.abi +package org.web3j.aion.abi.avm // FIXME Remove core dependency import org.aion.avm.userlib.abi.ABIDecoder @@ -81,10 +81,22 @@ internal object AbiFunctionDecoder : FunctionReturnDecoder() { Double::class.java.isAssignableFrom(type) -> decodeOneDouble().toWeb3j() Utf8String::class.java.isAssignableFrom(type) -> decodeOneString().toWeb3j() Bool::class.java.isAssignableFrom(type) -> decodeOneBoolean().toWeb3j() - BytesType::class.java.isAssignableFrom(type) -> decodeBytesType(type, decoder) - IntType::class.java.isAssignableFrom(type) -> decodeIntType(type, decoder) - DynamicArray::class.java.isAssignableFrom(type) -> decodeDynamicArray(typeReference, decoder) - StaticArray::class.java.isAssignableFrom(type) -> decodeStaticArray(typeReference, decoder) + BytesType::class.java.isAssignableFrom(type) -> decodeBytesType( + type, + decoder + ) + IntType::class.java.isAssignableFrom(type) -> decodeIntType( + type, + decoder + ) + DynamicArray::class.java.isAssignableFrom(type) -> decodeDynamicArray( + typeReference, + decoder + ) + StaticArray::class.java.isAssignableFrom(type) -> decodeStaticArray( + typeReference, + decoder + ) else -> throw ABIException("Unsupported ABI type") } } @@ -128,9 +140,18 @@ internal object AbiFunctionDecoder : FunctionReturnDecoder() { private val Class>.bitSize: kotlin.Int? get() = when { - INT_REGEX.matches(simpleName) -> bitSize(simpleName, INT_REGEX) - UINT_REGEX.matches(simpleName) -> bitSize(simpleName, UINT_REGEX) - BYTES_REGEX.matches(simpleName) -> bitSize(simpleName, BYTES_REGEX) + INT_REGEX.matches(simpleName) -> bitSize( + simpleName, + INT_REGEX + ) + UINT_REGEX.matches(simpleName) -> bitSize( + simpleName, + UINT_REGEX + ) + BYTES_REGEX.matches(simpleName) -> bitSize( + simpleName, + BYTES_REGEX + ) else -> throw ABIException("Unknown type ${javaClass.canonicalName}") } diff --git a/src/main/kotlin/org/web3j/aion/abi/AbiFunctionEncoder.kt b/avm/src/main/kotlin/org/web3j/aion/abi/avm/AbiFunctionEncoder.kt similarity index 99% rename from src/main/kotlin/org/web3j/aion/abi/AbiFunctionEncoder.kt rename to avm/src/main/kotlin/org/web3j/aion/abi/avm/AbiFunctionEncoder.kt index 0bcaeb7..d063df0 100644 --- a/src/main/kotlin/org/web3j/aion/abi/AbiFunctionEncoder.kt +++ b/avm/src/main/kotlin/org/web3j/aion/abi/avm/AbiFunctionEncoder.kt @@ -1,4 +1,4 @@ -package org.web3j.aion.abi +package org.web3j.aion.abi.avm // FIXME Remove core dependency import org.aion.avm.core.util.ABIUtil diff --git a/src/main/kotlin/org/web3j/aion/abi/spi/AbiServiceProviders.kt b/avm/src/main/kotlin/org/web3j/aion/abi/avm/spi/AbiServiceProviders.kt similarity index 76% rename from src/main/kotlin/org/web3j/aion/abi/spi/AbiServiceProviders.kt rename to avm/src/main/kotlin/org/web3j/aion/abi/avm/spi/AbiServiceProviders.kt index 87267ac..9568456 100644 --- a/src/main/kotlin/org/web3j/aion/abi/spi/AbiServiceProviders.kt +++ b/avm/src/main/kotlin/org/web3j/aion/abi/avm/spi/AbiServiceProviders.kt @@ -1,11 +1,11 @@ -package org.web3j.aion.abi.spi +package org.web3j.aion.abi.avm.spi import org.web3j.abi.FunctionEncoder import org.web3j.abi.FunctionReturnDecoder import org.web3j.abi.spi.FunctionDecoderProvider import org.web3j.abi.spi.FunctionEncoderProvider -import org.web3j.aion.abi.AbiFunctionDecoder -import org.web3j.aion.abi.AbiFunctionEncoder +import org.web3j.aion.abi.avm.AbiFunctionDecoder +import org.web3j.aion.abi.avm.AbiFunctionEncoder class AbiFunctionEncoderProvider : FunctionEncoderProvider { override fun get(): FunctionEncoder = AbiFunctionEncoder diff --git a/avm/src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionDecoderProvider b/avm/src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionDecoderProvider new file mode 100644 index 0000000..92375f9 --- /dev/null +++ b/avm/src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionDecoderProvider @@ -0,0 +1 @@ +org.web3j.aion.abi.avm.spi.AbiFunctionDecoderProvider diff --git a/src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionEncoderProvider b/avm/src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionEncoderProvider similarity index 100% rename from src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionEncoderProvider rename to avm/src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionEncoderProvider diff --git a/src/test/kotlin/org/web3j/aion/abi/AbiFunctionDecoderAvmTest.kt b/avm/src/test/kotlin/org/web3j/aion/abi/AbiFunctionDecoderAvmTest.kt similarity index 100% rename from src/test/kotlin/org/web3j/aion/abi/AbiFunctionDecoderAvmTest.kt rename to avm/src/test/kotlin/org/web3j/aion/abi/AbiFunctionDecoderAvmTest.kt diff --git a/src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderAvmTest.kt b/avm/src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderAvmTest.kt similarity index 100% rename from src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderAvmTest.kt rename to avm/src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderAvmTest.kt diff --git a/build.gradle b/build.gradle index b38b4f2..cde0099 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,17 @@ -plugins { - id 'java' - id 'idea' - id 'maven-publish' - id 'org.web3j' version '4.3.0' - id 'org.jetbrains.kotlin.jvm' version '1.3.31' - id 'org.unbroken-dome.test-sets' version '2.1.1' - id 'com.diffplug.gradle.spotless' version '3.23.0' - id 'com.adarshr.test-logger' version '1.6.0' +buildscript { + repositories { + mavenCentral() + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + classpath 'org.web3j:web3j-gradle-plugin:4.3.0' + classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31' + classpath 'org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:2.1.1' + classpath 'com.diffplug.spotless:spotless-plugin-gradle:3.23.0' + classpath 'com.adarshr:gradle-test-logger-plugin:1.7.0' + } } group = 'org.web3j.aion' @@ -28,130 +33,119 @@ ext { versions = loadPropsFromFile("$rootDir/versions.properties") } -repositories { - mavenCentral() - maven { - url 'https://oss.sonatype.org/content/repositories/snapshots/' - mavenContent { - snapshotsOnly() +subprojects { + apply plugin: 'maven' + apply plugin: 'java' + apply plugin: 'idea' + apply plugin: 'org.jetbrains.kotlin.jvm' + apply plugin: 'org.web3j' + apply plugin: 'maven-publish' + apply plugin: 'org.unbroken-dome.test-sets' + apply plugin: 'com.diffplug.gradle.spotless' + apply plugin: 'com.adarshr.test-logger' + + repositories { + mavenCentral() + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + mavenContent { + snapshotsOnly() + } + } + flatDir { + dirs "$rootProject.projectDir/lib" } } - flatDir { - dirs "$projectDir/lib" - } -} - -solidity { - executable = "docker run --rm -v $projectDir:/src satran004/aion-fastvm:0.3.1 solc" - version = '0.4.15' -} -web3j { - excludedContracts = ['Mortal'] -} - -testSets { - integrationTest { - dirName = 'integration-test' + testSets { + integrationTest { + dirName = 'integration-test' + } } -} - -dependencies { - implementation name: 'org-aion-avm-api' - implementation name: 'org-aion-avm-core' - implementation name: 'org-aion-avm-rt' - implementation name: 'org-aion-avm-tooling' - implementation name: 'org-aion-avm-userlib' - implementation name: 'rlp4j', version: '46e0cb3' - implementation name: 'util4j', version: '2c5aa4ad' - - implementation "org.web3j:core:${versions.web3j}" - implementation "org.web3j:codegen:${versions.web3j}" - implementation "info.picocli:picocli:${versions.picocli}" - - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' - implementation 'org.jetbrains.kotlin:kotlin-reflect' - implementation 'org.jetbrains.kotlin:kotlin-noarg' - implementation 'org.jetbrains.kotlin:kotlin-native-utils' - - implementation "io.github.microutils:kotlin-logging:${versions.kLogging}" - implementation "org.bouncycastle:bcpkix-jdk15on:${versions.bouncycastle}" + tasks.withType(Test) { + useJUnitPlatform() + reports.html.enabled = false + reports.junitXml.enabled = false + systemProperties = [ + 'junit.jupiter.extensions.autodetection.enabled': 'true', + 'junit.jupiter.testinstance.lifecycle.default' : 'per_class' + ] + } - implementation("com.github.shyiko:ktlint:${versions.ktlint}") { - exclude group: 'org.jetbrains.kotlin' - exclude group: 'org.slf4j' + configurations { + testOutput.extendsFrom (testCompile) + integrationTestOutput.extendsFrom (integrationTestCompile) } - testImplementation(group: 'org.web3j', name: 'core', version: versions.web3j, classifier: 'tests') - testImplementation "org.junit.jupiter:junit-jupiter-api:${versions.junit5}" - testImplementation "com.willowtreeapps.assertk:assertk-jvm:${versions.assertk}" - testImplementation "junit:junit:${versions.junit4}" - testImplementation("io.mockk:mockk:${versions.mockk}") { - exclude group: 'org.jetbrains.kotlin' + artifacts { + testOutput testJar + integrationTestOutput integrationTestJar + } + + testlogger { + showStandardStreams true } - runtimeOnly "com.github.schnitker.logmanager:logmgr-logback:${versions.logmanager}" + dependencies { + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + + testImplementation(group: 'org.web3j', name: 'core', version: versions.web3j, classifier: 'tests') + testImplementation "org.junit.jupiter:junit-jupiter-api:${versions.junit5}" + testImplementation "com.willowtreeapps.assertk:assertk-jvm:${versions.assertk}" + testImplementation "junit:junit:${versions.junit4}" + testImplementation("io.mockk:mockk:${versions.mockk}") { + exclude group: 'org.jetbrains.kotlin' + } - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${versions.junit5}" - testRuntimeOnly "org.junit.vintage:junit-vintage-engine:${versions.junit5}" + runtimeOnly "com.github.schnitker.logmanager:logmgr-logback:${versions.logmanager}" - integrationTestImplementation "org.testcontainers:testcontainers:${versions.testcontainers}" - integrationTestImplementation "org.testcontainers:junit-jupiter:${versions.testcontainers}" -} + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${versions.junit5}" + testRuntimeOnly "org.junit.vintage:junit-vintage-engine:${versions.junit5}" -spotless { - kotlin { - // This path needs to be relative to each project - target fileTree('.') { - include '**/*.kt' - exclude '**/.gradle/**' - } - ktlint(versions.ktlint) - trimTrailingWhitespace() - endWithNewline() + integrationTestImplementation "org.testcontainers:testcontainers:${versions.testcontainers}" + integrationTestImplementation "org.testcontainers:junit-jupiter:${versions.testcontainers}" } -} -tasks.withType(Test) { - useJUnitPlatform() - reports.html.enabled = false - reports.junitXml.enabled = false - systemProperties = [ - 'junit.jupiter.extensions.autodetection.enabled': 'true', - 'junit.jupiter.testinstance.lifecycle.default' : 'per_class' - ] -} - -testlogger { - showStandardStreams true -} + sourceCompatibility = JavaVersion.VERSION_1_8 -sourceCompatibility = JavaVersion.VERSION_1_8 + compileKotlin { + kotlinOptions { + jvmTarget = '1.8' + } + dependsOn 'generateContractWrappers' + } -compileKotlin { - kotlinOptions { - jvmTarget = '1.8' + compileTestKotlin { + kotlinOptions { + jvmTarget = '1.8' + } + dependsOn 'generateTestContractWrappers' } - dependsOn 'generateContractWrappers' -} -compileTestKotlin { - kotlinOptions { - jvmTarget = '1.8' + compileIntegrationTestKotlin { + kotlinOptions { + jvmTarget = '1.8' + } + dependsOn 'generateIntegrationTestContractWrappers' } - dependsOn 'generateTestContractWrappers' -} -compileIntegrationTestKotlin { - kotlinOptions { - jvmTarget = '1.8' + sourceSets { + main.kotlin.srcDirs += "${web3j.generatedFilesBaseDir}/main/java" + test.kotlin.srcDirs += "${web3j.generatedFilesBaseDir}/test/java" + integrationTest.kotlin.srcDirs += "${web3j.generatedFilesBaseDir}/integrationTest/java" } - dependsOn 'generateIntegrationTestContractWrappers' -} -sourceSets { - main.kotlin.srcDirs += "${web3j.generatedFilesBaseDir}/main/java" - test.kotlin.srcDirs += "${web3j.generatedFilesBaseDir}/test/java" - integrationTest.kotlin.srcDirs += "${web3j.generatedFilesBaseDir}/integrationTest/java" + spotless { + kotlin { + // This path needs to be relative to each project + target fileTree('.') { + include '**/*.kt' + exclude '**/.gradle/**' + } + ktlint(versions.ktlint) + trimTrailingWhitespace() + endWithNewline() + } + } } diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 0000000..21a3d39 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,21 @@ +dependencies { + implementation name: 'rlp4j', version: '46e0cb3' + implementation name: 'util4j', version: '2c5aa4ad' + + implementation "org.web3j:core:${versions.web3j}" + implementation "org.web3j:codegen:${versions.web3j}" + implementation "info.picocli:picocli:${versions.picocli}" + + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + implementation 'org.jetbrains.kotlin:kotlin-reflect' + implementation 'org.jetbrains.kotlin:kotlin-noarg' + implementation 'org.jetbrains.kotlin:kotlin-native-utils' + + implementation "io.github.microutils:kotlin-logging:${versions.kLogging}" + implementation "org.bouncycastle:bcpkix-jdk15on:${versions.bouncycastle}" + + implementation("com.github.shyiko:ktlint:${versions.ktlint}") { + exclude group: 'org.jetbrains.kotlin' + exclude group: 'org.slf4j' + } +} diff --git a/src/integration-test/kotlin/org/web3j/aion/protocol/AionIntegrationTest.kt b/common/src/integration-test/kotlin/org/web3j/aion/protocol/AionIntegrationTest.kt similarity index 100% rename from src/integration-test/kotlin/org/web3j/aion/protocol/AionIntegrationTest.kt rename to common/src/integration-test/kotlin/org/web3j/aion/protocol/AionIntegrationTest.kt diff --git a/src/integration-test/resources/aion/config/config.xml b/common/src/integration-test/resources/aion/config/config.xml similarity index 100% rename from src/integration-test/resources/aion/config/config.xml rename to common/src/integration-test/resources/aion/config/config.xml diff --git a/src/integration-test/resources/aion/config/genesis.json b/common/src/integration-test/resources/aion/config/genesis.json similarity index 100% rename from src/integration-test/resources/aion/config/genesis.json rename to common/src/integration-test/resources/aion/config/genesis.json diff --git a/src/integration-test/resources/aion/keystore/UTC--2019-05-07T08:22:08.825Z--a0d5c14a9a2f84a1a8b20fbc329f27e8cb2d2dc0752bb4411b9cd77814355ce6 b/common/src/integration-test/resources/aion/keystore/UTC--2019-05-07T08:22:08.825Z--a0d5c14a9a2f84a1a8b20fbc329f27e8cb2d2dc0752bb4411b9cd77814355ce6 similarity index 100% rename from src/integration-test/resources/aion/keystore/UTC--2019-05-07T08:22:08.825Z--a0d5c14a9a2f84a1a8b20fbc329f27e8cb2d2dc0752bb4411b9cd77814355ce6 rename to common/src/integration-test/resources/aion/keystore/UTC--2019-05-07T08:22:08.825Z--a0d5c14a9a2f84a1a8b20fbc329f27e8cb2d2dc0752bb4411b9cd77814355ce6 diff --git a/src/integration-test/resources/logback-test.xml b/common/src/integration-test/resources/logback-test.xml similarity index 100% rename from src/integration-test/resources/logback-test.xml rename to common/src/integration-test/resources/logback-test.xml diff --git a/src/integration-test/solidity/Greeter.sol b/common/src/integration-test/solidity/Greeter.sol similarity index 100% rename from src/integration-test/solidity/Greeter.sol rename to common/src/integration-test/solidity/Greeter.sol diff --git a/src/integration-test/solidity/TestContract.sol b/common/src/integration-test/solidity/TestContract.sol similarity index 100% rename from src/integration-test/solidity/TestContract.sol rename to common/src/integration-test/solidity/TestContract.sol diff --git a/src/main/kotlin/org/web3j/aion/AionConstants.kt b/common/src/main/kotlin/org/web3j/aion/AionConstants.kt similarity index 68% rename from src/main/kotlin/org/web3j/aion/AionConstants.kt rename to common/src/main/kotlin/org/web3j/aion/AionConstants.kt index aa585fd..b371ade 100644 --- a/src/main/kotlin/org/web3j/aion/AionConstants.kt +++ b/common/src/main/kotlin/org/web3j/aion/AionConstants.kt @@ -7,5 +7,6 @@ object AionConstants { const val MAX_BIT_LENGTH = 128 const val MAX_BYTE_LENGTH = MAX_BIT_LENGTH / 8 - const val ADDRESS_BIT_LENGTH = avm.Address.LENGTH * Byte.SIZE_BITS + const val ADDRESS_BYTE_LENGTH = 32 + const val ADDRESS_BIT_LENGTH = ADDRESS_BYTE_LENGTH * Byte.SIZE_BITS } diff --git a/src/main/kotlin/org/web3j/aion/AionExtensions.kt b/common/src/main/kotlin/org/web3j/aion/AionExtensions.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/AionExtensions.kt rename to common/src/main/kotlin/org/web3j/aion/AionExtensions.kt diff --git a/src/main/kotlin/org/web3j/aion/VirtualMachine.kt b/common/src/main/kotlin/org/web3j/aion/VirtualMachine.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/VirtualMachine.kt rename to common/src/main/kotlin/org/web3j/aion/VirtualMachine.kt diff --git a/src/main/kotlin/org/web3j/aion/abi/AbiDefinitionParser.kt b/common/src/main/kotlin/org/web3j/aion/abi/AbiDefinitionParser.kt similarity index 94% rename from src/main/kotlin/org/web3j/aion/abi/AbiDefinitionParser.kt rename to common/src/main/kotlin/org/web3j/aion/abi/AbiDefinitionParser.kt index e0fa9ca..b9634dc 100644 --- a/src/main/kotlin/org/web3j/aion/abi/AbiDefinitionParser.kt +++ b/common/src/main/kotlin/org/web3j/aion/abi/AbiDefinitionParser.kt @@ -1,6 +1,5 @@ package org.web3j.aion.abi -import org.aion.avm.userlib.abi.ABIException import org.web3j.protocol.core.methods.response.AbiDefinition import org.web3j.protocol.core.methods.response.AbiDefinition.NamedType import java.io.File @@ -63,7 +62,7 @@ internal object AbiDefinitionParser { private fun String.toFunction(): AbiDefinition { val result = FUNCTION_REGEX.matchEntire(this) - ?: throw ABIException("Invalid function definition: $this") + ?: throw AbiDefinitionException("Invalid function definition: $this") return AbiDefinition().apply { type = AbiDefinitionType.FUNCTION.toString() @@ -100,3 +99,5 @@ internal object AbiDefinitionParser { } } } + +class AbiDefinitionException(message: String, cause: Throwable? = null) : Exception(message, cause) \ No newline at end of file diff --git a/src/main/kotlin/org/web3j/aion/abi/AbiDefinitionType.kt b/common/src/main/kotlin/org/web3j/aion/abi/AbiDefinitionType.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/abi/AbiDefinitionType.kt rename to common/src/main/kotlin/org/web3j/aion/abi/AbiDefinitionType.kt diff --git a/src/main/kotlin/org/web3j/aion/codegen/AionFunctionWrapperGenerator.kt b/common/src/main/kotlin/org/web3j/aion/codegen/AionFunctionWrapperGenerator.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/codegen/AionFunctionWrapperGenerator.kt rename to common/src/main/kotlin/org/web3j/aion/codegen/AionFunctionWrapperGenerator.kt diff --git a/src/main/kotlin/org/web3j/aion/crypto/AionTransaction.kt b/common/src/main/kotlin/org/web3j/aion/crypto/AionTransaction.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/crypto/AionTransaction.kt rename to common/src/main/kotlin/org/web3j/aion/crypto/AionTransaction.kt diff --git a/src/main/kotlin/org/web3j/aion/crypto/Ed25519KeyPair.kt b/common/src/main/kotlin/org/web3j/aion/crypto/Ed25519KeyPair.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/crypto/Ed25519KeyPair.kt rename to common/src/main/kotlin/org/web3j/aion/crypto/Ed25519KeyPair.kt diff --git a/src/main/kotlin/org/web3j/aion/protocol/Aion.kt b/common/src/main/kotlin/org/web3j/aion/protocol/Aion.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/protocol/Aion.kt rename to common/src/main/kotlin/org/web3j/aion/protocol/Aion.kt diff --git a/src/main/kotlin/org/web3j/aion/protocol/JsonRpc2_0Aion.kt b/common/src/main/kotlin/org/web3j/aion/protocol/JsonRpc2_0Aion.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/protocol/JsonRpc2_0Aion.kt rename to common/src/main/kotlin/org/web3j/aion/protocol/JsonRpc2_0Aion.kt diff --git a/src/main/kotlin/org/web3j/aion/protocol/UnsupportedEndpoints.kt b/common/src/main/kotlin/org/web3j/aion/protocol/UnsupportedEndpoints.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/protocol/UnsupportedEndpoints.kt rename to common/src/main/kotlin/org/web3j/aion/protocol/UnsupportedEndpoints.kt diff --git a/src/main/kotlin/org/web3j/aion/tx/AionContract.kt b/common/src/main/kotlin/org/web3j/aion/tx/AionContract.kt similarity index 97% rename from src/main/kotlin/org/web3j/aion/tx/AionContract.kt rename to common/src/main/kotlin/org/web3j/aion/tx/AionContract.kt index d28d433..69e4417 100644 --- a/src/main/kotlin/org/web3j/aion/tx/AionContract.kt +++ b/common/src/main/kotlin/org/web3j/aion/tx/AionContract.kt @@ -1,6 +1,6 @@ package org.web3j.aion.tx -import avm.Address +import org.web3j.aion.AionConstants.ADDRESS_BYTE_LENGTH import org.web3j.aion.VirtualMachine import org.web3j.aion.crypto.Ed25519KeyPair import org.web3j.aion.protocol.Aion @@ -156,7 +156,7 @@ sealed class AionContract constructor( transactionManager: TransactionManager, gasProvider: ContractGasProvider ) : Contract( - EnsResolver(web3j, EnsResolver.DEFAULT_SYNC_THRESHOLD, Address.LENGTH * 2), + EnsResolver(web3j, EnsResolver.DEFAULT_SYNC_THRESHOLD, ADDRESS_BYTE_LENGTH * 2), contractBinary, contractAddress, web3j, transactionManager, gasProvider diff --git a/src/main/kotlin/org/web3j/aion/tx/AionTransactionManager.kt b/common/src/main/kotlin/org/web3j/aion/tx/AionTransactionManager.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/tx/AionTransactionManager.kt rename to common/src/main/kotlin/org/web3j/aion/tx/AionTransactionManager.kt diff --git a/src/main/kotlin/org/web3j/aion/tx/gas/AionGasProvider.kt b/common/src/main/kotlin/org/web3j/aion/tx/gas/AionGasProvider.kt similarity index 100% rename from src/main/kotlin/org/web3j/aion/tx/gas/AionGasProvider.kt rename to common/src/main/kotlin/org/web3j/aion/tx/gas/AionGasProvider.kt diff --git a/src/main/resources/logback.xml b/common/src/main/resources/logback.xml similarity index 100% rename from src/main/resources/logback.xml rename to common/src/main/resources/logback.xml diff --git a/src/test/kotlin/org/web3j/aion/abi/AbiDefinitionParserTest.kt b/common/src/test/kotlin/org/web3j/aion/abi/AbiDefinitionParserTest.kt similarity index 100% rename from src/test/kotlin/org/web3j/aion/abi/AbiDefinitionParserTest.kt rename to common/src/test/kotlin/org/web3j/aion/abi/AbiDefinitionParserTest.kt diff --git a/src/test/kotlin/org/web3j/aion/protocol/JsonRpcAionMock.kt b/common/src/test/kotlin/org/web3j/aion/protocol/JsonRpcAionMock.kt similarity index 100% rename from src/test/kotlin/org/web3j/aion/protocol/JsonRpcAionMock.kt rename to common/src/test/kotlin/org/web3j/aion/protocol/JsonRpcAionMock.kt diff --git a/src/test/kotlin/org/web3j/aion/protocol/JsonRpcAionTest.kt b/common/src/test/kotlin/org/web3j/aion/protocol/JsonRpcAionTest.kt similarity index 100% rename from src/test/kotlin/org/web3j/aion/protocol/JsonRpcAionTest.kt rename to common/src/test/kotlin/org/web3j/aion/protocol/JsonRpcAionTest.kt diff --git a/src/test/kotlin/org/web3j/aion/tx/AionTransactionManagerTest.kt b/common/src/test/kotlin/org/web3j/aion/tx/AionTransactionManagerTest.kt similarity index 100% rename from src/test/kotlin/org/web3j/aion/tx/AionTransactionManagerTest.kt rename to common/src/test/kotlin/org/web3j/aion/tx/AionTransactionManagerTest.kt diff --git a/fvm/build.gradle b/fvm/build.gradle new file mode 100644 index 0000000..c3e997a --- /dev/null +++ b/fvm/build.gradle @@ -0,0 +1,30 @@ +web3j { + excludedContracts = ['Mortal'] +} + +solidity { + executable = "docker run --rm -v $projectDir:/src satran004/aion-fastvm:0.3.1 solc" + version = '0.4.15' +} + +dependencies { + implementation project(':web3j-aion-common') + + implementation "org.web3j:abi:${versions.web3j}" + + testImplementation project(path: ':web3j-aion-common', configuration: 'testOutput') + integrationTestImplementation project(path: ':web3j-aion-common', configuration: 'integrationTestOutput') +} +repositories { + mavenCentral() +} +compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} diff --git a/src/integration-test/java/org/aion/greeter/Greeter.java b/fvm/src/integration-test/java/org/aion/greeter/Greeter.java similarity index 100% rename from src/integration-test/java/org/aion/greeter/Greeter.java rename to fvm/src/integration-test/java/org/aion/greeter/Greeter.java diff --git a/src/integration-test/kotlin/org/web3j/aion/protocol/FvmIntegrationTest.kt b/fvm/src/integration-test/kotlin/org/web3j/aion/protocol/FvmIntegrationTest.kt similarity index 100% rename from src/integration-test/kotlin/org/web3j/aion/protocol/FvmIntegrationTest.kt rename to fvm/src/integration-test/kotlin/org/web3j/aion/protocol/FvmIntegrationTest.kt diff --git a/fvm/src/main/kotlin/org/web3j/aion/abi/fvm/AbiFunctionDecoder.kt b/fvm/src/main/kotlin/org/web3j/aion/abi/fvm/AbiFunctionDecoder.kt new file mode 100644 index 0000000..626830f --- /dev/null +++ b/fvm/src/main/kotlin/org/web3j/aion/abi/fvm/AbiFunctionDecoder.kt @@ -0,0 +1,6 @@ +package org.web3j.aion.abi.fvm + +// FIXME Remove core dependency +import org.web3j.abi.DefaultFunctionReturnDecoder + +internal object AbiFunctionDecoder : DefaultFunctionReturnDecoder() diff --git a/fvm/src/main/kotlin/org/web3j/aion/abi/fvm/AbiFunctionEncoder.kt b/fvm/src/main/kotlin/org/web3j/aion/abi/fvm/AbiFunctionEncoder.kt new file mode 100644 index 0000000..d4f0199 --- /dev/null +++ b/fvm/src/main/kotlin/org/web3j/aion/abi/fvm/AbiFunctionEncoder.kt @@ -0,0 +1,6 @@ +package org.web3j.aion.abi.fvm + +// FIXME Remove core dependency +import org.web3j.abi.DefaultFunctionEncoder + +internal object AbiFunctionEncoder : DefaultFunctionEncoder() diff --git a/fvm/src/main/kotlin/org/web3j/aion/abi/fvm/spi/AbiServiceProviders.kt b/fvm/src/main/kotlin/org/web3j/aion/abi/fvm/spi/AbiServiceProviders.kt new file mode 100644 index 0000000..a6284ec --- /dev/null +++ b/fvm/src/main/kotlin/org/web3j/aion/abi/fvm/spi/AbiServiceProviders.kt @@ -0,0 +1,16 @@ +package org.web3j.aion.abi.fvm.spi + +import org.web3j.abi.FunctionEncoder +import org.web3j.abi.FunctionReturnDecoder +import org.web3j.abi.spi.FunctionDecoderProvider +import org.web3j.abi.spi.FunctionEncoderProvider +import org.web3j.aion.abi.fvm.AbiFunctionDecoder +import org.web3j.aion.abi.fvm.AbiFunctionEncoder + +class AbiFunctionEncoderProvider : FunctionEncoderProvider { + override fun get(): FunctionEncoder = AbiFunctionEncoder +} + +class AbiFunctionDecoderProvider : FunctionDecoderProvider { + override fun get(): FunctionReturnDecoder = AbiFunctionDecoder +} diff --git a/src/test/kotlin/org/web3j/aion/abi/AbiFunctionDecoderFvmTest.kt b/fvm/src/test/kotlin/org/web3j/aion/abi/AbiFunctionDecoderFvmTest.kt similarity index 100% rename from src/test/kotlin/org/web3j/aion/abi/AbiFunctionDecoderFvmTest.kt rename to fvm/src/test/kotlin/org/web3j/aion/abi/AbiFunctionDecoderFvmTest.kt diff --git a/src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderFvmTest.kt b/fvm/src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderFvmTest.kt similarity index 99% rename from src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderFvmTest.kt rename to fvm/src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderFvmTest.kt index 91862c2..1ae5571 100644 --- a/src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderFvmTest.kt +++ b/fvm/src/test/kotlin/org/web3j/aion/abi/AbiFunctionEncoderFvmTest.kt @@ -2,7 +2,6 @@ package org.web3j.aion.abi import assertk.assertThat import assertk.assertions.isEqualTo -import org.aion.avm.userlib.abi.ABIException import org.junit.Test import org.junit.jupiter.api.assertThrows import org.web3j.abi.FunctionEncoder.encode diff --git a/src/test/kotlin/org/web3j/aion/abi/FvmNumericConstants.kt b/fvm/src/test/kotlin/org/web3j/aion/abi/FvmNumericConstants.kt similarity index 100% rename from src/test/kotlin/org/web3j/aion/abi/FvmNumericConstants.kt rename to fvm/src/test/kotlin/org/web3j/aion/abi/FvmNumericConstants.kt diff --git a/settings.gradle b/settings.gradle index 0d93e45..0b7c05b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,10 @@ rootProject.name = 'web3j-aion' + +include 'common' +findProject(':common')?.name = 'web3j-aion-common' + +include 'avm' +findProject(':avm')?.name = 'web3j-aion-avm' + +include 'fvm' +findProject(':fvm')?.name = 'web3j-aion-fvm' diff --git a/src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionDecoderProvider b/src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionDecoderProvider deleted file mode 100644 index ee38316..0000000 --- a/src/main/resources/META-INF/services/org.web3j.abi.spi.FunctionDecoderProvider +++ /dev/null @@ -1 +0,0 @@ -org.web3j.aion.abi.spi.AbiFunctionDecoderProvider diff --git a/src/test/resources/erc20/ERC20Token.abi b/src/test/resources/erc20/ERC20Token.abi deleted file mode 100644 index c81cca9..0000000 --- a/src/test/resources/erc20/ERC20Token.abi +++ /dev/null @@ -1,13 +0,0 @@ -0.0 -com.example.dapp.ERC20Token -Clinit: () -public static String name() -public static String symbol() -public static int decimals() -public static long totalSupply() -public static long balanceOf(Address) -public static long allowance(Address, Address) -public static boolean transfer(Address, long) -public static boolean approve(Address, long) -public static boolean transferFrom(Address, Address, long) -public static boolean mint(Address, long)