Skip to main content
Chain metadata helps the parser understand smart contract interactions. Without metadata, contract calls may appear as raw hex data. With metadata, they’re parsed into meaningful field names and values.

When to provide metadata

ScenarioMetadata needed?
Native transfers (ETH, SOL, SUI)No
Known protocols (Uniswap, Jupiter, Aave)No (built-in support)
Standard token transfers (ERC-20, SPL)No (built-in support)
Custom smart contractsYes
Anchor programs without public IDLYes

Ethereum: Contract ABI

For Ethereum and EVM chains, provide the contract ABI to decode function calls:

gRPC example

request := &pb.ParseRequest{
    UnsignedPayload: txBytes,
    Chain: pb.Chain_CHAIN_ETHEREUM,
    ChainMetadata: &pb.ChainMetadata{
        Metadata: &pb.ChainMetadata_Ethereum{
            Ethereum: &pb.EthereumMetadata{
                Abi: &pb.Abi{
                    Value: contractABI, // JSON ABI string
                },
            },
        },
    },
}

ABI format

The ABI is standard Solidity ABI JSON:
[
  {
    "name": "transfer",
    "type": "function",
    "inputs": [
      { "name": "recipient", "type": "address" },
      { "name": "amount", "type": "uint256" }
    ]
  },
  {
    "name": "approve",
    "type": "function",
    "inputs": [
      { "name": "spender", "type": "address" },
      { "name": "amount", "type": "uint256" }
    ]
  }
]

Specifying network

For EVM chains other than mainnet, specify the network:
ChainMetadata: &pb.ChainMetadata{
    Metadata: &pb.ChainMetadata_Ethereum{
        Ethereum: &pb.EthereumMetadata{
            NetworkId: "POLYGON_MAINNET",  // or ARBITRUM_MAINNET, etc.
            Abi: &pb.Abi{
                Value: contractABI,
            },
        },
    },
}

Solana: Program IDL

For Solana programs, provide the Anchor IDL to decode instructions:

gRPC example

request := &pb.ParseRequest{
    UnsignedPayload: txBytes,
    Chain: pb.Chain_CHAIN_SOLANA,
    ChainMetadata: &pb.ChainMetadata{
        Metadata: &pb.ChainMetadata_Solana{
            Solana: &pb.SolanaMetadata{
                Idl: &pb.Idl{
                    Value: anchorIDL, // JSON IDL string
                    IdlType: pb.SolanaIdlType_SOLANA_IDL_TYPE_ANCHOR,
                },
            },
        },
    },
}

Multiple programs

If your transaction interacts with multiple programs, use the IDL mappings:
ChainMetadata: &pb.ChainMetadata{
    Metadata: &pb.ChainMetadata_Solana{
        Solana: &pb.SolanaMetadata{
            IdlMappings: map[string]*pb.Idl{
                "Program1111111111111111111111111111111111111": {
                    Value: program1IDL,
                    IdlType: pb.SolanaIdlType_SOLANA_IDL_TYPE_ANCHOR,
                },
                "Program2222222222222222222222222222222222222": {
                    Value: program2IDL,
                    IdlType: pb.SolanaIdlType_SOLANA_IDL_TYPE_ANCHOR,
                },
            },
        },
    },
}

Supported IDL types

TypeDescription
SOLANA_IDL_TYPE_ANCHORAnchor framework IDL
SOLANA_IDL_TYPE_SHANKShank IDL format

Library integration

When using the library directly (not gRPC), pass metadata as a function parameter:
use visualsign_parser::{parse_transaction, Chain, ChainMetadata, EthereumMetadata};

let metadata = ChainMetadata::Ethereum(EthereumMetadata {
    abi: Some(contract_abi.to_string()),
    network_id: None,
});

let result = parse_transaction(raw_tx, Chain::Ethereum, Some(metadata));

Obtaining metadata

Ethereum ABIs

SourceHow to get
EtherscanView verified contract → Contract tab → ABI
Compilationsolc --abi Contract.sol
Hardhatartifacts/contracts/Contract.sol/Contract.json
Foundryout/Contract.sol/Contract.json

Solana IDLs

SourceHow to get
Anchor buildtarget/idl/program_name.json
On-chainSome programs publish IDL on-chain
Program repoCheck the program’s source repository

Without metadata

If you don’t provide metadata for a contract interaction, the parser will:
  1. Decode what it can (addresses, amounts in native token)
  2. Show the function selector (first 4 bytes) as hex
  3. Display raw calldata for unknown parameters
This is safe but less informative. Users see something like:
Contract Interaction
Method: 0xa9059cbb (unknown)
To: 0x1234...
Data: 0x...

Next steps