alloy-rs / core

High-performance, well-tested & documented core libraries for Ethereum, in Rust
https://alloy.rs
Apache License 2.0
792 stars 155 forks source link

[Bug] generated getters for storage mappings with dynamic fields can't decode return type #811

Closed benluelo closed 3 days ago

benluelo commented 3 days ago

Component

sol! macro

What version of Alloy are you on?

    ├── alloy v0.6.4
    │   ├── alloy-consensus v0.6.4
    │   │   ├── alloy-eips v0.6.4
    │   │   │   ├── alloy-eip2930 v0.1.0
    │   │   │   │   ├── alloy-primitives v0.8.12
    │   │   │   │   │   ├── alloy-rlp v0.3.9
    │   │   │   │   │   │   ├── alloy-rlp-derive v0.3.9 (proc-macro)
    │   │   │   │   │   │   ├── alloy-rlp v0.3.9 (*)
    │   │   │   │   ├── alloy-rlp v0.3.9 (*)
    │   │   │   ├── alloy-eip7702 v0.4.1
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   │   ├── alloy-rlp v0.3.9 (*)
    │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   ├── alloy-rlp v0.3.9 (*)
    │   │   │   ├── alloy-serde v0.6.4
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   ├── alloy-rlp v0.3.9 (*)
    │   │   ├── alloy-serde v0.6.4 (*)
    │   ├── alloy-contract v0.6.4
    │   │   ├── alloy-dyn-abi v0.8.12
    │   │   │   ├── alloy-json-abi v0.8.12
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   │   ├── alloy-sol-type-parser v0.8.12
    │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   ├── alloy-sol-type-parser v0.8.12 (*)
    │   │   │   ├── alloy-sol-types v0.8.12
    │   │   │   │   ├── alloy-json-abi v0.8.12 (*)
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   │   ├── alloy-sol-macro v0.8.12 (proc-macro)
    │   │   │   │   │   ├── alloy-sol-macro-expander v0.8.12
    │   │   │   │   │   │   ├── alloy-json-abi v0.8.12
    │   │   │   │   │   │   │   ├── alloy-primitives v0.8.12
    │   │   │   │   │   │   │   ├── alloy-sol-type-parser v0.8.12
    │   │   │   │   │   │   ├── alloy-sol-macro-input v0.8.12
    │   │   │   │   │   │   │   ├── alloy-json-abi v0.8.12 (*)
    │   │   │   │   │   ├── alloy-sol-macro-input v0.8.12 (*)
    │   │   ├── alloy-json-abi v0.8.12 (*)
    │   │   ├── alloy-network v0.6.4
    │   │   │   ├── alloy-consensus v0.6.4 (*)
    │   │   │   ├── alloy-eips v0.6.4 (*)
    │   │   │   ├── alloy-json-rpc v0.6.4
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   │   ├── alloy-sol-types v0.8.12 (*)
    │   │   │   ├── alloy-network-primitives v0.6.4
    │   │   │   │   ├── alloy-consensus v0.6.4 (*)
    │   │   │   │   ├── alloy-eips v0.6.4 (*)
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   │   ├── alloy-serde v0.6.4 (*)
    │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   ├── alloy-rpc-types-eth v0.6.4
    │   │   │   │   ├── alloy-consensus v0.6.4 (*)
    │   │   │   │   ├── alloy-eips v0.6.4 (*)
    │   │   │   │   ├── alloy-network-primitives v0.6.4 (*)
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   │   ├── alloy-rlp v0.3.9 (*)
    │   │   │   │   ├── alloy-serde v0.6.4 (*)
    │   │   │   │   ├── alloy-sol-types v0.8.12 (*)
    │   │   │   ├── alloy-serde v0.6.4 (*)
    │   │   │   ├── alloy-signer v0.6.4
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   ├── alloy-sol-types v0.8.12 (*)
    │   │   ├── alloy-network-primitives v0.6.4 (*)
    │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   ├── alloy-provider v0.6.4
    │   │   │   ├── alloy-chains v0.1.39
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   ├── alloy-consensus v0.6.4 (*)
    │   │   │   ├── alloy-eips v0.6.4 (*)
    │   │   │   ├── alloy-json-rpc v0.6.4 (*)
    │   │   │   ├── alloy-network v0.6.4 (*)
    │   │   │   ├── alloy-network-primitives v0.6.4 (*)
    │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   ├── alloy-pubsub v0.6.4
    │   │   │   │   ├── alloy-json-rpc v0.6.4 (*)
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   │   ├── alloy-transport v0.6.4
    │   │   │   │   │   ├── alloy-json-rpc v0.6.4 (*)
    │   │   │   ├── alloy-rpc-client v0.6.4
    │   │   │   │   ├── alloy-json-rpc v0.6.4 (*)
    │   │   │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   │   │   ├── alloy-pubsub v0.6.4 (*)
    │   │   │   │   ├── alloy-transport v0.6.4 (*)
    │   │   │   │   ├── alloy-transport-http v0.6.4
    │   │   │   │   │   ├── alloy-json-rpc v0.6.4 (*)
    │   │   │   │   │   ├── alloy-transport v0.6.4 (*)
    │   │   │   │   ├── alloy-transport-ws v0.6.4
    │   │   │   │   │   ├── alloy-pubsub v0.6.4 (*)
    │   │   │   │   │   ├── alloy-transport v0.6.4 (*)
    │   │   │   ├── alloy-rpc-types-eth v0.6.4 (*)
    │   │   │   ├── alloy-transport v0.6.4 (*)
    │   │   │   ├── alloy-transport-http v0.6.4 (*)
    │   │   │   ├── alloy-transport-ws v0.6.4 (*)
    │   │   ├── alloy-pubsub v0.6.4 (*)
    │   │   ├── alloy-rpc-types-eth v0.6.4 (*)
    │   │   ├── alloy-sol-types v0.8.12 (*)
    │   │   ├── alloy-transport v0.6.4 (*)
    │   ├── alloy-core v0.8.12
    │   │   ├── alloy-dyn-abi v0.8.12 (*)
    │   │   ├── alloy-json-abi v0.8.12 (*)
    │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   └── alloy-sol-types v0.8.12 (*)
    │   ├── alloy-eips v0.6.4 (*)
    │   ├── alloy-network v0.6.4 (*)
    │   ├── alloy-provider v0.6.4 (*)
    │   ├── alloy-pubsub v0.6.4 (*)
    │   ├── alloy-rpc-client v0.6.4 (*)
    │   ├── alloy-rpc-types v0.6.4
    │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   ├── alloy-rpc-types-eth v0.6.4 (*)
    │   │   ├── alloy-serde v0.6.4 (*)
    │   ├── alloy-serde v0.6.4 (*)
    │   ├── alloy-signer v0.6.4 (*)
    │   ├── alloy-signer-local v0.6.4
    │   │   ├── alloy-consensus v0.6.4 (*)
    │   │   ├── alloy-network v0.6.4 (*)
    │   │   ├── alloy-primitives v0.8.12 (*)
    │   │   ├── alloy-signer v0.6.4 (*)
    │   ├── alloy-transport v0.6.4 (*)
    │   ├── alloy-transport-http v0.6.4 (*)
    │   └── alloy-transport-ws v0.6.4 (*)
