{
  "accepts leaf with valid inner proofs": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      },
      "path": [
        {
          "hash": 1,
          "prefix": "AgQIIGe3bHuC1g6+5/Qd0RoCU0waFu+nDCFzEDViMN/VrQwgIA=="
        },
        {
          "hash": 1,
          "prefix": "BAYIIA=="
        }
      ]
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      }
    },
    "Err": ""
  },
  "accepts one proper leaf": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      }
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      }
    },
    "Err": ""
  },
  "allows depth limited in proper range": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      },
      "path": [
        {
          "hash": 1,
          "prefix": "AgQIIGe3bHuC1g6+5/Qd0RoCU0waFu+nDCFzEDViMN/VrQwgIA=="
        },
        {
          "hash": 1,
          "prefix": "BAYIIA=="
        },
        {
          "hash": 1,
          "prefix": "BgwKIA=="
        }
      ]
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      },
      "max_depth": 4,
      "min_depth": 2
    },
    "Err": ""
  },
  "empty proof fails": {
    "Proof": {
      "key": "Zm9v",
      "value": "YmFy"
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      }
    },
    "Err": "existence Proof needs defined LeafOp"
  },
  "reject depth limited with too few inner nodes": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      },
      "path": [
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        }
      ]
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      },
      "max_depth": 4,
      "min_depth": 2
    },
    "Err": "innerOps depth too short: 1"
  },
  "reject depth limited with too many inner nodes": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      },
      "path": [
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        }
      ]
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      },
      "max_depth": 4,
      "min_depth": 2
    },
    "Err": "innerOps depth too long: 5"
  },
  "reject too many inner nodes (129) using default limited depth (128)": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      },
      "path": [
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        }, 
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        }
      ]
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      },
      "max_depth": 0,
      "min_depth": 2
    },
    "Err": "innerOps depth too long: 129"
  },
  "rejects invalid inner proof (hash mismatch)": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      },
      "path": [
        {
          "hash": 2,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        },
        {
          "hash": 1,
          "prefix": "qrvM3Q=="
        }
      ]
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      }
    },
    "Err": "inner, unexpected HashOp: 2"
  },
  "rejects invalid leaf": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      }
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      }
    },
    "Err": "leaf, unexpected PrehashValue: 0"
  },
  "rejects leaf with invalid inner proofs": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      },
      "path": [
        {
          "hash": 1,
          "prefix": "AgQIIGe3bHuC1g6+5/Qd0RoCU0waFu+nDCFzEDViMN/VrQwgIA=="
        },
        {
          "hash": 1,
          "prefix": "BAYIIA=="
        }, 
        {
          "hash": 1,
          "prefix": "AKq7zN0=",
          "suffix": "uw=="
        }
    ]
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      }
    },
    "Err": "inner, IAVL height (0) must be non-negative and greater than or equal to the layer number (3)"
  },
  "rejects only inner proof (hash mismatch)": {
    "Proof": {
      "key": "Zm9vZA==",
      "value": "YmFy",
      "leaf": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AAKKAQ=="
      },
      "path": [
        {
          "hash": 0,
          "prefix": "qrvM3Q=="
        }
      ]
    },
    "Spec": {
      "leaf_spec": {
        "hash": 1,
        "prehash_value": 1,
        "length": 1,
        "prefix": "AA=="
      },
      "inner_spec": {
        "child_order": [
          0,
          1
        ],
        "child_size": 33,
        "min_prefix_length": 4,
        "max_prefix_length": 12,
        "hash": 1
      }
    },
    "Err": "inner, unexpected HashOp: 0"
  }
}
