aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorAntonio Salazar Cardozo <savedfastcool@gmail.com>2018-06-05 18:22:02 +0800
committerFelix Lange <fjl@users.noreply.github.com>2018-06-05 18:22:02 +0800
commit4cf2b4110e9942bdcba1b9b1d82b3ca8ff552f64 (patch)
tree1f591dcd56056315203a26a60cd087624bef8a4d /common
parent0029a869f04e9beb6741e591ebde07327458e64f (diff)
downloaddexon-4cf2b4110e9942bdcba1b9b1d82b3ca8ff552f64.tar.gz
dexon-4cf2b4110e9942bdcba1b9b1d82b3ca8ff552f64.tar.zst
dexon-4cf2b4110e9942bdcba1b9b1d82b3ca8ff552f64.zip
cmd/abigen: support for reading solc output from stdin (#16683)
Allow the --abi flag to be given - to indicate that it should read the ABI information from standard input. It expects to read the solc output with the --combined-json flag providing bin, abi, userdoc, devdoc, and metadata, and works very similarly to the internal invocation of solc, except it allows external invocation of solc. This facilitates integration with more complex solc invocations, such as invocations that require path remapping or --allow-paths tweaks. Simple usage example: solc --combined-json bin,abi,userdoc,devdoc,metadata *.sol | abigen --abi -
Diffstat (limited to 'common')
-rw-r--r--common/compiler/solidity.go28
1 files changed, 24 insertions, 4 deletions
diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go
index 234714a2b..f6e8d2e42 100644
--- a/common/compiler/solidity.go
+++ b/common/compiler/solidity.go
@@ -31,11 +31,17 @@ import (
var versionRegexp = regexp.MustCompile(`([0-9]+)\.([0-9]+)\.([0-9]+)`)
+// Contract contains information about a compiled contract, alongside its code.
type Contract struct {
Code string `json:"code"`
Info ContractInfo `json:"info"`
}
+// ContractInfo contains information about a compiled contract, including access
+// to the ABI definition, user and developer docs, and metadata.
+//
+// Depending on the source, language version, compiler version, and compiler
+// options will provide information about how the contract was compiled.
type ContractInfo struct {
Source string `json:"source"`
Language string `json:"language"`
@@ -142,8 +148,22 @@ func (s *Solidity) run(cmd *exec.Cmd, source string) (map[string]*Contract, erro
if err := cmd.Run(); err != nil {
return nil, fmt.Errorf("solc: %v\n%s", err, stderr.Bytes())
}
+
+ return ParseCombinedJSON(stdout.Bytes(), source, s.Version, s.Version, strings.Join(s.makeArgs(), " "))
+}
+
+// ParseCombinedJSON takes the direct output of a solc --combined-output run and
+// parses it into a map of string contract name to Contract structs. The
+// provided source, language and compiler version, and compiler options are all
+// passed through into the Contract structs.
+//
+// The solc output is expected to contain ABI, user docs, and dev docs.
+//
+// Returns an error if the JSON is malformed or missing data, or if the JSON
+// embedded within the JSON is malformed.
+func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion string, compilerVersion string, compilerOptions string) (map[string]*Contract, error) {
var output solcOutput
- if err := json.Unmarshal(stdout.Bytes(), &output); err != nil {
+ if err := json.Unmarshal(combinedJSON, &output); err != nil {
return nil, err
}
@@ -168,9 +188,9 @@ func (s *Solidity) run(cmd *exec.Cmd, source string) (map[string]*Contract, erro
Info: ContractInfo{
Source: source,
Language: "Solidity",
- LanguageVersion: s.Version,
- CompilerVersion: s.Version,
- CompilerOptions: strings.Join(s.makeArgs(), " "),
+ LanguageVersion: languageVersion,
+ CompilerVersion: compilerVersion,
+ CompilerOptions: compilerOptions,
AbiDefinition: abi,
UserDoc: userdoc,
DeveloperDoc: devdoc,