│   ├── alloy v0.6.4 (*)
│   ├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
│   │   │   ├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
│   ├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)
├── alloy v0.6.4 (*)

Operating System

Linux

Describe the bug

having some issues with calling mapping getters on contracts when the stored value contains non-static fields. looked through the code generated by sol! and noticed that there's an extra tuple wrapping around the return type, removing this fixes the issue. i believe the issue is here: https://github.com/alloy-rs/core/blob/main/crates/sol-macro-expander/src/expand/mod.rs#L847-L864 but i have not had much time to look into it further yet.

Example

sol! {
    #![sol(all_derives, rpc)]

    contract TestIbc {
        /// ConnectionId -> Connection
        mapping(uint32 => Connection) public connections;
        /// ChannelId -> Channel
        mapping(uint32 => Channel) public channels;

        enum ConnectionState {
            Unspecified,
            Init,
            TryOpen,
            Open
        }

        struct Connection {
            ConnectionState state;
            uint32 client_id;
            uint32 counterparty_client_id;
            uint32 counterparty_connection_id;
        }

        enum ChannelState {
            Unspecified,
            Init,
            TryOpen,
            Open,
            Closed
        }

        struct Channel {
            ChannelState state;
            uint32 connection_id;
            uint32 counterparty_channel_id;
            bytes counterparty_port_id;
            string version;
        }
    }
}

.connections() works, but .channels() does not.