import java.io.PrintWriter import sbt.TaskKey import sbt._ import Keys._ object SolidityPlugin extends AutoPlugin { object autoImport { lazy val solidityCompile = TaskKey[Unit]("solidityCompile", "Compiles solidity contracts") } import autoImport._ override def projectSettings: Seq[Def.Setting[_]] = Seq( solidityCompile := { import sys.process._ val contractsDir = baseDirectory.value / "src" / "evmTest" / "resources" / "solidity" val outDir = baseDirectory.value / "target" / "contracts" (contractsDir ** "*.sol").get.foreach { f => Seq("solc", f.getPath, "--bin", "--overwrite", "-o", outDir.getPath).!! // this is a temporary workaround, see: https://github.com/ethereum/solidity/issues/1732 val abiOut = Seq("solc", f.getPath, "--abi").!! val abisLines = abiOut.split("\n").sliding(4, 4) abisLines.foreach { abiLines => val contractName = abiLines(1) .replace(f.getPath, "") .dropWhile(_ != ':').drop(1) .takeWhile(_ != ' ') new PrintWriter(outDir / s"$contractName.abi") { write(abiLines.drop(3).mkString); close() } } } } ) }