|
|
|
@ -44,6 +44,20 @@ type solcOutput struct { |
|
|
|
|
Version string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// solidity v.0.8 changes the way ABI, Devdoc and Userdoc are serialized
|
|
|
|
|
type solcOutputV8 struct { |
|
|
|
|
Contracts map[string]struct { |
|
|
|
|
BinRuntime string `json:"bin-runtime"` |
|
|
|
|
SrcMapRuntime string `json:"srcmap-runtime"` |
|
|
|
|
Bin, SrcMap, Metadata string |
|
|
|
|
Abi interface{} |
|
|
|
|
Devdoc interface{} |
|
|
|
|
Userdoc interface{} |
|
|
|
|
Hashes map[string]string |
|
|
|
|
} |
|
|
|
|
Version string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (s *Solidity) makeArgs() []string { |
|
|
|
|
p := []string{ |
|
|
|
|
"--combined-json", "bin,bin-runtime,srcmap,srcmap-runtime,abi,userdoc,devdoc", |
|
|
|
@ -125,7 +139,6 @@ 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(), " ")) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -141,7 +154,8 @@ func (s *Solidity) run(cmd *exec.Cmd, source string) (map[string]*Contract, erro |
|
|
|
|
func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion string, compilerVersion string, compilerOptions string) (map[string]*Contract, error) { |
|
|
|
|
var output solcOutput |
|
|
|
|
if err := json.Unmarshal(combinedJSON, &output); err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
// Try to parse the output with the new solidity v.0.8.0 rules
|
|
|
|
|
return parseCombinedJSONV8(combinedJSON, source, languageVersion, compilerVersion, compilerOptions) |
|
|
|
|
} |
|
|
|
|
// Compilation succeeded, assemble and return the contracts.
|
|
|
|
|
contracts := make(map[string]*Contract) |
|
|
|
@ -176,3 +190,35 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin |
|
|
|
|
} |
|
|
|
|
return contracts, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// parseCombinedJSONV8 parses the direct output of solc --combined-output
|
|
|
|
|
// and parses it using the rules from solidity v.0.8.0 and later.
|
|
|
|
|
func parseCombinedJSONV8(combinedJSON []byte, source string, languageVersion string, compilerVersion string, compilerOptions string) (map[string]*Contract, error) { |
|
|
|
|
var output solcOutputV8 |
|
|
|
|
if err := json.Unmarshal(combinedJSON, &output); err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
// Compilation succeeded, assemble and return the contracts.
|
|
|
|
|
contracts := make(map[string]*Contract) |
|
|
|
|
for name, info := range output.Contracts { |
|
|
|
|
contracts[name] = &Contract{ |
|
|
|
|
Code: "0x" + info.Bin, |
|
|
|
|
RuntimeCode: "0x" + info.BinRuntime, |
|
|
|
|
Hashes: info.Hashes, |
|
|
|
|
Info: ContractInfo{ |
|
|
|
|
Source: source, |
|
|
|
|
Language: "Solidity", |
|
|
|
|
LanguageVersion: languageVersion, |
|
|
|
|
CompilerVersion: compilerVersion, |
|
|
|
|
CompilerOptions: compilerOptions, |
|
|
|
|
SrcMap: info.SrcMap, |
|
|
|
|
SrcMapRuntime: info.SrcMapRuntime, |
|
|
|
|
AbiDefinition: info.Abi, |
|
|
|
|
UserDoc: info.Userdoc, |
|
|
|
|
DeveloperDoc: info.Devdoc, |
|
|
|
|
Metadata: info.Metadata, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return contracts, nil |
|
|
|
|
} |
|
|
|
|