Cannot build indexer when referencing ABI with enum types

Hello,

I’m trying to build indexer with provided ABI of an NFT contract. ABI is as follows:

{
  "types": [
    {
      "typeId": 0,
      "type": "()",
      "components": [],
      "typeParameters": null
    },
    {
      "typeId": 1,
      "type": "b256",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 2,
      "type": "bool",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 3,
      "type": "enum AccessError",
      "components": [
        {
          "name": "OwnerDoesNotExist",
          "type": 0,
          "typeArguments": null
        },
        {
          "name": "SenderNotOwner",
          "type": 0,
          "typeArguments": null
        },
        {
          "name": "SenderNotOwnerOrApproved",
          "type": 0,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 4,
      "type": "enum Identity",
      "components": [
        {
          "name": "Address",
          "type": 10,
          "typeArguments": null
        },
        {
          "name": "ContractId",
          "type": 12,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 5,
      "type": "enum InputError",
      "components": [
        {
          "name": "TokenAlreadyExists",
          "type": 0,
          "typeArguments": null
        },
        {
          "name": "TokenDoesNotExist",
          "type": 0,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 6,
      "type": "enum Option",
      "components": [
        {
          "name": "None",
          "type": 0,
          "typeArguments": null
        },
        {
          "name": "Some",
          "type": 7,
          "typeArguments": null
        }
      ],
      "typeParameters": [
        7
      ]
    },
    {
      "typeId": 7,
      "type": "generic T",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 8,
      "type": "str[19]",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 9,
      "type": "str[61]",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 10,
      "type": "struct Address",
      "components": [
        {
          "name": "value",
          "type": 1,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 11,
      "type": "struct ApprovalEvent",
      "components": [
        {
          "name": "approved",
          "type": 6,
          "typeArguments": [
            {
              "name": "",
              "type": 4,
              "typeArguments": null
            }
          ]
        },
        {
          "name": "owner",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 12,
      "type": "struct ContractId",
      "components": [
        {
          "name": "value",
          "type": 1,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 13,
      "type": "struct MintEvent",
      "components": [
        {
          "name": "owner",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 14,
      "type": "struct NFTMetadata",
      "components": [
        {
          "name": "token_name",
          "type": 8,
          "typeArguments": null
        },
        {
          "name": "token_uri",
          "type": 9,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 15,
      "type": "struct OperatorEvent",
      "components": [
        {
          "name": "approved",
          "type": 2,
          "typeArguments": null
        },
        {
          "name": "operator",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "owner",
          "type": 4,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 16,
      "type": "struct TransferEvent",
      "components": [
        {
          "name": "from",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "sender",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "to",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 17,
      "type": "u64",
      "components": null,
      "typeParameters": null
    }
  ],
  "functions": [
    {
      "inputs": [
        {
          "name": "approved",
          "type": 6,
          "typeArguments": [
            {
              "name": "",
              "type": 4,
              "typeArguments": null
            }
          ]
        },
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "name": "approve",
      "output": {
        "name": "",
        "type": 0,
        "typeArguments": null
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "read",
            "write"
          ]
        }
      ]
    },
    {
      "inputs": [
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "name": "approved",
      "output": {
        "name": "",
        "type": 6,
        "typeArguments": [
          {
            "name": "",
            "type": 4,
            "typeArguments": null
          }
        ]
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "read"
          ]
        }
      ]
    },
    {
      "inputs": [
        {
          "name": "owner",
          "type": 4,
          "typeArguments": null
        }
      ],
      "name": "balance_of",
      "output": {
        "name": "",
        "type": 17,
        "typeArguments": null
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "read"
          ]
        }
      ]
    },
    {
      "inputs": [
        {
          "name": "operator",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "owner",
          "type": 4,
          "typeArguments": null
        }
      ],
      "name": "is_approved_for_all",
      "output": {
        "name": "",
        "type": 2,
        "typeArguments": null
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "read"
          ]
        }
      ]
    },
    {
      "inputs": [
        {
          "name": "amount",
          "type": 17,
          "typeArguments": null
        },
        {
          "name": "to",
          "type": 4,
          "typeArguments": null
        }
      ],
      "name": "mint",
      "output": {
        "name": "",
        "type": 0,
        "typeArguments": null
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "read",
            "write"
          ]
        }
      ]
    },
    {
      "inputs": [
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "name": "owner_of",
      "output": {
        "name": "",
        "type": 6,
        "typeArguments": [
          {
            "name": "",
            "type": 4,
            "typeArguments": null
          }
        ]
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "read"
          ]
        }
      ]
    },
    {
      "inputs": [
        {
          "name": "approve",
          "type": 2,
          "typeArguments": null
        },
        {
          "name": "operator",
          "type": 4,
          "typeArguments": null
        }
      ],
      "name": "set_approval_for_all",
      "output": {
        "name": "",
        "type": 0,
        "typeArguments": null
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "write"
          ]
        }
      ]
    },
    {
      "inputs": [],
      "name": "tokens_minted",
      "output": {
        "name": "",
        "type": 17,
        "typeArguments": null
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "read"
          ]
        }
      ]
    },
    {
      "inputs": [
        {
          "name": "to",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "name": "transfer",
      "output": {
        "name": "",
        "type": 0,
        "typeArguments": null
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "read",
            "write"
          ]
        }
      ]
    },
    {
      "inputs": [
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "name": "token_metadata",
      "output": {
        "name": "",
        "type": 6,
        "typeArguments": [
          {
            "name": "",
            "type": 14,
            "typeArguments": null
          }
        ]
      },
      "attributes": [
        {
          "name": "storage",
          "arguments": [
            "read"
          ]
        }
      ]
    }
  ],
  "loggedTypes": [
    {
      "logId": 0,
      "loggedType": {
        "name": "",
        "type": 5,
        "typeArguments": []
      }
    },
    {
      "logId": 1,
      "loggedType": {
        "name": "",
        "type": 3,
        "typeArguments": []
      }
    },
    {
      "logId": 2,
      "loggedType": {
        "name": "",
        "type": 11,
        "typeArguments": []
      }
    },
    {
      "logId": 3,
      "loggedType": {
        "name": "",
        "type": 5,
        "typeArguments": []
      }
    },
    {
      "logId": 4,
      "loggedType": {
        "name": "",
        "type": 13,
        "typeArguments": []
      }
    },
    {
      "logId": 5,
      "loggedType": {
        "name": "",
        "type": 5,
        "typeArguments": []
      }
    },
    {
      "logId": 6,
      "loggedType": {
        "name": "",
        "type": 15,
        "typeArguments": []
      }
    },
    {
      "logId": 7,
      "loggedType": {
        "name": "",
        "type": 5,
        "typeArguments": []
      }
    },
    {
      "logId": 8,
      "loggedType": {
        "name": "",
        "type": 3,
        "typeArguments": []
      }
    },
    {
      "logId": 9,
      "loggedType": {
        "name": "",
        "type": 16,
        "typeArguments": []
      }
    }
  ],
  "messagesTypes": [],
  "configurables": []
}

When running cargo build --release I get the following error:

 --> src/lib.rs:5:1
  |
5 | #[indexer(manifest = "hello_indexer.manifest.yaml")]
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = help: message: Could not derive TypeApplication param types.: InvalidData("type id 0 not found in type lookup")

Everything works if I remove the entity of typeId 0 from the ABI and all other entities that reference it, but I believe that that’s not the way to do it.

My cargo dependencies:

[dependencies]
fuel-indexer-macros = { version = "0.11", default-features = false }
fuel-indexer-plugin = { version = "0.11" }
fuel-indexer-schema = { version = "0.11", default-features = false }
fuel-tx = "0.26"
fuels = { version = "0.40.0", default-features = false }
getrandom = { version = "0.2", features = ["js"] }
serde = { version = "1.0", default-features = false, features = ["derive"] }

Just to make sure I understand: do you mean that if you remove the reference to the () type in the ABI, the indexer module compiles?

edit: Also, what version of the Fuel indexer are you on? Can you share your indexer code?

Yes, in order to make it work I removed the () type and all types that depend on it from the ABI:

{
  "types": [
    {
      "typeId": 1,
      "type": "b256",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 2,
      "type": "bool",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 4,
      "type": "enum Identity",
      "components": [
        {
          "name": "Address",
          "type": 10,
          "typeArguments": null
        },
        {
          "name": "ContractId",
          "type": 12,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 7,
      "type": "generic T",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 8,
      "type": "str[19]",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 9,
      "type": "str[61]",
      "components": null,
      "typeParameters": null
    },
    {
      "typeId": 10,
      "type": "struct Address",
      "components": [
        {
          "name": "value",
          "type": 1,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 12,
      "type": "struct ContractId",
      "components": [
        {
          "name": "value",
          "type": 1,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 13,
      "type": "struct MintEvent",
      "components": [
        {
          "name": "owner",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 14,
      "type": "struct NFTMetadata",
      "components": [
        {
          "name": "token_name",
          "type": 8,
          "typeArguments": null
        },
        {
          "name": "token_uri",
          "type": 9,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 15,
      "type": "struct OperatorEvent",
      "components": [
        {
          "name": "approved",
          "type": 2,
          "typeArguments": null
        },
        {
          "name": "operator",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "owner",
          "type": 4,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 16,
      "type": "struct TransferEvent",
      "components": [
        {
          "name": "from",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "sender",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "to",
          "type": 4,
          "typeArguments": null
        },
        {
          "name": "token_id",
          "type": 17,
          "typeArguments": null
        }
      ],
      "typeParameters": null
    },
    {
      "typeId": 17,
      "type": "u64",
      "components": null,
      "typeParameters": null
    }
  ],
  "functions": [],
  "loggedTypes": [
    {
      "logId": 4,
      "loggedType": {
        "name": "",
        "type": 13,
        "typeArguments": []
      }
    },
    {
      "logId": 6,
      "loggedType": {
        "name": "",
        "type": 15,
        "typeArguments": []
      }
    },
    {
      "logId": 9,
      "loggedType": {
        "name": "",
        "type": 16,
        "typeArguments": []
      }
    }
  ],
  "messagesTypes": [],
  "configurables": []
}

My versions:

active toolchain
-----------------
beta-3-aarch64-apple-darwin (default)
  forc : 0.37.3
    - forc-client
      - forc-deploy : 0.37.3
      - forc-run : 0.37.3
    - forc-doc : 0.37.3
    - forc-explore : 0.28.1
    - forc-fmt : 0.37.3
    - forc-index : 0.11.2
    - forc-lsp : 0.37.3
    - forc-tx : 0.37.3
    - forc-wallet : 0.2.2
  fuel-core : 0.17.11
  fuel-indexer : 0.11.2

fuels versions
---------------
forc : 0.39

The indexer code could be whatever, since compilation fails on resolving the ABI, not the code. For example:

extern crate alloc;
use fuel_indexer_macros::indexer;
use fuel_indexer_plugin::prelude::*;

#[indexer(manifest = "nft_indexer.manifest.yaml")]
pub mod nft_indexer_index_mod {

    fn handle_transfer_event(event: TransferEvent) {
        Logger::info("Logging a transfer event");
        let from: &Identity = &event.from;
        let to: &Identity = &event.to;
        let token_id: &u64 = &event.token_id;
    }
}