Merge pull request #1418 from poanetwork/ab-pass-external-librarie-to-solidity-compiler

pass external libraries to the Solidity compiler
pull/1439/head
Ayrat Badykov 6 years ago committed by GitHub
commit 681eac512c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      apps/explorer/lib/explorer/smart_contract/solidity/code_compiler.ex
  2. 4
      apps/explorer/priv/compile_solc.js

@ -61,6 +61,8 @@ defmodule Explorer.SmartContract.Solidity.CodeCompiler do
}
"""
def run(name, compiler_version, code, optimize, external_libs \\ %{}) do
external_libs_string = Jason.encode!(external_libs)
{response, _status} =
System.cmd(
"node",
@ -69,16 +71,15 @@ defmodule Explorer.SmartContract.Solidity.CodeCompiler do
code,
compiler_version,
optimize_value(optimize),
@new_contract_name
@new_contract_name,
external_libs_string
]
)
with {:ok, contracts} <- Jason.decode(response),
%{"abi" => abi, "evm" => %{"deployedBytecode" => %{"object" => bytecode}}} <-
get_contract_info(contracts, name) do
bytecode_with_libraries = add_library_addresses(bytecode, external_libs)
{:ok, %{"abi" => abi, "bytecode" => bytecode_with_libraries, "name" => name}}
{:ok, %{"abi" => abi, "bytecode" => bytecode, "name" => name}}
else
{:error, %Jason.DecodeError{}} ->
{:error, :compilation}
@ -105,16 +106,6 @@ defmodule Explorer.SmartContract.Solidity.CodeCompiler do
end
end
defp add_library_addresses(bytecode, external_libs) do
Enum.reduce(external_libs, bytecode, fn {library_name, address}, acc ->
placeholder = String.replace(@new_contract_name, ".", "\.") <> ":" <> library_name
regex = Regex.compile!("_+#{placeholder}_+")
address = String.replace(address, "0x", "")
String.replace(acc, regex, address)
end)
end
def parse_error(%{"error" => error}), do: {:error, [error]}
def parse_error(%{"errors" => errors}), do: {:error, errors}
def parse_error({:error, _} = error), do: error

@ -6,6 +6,7 @@ var sourceCode = process.argv[2];
var version = process.argv[3];
var optimize = process.argv[4];
var newContractName = process.argv[5];
var externalLibraries = JSON.parse(process.argv[6])
var compiled_code = solc.loadRemoteVersion(version, function (err, solcSnapshot) {
if (err) {
@ -24,6 +25,9 @@ var compiled_code = solc.loadRemoteVersion(version, function (err, solcSnapshot)
enabled: optimize == '1',
runs: 200
},
libraries: {
[newContractName]: externalLibraries
},
outputSelection: {
'*': {
'*': ['*']

Loading…
Cancel
Save