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 def run(name, compiler_version, code, optimize, external_libs \\ %{}) do
external_libs_string = Jason.encode!(external_libs)
{response, _status} = {response, _status} =
System.cmd( System.cmd(
"node", "node",
@ -69,16 +71,15 @@ defmodule Explorer.SmartContract.Solidity.CodeCompiler do
code, code,
compiler_version, compiler_version,
optimize_value(optimize), optimize_value(optimize),
@new_contract_name @new_contract_name,
external_libs_string
] ]
) )
with {:ok, contracts} <- Jason.decode(response), with {:ok, contracts} <- Jason.decode(response),
%{"abi" => abi, "evm" => %{"deployedBytecode" => %{"object" => bytecode}}} <- %{"abi" => abi, "evm" => %{"deployedBytecode" => %{"object" => bytecode}}} <-
get_contract_info(contracts, name) do get_contract_info(contracts, name) do
bytecode_with_libraries = add_library_addresses(bytecode, external_libs) {:ok, %{"abi" => abi, "bytecode" => bytecode, "name" => name}}
{:ok, %{"abi" => abi, "bytecode" => bytecode_with_libraries, "name" => name}}
else else
{:error, %Jason.DecodeError{}} -> {:error, %Jason.DecodeError{}} ->
{:error, :compilation} {:error, :compilation}
@ -105,16 +106,6 @@ defmodule Explorer.SmartContract.Solidity.CodeCompiler do
end end
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(%{"error" => error}), do: {:error, [error]}
def parse_error(%{"errors" => errors}), do: {:error, errors} def parse_error(%{"errors" => errors}), do: {:error, errors}
def parse_error({:error, _} = error), do: error def parse_error({:error, _} = error), do: error

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

Loading…
Cancel
Save