> For the complete documentation index, see [llms.txt](https://docs.sanko.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.sanko.xyz/sanko-mainnet/sudoswap/sudoswap-overview/property-checking.md).

# Property Checking

## Properties

sudoAMM v2 enables users to create property-specific liquidity pools. Properties are enforced at the `LSSVMPair` level on buy methods, meaning that only NFTs with the specified properties can be sold into pools.

Property checking logic is contained within dedicated contracts called Property Checkers. Users can develop Property Checkers using the logic of their choosing, but the resulting contracts should conform to the `IPropertyChecker.sol` interface expected by pair contracts:

```
interface IPropertyChecker {
    function hasProperties(uint256[] calldata ids, bytes calldata params) external returns(bool);
}
```

The interface's single method `hasProperties` takes an array of tokenIds and optional bytes calldata, returning true or false if the specified tokenIds meet the Property Checker's criteria. The optional bytes calldata can be used to pass additional information to the Property Checker, such as proof-of-inclusion in a Merkle tree.

In order to leverage property checking, liquidity providers must specify a Property Checker when creating pools with the Pair Factory. The Property Checker that is specified for a pool at creation cannot be changed or removed.

## Default Property Checkers

sudoAMM v2 provides two default Property Checkers which can be cloned by users with custom parameters. For instructions on doing so, visit sudoswap's [documentation](https://docs.sudoswap.xyz/reference/property-checkers/) on cloning Property Checkers.

### RangePropertyChecker <a href="#rangepropertychecker" id="rangepropertychecker"></a>

`RangePropertyChecker` checks whether tokenIds passed to the `hasProperties` method lie within a `lowerBound` and `upperBound` specified when the contract was cloned.

For this Property Checker, the optional bytes calldata is not used.

### MerklePropertyChecker <a href="#merklepropertychecker" id="merklepropertychecker"></a>

`MerklePropertyChecker` checks whether tokenIds passed to the `hasProperties` method are leaves in an arbitrary Merkle tree whose root was specified when the contract was cloned.

For this Property Checker, the optional bytes calldata is used by the client to pass a Merkle proof.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.sanko.xyz/sanko-mainnet/sudoswap/sudoswap-overview/property-checking.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
