@ -31,11 +31,17 @@ import (
var versionRegexp = regexp . MustCompile ( ` ([0-9]+)\.([0-9]+)\.([0-9]+) ` )
var versionRegexp = regexp . MustCompile ( ` ([0-9]+)\.([0-9]+)\.([0-9]+) ` )
// Contract contains information about a compiled contract, alongside its code.
type Contract struct {
type Contract struct {
Code string ` json:"code" `
Code string ` json:"code" `
Info ContractInfo ` json:"info" `
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 {
type ContractInfo struct {
Source string ` json:"source" `
Source string ` json:"source" `
Language string ` json:"language" `
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 {
if err := cmd . Run ( ) ; err != nil {
return nil , fmt . Errorf ( "solc: %v\n%s" , err , stderr . Bytes ( ) )
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
var output solcOutput
if err := json . Unmarshal ( stdout . Bytes ( ) , & output ) ; err != nil {
if err := json . Unmarshal ( combinedJSON , & output ) ; err != nil {
return nil , err
return nil , err
}
}
@ -168,9 +188,9 @@ func (s *Solidity) run(cmd *exec.Cmd, source string) (map[string]*Contract, erro
Info : ContractInfo {
Info : ContractInfo {
Source : source ,
Source : source ,
Language : "Solidity" ,
Language : "Solidity" ,
LanguageVersion : s . Version ,
LanguageVersion : language Version,
CompilerVersion : s . Version ,
CompilerVersion : compiler Version,
CompilerOptions : strings . Join ( s . makeArgs ( ) , " " ) ,
CompilerOptions : compilerOptions ,
AbiDefinition : abi ,
AbiDefinition : abi ,
UserDoc : userdoc ,
UserDoc : userdoc ,
DeveloperDoc : devdoc ,
DeveloperDoc : devdoc ,