public static async Task <ContractParameterParser> GetContractParameterParserAsync(this IExpressNode expressNode, ExpressChain?chain = null)
        {
            ContractParameterParser.TryGetUInt160 tryGetAccount = (string name, out UInt160 scriptHash) =>
            {
                var account = chain?.GetAccount(name);
                if (account != null)
                {
                    scriptHash = account.AsUInt160();
                    return(true);
                }

                scriptHash = null !;
                return(false);
            };

            var contracts = await expressNode.ListContractsAsync().ConfigureAwait(false);

            var lookup = contracts.ToDictionary(c => c.manifest.Name, c => c.hash);

            ContractParameterParser.TryGetUInt160 tryGetContract = (string name, out UInt160 scriptHash) =>
            {
                if (lookup.TryGetValue(name, out var value))
                {
                    scriptHash = value;
                    return(true);
                }

                foreach (var kvp in lookup)
                {
                    if (string.Equals(name, kvp.Key, StringComparison.OrdinalIgnoreCase))
                    {
                        scriptHash = kvp.Value;
                        return(true);
                    }
                }

                scriptHash = default !;