neo-devpack-solidity 0.22.0

Production-focused Solidity-to-NeoVM compilation system
Documentation
#[test]
fn method_identifiers_include_selectors() {
    let selector_bytes = {
        let mut hasher = Keccak256::new();
        hasher.update("foo(uint256)".as_bytes());
        let digest = hasher.finalize();
        let mut selector = [0u8; 4];
        selector.copy_from_slice(&digest[..4]);
        selector
    };

    let metadata = ContractMetadata {
        name: "Test".to_string(),
        is_abstract: false,
            is_interface: false,
        is_library: false,
        methods: vec![FunctionMetadata {
            name: "foo".to_string(),
            neo_name: "foo".to_string(),
            kind: FunctionKind::Regular,
            parameters: vec![ParameterMetadata {
                name: Some("a".to_string()),
                ty: "uint256 memory".to_string(),
                neo_type: Some(NeoType::Integer {
                    signed: false,
                    bits: 256,
                }),
                storage: None,
            }],
            return_parameters: vec![],
            state_mutability: StateMutability::View,
            visibility: VisibilityKind::Public,
            offset: 0,
            body: None,
            selector: selector_bytes,
            is_virtual: false,
            is_override: false,
            documentation: NatspecDoc::default(),
            had_modifier_epilogue: false,
        }],
        events: vec![],
        errors: vec![],
        uses_storage: false,
        state_variables: vec![],
        structs: vec![],
        enums: vec![],
        contract_types: vec![],
        selector_registry: std::sync::Arc::new(neo_devpack_solidity::solidity::SelectorRegistry::default()),
        documentation: NatspecDoc::default(),
        has_using_for_star: false,
        has_using_function_list: false,
        using_for_libraries: vec![],
        using_directives: vec![],
        has_type_definitions: false,
        type_aliases: std::collections::HashMap::new(),
        flatten_warnings: Vec::new(),
        super_method_map: std::collections::HashMap::new(),
    };

    let identifiers = build_method_identifiers(&metadata);
    assert_eq!(identifiers.len(), 1);
    assert_eq!(
        identifiers
            .get("foo(uint256)")
            .and_then(|v| v.as_str())
            .unwrap_or_default(),
        &hex_prefixed(&hex::encode(selector_bytes))
    );
}

#[test]
fn metadata_blob_populates_keccak() {
    let metadata = build_metadata_blob(
        "Example",
        &[],
        "Contract.sol",
        &json!({"optimizer": true}),
        Some("deadbeef"),
    );

    let value: Value = serde_json::from_str(&metadata).expect("metadata should be valid JSON");
    assert_eq!(
        value["sources"]["Contract.sol"]["keccak256"],
        Value::String("0xdeadbeef".to_string())
    );
    assert_eq!(value["compiler"]["name"], COMPILER_ID);
}