code: func ParseVyperJSON(combinedJSON []byte, source string, languageVersion string, compilerVersion string, compilerOptions string) (map[string]*Contract, error) {
  	var output map[string]interface{}
  	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 {
  		// Parse the individual compilation results.
  		if name == "version" {
  			continue
  		}
  		c := info.(map[string]interface{})
  
  		contracts[name] = &Contract{
  			Code:        c["bytecode"].(string),
  			RuntimeCode: c["bytecode_runtime"].(string),
  			Info: ContractInfo{
  				Source:          source,
  				Language:        "Vyper",
  				LanguageVersion: languageVersion,
  				CompilerVersion: compilerVersion,
  				CompilerOptions: compilerOptions,
  				SrcMap:          c["source_map"],
  				SrcMapRuntime:   "",
  				AbiDefinition:   c["abi"],
  				UserDoc:         "",
  				DeveloperDoc:    "",
  				Metadata:        "",
  			},
  		}
  	}
  	return contracts, nil
  }
docs: // ParseVyperJSON takes the direct output of a vyper --f combined_json 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 vyper output is expected to contain ABI and source mapping.
  //
  // Returns an error if the JSON is malformed or missing data, or if the JSON
  // embedded within the JSON is malformed.