# The Wildcat Protocol

Private credit, on your terms.

{% hint style="info" %}
**This Gitbook recently underwent substantial changes to incorporate Wildcat V2 details.**\
\
Something you don't understand? Something missing?\
\
Fire a message to @[functi0nZer0](https://x.com/functi0nZer0) on Twitter/X and watch him do Things That Don't Scale!
{% endhint %}

## Hi there.

Welcome to the Wildcat protocol documentation.

We recognise that a protocol Gitbook is - as a rule - read by three distinct categories of people:

* *Potential users and researchers* working out if something is actually useful,
* *Security auditors* working out if something is actually broken, and
* *Lawyers and regulators* working out if something is actually legal.

With that in mind, we'll keep this high-level page brief.

***

## Users/Researchers

You might as well start at the beginning.

{% content-ref url="/pages/lNR0Y4yDm60fdEv5Dhcu" %}
[The Elevator Pitch](/overview/introduction)
{% endcontent-ref %}

***

## Auditors/Developers

Contract deployments, gas profiles etc can be found under the following section:

{% content-ref url="/pages/1uA3K6Jmx1p1itvEXXM6" %}
[Contract Deployments](/technical-overview/contract-deployments)
{% endcontent-ref %}

More specifically, if you're taking part in an audit or validating a potential bug, please refer to:

{% content-ref url="/pages/kpGErH7y6nXZJl1SlRgn" %}
[Security/Developer Dives](/technical-overview/security-developer-dives)
{% endcontent-ref %}

\
If you're interested in reading about our on-chain protection or previous security reviews:

{% content-ref url="/pages/Nh08YeRyiz400MvJPuyX" %}
[SphereX Protection](/security-measures/spherex-protection)
{% endcontent-ref %}

{% content-ref url="/pages/DheHJcS9gZUFqam9s5qd" %}
[Code Security Reviews](/security-measures/code-security-reviews)
{% endcontent-ref %}

***

## Lawyers/Regulators:

{% content-ref url="/pages/x0yhk65f1EIr7hOo5Znl" %}
[Wildcat Terms Of Use](/legal/wildcat-terms-of-use)
{% endcontent-ref %}

{% content-ref url="/pages/o9KbSKLhmwCuhpoGqDay" %}
[Risk Disclosure Statement](/legal/risk-disclosure-statement)
{% endcontent-ref %}

Beyond that, the documentation is yours to enjoy (or not) at your leisure.<br>

Hic sunt dragones.


# The Elevator Pitch

What Wildcat is and why — undercollateralised, fixed-rate credit markets, summarised for borrowers and lenders.

**The core premise of a Wildcat market is simple**: enabling undercollateralised borrowing and lending.

Wildcat is a decentralised protocol designed to enable undercollateralised borrowing and lending. Unlike typical overcollateralised solutions, Wildcat empowers borrowers to shape their loan terms while offering lenders new opportunities to deploy capital in ways they may not have previously considered.

Whether you’re a market maker, investment fund, staking collective, solver, DeFi protocol seeking liquidity, or a lender looking for competitive returns, Wildcat connects both sides of the credit market with greater flexibility and transparency.

## For Borrowers

Wildcat allows borrowers to create customised markets that suit their specific credit needs. You have full control over the loan terms, including:

**Loan Amount and Interest Rates**:

* Define the amount you wish to borrow and the fixed interest rate you’re willing to pay. For example, you could create a market for 4,000,000 USDC at a 15% annual rate, where 25% of any deposits must stay in reserve.

**Redemption Terms:**

* Specify repayment windows and penalty rates. For example, you might offer lenders seven days’ notice for withdrawal requests, with an additional 10% penalty rate if you exceed the repayment deadline.

**Lock-Up Periods:**

* Choose whether lenders can withdraw immediately or after a predetermined lock-up period (e.g., six months). APR reductions are not permitted for fixed-term markets, although options are available to enable early maturity or early market closure.

**Deposit Requirements:**

* Set minimum deposit amounts (e.g., 100,000 USDC) and compliance checks such as on-chain OFAC sanctions screening.

**Transferability of Debt Tokens:**

* Decide whether debt tokens are freely tradable, restricted to approved lenders, or non-transferable.

Wildcat’s on-chain infrastructure simplifies middle and back-office functions, replacing manual processes like OTC negotiations via Telegram. Whether you’re a DAO raising operational funds without selling tokens or a business seeking working capital, Wildcat offers a streamlined, transparent alternative. Additionally, responsible borrowing and lending helps establish a positive on-chain reputation, paving the way for future credit opportunities.

## For Lenders

Wildcat opens up new avenues for deploying capital, giving you direct access to borrowers who may not be available through traditional lending platforms. Key benefits include:

**Direct Counterparty Lending:**

* Lend directly to specific borrowers, enabling more targeted credit exposure.

**Fixed Interest Rates:**

* More predictable returns with fixed rates, reducing uncertainty compared to variable-rate systems.

**Flexible Redemption Options:**

* While borrowers control redemption terms, depending on configuration you can ragequit if interest rates become unattractive or better opportunities arise.

**Collateral Options (Coming Soon):**

* Borrowers will soon have the option to provide additional collateral that can be liquidated on-chain if they fail to maintain required reserves in the face of withdrawal requests.

**Additional Incentives:**

* Borrowers can offer additional token rewards (similar to liquidity mining) to incentivise lending via Masterchef mechanics (we'll make this easy for them to bolt in).

To provide legal clarity, Wildcat offers an open-source Master Loan Agreement designed to align on-chain interactions with traditional credit agreements, and borrowers are free to make use of this for any of their markets.

Wildcat **does not assess borrower creditworthiness or provide insurance against defaults**. Lenders assume full counterparty risk and should evaluate each borrower’s reliability before providing capital.

### Interested?

It's not our place to proscribe what Wildcat *should* and *shouldn't* be used for - tokenised lending instruments have a wide scope, and we've intentionally designed the protocol to be as hands-off as possible.

As a settlement layer, consider the protocol itself to be an Uatu the Watcher figure: we're interested, and we're watching, but it will not and *cannot* interfere.

We're looking forward to seeing how you make use of us!


# Whitepaper

Where to find the Wildcat v2.0 whitepaper, covering the protocol's ideology, design decisions and high-level logic.

The bulk of the ideology, design decisions and high-level logic behind the protocol can be read in the Wildcat whitepaper. It's not highly technical, and intended to be a *fairly* easy read barring some presented examples which you can skip over.

Most of the content is expanded on in this Gitbook, however, so if you've read this site top to bottom you're not going to be missing out by skipping it.<br>

**v2.0 \[Release Date: 21 October 2024]:**

<https://github.com/wildcat-finance/wildcat-whitepaper/blob/main/whitepaper_v2.0.pdf>


# FAQs

Answers to common questions about balances, withdrawals, delinquency, market access, integrations, security and support.

## Withdrawals

### Why isn't all of my withdrawal claimable, and when will I receive the rest?

There are three common reasons:

* The withdrawal cycle has not yet ended.
* The batch has expired but has only been partly funded. The available liquidity is then divided proportionally between the lenders in that batch.
* Liquidity is present, but the relevant market state or unpaid withdrawal batches have not yet been processed.

Depending on the circumstances, anyone may call either `updateState()` or `repayAndProcessUnpaidWithdrawalBatches(0, 10)`. The latter adds no new repayment and attempts to apply liquidity already held by the market to as many as ten unpaid batches.

Wildcat Labs now automates most of this second kind of processing through a sentinel service operated as a courtesy to users. This forms part of what is tentatively called the **Hydra executor**: infrastructure for making the various pokes, calls and invocations which help the protocol provide a smoother user experience. The underlying functions remain public and can still be called manually.

You may claim the amount already available without forfeiting the unfunded remainder. That remainder stays queued until the batch receives further liquidity.

A withdrawal request cannot be cancelled or reversed once it has been queued.

Older expired batches are funded before newer ones. If the market does not hold enough liquidity, the borrower must return further assets before the outstanding amount can become claimable.

In the app:

* **Ongoing** means the withdrawal cycle has not yet ended.
* **Claimable** is the amount presently available to withdraw.
* **Outstanding** is the portion still waiting to be funded.

See [Making withdrawals](/using-wildcat/day-to-day-usage/lenders#making-withdrawals).

***

### Why are my wallet balance, transferable amount and claimable amount different?

They describe different assets or stages of a withdrawal:

* **Wallet balance** is the rebasing market-token balance currently held by the address. It represents the address's unqueued lender position and normally rises as interest accrues.
* **Transferable amount** is the portion of that wallet-held market-token balance which the market's transfer policy permits the address to send. Open markets permit arbitrary recipients, restricted markets require an eligible recipient, and disabled markets permit transfers only back to the market for withdrawal. Transferability does not measure market liquidity.
* **Claimable amount** is underlying asset already allocated to that address's withdrawal batches and presently available to claim. It is determined by the withdrawal cycle and batch funding, not by the address's remaining market-token balance or its ability to transfer those tokens.

Submitting a withdrawal request moves the requested market tokens out of the lender's wallet. As liquidity is assigned, queued market tokens are burned and the corresponding underlying asset becomes claimable. A partly funded batch can therefore have a claimable amount smaller than the amount requested, while any market tokens which were not queued remain a separate rebasing wallet balance.

See [Reading lender balances](/using-wildcat/day-to-day-usage/lenders#reading-lender-balances).

***

### When do withdrawal cycles start and end?

Withdrawal cycles do not begin at a fixed time each day. The first withdrawal request made while no cycle is active starts a new cycle.

Its expiry is calculated using that market's configured withdrawal-batch duration. Later requests made during the same cycle join the existing batch and receive the same expiry.

Once the cycle expires, another cycle does not start automatically. A new one begins when the next eligible withdrawal request is submitted.

***

### Does a requested withdrawal continue earning interest?

No. Tokens placed into a withdrawal batch stop earning interest from the start of that batch's cycle.

The batch records the market's scale factor when the cycle begins. If a lender joins the batch part-way through the cycle, their amount is adjusted back to that starting scale factor. This prevents a later participant from earning interest for part of a period during which the earlier withdrawal requests were already excluded from accrual.

Assets reserved for a processed withdrawal batch do not earn interest and cannot be borrowed again. They remain in the market until claimed.

***

### Can Wildcat bump or prioritise my withdrawal?

No. Wildcat cannot move one lender ahead of another, fund a withdrawal on a borrower's behalf, or submit a transaction from a user's wallet.

Expired batches are funded in chronological order. Within a batch, available liquidity is distributed proportionally between its participating lenders.

You may claim a partly funded amount while the remainder stays queued. The remaining withdrawal cannot be cancelled.

If the borrower has returned liquidity but it has not yet been allocated, anyone may call `repayAndProcessUnpaidWithdrawalBatches(0, 10)`. Wildcat Labs now automates most of these calls through its sentinel service, as part of the tentative Hydra executor, but the function remains public.

If the market state itself is stale, anyone may call `updateState()`.

If there is genuinely insufficient liquidity in the market, the borrower must return more assets before the outstanding withdrawal can be funded.

***

### How do I ping a market?

"Ping" is informal and context-dependent.

In discussions about bringing a market's accounting up to date, it usually means calling `updateState()`. This updates the market's state without requiring a deposit, repayment or withdrawal.

In discussions about pending or outstanding withdrawals, "ping" has generally meant calling:

```solidity
repayAndProcessUnpaidWithdrawalBatches(0, 10)
```

The first argument adds no repayment. The second asks the market to process up to ten unpaid withdrawal batches using whatever liquidity is already available. That liquidity is applied to expired batches in first-in, first-out order.

Wildcat Labs now automates most of this withdrawal-processing work through a sentinel service run as a courtesy to users. It forms part of the tentative Hydra executor, which performs the various pokes, calls and invocations needed across protocol markets to provide a smoother user experience.

Both functions remain public and may still be called manually:

* [`updateState()`](https://github.com/wildcat-finance/v2-protocol/blob/c7be4039f8f383a9dda4e45f63331c17d63f9ed9/src/market/WildcatMarket.sol#L26-L30)
* [`repayAndProcessUnpaidWithdrawalBatches()`](https://github.com/wildcat-finance/v2-protocol/blob/c7be4039f8f383a9dda4e45f63331c17d63f9ed9/src/market/WildcatMarketWithdrawals.sol#L279-L312)

***

## Interest, debt and market health

### Does the borrower pay interest on all deposits or only the amount borrowed?

Interest accrues against the market's outstanding lender supply, not merely the amount transferred out by the borrower.

If lenders deposit 4 million units and the borrower draws 3 million, interest still accrues on the 4 million represented by the outstanding market-token supply.

That supply falls as market tokens are burned through withdrawals. Once a closed market has been fully repaid and no lender supply remains, further interest no longer accrues.

***

### Why is a market marked delinquent or pending?

A market becomes delinquent when its available liquidity falls below its required liquidity.

That requirement may include:

* The liquidity demanded by the market's reserve ratio.
* Amounts needed for pending or processed withdrawals.
* Accrued protocol fees.

A market can therefore become delinquent because of withdrawals, accrued interest or fees even if the borrower has not made a new transfer.

The market first enters its configured grace period. Penalty interest applies only after the cumulative delinquency timer exceeds that grace period.

For a particular market, check its live reserve shortfall, grace period and delinquency time. The status alone does not establish why the shortfall occurred.

***

### What does delinquency change while my withdrawal is queued?

Delinquency, withdrawal interest, batch payment and claim timing are separate:

* **Interest:** the amount placed into the withdrawal batch stops earning interest from the start of that batch's cycle. Any market tokens which remain in the lender's wallet continue to rebase normally. Penalty APR applies to the market's outstanding lender supply after the grace threshold; it does not turn a queued withdrawal back into an interest-bearing wallet balance.
* **Payment and liquidity:** delinquency means the market holds less than its required liquidity. Pending withdrawals are part of that obligation, and new liquidity is applied to older expired batches before newer ones. Delinquency does not cancel or reprioritise the request.
* **Claim timing:** the configured cycle expiry does not move merely because the market is delinquent. Expiry makes the batch eligible for settlement, but only its funded portion is claimable. Any unfunded remainder stays queued until more liquidity is supplied and processed.

See [Delinquency and queued withdrawals](/using-wildcat/delinquency#what-delinquency-changes-for-a-queued-withdrawal).

***

### What should a borrower check regularly?

The protocol does not prescribe a daily operational ritual, but borrowers should monitor:

* Market reserves and available liquidity.
* Delinquency status, grace periods and penalty exposure.
* Ongoing, expired and unpaid withdrawal batches.
* Upcoming withdrawal expiries.
* Outstanding debt, accrued interest and protocol fees.
* Recent market events.
* The borrower wallet's underlying-asset balance and transaction readiness.

The [Telegram notification bot](/using-wildcat/telegram-notification-bot) can help surface relevant market events. It does not replace the borrower's own monitoring or any obligations contained in a market's legal agreement.

***

## Deposits and access

### I deposited but did not receive market tokens. Is the deposit delayed?

A successful deposit mints market tokens in the same transaction. There is no separate settlement period.

First confirm that both the token approval and the deposit transaction succeeded. The deposit transaction should emit a `Deposit` event.

If the deposit failed, check:

* The selected network.
* The underlying-token balance.
* The approved allowance.
* The market's remaining capacity.
* Its minimum-deposit setting.
* Whether the wallet has the required market credential.
* Any applicable market terms or Master Loan Agreement requirements.

When requesting support, provide the market address, wallet type, network, transaction hash and exact error message. Never provide a seed phrase or private key.

***

### Why does a market have a minimum deposit?

A minimum deposit is an optional, borrower-configured floor applied to each deposit transaction.

It still applies when a lender already has a larger position. It is not merely a minimum account balance.

There is no protocol-wide formula for choosing the value. A borrower may set it according to the market's capacity, asset, lender profile or operational requirements.

The default is zero, and the borrower can update it. A borrower may also set the minimum above the market's available capacity to prevent new deposits without changing the market's stated maximum capacity.

***

### How do I access the app or qualify to lend in a market?

Open [app.wildcat.finance](https://app.wildcat.finance), connect a supported wallet and accept the applicable terms.

Access is determined separately for each market under the borrower's chosen access-control policy. Depending on the market, this may involve:

* Self-service credential creation.
* Direct borrower approval.
* Verification through an external provider.
* Sanctions screening.

Check the market and borrower profile for its stated process. Wildcat cannot broker access, override the borrower's policy or transfer approval from one market to another.

See [Onboarding](/using-wildcat/onboarding) and the [Lender guide](/using-wildcat/day-to-day-usage/lenders).

***

### If my wallet satisfies one role provider but not another, may it deposit?

Under Wildcat's shipped `AccessControlHooks`, approved role providers are alternative sources of a deposit credential, not a checklist which every lender must satisfy. One valid, unexpired credential from any provider still approved by the hook instance is sufficient for the access check. A failed check against one provider does not override a valid credential from another.

The market's hook instance makes the final on-chain access decision; a role provider only supplies or validates evidence. To determine access for a particular wallet, the evidence must identify the market and wallet and show:

* which hook instance and access-control template the market uses;
* whether the provider is currently approved and whether its credential has expired under that provider's configured time-to-live;
* any stored credential, pull-provider result, or transaction-supplied proof required by that provider; and
* whether the wallet has been explicitly blocked from deposits.

Some evidence may exist only in provider-specific data supplied with the deposit transaction or in an external verification system. Without it, public market configuration alone cannot prove that the wallet will pass. A custom hook may also implement different rules, so the alternative-provider behaviour must not be assumed outside the shipped `AccessControlHooks` template.

Passing the access hook does not guarantee that a deposit will succeed: balance, allowance, capacity and minimum-deposit checks still apply.

See [How multiple role providers are evaluated](/using-wildcat/day-to-day-usage/market-access-via-policies-hooks#how-multiple-role-providers-are-evaluated).

***

### We applied to become a borrower and have not heard back. Who should we contact?

Reply through the channel used for the original application or contact <contact@thewildcat.foundation>.

Include the company name, approximate application date, email address used and the appropriate contact person. Do not send identity documents through Telegram or an unsolicited direct message.

See [Onboarding](/using-wildcat/onboarding) for the current process.

***

### Fireblocks is rejecting my deposit transaction. What should I do?

This is usually caused by a Transaction Authorization Policy (TAP) rule which blocks interactions with DeFi contracts.

Add a Contract Call TAP rule which allows the Wildcat market address you are trying to use, then place that rule above any generic blocking rules. Fireblocks documents the process in its [TAP examples](https://support.fireblocks.io/hc/en-us/articles/7361651981468-TAP-examples) guide, which requires a Fireblocks account.

***

## Data and integrations

### Can I read APR, capacity and debt programmatically?

Yes. The market contracts expose the principal values directly, including:

* `annualInterestBips()` for the base annual lender interest rate. One hundred basis points equals 1%.
* `maximumDeposit()` for the market's configured maximum deposit.
* `totalDebts()` for the market's current total debt.
* `currentState()` for a consolidated view of current market state.
* `balanceOf(account)` for a lender's current market-token balance.
* `getAccountWithdrawalStatus(account)` for the account's withdrawal status.

`annualInterestBips()` is the base lender APR. It should not be treated as including penalty interest or the protocol fee.

For batched and consolidated reads, use **`MarketLensV2`**.

Contract addresses are listed under [Contract deployments](/technical-overview/contract-deployments).

***

### How can I enumerate Wildcat markets?

Use the network's `ArchController`.

It exposes the registered-market count and paginated access to registered market addresses through `getRegisteredMarkets(...)`.

Registration does not necessarily mean that a market remains open for deposits. Consumers should also inspect each market's current state and filter closed markets where appropriate.

If the integration needs to group markets by hooks implementation, it can additionally query the relevant hooks factory for deployed instances or templates.

Addresses and results are network-specific. Do not combine registries from different chains without labelling them.

***

### How do I track my original deposits, current balance and loan history?

A lender's current market-token balance is rebasing. It represents the lender's present claim on the market's underlying assets, rather than a static record of the amount originally deposited.

Use the app's **Market History**, together with block-explorer records, to review deposits, transfers, withdrawal requests and claims.

Subtracting one balance snapshot from another is not a reliable substitute for transaction history. Balances may be affected by:

* Further deposits.
* Interest accrual.
* Transfers.
* Withdrawal requests.
* Partial funding and claims.
* Rounding.

For accounting purposes, reconstruct the position from events and transactions rather than relying on balance differences alone.

***

### Can I export annual borrowing, repayment and interest figures as CSV?

Yes. Download the [Wildcat Market CSV Exporter Claude skill](/using-wildcat/wildcat-market-csv-exporter). The Wildcat app itself does not currently produce a one-click CSV or PDF with annual borrowing, repayment and interest figures.

You can reconstruct the activity from the app's Market History, contract events, block-explorer transactions and indexed protocol data.

Give the skill a market address and it builds a verified transaction ledger, a complete decoded event history and a separate quarantine file for unrelated or potentially malicious token transfers.

Once those files exist, we have found that either Fable or Sol can derive follow-up reports, including annual borrowing, repayment and interest figures, without much fuss.

The exports are raw protocol records, not certified financial or tax reports. You may still need an accountant or another suitable provider to review anything used for formal reporting.

***

## Security

### Have all audit findings been resolved?

It would not be accurate to describe every published finding simply as "fixed".

The 2024 Code4rena review reported one high-severity and eight medium-severity findings. Wildcat then completed remediation work and two mitigation reviews.

Some findings were fixed through code changes. Others were accepted as design trade-offs or documented as intentional behaviour. The status depends on the finding.

See:

* The [Code4rena audit report](https://code4rena.com/reports/2024-08-wildcat).
* [Code security reviews](/security-measures/code-security-reviews).
* [Known issues](/technical-overview/security-developer-dives/known-issues).

An audit is scoped to particular code and a particular point in time. It should not be read as a guarantee that the protocol is free of risk.

***

## Contact and announcements

### Who should I contact about a partnership, listing or integration?

Use the appropriate channel in the [Wildcat Telegram community](https://t.me/+ewyCAZOA5_Y2Zjg0). This allows the team to route the enquiry to the right people without relying on unsolicited direct messages.

Borrower-onboarding or Foundation matters may instead be sent to <contact@thewildcat.foundation>.

Be wary of anyone who contacts you privately first while claiming to represent Wildcat. Where possible, confirm the person and conversation through a public community channel.

***

### Is there a Discord, and where should I ask for support?

Wildcat does not presently list an official public Discord.

For support, use the appropriate channel in the [Wildcat Telegram community](https://t.me/+ewyCAZOA5_Y2Zjg0). Foundation, onboarding or compliance enquiries may be sent through the relevant email channel.

The [Wildcat notification bot](https://t.me/wildcat_notifications_bot) is an automated notification service, not a support account.

Wildcat does not solicit users through purported Discord moderators. Treat unexpected direct messages, support offers and wallet links with suspicion.

***

### Are you hiring, and can I DM someone about a role?

Treat a role as genuine only if Wildcat has published it through an official channel.

Community administrators and support contributors cannot confirm unpublished or private recruitment exercises. Do not rely on unsolicited direct messages claiming to offer work.

If you have a relevant enquiry which does not correspond to a published vacancy, use the appropriate channel in the [Wildcat Telegram community](https://t.me/+ewyCAZOA5_Y2Zjg0).

Never pay an application fee, connect a wallet or sign a transaction as part of a recruitment process.

***

## Troubleshooting

### I have a Safe multisig. How do I connect it?

Open the [Safe](https://app.safe.global/) interface and add Wildcat as a [Custom App](https://help.safe.global/en/articles/40859-add-a-custom-safe-app).

Use `https://app.wildcat.finance` for the mainnet app or `https://testnet.wildcat.finance` when using Sepolia.

***

### The site is down or will not load. What should I do?

First confirm that you are using [app.wildcat.finance](https://app.wildcat.finance).

Record:

* Browser and version.
* Network and market.
* Whether the wallet connects successfully.
* Wallet type.
* The affected page.
* The exact error message.
* Whether the issue persists in a private window or with non-wallet extensions disabled.

Try a hard refresh and reconnect the wallet.

If a transaction appeared to fail, check its hash on the relevant block explorer before submitting it again.

Report the problem in the appropriate channel in the [Wildcat Telegram community](https://t.me/+ewyCAZOA5_Y2Zjg0). Include the diagnostic information above, but never share a seed phrase, private key or other secret.


# For AI Agents & LLMs

How to consume the Wildcat docs as an AI agent — Markdown endpoints, llms.txt, the ?ask API, and the Wildcat skill.

This documentation is built to be machine-readable. If you're an AI agent — or building one — here's how to consume it efficiently.

## Markdown and indexes

* [**/llms.txt**](https://docs.wildcat.finance/llms.txt) — a curated, sectioned index of the entire documentation, with a short description of every page. Start here to navigate.
* [**/llms-full.txt**](https://docs.wildcat.finance/llms-full.txt) — the full text of the documentation concatenated into a single file, for wholesale ingestion.
* **Markdown for any page** — append `.md` to any page URL to get clean Markdown without site chrome (for example, [terminology.md](/using-wildcat/terminology)).

## Ask the docs a question

Appending `?ask=` to a page URL opens the documentation assistant with your question pre-filled:

```
https://docs.wildcat.finance/using-wildcat/terminology?ask=How does a withdrawal cycle work?
```

**This is a browser feature, not an API.** The parameter is handled client-side, so a plain `GET` returns the same HTML as the page without it, and appending `?ask=` to a `.md` endpoint returns 404. If you are an agent fetching over HTTP rather than driving a browser, use the Markdown endpoints and indexes above instead.

## The Wildcat skill

For agents that need a single, self-contained briefing on the protocol — concepts and terminology, borrower and lender workflows, contract internals and addresses, and security/legal pointers — load the Wildcat skill (`SKILL.md`) maintained in the documentation repository under `skills/wildcat-protocol/`.

## Where to start

* New to Wildcat? Read [The Elevator Pitch](/overview/introduction), then [Terminology](/using-wildcat/terminology).
* Using the protocol? See [Borrowers](/using-wildcat/day-to-day-usage/borrowers) and [Lenders](/using-wildcat/day-to-day-usage/lenders).
* Auditing or integrating? See [Security/Developer Dives](/technical-overview/security-developer-dives) and [Contract Deployments](/technical-overview/contract-deployments).


# Terminology

It's dangerous to go alone - learn these.

#### **Archcontroller**

* Smart contract which doubles up as a registry and permission gate. [Borrowers](#borrower) are added or removed from the archcontroller by the operators of the protocol itself (granting/rescinding the ability to deploy [hooks](#hook) and/or [markets](#market)), and the addresses of any factories, hooks instances or markets that get deployed through the protocol are stored here.

#### **Base APR**

* The interest rate that lenders receive on [assets](#underlying-asset) that they have deposited into a particular [market](#market), in the absence of the [penalty APR](#penalty-apr) being enforced.

#### **Borrow**

* To withdraw [assets](#underlying-asset) from a [market](#market) that has a non-zero [supply](#supply) and [reserve ratio](#reserve-ratio) less than 100%, with the intent of repaying the assets (plus any accrued interest) to the market either when the required purpose of using the assets has concluded or as a response to [withdrawal requests](#withdrawal-request).

#### **Borrower**

* Both:
  * The counterparty that wishes to make use of a credit facility through a Wildcat [market](#market), and
  * The blockchain address that defines the parameters of a market and deploys the [hook instances](#hooks-instance) and market contracts that use them.

#### **Capacity**

* Parameter required of [borrower](#borrower) when creating a new [market](#market).
* The `maxTotalSupply` field in the state.
* The *maximum* amount of an asset that a borrower is looking to source via a market - the threshold for `totalSupply` after which the market will stop accepting [deposits](#deposit).
* Can be exceeded by the market's `totalSupply` due to interest accrual.

#### **Claim**

* Removing [assets](#underlying-asset) from the [unclaimed withdrawals pool](#unclaimed-withdrawals-pool) that were requested for withdrawal by a [lender](#lender).
* Can only occur after a [withdrawal cycle](#withdrawal-cycle) expires.
* Note that retrieving your [deposits](#deposit) from a Wildcat market requires a [withdrawal request](#withdrawal-request) and *then* a claim - it is a two transaction process with the conclusion of one withdrawal cycle in between.

#### Collateral Obligation

* The minimum amount of [assets](#underlying-asset) that the borrower is obligated to keep in the market in order to avoid [delinquency](#delinquency).
* The sum of:
  * The [reserves](#required-reserves) needed to meet the [reserve ratio](#reserve-ratio) for the [outstanding supply](#outstanding-supply),
  * The market's [unclaimed withdrawals pool](#unclaimed-withdrawals-pool),
  * The normalized value of the market's [pending](#pending-withdrawal) and [expired](#expired-withdrawal) withdrawals, and
  * The unclaimed [protocol fees](#protocol-apr).

#### **Delinquency**

* A [market](#market) state wherein there are insufficient [assets](#underlying-asset) in the market to meet the market's [collateral obligations](#collateral-obligation).
* Arises via the passage of time through interest if the borrower borrows right up to their reserve ratio.
* Can also arise if a [lender](#lender) makes a [withdrawal request](#withdrawal-request) that exceeds the market's available liquidity.
* A market being delinquent for an extended period of time (as specified by the [grace period](#grace-period)) results in the [penalty APR](#penalty-apr) being enforced in addition to the [base APR](#base-apr) and any [protocol APR](#protocol-apr) that may apply.
* 'Cured' by the borrower [depositing](#deposit) sufficient assets into the market as to reattain the required collateral obligation.

#### **Deposit**

* Both:
  * The act of sending [assets](#underlying-asset) as a [lender](#lender) to a [market](#market) for the purposes of being [borrowed](#borrow) by the [borrower](#borrower),
  * The act of sending assets as a borrower to a market for the purposes of being [withdrawn](#withdrawal-request) by lenders,
  * A term for the lenders' assets themselves once in a market.

#### Deposit Credential

* Permission granted to a [lender](#lender) through a [role provider](#role-provider) in order to [deposit](#deposit) into a [market](#market).
* The set of requirements for receiving a deposit credential from a given role provider are arbitrary, determined by the [borrower](#borrower) according to their needs.
* May be associated with a TTL (Time-To-Live) configured by the borrower, after which the deposit credential expires and a new one must be acquired from a role provider in order to make any further deposits.
* Depositing into a market while holding a valid deposit credential (or receiving [market tokens](#market-token) while in possession of one) marks lender as a [known lender](#known-lender).

#### **Escrow Contract**

* An auxiliary smart contract that is deployed in the event that the [sentinel](#sentinel) detects that a [lender](#lender) address has been added to a sanctioned list such as the OFAC SDN: this check is performed through the [**Chainalysis oracle**](https://go.chainalysis.com/chainalysis-oracle-docs.html).
* Used to transfer the debt (for the [lender](#lender)) and obligation to repay (for the [borrower](#borrower)) away from the [market](#market) contract to avoid wider contamination through interaction. Interest ceases to accrue upon creation and transfer.
* Any [assets](#underlying-asset) relating to an attempted claim by the affected lender as well as any market tokens tied to their remaining [deposit](#deposit) are automatically transferred to the escrow contract when blocked (either through an attempt to withdraw or via a call to a 'nuke from orbit' function found within the market).
* Assets can only be released to the lender in the event that a) they are no longer tagged as sanctioned by the Chainalysis oracle, or b) the borrower specifically overrides the sanction.

#### Expired Withdrawal

* A [withdrawal request](#withdrawal-request) that could not be fully honoured by [assets](#underlying-asset) in the [unclaimed withdrawals pool](#unclaimed-withdrawals-pool) within a single [withdrawal cycle](#withdrawal-cycle).

#### Fixed Term

* Parameter configured by a [borrower](#borrower) when creating a new [market](#market).
* Determines the length of time after market deployment in which [withdrawal requests](#withdrawal-request) and reductions in [base APR](#base-apr) will be rejected by the market.
* After this time has elapsed, the market converts into an '*open term*' market where the above are permitted. Once a market has converted to open term, it cannot be moved back into a fixed term.
* Default value is zero (immediately open term).
* Associated with two distinct market configuration flags that allow a borrower to either prematurely close a market or bring the maturity/conversion time closer to the present.
* Cannot be extended once a market is deployed.

#### **Force Buyback**

* Permission toggled by a [borrower](#borrower) when creating a new [market](#market).
* If enabled, permits the borrower to purchase [market tokens](#market-token) directly from a [lender](#lender), subverting the market by swapping the market tokens for an equivalent amount of [underlying assets](#underlying-asset) sourced from the borrower.
* Cannot be used if a market is [delinquent](#delinquency) or currently in a [fixed term](#fixed-term) state.
* If performed for the first time on a market, marks the borrower as a [known lender](#known-lender).
* Immediately forces the market tokens into a [withdrawal request](#withdrawal-request) on behalf of the borrower.
* Can be permanently disabled for a market at the borrower's discretion.
* **Note**: if a market has both force buyback enabled *and* open [token transferability](#token-transferability), a borrower is capable of force rebuying market tokens from LP contracts that hold market tokens such as Uniswap or Curve pools. Despite there being a warranty in the (optional) template Master Loan Agreement related to this point, the potential for substantial damage exists here.

#### **Grace Period**

* Parameter required of [borrower](#borrower) when creating a new [market](#market).
* Rolling period of time for which a market can be [delinquent](#delinquency) before the [penalty APR](#penalty-apr) of the market activates.
* Note that the grace period does not 'reset' to zero when delinquency is cured. See [grace tracker](#grace-tracker) below for details.

#### **Grace Tracker**

* Internal [market](#market) parameter associated with the [grace period](#grace-period).
* `timeDelinquent` in the market state.
* Once a market becomes [delinquent](#delinquency), begins counting seconds up from zero - when the value of the grace tracker exceeds the grace period, the [penalty APR](#penalty-apr) activates.
* Once a market is cured of delinquency, begins counting seconds down to zero - the penalty APR continues to apply *until the grace tracker value is below the grace period value*.
* Enforces the rolling nature of the grace period.

#### **Hook**

* A function on a [hook instance](#hook-instance) which is executed when a particular action occurs on a [market](#market).
* Corresponds to a specific market action, such as the `onCloseMarket` hook which is called when `closeMarket` is called on a market during termination.

#### **Hook Instance**

* Contract that defines the [hook functions](#hook) for a market.
* Deployed by an approved borrower as an instance of a particular [hooks template](#hooks-template).
* Configured in the market parameters at market deployment.

#### **Hooks Template**

* A base contract defining behaviour for a kind of [hook contract](#hook-instance) approved by factory operators.
* Copied when borrowers deploy hook instances.

#### **Known Lender**

* A state marked within the [market](#market) contracts for any [lender](#lender) that either [deposited](#deposit) [assets](#underlying-asset) into a market or received [market tokens](#market-token) while holding a valid [deposit credential](#deposit-credential).
* Any known lender is always capable of making a [withdrawal request](#withdrawal-request) unless i) the market is in a [fixed term](#fixed-term) or ii) the known lender is marked as sanctioned by the [sentinel](#sentinel).

#### **Lender**

* Both:
  * A counterparty that wishes to provide a credit facility through a Wildcat [market](#market), and
  * The blockchain address associated with that counterparty which [deposits](#deposit) [assets](#underlying-asset) to a market for the purposes of being [borrowed](#borrow) by the [borrower](#borrower).

#### Liquid Reserves

* The amount of [underlying assets](#underlying-asset) currently counting towards the [market](#market)'s [required reserves](#required-reserves).
* Comprises the liquidity that can be made available for new [withdrawals](#withdrawal-request).
* Is equal to the total assets in the market minus the [unclaimed withdrawals](#unclaimed-withdrawals-pool), [pending withdrawals](#pending-withdrawal), [expired withdrawals](#expired-withdrawal) and accrued [protocol fees](#protocol-apr).

#### **Market**

* Smart contract that accepts [underlying assets](#underlying-asset), issuing [market tokens](#market-token) in return.
* Deployed by [borrower](#borrower) through the factory.
* Holds assets in escrow pending either being [borrowed](#borrow) by the borrower or [withdrawn](#withdrawal-request) by a [lender](#lender).
* Permissioned: only lenders that have been obtained a credential authorising them to deposit (either through explicit whitelisting or another access provider via hooks) can interact.

#### **Market Token**

* ERC-20 token indicating a [claim](#claim) on the [underlying assets](#underlying-asset) in a [market](#market).
* Issued to [lenders](#lender) after a [deposit](#deposit).
* [Supply](#supply) rebases after every non-static call to the market contract depending on the total current APR of the market.
* Can only be redeemed by authorised lender addresses (not necessarily the same one that received the market tokens initially).
* Name and symbol prefixes are customisable in market creation, prepending to the name and symbol of the underlying asset.

#### Minimum Deposit

* Parameter required of [borrower](#borrower) when creating a new [market](#market).
* Determines the amount of [assets](#underlying-asset) below which any attempts by a [lender](#lender) to [deposit](#deposit) in a single transaction will be rejected.
* Defaults to zero, can be configured after launch by the borrower.

#### Outstanding Supply

* The amount of [market tokens](#market-token) not currently queued for [withdrawal](#withdrawal-request).
* Equal to the market's [supply](#supply) minus its [pending](#pending-withdrawal) and [expired](#expired-withdrawal) withdrawals.

#### **Penalty APR**

* Parameter required of [borrower](#borrower) when creating a new [market](#market).
* Additional interest rate (above and beyond the [base APR](#base-apr) and any [protocol APR](#protocol-apr)) that is applied for as long as the [grace tracker](#grace-tracker) value for a market is in excess of the specified [grace period](#grace-period).
* Encourages borrower to responsibly monitor the [reserve ratio](#reserve-ratio) of a market.
* No part of the penalty APR is receivable by the Wildcat protocol itself (does not inflate the protocol APR if present).

#### Pending (State)

* An alias for [delinquency](#delinquency) that is used on the frontend while a [market](#market) has insufficient [reserves](#required-reserves).
* It was observed that several lenders expressed concern about the loaded meaning of the word 'delinquent' (which is purely technical within the protocol itself).
* As a result, 'Pending' is used on the frontend to emphasise that this state does not *necessarily* imply a failure on the part of the borrower: typically delinquency is fallen into as soon as a large withdrawal request is made, and remains until repayments are made.
* A market that is pending/delinquent for longer than the specified grace period subsequently enters the Penalty state, where the [Penalty APR](#penalty-apr) applies.

#### **Pending Withdrawal**

* A [withdrawal request](#withdrawal-request) that has not yet [expired](#expired-withdrawal) (i.e. was created in the current [withdrawal cycle](broken://pages/IF6qqH7G7vY6VkIWtcOj#processunpaidwithdrawalbatch)).

#### Policy

* Another term for a [hook instance](#hook-instance).

#### Protocol APR

* Percentage of [base APR](#base-apr) that accrues to the Wildcat protocol itself.
* Parameter configured by the factory operator for each [hooks template](#hooks-template), applying to all [markets](#market) deployed with an instance of said template.
* Can be zero.
* Does not increase in the presence of an active [penalty APR](#penalty-apr) (which only increases the APR accruing to [lenders](#lender)).
* Example: market with base APR of 10% and protocol APR of 20% results in borrower paying 12% when penalty APR is not active.

#### Required Reserves

* Amount of [underlying assets](#underlying-asset) that must be made available for new withdrawals according to the configured [reserve ratio](#reserve-ratio).
* Equal to the reserve ratio times the [outstanding supply](#outstanding-supply).

#### **Reserve Ratio**

* Parameter required of [borrower](#borrower) when creating a new [market](#market).
* Percentage of current [outstanding supply](#outstanding-supply) that must be kept in the market (but still accrue interest).
* Intended to provide a liquid buffer for [lenders](#lender) to make [withdrawal requests](#withdrawal-request) against, partially 'collateralising' the credit facility through lenders' deposits.
* Increases temporarily when a borrower reduces the [base APR](#base-apr) of a [market](#market) (fixed-term increase).
* A market which has insufficient assets in the market to meet the reserve ratio is said to be [delinquent](#delinquency), with the [penalty APR](#penalty-apr) potentially being enforced if the delinquency is not cured before the [grace tracker](#grace-tracker) value exceeds that of the [grace period](#grace-period) for that particular market.

#### Role Provider

* A smart contract registered to an access [hook instance](#hook-instance) for a [market](#market) which grants [deposit credentials](#deposit-credential) to would-be [lenders](#lender) according to a specific set of requirements (i.e. lender has a Coinbase Verification, and/or lender is not marked as sanctioned by the Chainalysis oracle).
* Two variants: 'pull' providers which are contracts that can be queried by wallet address to determine suitability, or 'push' providers that explicitly tell the market *which* addresses are suitable.
* Deployed by the [borrower](#borrower) (either from a template or constructed themselves).
* Can be arbitrarily added and removed to a market after deployment by the borrower.
* **Note:** the removal of all role providers from a hook instance for a market means that no more deposit credentials can be granted. However, all [known lenders](#known-lender) will always be able to make [withdrawal requests](#withdrawal-request) provided the market is not in a [fixed term](#fixed-term) and they are not sanctioned.

#### **Sentinel**

* Smart contract that ensures that addresses which interact with the protocol are not flagged by the [**Chainalysis oracle**](https://go.chainalysis.com/chainalysis-oracle-docs.html) for sanctions.
* Can deploy escrow contracts to excise a [lender](#lender) flagged by the oracle from a wider [market](#market).
* Facilitates the deployment of [escrow contracts](#escrow-contract).

#### **Supply**

* Current amount of [underlying asset](#underlying-asset) [deposited](#deposit) in a [market](#market).
* Tied 1:1 with the supply of [market tokens](#market-token) (rate of growth APR dependent).
* Can only be reduced by burning market tokens as part of a [withdrawal request](#withdrawal-request) or [claim](#claim).
* [Reserve ratios](#reserve-ratio) are enforced against the supply of a market, *not* its [capacity](#capacity).
* Capacity can be reduced below current supply by a [borrower](#borrower), but this only prevents the further deposit of assets until the supply is once again below capacity.

#### Token Transferability

* Parameter required of [borrower](#borrower) when creating a new [market](#market).
* Determines whether [market tokens](#market-token) can be transferred from their holders to arbitrary wallets.
* Three configurations options (default is Open):
  * **Open**: market tokens can be transferred anywhere at any time.
  * **Restricted**: market tokens can only be transferred to either [known lenders](#known-lender) or addresses holding a valid (unexpired) [deposit credential](#deposit-credential).
  * **Disabled**: market tokens can only be sent back to the market as part of a [withdrawal request](#withdrawal-request).

#### **Unclaimed Withdrawals Pool**

* A sequestered pool of [underlying assets](#underlying-asset) which are pending their [claim](#claim) by [lenders](#lender) following a [withdrawal request](#withdrawal-request).
* Assets are moved from market reserves to the unclaimed withdrawals pool by burning [market tokens](#market-token) at a 1:1 ratio (reducing the [supply](#supply) of the market).
* Assets within the unclaimed withdrawals pool do not accrue interest, but similarly cannot be [borrowed](#borrow) by the [borrower](#borrower) - they are considered out of reach.

#### **Underlying Asset**

* Parameter required of [borrower](/using-wildcat/onboarding#borrowers) when creating a new [market](#market).
* The asset which the borrower is seeking to [borrow](#borrow) by deploying a market - for example DAI (Dai Stablecoin) or WETH (Wrapped Ether).
* Can be *any* ERC-20 token (however, rebasing tokens break the underlying interest model).

#### **Withdrawal Cycle**

* Parameter required of [borrower](#borrower) when creating a new [market](#market).
* Period of time that must elapse between the first [withdrawal request](#withdrawal-request) of a 'wave' of withdrawals and [assets](#underlying-asset) in the [unclaimed withdrawals pool](#unclaimed-withdrawals-pool) being made available to [claim](#claim).
* Withdrawal cycles do not work on a rolling basis - at the end of one withdrawal cycle, the next cycle will not start until the next withdrawal request.
* In the event that the amount being claimed in the same cycle across all lenders is in excess of the reserves currently within a market, all [lenders](#lender) requests within that cycle will be honoured *pro rata* depending on overall amount requested.
* Intended to prevent a run on a given market (mass withdrawal requests) leading to slower lenders receiving nothing.
* Can have a value of zero, in which case each withdrawal request is processed - and potentially added to the [withdrawal queue](#withdrawal-queue) - as a standalone batch.

#### **Withdrawal Queue**

* Internal data structure of a [market](#market).
* All [withdrawal requests](#withdrawal-request) that could not be fully honoured at the end of their [withdrawal cycle](#withdrawal-cycle) are batched together, marked as [expired](#expired-withdrawal) and added to the withdrawal queue.
* Tracks the order and amounts of [lender](#lender) [claims](#claim).
* FIFO (First-In-First-Out): when [assets](/using-wildcat/day-to-day-usage/lenders) are returned to a market which has a non-zero withdrawal queue, assets are immediately routed to the [unclaimed withdrawals pool](#unclaimed-withdrawals-pool) and can subsequently be claimed by lenders with the oldest expired withdrawals first.

#### Withdrawal Request

* An instruction to a [market](#market) to transfer reserves within a market to the [unclaimed withdrawals pool](#unclaimed-withdrawals-pool), to be [claimed](#claim) at the end of a [withdrawal cycle](#withdrawal-cycle).
* A withdrawal request made of a market with non-zero reserves will burn as many [market tokens](#market-token) as possible 1:1 to fully honour the request.
* Any amount requested - whether or not it is in excess of the market reserves - is marked as a [pending withdrawal](#pending-withdrawal), either to be fully honoured at the end of the cycle, or marked as [expired](#expired-withdrawal) and added to the [withdrawal queue](#withdrawal-queue), depending on the actions of the [borrower](#borrower) during the cycle.


# Onboarding

How to make use of the Wildcat protocol.

Wildcat is a permissioned protocol where both borrowers and lenders must meet specific criteria to participate. The onboarding process and permissions differ for each role, as outlined below.

## Borrowers

Borrowers interested in using Wildcat are encouraged to contact the Wildcat Foundation through the [landing page](https://wildcat.finance) or by emailing <contact@thewildcat.foundation>.

#### Eligibility:

Currently, only registered legal entities are accepted as borrowers. In the future, individual retail borrowers may be allowed.

#### Verification Process:

The Wildcat Foundation performs a KYB/C verification similar to centralised exchanges. This includes verifying certificates of incumbency, proofs of address, and the identities of directors and individuals with significant control. After verification, borrowers provide an Ethereum address that is registered on-chain via the [**archcontroller**](/using-wildcat/terminology#archcontroller)**,** enabling them to deploy hooks instances and create markets.

#### Permissions:

Borrowers have the authority to determine which categories of lenders can interact with their markets.

## Lenders

Wildcat does not directly onboard lenders; instead, each borrower sets their own criteria for lender participation.

#### Onboarding Process:

The process to obtain lending credentials varies depending on the borrower’s [policies](/using-wildcat/terminology#policy). Examples include:

* Confirming the lender is not subject to sanctions.
* Requiring explicit whitelist approval from the borrower.
* Verifying jurisdiction and accreditation through a third-party KYC/B check.
* Accepting credentials like [Coinbase Verification](https://www.coinbase.com/en-gb/onchain-verify) or [Binance Account Bound Tokens](https://www.binance.com/en-GB/babt) (with future hook integrations planned).

#### Access and Credentials:

* Lenders obtain deposit credentials through market hook instances, which act as gatekeepers.
* Credentials are typically issued without needing direct contact with the borrower, though that option remains available.
* Credentials may expire and need periodic renewal.
* Addresses that have previously deposited assets or received market tokens with a valid deposit credential can still make withdrawal requests even if the credential has expired.
* For security, lenders should use a hardware wallet or multisig when interacting with Wildcat.

#### Compliance and Restrictions

Wildcat does not dictate borrower requirements for lender onboarding. Each borrower is responsible for compliance based on their location, risk tolerance, and objectives.

Borrower profile pages on the protocol UI provide contact information (email, Telegram, Twitter), and each market displays its credential requirements.

Addresses flagged as sanctioned by the [Chainalysis oracle contract](https://go.chainalysis.com/chainalysis-oracle-docs.html) are automatically blocked from interacting with the protocol.


# How borrowers are onboarded

## How Borrowers Are Onboarded

Every borrower on Wildcat is a real, registered legal entity that has passed an automated KYB check (legal existence, ownership, control, and AML/sanctions screening) using Sumsub and has had their Ethereum address written on-chain before they can deploy a single market. This page walks through how that happens, what we ask for, and which information on a borrower profile we have actually verified versus which is supplied by the borrower themselves.

Two points to get out of the way first, because we keep harping on about them and it bears repeating:

* **We do not underwrite anyone.** KYB establishes who a borrower is: that the entity exists, who owns it, and who controls it. It is not an assessment of creditworthiness or repayment capacity, and Wildcat does not insure against defaults. As a lender you shoulder the counterparty risk.
* **Only part of a profile is checked.** The legal-identity fields come out of KYB and are checked. The marketing copy, the links, the pitch: those are supplied by the borrower and are not verified or monitored. If you think a borrower is misrepresenting themselves you can reach out to <contact@thewildcat.foundation>.

### The Process at a Glance

| Step             | Who runs it                          | What happens                                                   |
| ---------------- | ------------------------------------ | -------------------------------------------------------------- |
| 1. First contact | You + Wildcat                        | You approach us directly, or through one of the outreach forms |
| 2. Intro call    | Wildcat                              | We explain what Wildcat is; you explain what you do            |
| 3. Handover      | Wildcat                              | We introduce you to our compliance service provider            |
| 4. KYB check     | Compliance service provider + Sumsub | You complete a Sumsub KYB check via a secure link              |
| 5. Registration  | Wildcat                              | Your Ethereum address is written to the archcontroller         |
| 6. Deployment    | You                                  | You deploy whatever markets you like                           |
| 7. Profile       | You                                  | You supply your profile details and market descriptions        |

### Step 1: You Get In Touch

There are two doors in. You either come to us directly, or you find us through one of the outreach forms on the Wildcat websites. Either is fine.

We ask for no documents and no identity data at this stage. This is just first contact.

### Step 2: The Intro Call

Before any compliance machinery starts turning, Wildcat will usually jump on a call with you. The call covers two topics:

* **What Wildcat actually is.** An undercollateralised, non-custodial lending protocol where you set the terms of your markets and we stay out of the way. We don't intermediate the loan and we don't underwrite it.
* **What you actually do.** Your business, what you want to borrow, and what you'd use the markets for.

The call carries no commitment on either side.

### Step 3: Handover to Compliance

Once there's genuine interest on both sides, we hand you over to our compliance service provider, who owns the onboarding process from here on. The handover goes out by email and introduces you to the operations team running it. That email also tells you what's coming: a Sumsub KYB link, on-chain registration of your address once the check clears, and a heads-up about which of your details will be made public.

### Step 4: The KYB Check (via Sumsub)

The compliance service provider sends you a link to complete the KYB check, which it conducts using Sumsub, a specialist verification platform. It is an automated corporate due diligence check of borrower-submitted material: legal existence, ownership and control structure, identity of directors and shareholders at 10% or more ownership of the entity, document authenticity, and selected automated AML and sanctions screening.

#### What we'll ask you for

Where you genuinely can't provide one of these for reasons tied to your jurisdiction or entity type, an equivalent document is accepted in its place, so don't panic if the exact wording doesn't match your filing cabinet.

* **Proof of legal existence:** documentation such as a certificate of incorporation or registration.
* **Company structure:** the whole corporate picture, subsidiaries and parent companies included. Org charts are not a required document, although some entities do provide one.
* **Registry of directors:** a full list, with proof of identity and proof of address for each individual. The KYC policy only requires obtaining KYC for a minimum of two directors where there are more than two on the register, in line with CIMA's AML Regulations.
* **Registry of shareholders:** the list, with proof of identity, proof of address and selfie verification for anyone holding 10% or more.
* **Intended use case:** a short blurb on what you plan to use your Wildcat markets for. This one is kept as an internal compliance log, not published, so you can be plain about it.
* **Corporate identity details:** legal name, registration number, jurisdiction of incorporation, registered office address, and a notice email. These feed the legal agreements later.
* **Blockchain address:** an Ethereum mainnet deployment address. Smart-contract and MPC wallets are all fine here (Safe, Fireblocks, Fordefi, and so on). We strongly recommend a multisig or MPC setup over a single-key EOA: this address controls your markets and your borrowing capacity.

#### How the check verifies it

The check follows Sumsub's Full KYB methodology: a mix of automated checks, cross-referencing against corporate registries, and actual humans reading the documents. Between them, the process establishes and verifies:

* **That the entity legally exists, and its details.** Name, registration number, legal form, address, incorporation date: pulled from your documents and cross-checked against government corporate registries and independent databases where these are available.
* **Who owns and controls it.** Directors, shareholders, and Ultimate Beneficial Owners are established from the documents and registries, and the individuals in those roles complete a KYC identity check.
* **That the documents aren't forged.** Every document is scanned automatically for tampering and graphic-editor trickery, then eyeballed manually for internal inconsistencies, odd deviations from standard templates, and missing data.
* **That nobody's on a list they shouldn't be.** The entity and its associated parties are screened against automated sanctions lists, PEP lists and watchlists. No automated on-chain AML analytics are performed.

{% hint style="info" %}
One honest caveat on registry data: coverage and depth vary by jurisdiction. Where a registry exists and can be queried, Sumsub pulls and cross-checks company data directly from it; where a registry is thin, holds limited detail, or doesn't expose ownership information at all, the submitted corporate documents and manual review carry more of the weight and certified copies are often requested. Registry data alone rarely reveals the full ownership picture, which is exactly why the document package above is requested alongside it.
{% endhint %}

For a full description of the methodology, see Sumsub's own documentation: [How Business Verification works](https://docs.sumsub.com/docs/business-verification).

The upshot is that a passed profile carries the applicant record and status, the completed verification checklist, the documents on file, the mapped-out company structure, registry-verified company data, the individual checks (email, IP, corporate registry), and the automated AML/sanctions screening results. That's the paper trail sitting behind every verified borrower.

The KYB check is a point-in-time verification performed at onboarding. Wildcat does not re-run it regularly or continuously monitor a borrower's corporate status afterwards.

#### How long it takes

Depends entirely on how complicated you are and how quickly you send documents over. A clean single-entity structure clears fast. A Russian-doll ownership chain where the intermediate holding companies have to be verified too will take longer, because of course it will. We deliberately don't quote a fixed turnaround here; you'll get a realistic estimate for your specific case once your structure has been seen.

### Step 5: You Get Written On-Chain

Once the KYB check passes, we ask for the Ethereum mainnet address you want to use and register it on the archcontroller: the registry and permission gate that decides who is allowed to deploy hooks and markets. Before your address is on it, you can't create markets. After it, you have free rein to deploy whatever you like.

{% hint style="info" %}
Also want to be on Plasma? Let us know during onboarding so your address can be registered there too, rather than discovering the gap later.
{% endhint %}

### Step 6: You Deploy Markets

With your address registered, you sign the Terms of Use (if you haven't already), flip the app over to the Borrower side, and start deploying. Every knob is yours to set:

* Underlying asset and the market token name
* Base APR, capacity, and reserve ratio
* Grace period, penalty APR, and withdrawal cycle duration
* Access policy: lenders self-onboard, or you operate an allowlist
* Whether the market carries a Master Loan Agreement

We have solid documentation walking through every one of these choices, and we're around to talk you through the how whenever you want. What we won't do is pick the parameters for you or go find your lenders: those are yours.

{% hint style="warning" %}
\*\*On the MLA:\*\* pick the Wildcat template and you pre-sign it at market creation, with lenders countersigning before they deposit. Decline it and we still make you sign, purely to log that you explicitly said no. MLAs can't be bolted on retroactively, and lenders may reasonably ask why you didn't offer one, so have an answer ready.
{% endhint %}

### Step 7: You Own Your Profile

After registration your public profile is yours to maintain: your description, contact methods, socials and market descriptions can be edited directly from your registered borrower address, whenever you like. Your alias or trading name is likewise yours: it is displayed as you supply it, unverified. What cannot be changed by anyone except through a fresh KYB check is your legal identity, for reasons that should be obvious.

### What's Public, and What We've Actually Checked

Lenders: this is your section. A borrower profile shows two kinds of information sitting right next to each other, and only one of them has been checked by us. Read accordingly.

#### Checked by Wildcat (straight out of KYB)

These are facts about the legal entity, drawn from the Sumsub check:

* Legal name
* Borrower Ethereum address
* Headquarters (the registered office established during KYB)
* Entity legal form
* Founded (year)

#### Not checked by Wildcat (borrower-supplied)

These fields are supplied by the borrower. We make no claim they're accurate, and we don't endorse any link you click through to:

* Alias / trading name
* Profile description
* Outgoing links (contact details, social channels)
* Market descriptions

Treat these as leads for your own diligence, not as facts: check a trading name against the verified legal name, verify links independently before trusting them, and take questions about the business to the borrower directly through their listed contact methods.

#### What signing up makes public

By going through the KYB check, you accept that the following go onto your front-facing profile: year founded, legal name, jurisdiction, and legal nature of the entity.

Your physical (registered office) address is requested to be made quasi-public. Quasi-public means it isn't broadcast on the open profile by default; it's used to pre-populate the on-chain Master Loan Agreement for any market where you offer one, and is therefore visible to the lenders who countersign that agreement. If you're not comfortable with the address being displayed, the profile can instead show "Physical Address Withheld."

### Collections Are Not a Wildcat Function

Once you deploy a market, the borrower-lender relationship is yours. Wildcat is not a lender, intermediary, agent, advisor, servicer, custodian, collection agent, or enforcement party. We do not control or manage markets, do not intermediate transactions through the Protocol, and do not assume responsibility for repayment, collection, enforcement, recovery, market performance, or the outcome of any borrower-lender dispute.

If a borrower defaults, any rights and remedies belong to the relevant lender or other non-defaulting party under the applicable market terms, Master Loan Agreement (if any), Terms of Use, applicable law, or equity. Wildcat does not collect on behalf of lenders, direct lenders on whether or how to pursue claims, or participate in recovery, enforcement, liquidation, legal proceedings, or settlement activity.

Where appropriate, Wildcat may provide limited borrower-identifying information that is reasonably necessary for a lender to evaluate and, if it chooses, pursue its own rights and remedies. Any such disclosure is evaluated under applicable law, the Wildcat Terms of Use, the Wildcat Privacy Policy, and any applicable contractual restrictions. That does not make Wildcat responsible for the lender's decision, the borrower's repayment, or the outcome of any proceedings.

### The Short Version, By Audience

**If you're a borrower:** a call with Wildcat, a handover to our compliance service provider, a full Sumsub KYB check, then your address goes on-chain and the rest is yours. Your legal identity becomes public; your physical address can be withheld if you'd prefer.

**If you're a lender:** every borrower here is a KYB-verified legal entity, and that carries real weight. Treat legal name, Ethereum address, headquarters, entity legal form and founded year as verified. Treat trading names, descriptions, links and market copy as borrower-supplied material to check for yourself, not as verified facts. And remember the drum we keep banging: verification confirms identity, not creditworthiness, and we don't underwrite a single one of these markets.

### Anything Else?

KYB and onboarding questions go to <contact@thewildcat.foundation>. Product and deployment questions can come to the Wildcat team directly. Any issues, questions or concerns with any of the above, let us know. We're trying to enable a better way of doing this than what came before.


# Day-To-Day Usage

Hands-on guides for operating Wildcat day to day, for both borrowers and lenders.


# Borrowers

What you need to know as a Wildcat borrower.

## Launching A New Market

For the purpose of this section, we assume that the borrower has already gotten in contact with Wildcat and been added as a whitelisted borrower on the [**archcontroller**](/using-wildcat/terminology#archcontroller) (the registry that tracks permissions and deployments).

Once this is done, the borrower can go to the protocol UI, and having signed the [**Terms of Use**](/legal/wildcat-terms-of-use) (if not done already), navigate to the Borrower section by flipping the switch over from Lender.

Thereafter, you should ensure that your Borrower Profile page is accurate (although if you're on testnet this doesn't matter): you can view this by clicking on View Profile after clicking on your signed in address in the top-right of the app:

<figure><img src="/files/SVpWEHG6Ru0ed26R7P3X" alt="" width="307"><figcaption></figcaption></figure>

Ensured this is filled out properly: you can change your socials and your Description here by yourself if needed, but anything else requires a site admin to make the change to ensure that you don't name yourself Raytheon to try and bamboozle people. These profile details are needed for grabbing information for the master loan agreement template if you opt to make use of it, and more generally it's just useful stuff for would-be lenders to know who they're engaging with.

Now click **Create New Market**.

<figure><img src="/files/MjnfN82hQAoAy1IJASqY" alt=""><figcaption></figcaption></figure>

There are a number of parameter fields that are presented here, and the screen may appear a bit overwhelming, but they fundamentally represent the degrees of freedom you have available to you.

Note: the [**Terminology**](/using-wildcat/terminology) page may help here if you get lost in the sauce.\
\
They are:

## 1) Policy Creation

This is the section that dictates the [hook instance](/using-wildcat/terminology#hook-instance) used to govern the market.

### Market Policy

This dropdown allows for you to either re-use a policy that you have previously created, or instantiate a new one. Markets that are governed by the same policy all adhere to the same rules. If you select an existing policy here, the remaining three fields are auto-completed.

### Policy Name

Exactly what you'd expect: enter a unique identifier here that describes the policy.

### Market Type

Two options here:

* **Open Term**: deposits from lenders can be requested for withdrawal at will, at any time.
* **Fixed Term**: deposits can only be requested after a set amount of time has elapsed after market creation, whereupon the market converts to an open-term. Once a market has converted, it cannot be entered into another fixed term. If you select this option, another three sub-options are shown:
  * **Fixed Term Maturity Date \[00:00 UTC]**: when do you want to permit withdrawal requests? Please note that Base APR (chosen later) *cannot be reduced* while a market is in fixed-term!
  * **Permit Early Termination**: do you want to reserve the right to repay all market debt and stop accruing interest even while the market is in a fixed-term?
  * **Permit Maturity Reduction**: do you want to reserve the right to bring the maturity (conversion to open term) date closer to the present?

### Access Control

At present, we support two options here:

* **Lender Self-Onboarding**: any lender can grant themselves a deposit credential provided they are not sanctioned by OFAC as detectable through the Chainalysis oracle for that chain.
* **Borrower Operated Allowlist**: lenders can only deposit into markets if their address has been explicitly added to the policy on-chain by the borrower.

<figure><img src="/files/U115NYshAm1ofCXIX4NE" alt=""><figcaption></figcaption></figure>

## 2) Basic Market Setup

Here you are asked for what it is you want to borrow and how you want to identify the debt token that is issued in exchange.

### **Underlying Asset**

This is the asset that you wish to borrow, such as LUSD or WETH.

If you're deploying on mainnet, it's going to be easier for you to explicitly enter the token address rather than just searching for, say, USDC - this is because typing in a ticker performs a symbol search from <https://tokens.1inch.eth.link>: and as you'll see if you try, there are a *lot* of different USDCs listed.\
\
**DO NOT create markets with rebasing assets such as stETH as the underlying: this breaks the underlying interest model. It's not a vulnerability, but you'll just end up causing everyone pain.**

### **Market Token Name**

The prefix string that the **market token** issued to represent debt will use. For example, if you are borrowing *WETH* (Wrapped Ethe&#x72;*)* and enter '*West Ham Capital*' here, the name of the market token will be *West Ham Capital Wrapped Ether*.

### **Market Token Symbol**

The prefix string that the market token issued to represent debt will use. For example, if you are borrowing *WETH* and enter '*whc*' here, the symbol of the market token will be *whcWETH*.

<figure><img src="/files/40FB2yk2TgQZBKEwnv18" alt=""><figcaption></figcaption></figure>

## 3) Basic Market Terms

Here you configure the capacity, rates, reserve ratio and minimum deposit, plus the grace and withdrawal periods of your market.

### Maximum Borrowing Capacity

This represents the initial **capacity** of the market - the maximum amount of debt that you're willing to pay interest on at launch. Note that depending on what you set the reserve ratio as, this does *not* correspond to the amount that you are able to borrow from the market when fully subscribed.

### Base APR

The amount of interest that you are willing to pay on deposits to *lenders*. This is the rate that will apply presuming that your market never stays delinquent for long enough for the penalty APR to activate (see below). The APR compounds every time the market is interacted with in a non-static call (such as a deposit or withdrawal request), so it's hard to determine precisely what the APY would be for this rate.\
\
Note: that this is not the true APR that you pay in the presence of the [protocol fee](/using-wildcat/protocol-usage-fees), which will be added onto the base rate (e.g. selecting a base rate of 10% for a market that includes a 5% protocol fee produces a final rate for the borrower of 10% + (0.05 \* 10%) = 10.5%. However, this 0.5% does not accrue to the rebasing debt tokens, but rather to the required reserves of a market over time.

### Penalty APR

The amount of *additional* APR that you agree to pay in the event that your market becomes [**delinquent**](/using-wildcat/terminology#delinquency) (i.e. falls below required reserves) and the delinquency is not resolved within the amount of time specified by the [**grace period**](/using-wildcat/terminology#grace-period) (defined in this panel by yourself), as observed by the [**grace tracker**](/using-wildcat/terminology#grace-tracker).

Wildcat V2 markets allow for this value to range between **0 - 100%**. We encourage borrowers to select a non-zero value to illustrate the seriousness with which they intend to monitor their obligations.\
\
This penalty rate is added on to the base rate only for as long as the value of the grace tracker is above that of the grace period. The presence of an active penalty rate does not factor in to the calculation of any protocol fees that are in place, as Wildcat profiting from delinquent markets would present all manner of perverse incentives.

### Reserve Ratio

The percentage of the market **supply** that must remain *within* the market available for redemption. For example, a market with a capacity of 100,000 tokens, a supply of 20,000 tokens and a reserve ratio of 25% must have 5,000 tokens within the market ready for lenders to withdraw.

Wildcat V2 markets allow for this value to range between **0 - 100%**. The zero is in homage to the American central banking system. This enables fully uncollateralised markets: however, a borrower will still be expected to maintain a small amount within the market to handle protocol fee accrual.\
\
Failing to maintain this level will result in the market becoming **delinquent**.\
\
Note that the capacity and the reserve ratio together dictate the *maximum* that you are able to borrow from a market. A higher reserve ratio leads to a greater amount that you are paying interest on, but provides more of a cushion for lenders to easily exit their position, presuming that you fix delinquencies in a timely manner (lest you incur the *penalty APR*, see above).

### Grace Period Duration

The amount of time that a market is permitted to be delinquent for before the penalty APR activates. This parameter is measured in hours, and comes with a corresponding variable called the grace tracker, which measures the amount of time for which the market has been delinquent.\
\
The grace period is a *rolling limit*: once delinquency has been cured within a market, the grace tracker will count back down to zero from whatever value it had reached, and any penalty APR that is currently in force will only cease to do so after the grace tracker value is once again below the grace period.

Wildcat V2 markets allow for this value to range between **0 - 2160 hours** (90 days).\
\
Note: this means that if a markets grace period is 3 days, and it takes 5 days to cure delinquency, this means that **4** days of penalty APR are paid (you took two days to fix it, and then it took another two days to climb back to zero). **This is important**: a borrower does not necessarily have `grace_period` amount of time to cure each distinct instance of delinquency!

### Withdrawal Cycle Duration

The maximum amount of time that a lender who has filed a withdrawal request must wait before they are permitted to request their assets from the market. If a lender has initiated a new withdrawal cycle, any other lender is able to join in the same cycle.

Wildcat V2 markets allow for this value to range between **0 - 2160 hours (90 days)**.\
\
This parameter exists in order to fairly distribute assets across multiple lenders given the undercollateralised nature of Wildcat markets. In the event that a significant amount of the supply is recalled at once, a longer withdrawal cycle permits reserves to be handed out *pro rata* depending on the reserves within the market. For more on how this looks from the lenders perspective, please see the [**Lenders**](/using-wildcat/day-to-day-usage/lenders) page.

### **Minimum Deposit**

What is the minimum amount of the underlying asset that will be accepted by the market in a single deposit transaction by an approved lender? Default value is zero, this is completely optional.

<figure><img src="/files/fBsajoHqtYzkyau5C8qL" alt=""><figcaption></figcaption></figure>

## 4) Lender Restrictions

This section is related to hook management, and allows for you to determine who can deposit and withdraw from markets, as well as how transferable the debt tokens (dfdUSDC, in this example) are:

* **Restrict Withdrawals** - restricts the ability to withdraw funds to users who meet the market access criteria dictated by your policy. **We strongly recommend that this be turned on**.
* **Restrict Transfers** - ensures that market tokens can only be transferred between participants who meet the specific access requirements set by the market’s policy.
* **Disable Transfers** - stops the movement of tokens representing deposits or loans within the market. Transfers to the market as part of withdrawal requests are permitted.

<figure><img src="/files/iwF1qaCzcLMFQ6u8Jpos" alt=""><figcaption></figcaption></figure>

## 5) Loan Agreement

This is not directly relevant to the structure of the market which is deployed, but borrowers are presented with the option of whether or not to make use of a Wildcat-specific master loan agreement for the protection of any lenders.

If the Wildcat MLA Template is selected, the borrower is required to pre-sign a copy of the [Template MLA](/legal/master-loan-agreement) with the relevant parameters sourced from this market configuration and the borrower's profile. This document is then offered to lenders which seek to deposit to a market after onboarding, binding them to the borrower via contract. It defines certain warranties and covenants, discusses the handling of sanctions, accounts for the mutability of certain parameters and is intended to offer the lender protection via the legal system, as they shoulder the bulk of the risk in a trusted relationship.

If 'Don't Use' is selected, then a signature is still requested, but this is to log the fact that the borrower explicitly declined to add an MLA to the market. At present, MLAs cannot be retroactively added on to markets that did not start with one. In future, we will support the ability for borrowers to provide their own agreements, but for now, this is where we are.

Note that if you do not offer one, lenders may rightly ask why you felt it appropriate to refuse to do so. If your reasoning is because you would like a slightly different phrasing of terms or you need something more custom, please get in touch with us.

<figure><img src="/files/D1qPBw6SE0FXBW1x6KSA" alt=""><figcaption></figcaption></figure>

## Confirmation

At this point, you are presented with a summary of the market that you are about to create:

<figure><img src="/files/xB7u8JFKBYEmj78Vi8CR" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/7gaTurFuD4TTU09O1Qwi" alt=""><figcaption></figcaption></figure>

There are a series of messages at the bottom of the page for you to pay attention to depending on your configuration, in particular regarding the protocol fee, which is derived from the Base APR as 5% of that value.

You are then asked to Sign: this is related to the MLA, and requires you to ECDSA sign the template agreement or your refusal to offer it.

**Please note:** if you're using a Safe multisig, you need to *keep this window open* until the MLA signature/refusal has been signed so that you can fire off the deployment transaction afterwards. If you're on the testnet, you need to make *two* transactions as part of deployment (we create a mock token contract for you as the base asset so you people can access a faucet). This is a pain for UX, but closing the window between these steps *will invalidate the MLA signature/lose all progress*, and you'll have to do it again. Not much we can do about this without some pretty beefy changes.\
\
**TL;DR: Have your multisig signers available when you do this!**

<figure><img src="/files/0nqGo96RLu3eC03doJvq" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/p9r2fA3Tb1HZmZV0P3ct" alt=""><figcaption><p>The `Sign' button presents this if you offer an MLA.</p></figcaption></figure>

<figure><img src="/files/RJqtfsJ5wz0aLEz56u3D" alt=""><figcaption><p>You're asked to explicitly decline the MLA if you don't offer one.</p></figcaption></figure>

After signing the MLA for your market (or your refusal to offer it), you can finally deploy!

<figure><img src="/files/GOyn90e4xXHeRyk2J58y" alt=""><figcaption><p>Post-deployment, your market will appear as Non-Deposited, since obviously no one has put anything in it yet!</p></figcaption></figure>

## Sourcing Deposits

Once a given market is live, lenders can start onboarding to the market, depending on the access policy in place. For those markets which make use of an explicit address whitelist, the borrower must make use of the Edit Policy button within the Lenders section of a market to execute an on-chain transaction specifying one or multiple addresses. We defer the decision-making of who is 'allowed' to be onboarded to borrowers.

<figure><img src="/files/xrNe5ocYBvhupZRC2Amm" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/mMzs5L5bhIQOBDxhlmCX" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/zmBF8O17GK0JJY8Y1qwu" alt=""><figcaption></figcaption></figure>

Wildcat itself does not source capital providers for you, although we may well advertise the fact that your markets exist and what their parameters are (as well as any changes).

## Borrowing From A Market

If we fast forward from here to the stage where lenders have onboarded and deposited assets, we can finally get to the *point* of all of this: borrowing assets from the market that you have set up. You can access your market from the market overview page, which takes you a page with several stats about your market: amount loaned, amount you can borrow, parameters, lists of who holds how much debt and so on.

<figure><img src="/files/iT03vl6Lh4MLrYfSCU5W" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/bXg3Y4xMHDixvnYXwMwO" alt=""><figcaption></figcaption></figure>

Remember that the *capacity* you set for your market only dictates the maximum amount that you are able to source from lenders, and that your *reserve ratio* will dictate the amount of the *supply* that you cannot remove from a market.

If you have created a market with a maximum capacity of 1,000,000 USDC and a reserve ratio of 20%, this means you can borrow *up to* 800,000 USDC provided that the market is 'full' (i.e. *supply* is equal to *capacity*). In the event where the supply to this market is 600,000 USDC, you can only borrow up to 480,000 USDC.

The process of actually borrowing available assets from a market is simple: navigate to the market details page of your market, and you will be presented with the ability to withdraw assets up to the current reserve ratio.

<figure><img src="/files/ObRtNzN7FrrNx7i3cxA2" alt=""><figcaption><p>Step 1: Enter how much you want to borrow from your market.</p></figcaption></figure>

<figure><img src="/files/4ViQVjwVxbCy1KWL4TKt" alt=""><figcaption><p>Step 2: Verify you're comfortable with how long your market will remain healthy and confirm.</p></figcaption></figure>

We strongly advise not borrowing right up to the limit, as the result of this will be that your market becomes delinquent after the very next non-static call which updates the market state and rebases the market token supply.

Please also note that where a protocol fee is in place for a market, said fees will accrue as [required reserves](/using-wildcat/terminology#required-reserves) in the market over time, alongside interest that accrues to the rebasing debt tokens.

## Repaying A Market

The primary mechanic by which funds are recalled by lenders is through **withdrawal requests**, which isolate assets currently in reserve in a market for lenders to claim at the end of a withdrawal cycle (for more details on this, please refer to the [**Lenders**](/using-wildcat/day-to-day-usage/lenders) page).

Withdrawal requests impact the liquid and required reserves of your market, and as such borrowers are minded to monitor their reserve ratios to determine when funds are being requested. Requests (including who has placed the request and for how much) are also logged within the Market History tab of a market from the borrower perspective.

The act of repaying is simple in the sense that it just requires moving assets back to the market contract via a standard ERC-20 transfer. Further, *anyone* can repay assets to the market in this way - we've permitted this in case the borrower address is compromised.

<figure><img src="/files/hbuO03PwOGgxfxnSBJe1" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/InAXGu3i4nRGLbVylWLt" alt=""><figcaption><p>You can also elect to repay a number of days worth of anticipated interest rather than a specific amount.</p></figcaption></figure>

## Reducing APR

The interest rate on a market is fixed at any given point in time (i.e. markets do not make use of a utilisation-rate based curve), however the borrower is free to adjust this rate step-wise should they wish, under the following formula:

* Should a borrower wish to increase the APR of a market in order to encourage additional deposits, they are able to do so without constraint.
* Should they wish to decrease the APR, they are able to do so by up to 25% of the current APR in a given two week period: a decrease of more than this requires that twice the amount is returned to the market reserves for that two week period to permit lenders to opt out ('ragequit') if they choose.\
  \
  To illustrate:
  * A borrower can reduce a market APR from 10% to 7.5% with no penalty, and two weeks thereafter will be able to reduce it again to 5.625%, and so on.
  * However, should a borrower reduce a market APR from 10% to 7.4% (a 26% reduction), they will be required to return 52% of the outstanding supply to the market for two weeks. After that time has passed, the reserve ratio can be reset back to the prior level and the assets can be borrowed again.

<figure><img src="/files/65568ArCt6GUEiKZw5g1" alt=""><figcaption><p>POV: you're increasing Base APR. No change.<br>(Recently adjust notification here is just because it's a new market).</p></figcaption></figure>

<figure><img src="/files/f5JrTUILyBa7CnMr2Fpg" alt=""><figcaption><p>POV: you're reducing Base APR by 25% or less. No change.</p></figcaption></figure>

<figure><img src="/files/KZjgDiRveUiqddGu4Yud" alt=""><figcaption><p>POV: you're reducing Base APR by more than 25%. No collateral obligation here (empty market), but you'll only be able to borrow half of what anyone deposits for the next two weeks.</p></figcaption></figure>

Note that the above only applies if your market is in an 'open-term' setting: i.e. there is no hook enabled which is preventing withdrawals at the time of the proposed change. If this is the case, you will not be able to reduce the APR while that hook is active (otherwise that enables a fairly obvious rug mechanic).

If you're confused by this mechanism, let us know and we'll expand a bit more!

## Altering Capacity

As a borrower, you are able to adjust the capacity up or down to whatever amount you wish. Note that that the rebasing of market tokens can bring the total debt of a market above such a capacity. Setting the capacity to below the current debt prevents further deposits until such time as the total supply has been reduced via withdrawal requests. Interest accrues on the outstanding supply until such time as lenders reduce the supply through withdrawal requests that burn market tokens. The required reserves of a market remain unchanged regardless of capacity changes.

<figure><img src="/files/xvrKfn4wYWrtmO37XUoV" alt=""><figcaption></figcaption></figure>

## Altering Minimum Deposit

You are capable of adjusting the minimum deposit level of your market at any time (it defaulted to 0 if you didn't set it on market creation). Furthermore, you can stop any future deposits without reducing the market capacity by simply setting the minimum deposit above the capacity.

<figure><img src="/files/zbsTzphLaKwmmAxQJCjt" alt=""><figcaption></figcaption></figure>

## Reducing Maturity

If your market is currently in a Fixed Term state, and you selected the Permit Maturity Reduction flag on market creation, you are able to bring the maturity forward (closer to the present day) at will. Note that you can't move the maturity further into the future, as that would enable a fairly obvious rug mechanism where you just set it to some impossible distance.

<figure><img src="/files/u23wpHJgKPuEOUap2DWM" alt=""><figcaption></figcaption></figure>

## Terminating A Market

In the event that a borrower has finished utilising the funds for the purpose that the market was set up to facilitate, the borrower can *terminate* (close) a market at will.

This is a special case of reducing the APR (with the associated increased reserve rate that accompanies it). When a market is closed, sufficient assets must be repaid to increase the reserve ratio to 100%, after which interest ceases to accrue and *no further parameter adjustment or borrowing is possible*. The only thing possible to do in a closed market is for the lenders to file withdrawal requests and exit via claiming.

You can access this by clicking **Terminate Market** in the left-hand status bar as a borrower:

<figure><img src="/files/7p5MkXketSXKwVtvHxcr" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/WUBN2TSIDJ3ZGeIpMoCn" alt=""><figcaption></figcaption></figure>

Note that the withdrawal cycle period is erased in terminated markets: lenders still have to file two distinct transactions (i.e. across separate blocks), but the withdrawal cycle period is not enforced in this instance. If a withdrawal cycle was ongoing when the market was terminated, it is immediately concluded, allowing lenders therein to claim.

## Archcontroller Removal

For whatever reason, it may be the case that the Wildcat protocol itself no longer wishes to permit a given borrower to engage further with it. In this case, the address(es) of a borrower can be removed from the archcontroller by its owners. If this happens, the borrower can no longer deploy *new* hooks instances or markets.

However, they are still capable of interacting with *existing* markets as before - neither the protocol nor its operators can force these closed. This is because there are potentially master loan agreements surrounding market usage, and Wildcat having the power to unilaterally step in and sever them would make it a key participant in the arrangement.

We kindly ask that you treat your Wildcat markets with respect, and inform us (and your lenders) if anything has gone drastically wrong on your end. We're trying to enable something better than before.


# Lenders

How lenders deposit, read balances, transfer market tokens, request withdrawals and claim underlying assets.

## Making Deposits

Depositing assets to a Wildcat market is a fairly simple process, but depends somewhat on the policy in place for said market.

With that said, the first thing we want you to remember is that *Wildcat does not underwrite these markets or provide any guarantees as to whether or not the borrower is guaranteed to repay them.* We keep harping on about this, but it really does bear repeating.

Moving on: this is what you're faced with when you get to the main lender dashboard.

<figure><img src="/files/bJrTleSMG2xy8ZQ2XmF8" alt=""><figcaption><p>Note that the lender has active loans to three markets - the 'No Active Markets' under the 'Non-Deposited' is indicative of the fact that there are no markets where the lender has been explicitly onboarded to by a borrower (or otherwise holds an access credential) and they haven't deposited any assets yet. This might be confusing, let us know if that's the case!</p></figcaption></figure>

To look for a new market, you can either click *Other Markets* in the table itself, or the **Observe New Markets** button in the top-right.

At this stage, there are two types of markets: ones where you can onboard yourself provided that you are not OFAC-sanctioned, and ones where you must be explicitly onboarded by the borrower.

<figure><img src="/files/J9Hl54vHGFzMKjGgZHWd" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/zWCSuAyQrsVEZehzKDt9" alt=""><figcaption></figcaption></figure>

Note that if you try to enter a market which requires borrower onboarding, you will only be able to view descriptive statistics plus the market history.

<figure><img src="/files/ppcWSkoj25nxVSG5OBYI" alt=""><figcaption><p>You can reach out to the borrower through one of the methods available on their borrower profile if you want to ask about being added (click the blue underlined borrower name for that market).</p></figcaption></figure>

Upon entering a self-onboarding market, if the borrower has specified that this market is to be bound by one, the lender will be asked to countersign the associated Wildcat Master Loan Agreement (MLA) parameterised for the specific market terms.

<figure><img src="/files/P7GFeAV20qXIw6fJim7L" alt=""><figcaption></figcaption></figure>

Note that dependent on the borrower, this may not be in place: for all Wildcat itself knows, you may be looking to lend to a market which you've been added to an allow-list for having signed a separate agreement which you may be asked to sign off-chain. If the market does not offer an MLA, the UI simply presents you with the ability to deposit.

To sign the MLA, click the View/Sign MLA button, scroll to the bottom, and sign with your wallet. No pesonal details other than your wallet address and your ECDSA signature will be stored: this is sufficient to prove that you've accepted it (and can enforce it against the borrower if needed down the line).

Once you've signed it, you're faced with the following:

<figure><img src="/files/jiTpxXU0jxm5zfL41uMq" alt=""><figcaption></figcaption></figure>

After this point provided that the lender holds some of the [**underlying asset**](/using-wildcat/terminology#underlying-asset), and there is [**capacity**](/using-wildcat/terminology#capacity) in the market, the lender is able to deposit as much of the asset as they are willing to (or up to the capacity), receiving in exchange a 1:1 amount of the [**market token**](/using-wildcat/terminology#market-token) associated with that particular market. The lender that deposits 133.7 XYZ tokens into a market will receive 133.7 market tokens - with the market token name depending on what was selected by the borrower when the market was launched: e.g. wildcatXYZ.

<figure><img src="/files/TqWUmEgQABjJclz0GjVw" alt=""><figcaption><p>This particular market has a minimum deposit amount, but otherwise it's the same<br>pattern you're used to from everywhere else that you know and love.</p></figcaption></figure>

<figure><img src="/files/SUPybAYSOxXifXuL9GSv" alt="" width="369"><figcaption><p>These are mock tokens on Sepolia, but tokens in, debt tokens out.</p></figcaption></figure>

Market tokens are *rebasing* - depositing 1,000 tokens of an underlying asset into a market offering 10% base APR will result in a wallet balance of 1,100 market tokens after a year, giving rise to a claim on 1,100 tokens of the underlying.

Wildcat market tokens differ somewhat from aTokens/eTokens from Aave and Euler in that they do not have an internal exchange rate whereby 1 market token will be worth - for example - 1.05 of the underlying asset after a year. Rather, after every interaction with the market that changes the state, market token balances will be adjusted to maintain the 1:1 ratio between market tokens held and the claim of each lender.

Depending on the constraints placed upon the markets, lenders *may* be able to transfer market tokens freely (you can send them to a cold wallet, you can LP them, you can build additional infrastructure around them). Borrowers are able to constrain transfers to only those addresses that hold an unexpired deposit credential or are marked as known lenders, or completely prevent transfers except for those to/from the market contract. Check the details of your particular market via the protocol interface, it's all explained there.

<figure><img src="/files/h7F3gsVj6RaCBiOUtZCa" alt=""><figcaption></figcaption></figure>

If your address has ever deposited to a market or received market tokens while holding a valid deposit credential, you will be marked as a known lender, and always be allowed to place withdrawal requests for that market. If the market permits it and Lender A sends their market tokens from their depositing wallet to a secondary one, those markets must either be sent back to the original wallet in order to claim, or the secondary wallet address must also become a known lender.

## Reading Lender Balances

A lender can see several numbers for the same market, but they are not interchangeable:

* The **wallet market-token balance** is the rebasing balance returned by `balanceOf(account)`. It represents market tokens still held by that address. It is a lender claim on the borrower, not a statement that the market holds enough immediately available underlying asset to redeem it.
* The **transferable amount** is bounded by that wallet balance and by the market's transfer policy. An open market allows arbitrary recipients; a restricted market permits only known lenders or recipients with a valid credential; and a disabled market permits the tokens to move only back to the market as part of a withdrawal request. A transfer moves market tokens; it does not redeem them for the underlying asset.
* The **claimable amount** is underlying asset which has already been allocated to the lender's withdrawal batch and can presently be claimed. It belongs to the withdrawal ledger and may be zero, partial or fully funded independently of the address's remaining wallet balance.

When a lender queues a withdrawal, the requested market tokens leave the lender's wallet and are held by the market until the protocol can burn them against allocated underlying assets. Once a cycle expires, the funded portion becomes claimable. Any unfunded remainder remains in the withdrawal queue, while market tokens which were never queued remain in the wallet and continue to rebase.

## Making Withdrawals

[**Withdrawals**](/using-wildcat/terminology#withdraw) are handled slightly differently within Wildcat markets than in other DeFi protocols you might be used to interacting with.

To that end, this section provides a brief guide to how withdrawals are processed, and the ways in which you reclaim assets from a market that you have requested, either in full or *pro rata* depending on both the reserves currently in the market and how many other lenders are simultaneously requesting a withdrawal.

Wildcat does not permit immediate withdrawals - rather, the borrower that you are lending to specified a [**withdrawal cycle**](/using-wildcat/terminology#withdrawal-cycle) length when creating the market you are attempting to withdraw from.

A withdrawal involves:

* Transferring the total number of market tokens corresponding to your requested amount to the market, which are either burned immediately or held to be burned (which one happens depends on the amount of reserves currently in the market),
* Waiting for the withdrawal cycle period to elapse (either the full period if you were the request that kickstarted the cycle, or the remainder if you placed the request in the middle of a cycle), and then
* Claiming the assets that are available to you at the end of the cycle.

If your market is Open Term (i.e. you can place withdrawals requests at any time, the dashboard for your market will allow you to access a Withdrawal button):

<figure><img src="/files/jq81ilZwsSDvM91qi2r3" alt=""><figcaption><p>I went and took this image after the one below, no one ever accused me of being good at this.</p></figcaption></figure>

<figure><img src="/files/5DGZMtYhaRgrK1ILZ0f6" alt=""><figcaption></figcaption></figure>

However, if your market is Fixed Term, then you will not be able to place a withdrawal request until such time as that maturity passes (well, either that or the market is closed by the borrower), and as such the Withdraw button is hidden from you:

<figure><img src="/files/CwYhqBIe46mhlHT8Zg8a" alt=""><figcaption><p>We did this because we, as its' developers, got confused at one point as to why we weren't able to place withdrawal requests.</p></figcaption></figure>

### The Unclaimed Withdrawals Pool

Within a given market, there is a unclaimed withdrawals pool - a 'side-pot' containing reserves that are still technically 'within' the market, but have been earmarked for withdrawal by lenders via a *withdrawal request*. Assets that are placed within this pool are unavailable to the borrower (they are considered to be removed from the market supply), and the [**reserve ratio**](/using-wildcat/terminology#reserve-ratio) of a market does not factor them in.

When you request a withdrawal, whether any of the market tokens you transfer to the market are burned or not depends on whether there are any reserves that are *not* yet in the unclaimed withdrawals pool.

* If there are reserves in the pool that are not in the unclaimed withdrawals pool, then market tokens are burned at a 1:1 rate in order to move those reserves into the pool. If there is no current withdrawal cycle ongoing, this action begins the countdown for a new cycle.
* If all assets within the market are currently within the unclaimed withdrawals pool (or there are no reserves in the pool to speak of at present), then your withdrawal request is logged, but no market tokens are burned after you transfer them (as there is nothing to move into the pool). Instead, you tokens will burn as assets become available (see below).

### Claiming

<figure><img src="/files/TsB4EAOfTWKDkXKuIGFH" alt=""><figcaption></figcaption></figure>

Once a withdrawal cycle completes, then lenders who made withdrawal requests during that cycle are able to *claim* assets that they requested from the unclaimed withdrawals pool, subject to the following:

* If there are enough assets in the unclaimed withdrawals pool to cover the total amount requested for withdrawal in that cycle, then the lender can claim the full amount of their requested withdrawal.
* In the scenario where the total amount requested (across several lenders) exceedes the amount in the unclaimed withdrawals pool, then the lender is able to claim a *pro rata* amount of the assets in the reserved pool proportional to the size of *their* overall withdrawal amount compared to the total. To illustrate:
  * If Lender A requested a withdrawal of 10,000 tokens from a pool with 5,000 tokens in reserve, they would be able to withdraw all 5,000 if they were the only lender in that withdrawal cycle.
  * In the event that Lender B requests a withdrawal of 40,000 tokens in the same cycle, however, Lender A would only be able to claim 1,000 tokens while Lender B would be able to claim 4,000 (because 10,000 : 40,000 is a 1:4 ratio).
  * Note in this scenario that Lender A - if they requested the withdrawal first - would have had half of their market tokens burned to place these 5,000 assets in the unclaimed withdrawals pool, while Lender B had none burned. Rather, Lender B's market tokens will be burned later on as assets are repaid by the borrower.
  * The above situation leaves Lender A having burned 5,000 market tokens and only able to claim 1,000 - the discrepancy here is logged, and is resolved as the overall outstanding amount is paid off by the borrower.

<figure><img src="/files/n0rxO0e7K3fDpR3btj9H" alt=""><figcaption><p>Example of the lender's perspective when a withdrawal cycle is ongoing.</p></figcaption></figure>

<figure><img src="/files/1SrnZEDgnN6drg10zZ5i" alt=""><figcaption></figcaption></figure>

### Expired Claims and The Withdrawal Queue

Any withdrawal amounts that cannot be honoured at the end of a withdrawal cycle (either due to the assets in market reserves being insufficient, or due to a *pro rata* claim on assets within the unclaimed withdrawals pool) are batched together, marked as 'expired' and placed into a queue.

Subsequent repayments by the borrower to a market with a non-zero queue will route assets to the unclaimed withdrawals pool in the amounts required to fully honour *all* expired claims *in the order that they were initiated* - only after this obligation is met do repaid assets start counting towards the reserve ratio of a market.

To illustrate in some depth (this is pretty picky stuff, no harm no foul if you don't read it):

* A market with capacity 50,000 has a supply of 40,000 tokens, and 10,000 tokens in reserve (for a reserve ratio of 25%).
* Lender A makes a withdrawal request for 15,000 tokens, moving 15,000 market tokens to the market and burning 10,000 of them to move the reserves to the unclaimed withdrawals pool (reserve ratio now 0%).
* The supply of the market is reduced to 30,000 tokens (10,000 burned).
* Lender B makes an additional withdrawal request in the same cycle for 5,000 tokens: there are no assets in reserve to move, so no market tokens are burned.
* The withdrawal cycle period elapses.
* There is a total of 10,000 tokens in the unclaimed withdrawals pool and an outstanding claim of 20,000 tokens from both lenders:
  * Lender A can claim 7,500 tokens,
  * Lender B can claim 2,500 tokens,
* Lender A now has an outstanding claim of 7,500 tokens (2,500 of which have been 'pre-paid' in the sense that an extra 2,500 market tokens were burned than they were able to access), and Lender B has an outstanding claim of 2,500 tokens.
* This claim of a total of 10,000 tokens is marked as expired and placed in the queue as **Batch A.**
* Lender C starts a new withdrawal cycle by requesting a withdrawal of 5,000 tokens. As with Lender B, no reserves means no market tokens are burned.
* This second withdrawal cycle elapses, and a second expired claim for 5,000 tokens is added to the queue as **Batch B.**
* At this point, the borrower returns 13,000 tokens to the market.
* These tokens are immediately placed into the unclaimed withdrawals pool, and since the amount returned is less than the total amount outstanding in the queue (15,000), the reserve ratio of the market remains at 0%.
* Since the unclaimed withdrawals pool now contains enough assets to fully honour Batch A, the remaining 10,000 market tokens held by the market and associated with this batch are burned.
* Both Lender A and Lender B can now claim the remainder of their withdrawal request amounts.
* After factoring in the assets to honour Batch A, Batch B has 3,000 assets against a 5,000 claim. 3,000 of the market tokens transferred by Lender C are burned, and so Lender C can claim 3,000.
* **Important:** even though the 13,000 tokens returned to the market were in excess of the 5,000 token claim of Lender C, they were only eligible to claim that part in excess of the amount owed to the previous batch in the queue .
* If all of these claims are processed, the Batch A is eliminated from the queue, leaving only a 2,000 token claim for Lender C.
* If the borrower subsequently returns an additional 11,000 tokens to the market at this point, then 2,000 are again assigned to the unclaimed withdrawals pool, burning the remaining 2,000 market tokens associated with Batch B.
* The remaining 9,000 are now considered 'true' reserves, bringing the reserve ratio of the market back up to 9,000 / 15,000 = 60%.

One final point: if there are multiple lenders in a batch, and the batch can only be partially honoured (via a return of less than the total amount due), then each individual lender in the batch can only claim a pro-rata amount of the assets isolated to that batch.

Phrased differently: if a batch has been 60% honoured with deposited assets, then each lender can only withdraw 60% of their outstanding claim, until such time as more assets arrive to completely honour the batch.

This logic can be *very* confusing when first encountering it, so please ask us if there's any particular part you'd like us to expand on differently!


# Wildcat 4626 Wrapper

Wrap a rebasing market token into a non-rebasing ERC-4626 share for bridging, LPing or accounting.

## ERC-4626 Vault Wrappers

Wildcat market tokens rebase: your balance increases automatically as interest accrues. This is great for tracking what you are owed, but causes problems in certain situations — bridging to another chain, providing liquidity on most DEXs, or reconciling PnL for accounting purposes all work better with a stable token balance.

The ERC-4626 vault wrapper solves this. It converts your rebasing market token into a standard non-rebasing vault share that holds its balance steady while still appreciating in value over time.

> If you want to understand exactly why Wildcat market tokens rebase and how the underlying math works, see [The Scale Factor](/technical-overview/security-developer-dives/the-scale-factor).

***

### What Changes and What Stays the Same

When you wrap your market tokens:

* Your **share balance stays fixed**. It does not tick upward every block the way a regular market token does.
* Your **shares increase in value** over time instead. Each share becomes redeemable for more market tokens as interest accrues.
* You are **still exposed to the same market**. The wrapper is a thin layer on top. The underlying credit risk, withdrawal process, and market parameters do not change.
* Your wrapped token will appear in wallets and interfaces as **v-\[marketSymbol]** (e.g. v-wctUSDC).

> For a deeper look at how Wildcat markets behave at the protocol level, including deposits, withdrawals, and interest accrual, see [Core Behaviour](/technical-overview/security-developer-dives/core-behaviour).

***

### Who Can Deploy a Wrapper

Any registered Wildcat market can have a wrapper deployed for it. Either the borrower (at market deployment) or any lender (at any point afterwards) can deploy one. Only one wrapper can exist per market — if one already exists, you use that one rather than deploying a new one.

> Deployed wrapper factory addresses for mainnet and Sepolia can be found in Contract Deployments.

***

### How to Use the Wrapper

#### Wrapping (converting market tokens to vault shares)

1. Go to the market page for the market you hold tokens in.
2. Navigate to the wrapper section and select **Wrap**.
3. Enter the amount of market tokens you want to wrap.
4. Approve the wrapper contract to transfer your market tokens (one-time approval per market).
5. Confirm the transaction. You receive v-\[marketSymbol] shares in return.

> **Important:** Do not send market tokens directly to the wrapper contract address. This will not mint shares. Always use the wrap function in the app.

#### Unwrapping (converting vault shares back to market tokens)

1. On the same wrapper section, select **Unwrap**.
2. Enter the number of shares you want to redeem.
3. Confirm the transaction. You receive the corresponding market tokens.

Unwrapping gives you back your rebasing market tokens. It does not trigger a withdrawal from the Wildcat market or return USDC (or whatever the underlying asset is). To exit to the underlying asset, you still need to go through the standard Wildcat withdrawal process after unwrapping.

***

### Getting Back to the Underlying Asset

The wrapper sits one step removed from the withdrawal queue. The full exit path is:

**Unwrap shares → receive market tokens → submit withdrawal request → wait for batch expiry → claim underlying asset**

The wrapper does not shortcut this process. If you need USDC back, you need to complete all steps.

> For a full walkthrough of the withdrawal request and claim lifecycle, see [Lenders](/using-wildcat/day-to-day-usage/lenders) and the [Terminology](/using-wildcat/terminology) entries for Withdrawal Request and Claim.

***

### Key Things to Know

**Your interest does not stop accruing.** The wrapper does not affect how the underlying market works. Interest continues to build and is reflected in the increasing redemption value of your shares.

**Sanctions checks still apply.** The wrapper uses the same sanctions sentinel as the underlying market. Sanctioned addresses cannot deposit into or redeem from the wrapper. See [The Sentinel](/using-wildcat/day-to-day-usage/the-sentinel) for more on how sanctions handling works.

**The market capacity limit still applies.** If the market is at maximum capacity, you cannot deposit additional market tokens into the wrapper even if you hold them.

**The share count you see is not the market token amount you are owed.** Your shares will always redeem for more market tokens than their face count, because interest has accrued since you wrapped. The app will show you the current redemption value alongside your share balance.

**Delinquency does not affect the wrapper directly.** If the underlying market becomes delinquent, your wrapper shares still represent your claim on market tokens. What changes is the recoverability of those tokens, which depends on borrower behaviour. See [Delinquency](/using-wildcat/delinquency) for more detail.

***

### Frequently Asked Questions

**Does wrapping affect my withdrawal rights?** No. Your underlying position in the market is unchanged. You can unwrap at any time and then submit a withdrawal request as normal.

**Can I wrap tokens from a market I did not originally deposit into?** Yes, as long as you hold the market tokens (e.g. if they were transferred to you) and you pass the market's access controls. See [Market Access](/using-wildcat/day-to-day-usage/market-access-via-policies-hooks) Via Policies/Hooks for how access controls work.

**What happens to my wrapped shares if the market becomes delinquent?** The wrapper is unaffected by delinquency directly. Your shares continue to represent your claim on the underlying market tokens. What changes is the recoverability of those tokens, which depends on the borrower's behaviour — the same as for any lender in that market.

**Is there a fee for wrapping or unwrapping?** No. The wrapper charges no additional fee beyond standard Ethereum gas costs. For details on Wildcat's protocol fees more broadly, see [Protocol Usage Fees](/using-wildcat/protocol-usage-fees).

***

### For Developers and Integrators

If you are building on top of the wrapper or integrating it into a protocol, the full technical reference including function signatures, error codes, and exchange rate helpers is in the [developer documentation](/technical-overview/security-developer-dives/wildcat-4626-wrapper).

Note the known rounding behaviour between preview functions and execution functions before using previews as exact assertions in routing or accounting logic.


# Optional Collateral Contracts

How a borrower can pledge separate, liquidatable ERC-20 collateral to back a market.

Wildcat allows for a borrower to deploy one or more smart contracts holding assets that can be liquidated and transferred in to a specific Wildcat market should capital calls (withdrawal requests) not be honoured in the appropriate time frame. The intention here is to offer lenders a mechanism by which they can underwrite a credit opportunity by referring to backing assets visible on-chain.

While the 'default' behaviour of Wildcat is that markets are under/uncollateralized depending on the [reserve ratio/CRR](/using-wildcat/terminology#reserve-ratio) set on creation, making use of collateral contracts permits a market to be partially, fully or even *over*collateralised, in *any* ERC20 asset provided that there is a path to convert them to the underlying (base) asset of a Wildcat market.

This is distinct from the concept of a borrower 'over-repaying' assets to a market itself (i.e. transferring 1,000 USDC to a market where they only have 900 USDC in outstanding debt) - collateral contracts are defined in assets that are *different* to the asset being borrowed, such as depositing Wrapped Ether (WETH) as a pledge against a USDC credit line.

In the current version of collateral contracts, the assets pledged within a collateral contract are not deployed further to, for example, yield farm: rather, they sit 'in stasis' until the earlier of:\
\
a) the market being terminated (all outstanding debt is repaid), whereupon the borrower can withdraw the assets from the collateral contract, or\
\
b) the market enters penalised delinquency, whereupon the appropriate amount can be liquidated by an approved executor address into the underlying asset of the market and repaid.

#### Using Collateral Contracts As A Borrower

<figure><img src="/files/v5MCVwPmHROXbHSTOU9w" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/IHVgV41yYgT0LwzgFZQy" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/nRaje3rruizJJbJIfHGk" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/UGY4SawfcawzvH4OOC6O" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/QjeygmlYIGzFnHReUIOH" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/xkukk386sFOjVE7HJjhy" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/mMVcRVyLvt2cAF9Ztc2O" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/8HEZZbOVVcUF1ssNMQpp" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/y1U0D8AFfJdQaXwHTvqt" alt=""><figcaption></figcaption></figure>

#### Technical Details


# Market Access Via Policies/Hooks

How V2 hooks combine role providers, credentials, sanctions checks, allowlists and known-lender status to decide market access.

When you first encounter a Wildcat market, you will be prevented from depositing unless you meet certain requirements specified by the borrower, to make sure that they're not making use of funds sourced from Lazarus, or worse, Ripple enthusiasts.

The way that this worked in Wildcat V1 was that the borrower had to perform due diligence on each would-be lender that approached them and subsequently add their address to a controller contract via an on-chain transaction. This was a huge friction point, and one of the primary reasons we built V2.

Wildcat V2 abstracts this away by putting the `deposit` function behind a 'hook' (a piece of code that needs to succeed before access to the function is granted). We've built this in a way that borrowers can select arbitrary mechanisms tailored to their preferences, but the *most common* examples we expect to see are:

* Addresses that are not flagged as sanctioned by the Chainalysis sanctions oracle,
* Addresses that are members of a pre-determined set,
* Addresses that have some form of NFT or soulbound token testifying to their identity, and
* Addresses that have a credential testifying to off-chain circumstances.

The first example is the most accessible, and simply verifies whether or not the address applying for a credential is subject to a sanctions designation by the US, EU, UN and so forth, as provided by Chainalysis. Given that the entire protocol has defences against addresses flagged by Chainalysis (see [The Sentinel](/using-wildcat/day-to-day-usage/the-sentinel)), this category falls out naturally.

The second example is effectively the V1 model, but we didn't want to throw it in the bin: we just also didn't want it to be the *only* way that people could access Wildcat. We plan to evolve this slightly, however: if a borrower is an entity that has a significant number of OTC counterparties, Wildcat can look into deploy a hooks template which grants credentials by providing proof that your address is in the Merkle tree of that set.

The third example accounts for on-chain solutions such as [Coinbase Verifications](https://www.coinbase.com/en-gb/onchain-verify) and [Binance Account Bound Tokens](https://www.binance.com/en-GB/babt), assuming that the borrower is comfortable relying on these. In this case, access credentials are granted by signing a transaction that verifies that your address is in fact in possession of whatever is being sought out (i.e. an NFT in your wallet with a certain timestamp).

The fourth example is one that extends off-chain. Lenders may be required to upload KYC/KYB data to a third-party platform such as - for the sake of example - Netki, Fractal ID or Civic, in order to establish jurisdiction, extract evidence of accredited investor status and so on, and leverage a third-party wallet such as Privado or a ZK solution such as Keyring Network to relay that information onwards.

All of these are implemented via *role providers*, smart contracts deployed by the borrower that enforce the check, following a fairly loose specification: more on this in [Access Control Hooks](/technical-overview/security-developer-dives/hooks/access-control-hooks). For the most part, Wildcat will make templates for commonly requested use cases available so that it's simply point-and-click plus some initial configuration for the borrower, but borrowers *are* capable of writing their own Eldritch horror role providers and deploying them themselves, should the urge overtake them.

We'll be able to illustrate this in far more detail once we have some live policies and markets available, but the TL;DR is: in most cases, we expect you to be able to onboard yourself to Wildcat markets without ever having to reach out to a borrower via Telegram or email.

## How Multiple Role Providers Are Evaluated

For the shipped `AccessControlHooks` template, a hook instance owns the access decision and its approved role providers supply possible credentials. Providers are alternatives: one valid, unexpired credential from any provider which is still approved by that hook instance is sufficient. A lender does not need to pass every configured provider.

The hook first accepts an existing unexpired credential. If none exists, it can validate provider-specific data supplied with the transaction, refresh an expired credential from its pull provider, and then try the remaining approved pull providers. The first valid result is stored and access succeeds. If no provider yields a valid credential, the restricted action reverts.

Consequently, evidence that a wallet satisfies one provider is not enough to predict a particular deposit unless the evidence also identifies:

* the market and its hook instance;
* the hook template and whether deposit access checking is enabled;
* whether that provider is currently approved and its configured credential time-to-live;
* the wallet's stored credential or the provider result/proof needed to create one; and
* whether the hook instance has explicitly blocked the wallet from deposits.

Some providers can be queried on-chain by wallet address. Others validate data which must accompany the deposit transaction, and the underlying off-chain verification may not be public. In that case, public chain state alone cannot prove that the wallet will pass. Custom hook templates may impose different or cumulative rules; the alternative-provider behaviour described here belongs to Wildcat's shipped `AccessControlHooks` template.

Access is only one part of deposit execution. Even after the hook accepts the wallet, the transaction can still fail because of the underlying-token balance or allowance, remaining market capacity, or minimum-deposit setting.

## Credential Applicability/Durations

Depending on the way that a market is configured by a borrower, gaining a deposit credential for one market may simultaneously grant you access to other markets the same borrower has deployed. This is contingent on the markets having been deployed with the same policy tied to each, so it's worth checking if you're able to access more offerings by the same borrower.

When you have acquired a deposit credential granting you access to one or more Wildcat markets, it's worth noting that it may eventually expire, depending on whether or not the borrower has set a 'Time-To-Live' limit on it. This is to reduce the risk of an address being compromised and funds being deposited from an entity that is not the party which initially received the credential (unlikely as this may be). Credentials can be refreshed, assuming that the role provider that granted it is still tied to the market: borrowers can add and remove role providers from their access hook at will.

Note also that any address that received a credential and either (i) deposited while it was active or (ii) received market tokens from a third party while it was active is marked as a *known lender*. Known lenders permanently retain the ability to file withdrawal requests, so that a borrower is incapable of removing all role provider contracts from a market and erasing the ability for anyone to exit.


# The Sentinel

What's the worst that could happen?

We do not expect this to happen to any users of the protocol, but we have accounted for the potential that a lender address is added to a national sanctions list such as the OFAC SDN in a repeat of the Tornado Cash incident of August 2022.

The strict liability nature of transfers to and from addresses that have been tagged in such a manner means that we need to account for the potential for them to poison a entire market.

Here's how we've handled it:

### Lender Gets Sanctioned

In the event that a lender address is sanctioned, the sentinel contract deploys an escrow contract between the borrower of a market and the lender in question. This happens on the earlier of i) the lender attempting to make a withdrawal request, or ii) any party taps a `nukeFromOrbit` function present within market contracts that forces the sanctioned lender into a withdrawal request. Once that withdrawal expires, any claimable assets for their withdrawal request can be executed using the normal `executeWithdrawal` function.\
\
However, instead of the underlying assets being returned to the lender, they are instead transferred to the escrow contract. Assets within an escrow contract can be released to the lender via the `releaseEscrow` function in two cases:

* The lender address is no longer flagged as being sanctioned by the Chainalysis oracle, or
* The borrower involved in that particular escrow contract specifically overrides the sanction status via the `overrideSanction` function.

Note that this power cannot be randomly used to erase lenders from markets: the Chainalysis oracle must return true when asked if the lender address is sanctioned in order for the escrow contract to be created.

We do not believe that Wildcat protocol users are at risk of a simultaneous malicious exploit of the Chainalysis oracle and excision from a market as a result - in fact we do not expect `nukeFromOrbit` to ever actually be called - but it's better to be prepared.

### Borrower Gets Sanctioned

In the event that the *borrower* of a market is added to the Chainalysis oracle, any markets that they have deployed are immediately considered irreparably poisoned: *all* lenders will be affected by strict liability if they withdraw assets after the borrower repays assets back to the market after this point.

If this happens, the archcontroller is likely to sever the market - this means that while it will still operate normally, it will no longer show up on the UI (which queries the archcontroller for a list of which markets to display), and escrow contracts cannot be created for it.

You're going to want to speak to a lawyer in your jurisdiction if you're a lender to a market where this happens: we don't have a good answer in code for this, since it's fundamentally an off-chain issue.


# Protocol Usage Fees

There's no such thing as a free lunch.

Wildcat has the ability to charge fees for the usage of its markets.

Once a borrower is added to the global registry by the archcontroller, they can freely deploy markets with customizable parameters (e.g., capacity, withdrawal periods) and access-control hooks.

However, one parameter that borrowers cannot modify is the protocol fee. This fee can take one or both of the following forms:

#### Origination Fee:

* Paid during market deployment.

#### Streaming Fee:

* A percentage of the base APR that accrues over the supply of assets, rather than the market’s capacity. This does not accelerate the rebase of market tokens.

For example, if a borrower deploys a market with a 10% base APR and a 5% streaming protocol fee, the effective rate paid is 10.5%. Lenders still receive the full 10% APR, while the remaining 0.5% accrues to the protocol. Adjusting the base APR proportionally affects the protocol fee. For instance, lowering the base APR to 8% reduces the effective rate to 8.4%.

Protocol fees are not applied to penalty APRs. If a market with a 10% base APR incurs a 20% penalty APR, the total rate is 30.5% (10% + 0.5% + 20%), not 31.5%.

Protocol fees have seniority over lender claims within a market. When withdrawing reserves, lenders can only access the amount net of any accrued but unpaid protocol fees.

The archcontroller owner can adjust the fee configuration of active markets, with changes applied retroactively in V2 markets. For example, if a market launches with a 0% streaming fee and this is later increased to 5%, the new fee takes effect once the associated hook instance contract is updated. Origination fee adjustments do not apply to existing markets.

At the launch of Wildcat V2, the default fee was set at **5% streaming with no origination fee**. Streaming protocol fees are hard-capped at 10% of the base APR.


# Delinquency

What delinquency means and how it separately affects interest, liquidity, withdrawal payment and claim timing.

## Definition

Any given Wildcat market contains a *reserve ratio* that dictates what percentage of the assets that are currently being loaned must be available to be withdrawn at any given moment by lenders.

This ratio applies to the current *supply* of assets to the market. If a market exists that has a capacity of 10,000,000 USDC and a reserve ratio of 20%, the reserve ratio does not apply to that capacity figure unless the market is fully subscribed.

Rather, if the market has a supply of 4,000,000 USDC from lenders, then 800,000 USDC must be in reserve. The amount that a market requires in reserves inflates as interest accrues on a stable supply, since the market token and underlying asset are redeemable 1:1.

A market which has a zero percent reserve ratio need only worry about this to the extent that they need to monitor for withdrawal requests and keep sufficient assets available to cover the protocol fee, if the latter is active.

A market that goes below the reserve ratio - however it does so - is *delinquent*.

## What Delinquency Changes For A Queued Withdrawal

Delinquency does not cancel a withdrawal request, change its place in the queue or reset its configured cycle expiry. It does show that the market currently holds less than its collateral obligation, which includes pending and processed withdrawals as well as ordinary reserve requirements and accrued protocol fees.

The effects must be read separately:

* **Interest:** an amount placed into a withdrawal batch stops earning interest from the start of that batch's cycle. Market tokens which remain outside the request continue to rebase. If delinquency persists beyond the grace period, penalty APR applies to the outstanding lender supply, not to underlying assets already allocated to the unclaimed withdrawals pool.
* **Payment and liquidity:** the request remains valid, but a liquidity shortfall may leave its batch partly or wholly unfunded. Returned liquidity is applied to older expired withdrawal batches before newer ones. Delinquency itself neither funds a batch nor moves one lender ahead of another.
* **Claim timing:** cycle expiry makes the batch eligible for settlement; it does not guarantee full payment. The lender can claim the funded portion after expiry. Any remainder stays queued until additional liquidity is supplied and processed.

The live delinquency status therefore cannot, by itself, establish a lender's claimable amount. That requires the market's withdrawal-batch state and the lender's position within those batches.

## Related Market Parameters

As well as the reserve ratio, another two parameters are provided when creating a Wildcat market:

* **The grace period**: the time (measured in seconds) that a market is permitted to be delinquent for without adverse effects, and
* **The penalty APR**: the interest rate that applies over and above the base market APR and protocol fee (if present) in the event that a market stays delinquent for longer than the grace period.

## How Delinquency Triggers

Associated with each market is an internal number called the '*grace tracker*' - this is a number that starts counting up from zero after the block in which a market becomes delinquent, and back down towards zero after the block in which a market is cured of its delinquency.

The penalty APR associated with a market activates once the grace tracker exceeds the grace period, and remains active until it drops below the same. To illustrate:

* A market with a 5 day grace period becomes delinquent for the first time, and the grace tracker begins counting up from zero.
* The borrower takes 7 days to cure the market of its delinquency.
* Once the delinquency is cured, the market calculates that 2 days of penalty APR must be applied and adjusts the scaling factor of market tokens accordingly.
* The grace tracker counts back down to zero from this point - subsequent market state updates will detect when the tracker drops below the market grace period and adjust scaling factors appropriately.
* A total of **4** days of penalty APR will be applied in total: the failure of a market to update its state in a timely fashion as the tracker drops below the grace period does *not* adversely impact the borrower.

## Unclaimed/Pending Withdrawals & Delinquency

Tthe reserve ratio of a market can be temporarily raised depending on the amount of assets that are either earmarked for withdrawal by a lender, or are part of a pending withdrawal request.

When a lender burns market tokens in order to request a withdrawal of assets they have deposited in a market, any reserves that exist within the market are removed from the market supply. Consider the following:

* A market with a supply of 1,000,000 USDC has a reserve ratio of 20%, and currently holds 250,000 USDC in reserves (current reserve ratio 25%).
* A lender makes a request to withdraw 200,000 USDC, burning 200,000 market tokens to move 200,000 USDC of the reserves into the unclaimed withdrawals pool, and reducing the supply by the same amount.
* The market now has 50,000 USDC in reserves against a supply of 800,000 USDC. This means that the new reserve ratio is 6.25%, and the market is immediately delinquent.
* The borrower needs to return 110,000 USDC to the market reserves in order to cure the delinquency.

More particularly, any withdrawal request that exceeds the reserves currently in a market temporarily forces the reserve ratio upwards. To illustrate:

* A market with a supply of 1,000,000 USDC has a reserve ratio of 20%, and currently holds 250,000 USDC in reserves (current reserve ratio 25%).
* A lender makes a request to withdraw 400,000 USDC, burning 250,000 market tokens to move 250,000 USDC of the reserves into the unclaimed withdrawals pool and generating a pending withdrawal of the remaining 150,000 USDC. The reserve ratio of the market is immediately 0%.
* The supply of the market is reduced by the 250,000 that was moved into unclaimed withdrawals, rather than the full 400,000 requested.
* Pending withdrawals must be 100% collateralised by a market, with the standard reserve ratio of the market applying to the *remainder* of the supply. In this case, then, the amount of reserves that the market must hold is (150,000 \* 1) + (600,000 \* 0.2) = 270,000 USDC.
* Against a supply of 750,000 USDC, this means that the temporary reserve ratio is 36% rather than the 20% we would 'expect' to see against the remaining supply: the market will remain delinquent until this 36% has been met.
* Pending withdrawals - and their impact on the reserve ratio of a market - remain in place until the lender is capable of burning market tokens in order to reclaim their loaned assets.

\[*The above includes one mild simplification: as stated in* [*Protocol Usage Fees*](/using-wildcat/protocol-usage-fees)*, lenders are only capable of withdrawing reserves net of any protocol fees that have been accrued and not withdrawn. However, the overall point remains.*]

The astute borrower of a market will actively monitor withdrawal requests and current reserve ratios in order to minimise the time for which the grace tracker is active to avoid paying penalties.


# Wildcat Market CSV Exporter

Downloadable Agent Skill for ChatGPT and Claude which exports, verifies and analyses a Wildcat market's complete on-chain history.

The **Wildcat Market CSV Exporter is a downloadable Agent Skill for ChatGPT and Claude**. It is not a feature built into the Wildcat app.

Give the agent the Ethereum mainnet address of a Wildcat market and it reconstructs the market's history at a fixed snapshot block. The standard export contains:

* A transaction ledger covering deposits, borrowing, repayments, queued and executed withdrawals, fees and other underlying-asset movements
* A row-by-row record of every decoded market event
* A quarantine file for unrelated or potentially malicious token transfers which would otherwise pollute the market's explorer history

The skill can also produce lender position reports. These split withdrawals and lender-to-lender transfers between principal and interest under FIFO, LIFO and pro-rata accounting conventions.

{% file src="/files/t6xw7YqH7GahhzsyTmIK" %}

The standard files are `<SYMBOL>_transactions.csv`, `<SYMBOL>_events.csv` and `<SYMBOL>_spam_token_transfers_excluded.csv`. Position analysis adds `<SYMBOL>_interest_allocations_<method>.csv`, with one row per executed withdrawal or lender transfer, and `<SYMBOL>_position_analytics_<method>.csv`, with one row per lender.

## How the Export Is Built

No single source contains the complete history. The skill joins three:

1. Archive-node `eth_getLogs` results provide every event emitted by the market, including transactions routed through intermediary contracts which do not appear in an explorer's direct account history.
2. Etherscan's transaction list adds failed or reverted direct transactions, which emit no logs, and supplies readable method names.
3. Etherscan's token-transfer list adds movements of the underlying asset which have no matching market event, including direct transfers and excess assets returned when a market closes.

Transfers emitted by unrelated token contracts are kept out of the ledger. Scam airdrops can mention the market address and imitate very large stablecoin movements, so the skill writes those records to the separate quarantine CSV instead.

The fetch is resumable. It caches raw results and log-scan checkpoints, so an interrupted run can continue without starting again from the deployment block.

## What the Verification Proves

The export is checked against data fetched independently of the original reconstruction. The verifier compares the event history with Etherscan's logs API, checks a sample of transaction receipts and reads contract state at the same snapshot block.

The central invariant is exact, not approximate:

`deposited + repaid + untracked_asset_in - borrowed - withdrawal_executed - fees_collected - escrowed_out - untracked_asset_out = balanceOf(market)`

Queued withdrawals are deliberately absent from the outflow side. Queueing creates a claim but does not send cash out of the market; the asset leaves only when the withdrawal executes. The verifier requires the ledger's resulting balance to equal the underlying token's on-chain `balanceOf(market)` in raw integer units.

The skill does not deliver an export if these checks fail. A stale cache, an RPC endpoint without archive data or a newly introduced event which the exporter does not yet understand all require investigation rather than an accounting guess.

## Lender Principal and Interest

Wildcat market tokens rebase as interest accrues. A lender's visible token balance therefore blends deposited principal with accrued interest, while the contract tracks scaled units beneath it. The chain records the position and its value, but it does not record which historical deposit should count as the principal disposed of when a lender transfers tokens or requests a withdrawal.

FIFO, LIFO and pro-rata answer that reporting question differently:

| Method   | Principal selected when scaled units leave a position                                      |
| -------- | ------------------------------------------------------------------------------------------ |
| FIFO     | The oldest acquired units are used first                                                   |
| LIFO     | The newest acquired units are used first                                                   |
| Pro-rata | Principal is taken from the blended position in proportion to the scaled units disposed of |

These are accounting conventions applied by the report, not facts asserted by the contract and not tax advice. If no method has been chosen, the skill runs all three so the effect of the policy is visible.

### A Worked Example

Suppose a lender makes two deposits into the same market:

1. They deposit 100 USDC when the scale factor is 1.0 and receive 100 scaled units. That lot has 100 USDC of principal.
2. Later, when the scale factor is 1.5, they deposit 150 USDC and receive another 100 scaled units. That lot has 150 USDC of principal.

When the scale factor reaches 2.0, the lender holds 200 scaled units worth 400 USDC. Their total principal is 250 USDC and their total accrued interest is 150 USDC.

They then queue 100 scaled units. Assume the batch is fully funded at that point and later pays 200 USDC. The three methods split the same payout as follows:

| Method   | Principal returned | Interest realised | Principal left active | Unrealised interest left active |
| -------- | -----------------: | ----------------: | --------------------: | ------------------------------: |
| FIFO     |           100 USDC |          100 USDC |              150 USDC |                         50 USDC |
| LIFO     |           150 USDC |           50 USDC |              100 USDC |                        100 USDC |
| Pro-rata |           125 USDC |           75 USDC |              125 USDC |                         75 USDC |

Nothing economic changes between the rows. In every case the lender has earned 150 USDC in total: the method only moves that amount between realised interest on the payout and unrealised interest in the remaining position.

The implementation performs this calculation in raw token units. When a partial lot must be split, integer rounding stays in the remaining lot so the principal identity continues to reconcile exactly.

## Queued Withdrawals

Queueing a withdrawal moves the chosen scaled units and their allocated principal out of the lender's active lots and into a pending claim. It does **not** realise principal or interest, because the lender has not received any underlying asset.

A batch can contain both funded and unfunded value:

* The funded, unclaimed part has been set aside in the unclaimed-withdrawals pool. It no longer accrues interest.
* The unfunded part remains a scaled claim. Its value continues to grow with the market's scale factor until those scaled units are burned by a batch payment.

If the batch is funded or claimed in stages, the skill allocates principal cumulatively. Each executed payment receives its proportion of the claim's original principal; the remainder stays pending. Interest becomes cash-realised only when `WithdrawalExecuted` records the payout.

This distinction also matters in the transaction ledger: `withdrawal_queued` records the claim, while `withdrawal_executed` records the underlying asset leaving the market.

## Transfers Between Lenders

For the sender, a transfer is another disposal of scaled units. FIFO, LIFO or pro-rata selects the principal attached to those units, and the difference between their market-token value and that principal is reported as `transfer_interest`.

That figure is economic value embodied in the transfer, not cash received by the sender. The recipient starts a new lot with principal basis equal to the market-token value at the time of transfer; they do not inherit the sender's historical basis.

## Realised and Unrealised Interest

The position report separates earnings into four places:

* `cash_realized_interest`: interest included in executed withdrawal payments
* `transfer_interest`: interest included in market tokens sent to another lender
* `active_unrealized_interest`: current on-chain value of active market tokens less their remaining principal
* `pending_unrealized_interest`: current value of queued claims less their remaining principal

The spelling of the CSV field names follows the scripts. In the report's accounting, only an executed withdrawal produces cash-realised interest. A transfer is shown separately, and a queued claim remains unrealised until paid.

## Position Checks

For delivered analytics, the skill reads `balanceOf`, `scaledBalanceOf` and `currentState` at the export's pinned snapshot block. It refuses to write the reports if the event-by-event walk does not reproduce a lender's on-chain scaled balance.

The interest verifier then checks every result in raw units:

* Every disposal satisfies `value = allocated principal + allocated interest`.
* Every lender satisfies `deposits + transfer basis in = active principal + pending principal + cash principal returned + principal transferred out`.
* Total economic earnings equal cash-realised interest, transfer interest, active unrealised interest and pending unrealised interest added together.
* Disposal rows roll up exactly to the corresponding position totals.
* Every allocated address has one position summary produced from snapshot RPC data.
* Total economic earnings are identical under FIFO, LIFO and pro-rata, even though the realised and unrealised split differs.

Offline estimates are useful for test fixtures, but the skill does not accept them for an accounting, audit or other delivered result.

## Using the Files

The standard transaction and event CSVs are an independently checked protocol history, not a finished annual accounting statement. The optional position files add a transparent cost-basis convention, but they remain reports derived from on-chain records rather than certified financial or tax accounts.

Once the CSVs exist, Fable or Sol can help derive further reports such as annual borrowing and repayment figures. Anything used for formal reporting may still need review by an accountant or another suitable provider, with the chosen FIFO, LIFO or pro-rata convention stated explicitly.

## Requirements

The skill needs Python 3.10 or later, an Ethereum archive-node RPC endpoint and an Etherscan API key.

If those last two are new to you:

* `RPC_URL` is the URL the skill uses to read Ethereum data. [Alchemy](https://www.alchemy.com/docs/what-is-archive-data-on-ethereum) is one place to create an Ethereum mainnet endpoint with archive access. Other providers are fine, but check that the endpoint serves historical archive data rather than current state alone.
* `ETHERSCAN_API_KEY` lets the exporter request transaction and contract data from Etherscan. Create an Etherscan account, then add a key from its API Dashboard by following the [Etherscan getting-started guide](https://docs.etherscan.io/getting-started).

They are separate credentials. Put the RPC URL in `RPC_URL` and the Etherscan key in `ETHERSCAN_API_KEY` within a local `.env` file. Never commit that file or include either value in an exported CSV.


# Telegram Notification Bot

How to use the Wildcat Telegram Bot

Wildcat operates a Telegram bot that delivers notifications for onchain market events. It allows you to subscribe to a given market, borrower, lender or chain.

## Getting Started

You can find the bot here: <https://t.me/wildcat_notifications_bot>

Once you've accepted the disclaimer, you will be greeted with a welcome message along with the latest updatelog. You can also send `/help` at any time for the full command reference.

The most common usage would be subscribing to all mainnet markets by typing:

```
/subscribe mainnet *
```

or a lender wanting notifications on markets they subscribe to:

```
/subscribe mainnet lender <lenderAddress>
```

## Subscribing to Markets

The bot supports three subscription modes, each of which can be scoped to a specific chain.

### Single Market

Subscribe to events for one specific market by address:

```
/subscribe <marketAddress>
/subscribe <chain> <marketAddress>
```

If you omit the chain, mainnet will be defaulted. The `address` is the market contract address that you would see in the Wildcat UI or on a block explorer.

### Borrower

Subscribe to *all* current and future markets deployed by a given borrower:

```
/subscribe borrower <borrowerAddress>
/subscribe <chain> borrower <borrowerAddress>
```

### Lender

Subscribe to all current and future markets where a given address is an active lender:

```
/subscribe lender <lenderAddress>
/subscribe <chain> lender <lenderAddress>
```

### Full Chain

Subscribe to every market on an entire chain:

```
/subscribe <chain> *
```

With this you'll receive notifications for all market activity on that chain. The chains currently supported are Ethereum Mainnet, Sepolia, Plasma Mainnet and Plasma Testnet.

As with borrower subscriptions, new markets are automatically picked up via periodic discovery.

## Unsubscribing

Unsubscribing mirrors the subscribe syntax:

```
/unsubscribe <marketAddress>
/unsubscribe <chain> <marketAddress>
/unsubscribe borrower <borrowerAddress>
/unsubscribe <chain> borrower <borrowerAddress>
/unsubscribe lender <lenderAddress>
/unsubscribe <chain> lender <lenderAddress>
/unsubscribe lender *
/unsubscribe <chain> lender *
/unsubscribe *
```

The wildcard `/unsubscribe *` removes *all* of your subscriptions across every chain (including borrower/market specific subs).

## What Gets Notified

We currently watch all market events and then cull a few of the noisy/unnecessary ones. The list below is the active set of events we monitor and in future this may become user-driven in terms of which events you're interested in seeing.

* **Deposits** and **withdrawals**
* **Borrows** and **debt repayments**
* **Interest rate changes** (`AnnualInterestBipsUpdated`) — shown with the effective borrower and lender APRs
* **Reserve ratio changes** (`ReserveRatioBipsUpdated`)
* **Max total supply updates**
* **Market closures**
* **Withdrawal batch lifecycle**
* **Delinquency transitions**

Events from the same transaction are grouped together, so a single notification might read something like:

> *Interest rate / Reserve ratio updated on USDC Market Alpha: effective APR borrower 12.50%, lender 11.88%, reserve ratio 20.00% |* [*tx*](file:///)

## Checking Bot Status

```
/status
```

This command will provide some information on the current state such as uptime, active chains, number of watchers, subscription counts, and the size of the event allowlist. Useful for checking that the bot is alive and watching what you expect.

## Command Reference

| Command                                   | Description                                                               |
| ----------------------------------------- | ------------------------------------------------------------------------- |
| `/start`                                  | Show disclaimer (first use) or welcome message                            |
| `/help`                                   | Display the full command list                                             |
| `/subscribe <address>`                    | Subscribe to a market on the default chain                                |
| `/subscribe <chain> <address>`            | Subscribe to a market on a specific chain                                 |
| `/subscribe borrower <address>`           | Subscribe to all markets by a borrower (default chain)                    |
| `/subscribe <chain> borrower <address>`   | Subscribe to all markets by a borrower on a specific chain                |
| `/subscribe lender <address>`             | Subscribe to all markets where an address is a lender (default chain)     |
| `/subscribe <chain> lender <address>`     | Subscribe to all markets where an address is a lender on a specific chain |
| `/subscribe <chain> *`                    | Subscribe to all markets on a chain                                       |
| `/unsubscribe <address>`                  | Unsubscribe from a market                                                 |
| `/unsubscribe <chain> <address>`          | Unsubscribe from a market on a specific chain                             |
| `/unsubscribe borrower <address>`         | Unsubscribe from a borrower                                               |
| `/unsubscribe <chain> borrower <address>` | Unsubscribe from a borrower on a specific chain                           |
| `/unsubscribe lender <address>`           | Unsubscribe from a lender                                                 |
| `/unsubscribe <chain> lender <address>`   | Unsubscribe from a lender on a specific chain                             |
| `/unsubscribe lender *`                   | Unsubscribe from your own lender subscription                             |
| `/unsubscribe <chain> lender *`           | Unsubscribe from your own lender subscription on a specific chain         |
| `/unsubscribe *`                          | Remove all subscriptions                                                  |
| `/list`                                   | List active subscriptions                                                 |
| `/status`                                 | Show bot operational status                                               |


# Security/Developer Dives

Auditor-oriented explainers of how the Wildcat V2 components work.

This page contains a handful of explainers that we have produced for the sake of auditors describing the various components of Wildcat V2 and how they work.

You might find the contents useful if you're taking part in a Code4rena review or validating an issue for an Immunefi submission, but otherwise you might have A Bad Time.

Nonetheless, here you go:

\
[The Scale Factor](/technical-overview/security-developer-dives/the-scale-factor)
---------------------------------------------------------------------------------

## [Core Behaviour](/technical-overview/security-developer-dives/core-behaviour)

## [V1 -> V2 Changelog](/technical-overview/security-developer-dives/v1-greater-than-v2-changelog)

## [Known Issues](/technical-overview/security-developer-dives/known-issues)

## [Hooks](/technical-overview/security-developer-dives/hooks)

### [How Hooks Work](/technical-overview/security-developer-dives/hooks/how-hooks-work)

### [Access Control Hooks](/technical-overview/security-developer-dives/hooks/access-control-hooks)


# The Scale Factor

Scaled vs market token amounts and the scaleFactor (a ray) that rebases market tokens with interest.

We get a lot of questions about the scaling mechanics and want to be thorough, but here's the condensed version:

* Wildcat markets have *scaled token amounts* and *market token amounts*, where scaled tokens represent shares in the market that only change upon deposit or withdrawal, and market tokens represent debt owed by the borrower in units of the base asset.
* The *scale factor* is the ratio between scaled and market token amounts. 1 wTKN is worth `1 * scaleFactor` TKN.
* The scale factor constantly grows with interest, causing the market token to rebase as debt accrues.
* All the standard market functions (`balanceOf`, `totalSupply`, `transfer`, `deposit`, `withdraw`, etc.) use *market token amounts*.
* The scaled query functions (`scaledBalanceOf`, `scaledTotalSupply`) return *scaled token amounts*, equivalent to market shares.

## Relevant Code

In Wildcat, the scale factor is stored as a ray value, meaning it has a base unit of 1e27, so 1.1e27 is 1.1.

The [MathUtils](https://github.com/wildcat-finance/v2-protocol/blob/src/libraries/MathUtils.sol) library contains the math functions for dividing/multiplying ray values.

## Scaled Tokens

A key component of the Wildcat contracts is the scale factor and scaled token amounts - it's crucial to all of the protocol's behavior and should be understood before diving into the codebase. If you're already familiar with Aave, our scaling works the same way as aTokens, so you can skip this page; otherwise, there are a few ways to think of scaling, but the best is probably by analogy to token vaults.

### Typical Token Vaults

Suppose we have an [ERC4626](https://eips.ethereum.org/EIPS/eip-4626#methods) vault called VUSDC which holds USDC. The vault is itself a token where 1 VUSDC is 1 share of ownership in the USDC held by the vault. The vault has 100 shares (`VUSDC.totalSupply() = 100`) and holds 200 USDC (`VUSDC.totalAssets() = 200`), so every 1 VUSDC is convertible to 2 USDC.

Alice owns 10 VUSDC `VUSDC.balanceOf(alice) = 10`. To get the amount of USDC her shares can be converted to, we'd call `VUSDC.convertToAssets(10) = 20`. If the vault receives another 100 USDC, Alice still has 10 shares, but now `convertToAssets(10)` will return 30, because the ratio of USDC to VUSDC has increased by 50%.

So in a typical vault, you have shares which are your balance in the vault and you have assets which your shares are convertible to, where the "assets" are always the actual assets held by the vault at a given point in time (or the convertible value of assets held by the vault, if they're wrapped in a secondary token). Pretty simple.

### Wildcat Markets

Wildcat's scaling mechanism works in a similar way, except that Wildcat market tokens represent the *value* of shares rather than the *number* of shares, and Wildcat markets constantly rebase with interest.

#### **Scaled Token Amounts**

The first important distinction is that in Wildcat markets, *market tokens* (the values reported when using the ERC20 functions `balanceOf`, `totalSupply` on a market) represent the *value* of shares rather than the number of shares, and *scaled tokens* represent the number of shares.

We also refer to market token amounts as "normalized" amounts, as they have been converted to units that always relate 1:1 to amounts of underlying assets.

Using numbers from the previous example and swapping VUSDC for WUSDC, when the market has 100 shares and 200 USDC:

Alice has 10 out of 100 scaled tokens (shares):

```
WUSDC.scaledBalanceOf(alice) = 10
WUSDC.scaledTotalSupply() = 100
```

But she has 20 out of 200 normalized tokens (asset value):

```
WUSDC.balanceOf(alice) = 20
WUSDC.totalSupply() = 200
```

> Notice that so far, `WUSDC.balanceOf(alice)` for a Wildcat market is equivalent to `VUSDC.convertToAssets(VUSDC.balanceOf(account))` for an ERC4626.

#### **Rebasing With Interest**

The second important distinction is that Wildcat markets constantly rebase with interest, and markets do not always hold all of the assets that shares are worth.

An ERC4626 would typically hold all of its underlying assets in some liquid form, meaning Alice can always burn her 1 VUSDC and immediately receive 2 USDC back. `VUSDC.totalAssets()` will always report the amount of USDC that the vault is worth, and that is always equivalent to the amount of USDC that it has immediate access to (for the sake of this comparison).\
\
`ERC4626.convertToAssets(shares)` is just `shares * totalAssets / totalShares`.

Wildcat markets are uncollateralised lending markets, which adds two other factors to this equation:

* Interest is always accruing from the borrower. 1 WUSDC in block `n` is worth more than 1 WUSDC in block `n - 1`, even though the market contract has not received any more USDC.
* The market may not always have the assets that shares are worth in a liquid form, both because the underlying assets can be borrowed and because the constant interest accrual is always increasing the borrower's debt. This makes `totalAssets` useless for determining the value of 1 WUSDC.

The way this is handled is with the `scaleFactor` - the ratio between the number of shares and the amount of underlying assets that shares are worth (but not necessarily instantly redeemable for). Every time the market is updated for the first time in a block, the scale factor is multiplied by the amount of interest that has accrued since the last update (Wildcat interest rates are auto-compounding).

To mint market tokens, lenders use the deposit function, which takes a normalized (underlying) token amount that the lender wants to transfer. This is divided by the `scaleFactor`, yielding the number of scaled tokens / shares they have minted.

Similarly, when a lender withdraws an amount of their market tokens, they must burn `scaledAmountToBurn = normalizedAmount / scaleFactor`.

The result of all of this is that the market token represents *the amount of debt owed by the borrower at a given point in time*, and is thus a measure of an eventual amount of underlying tokens assuming the borrower repays their debts. It does not measure the shares owned by an account or the amount of underlying assets those shares are instantly redeemable for.

Just to reiterate the terminology here:

* The scale factor is the ratio of debt owed by the borrower to shares in the market. If the scaleFactor is 2, 1 scaled token equals 2 market tokens.
* "Normalized amount" is any amount denominated in units of the base asset (e.g. USDC). All market functions that use token amounts (other than `scaledBalanceOf, scaledTotalSupply`) use normalized amounts.
* "Market tokens" are normalized amounts of scaled tokens, and represent the underlying assets the borrower is obligated to eventually repay
* `scaleAmount(x)` divides a normalized amount `x` by the scale factor
* `normalizeAmount(x)` multiplies a scaled amount `x` by the scale factor

## **Basic Example**

1. Bob deposits 100 TKN into the Wildcat market wTKN which has an annual interest rate of 10% as soon as the market is created (T1):
   * scaleFactor = 1
   * scaledBalanceOf(bob) = 100
   * balanceOf(bob) = scaledBalanceOf(bob) \* scaleFactor = 100
   * scaledTotalSupply = 100
   * totalSupply = (scaledTotalSupply \* scaleFactor) = 100<br>
2. We update the market after half a year (T2):
   * scaleFactor = previousScaleFactor \_ (1 + APR \_ timeElapsed / oneYear) = 1.05
   * scaledBalanceOf(bob) = 100
   * balanceOf(bob) = scaledBalanceOf(bob) \* scaleFactor = 105
   * scaledTotalSupply = 100
   * totalSupply = (scaledTotalSupply \* scaleFactor) = 105<br>
3. In the same block, Alice deposits 210 TKN (T3):
   * scaleFactor = 1.05
   * scaledBalanceOf(bob) = 100
   * balanceOf(bob) = 105
   * scaledBalanceOf(alice) = deposit / scaleFactor = 210 / 1.05 = 200
   * balanceOf(alice) = scaledBalanceOf(alice) \* scaleFactor = 210
   * scaledTotalSupply = 300
   * totalSupply = (scaledTotalSupply \* scaleFactor) = 315<br>
4. After another half a year, we update the market again (T4):
   * scaleFactor = previousScaleFactor \_ (1 + APR \_ timeElapsed / oneYear) = 1.1025
   * scaledBalanceOf(bob) = 100
   * balanceOf(bob) = scaledBalanceOf(bob) \* scaleFactor = 110.25
   * scaledBalanceOf(alice) = 200
   * balanceOf(alice) = scaledBalanceOf(alice) \* scaleFactor = 220.50
   * scaledTotalSupply = 300
   * totalSupply = (scaledTotalSupply \* scaleFactor) = 330.75


# Core Behaviour

How a market operates internally: configuration, collateral obligation, interest accrual, state updates and the withdrawal batch lifecycle.

This section contains the most important aspects of how a Wildcat market operates.

Make sure you understand the [scale factor](/technical-overview/security-developer-dives/the-scale-factor) before continuing.

## Market Configuration

Markets are configured with the following values:

* `asset` - The underlying asset for the market
* `name` - The name of the market (borrower-provided prefix + asset name)
* `symbol` - The symbol of the market (borrower-provided prefix + asset symbol)
* `borrower` - Address allowed to borrow from and make changes to the market
* `feeRecipient` - Recipient of protocol fees
* `sentinel` - Chainalysis wrapper determining whether accounts are sanctioned
* `maxTotalSupply` - The `totalSupply` at which the market will stop accepting withdrawals
* `protocolFeeBips` - A fraction of `annualInterestBips` which accrues to the protocol (in excess of the rate paid to lenders, not subtracted from it). This is not affected by delinquency fees.
* `annualInterestBips` - The base interest rate set by the borrower. Accrues solely to lenders.
* `delinquencyFeeBips` - Penalty fee added to the interest rate when the borrower is delinquent for too long. . Accrues solely to lenders.
* `withdrawalBatchDuration` - The length of a withdrawal cycle.
* `reserveRatioBips` - The fraction of outstanding debt which the borrower is obligated to keep in liquid reserves.
* `delinquencyGracePeriod` - The amount of time a borrower has before incurring penalties for a delinquent market.
* `archController` - Registry for factory/controller/market deployments.
* `sphereXEngine` - Engine for SphereX integration which does security checks on transactions.
* `hooks` - The market's hooks policy and the address of the hooks instance.

## Basic Market Behavior

### Collateral Obligation

Not all market tokens have the same collateral requirements attached. Tokens which are in pending withdrawals (current or unpaid expired batches) must be covered 100% by the borrower with underlying assets as soon as they enter a withdrawal batch, while tokens which are not pending withdrawal only need to be covered at the reserve ratio. We call the portion of the market's total supply which is not pending withdrawal the *outstanding supply*.

Aside from market tokens, there are two other contributors to the collateral obligation: unclaimed protocol fees and unclaimed withdrawals. The latter are no longer associated with market tokens as they represent tokens that have already been paid for, burned and subtracted from the total supply; however, because lenders do not receive their withdrawals until they claim them via `executeWithdrawal`, the assets that have been set aside for withdrawals must remain in the market and so increase the collateral requirement for the market. This effectively just reduces the `totalAssets` the market sees as being available, as these assets do not cause the borrower to incur any additional interest payments or fees. See the section on withdrawals for further details.

The total collateral obligation that a borrower is required to maintain in the market (`state.liquidityRequired()`) is the sum of:

* 100% of all pending (unpaid) withdrawals
* 100% of all unclaimed (paid) withdrawals
* reserve ratio times the outstanding supply
* accrued protocol fees

```
state.normalizeAmount(state.scaledPendingWithdrawals)
+ state.normalizedUnclaimedWithdrawals
+ state.normalizeAmount(
    state.scaledTotalSupply - state.scaledPendingWithdrawals
).bipMul(state.reserveRatioBips)
+ state.accruedProtocolFees
```

### **Delinquency**

Whenever a market has less total assets than its minimum collateral obligation, the borrower is considered delinquent (`state.isDelinquent`). For every second the borrower remains delinquent, a timer (`state.timeDelinquent`) increments. For every second the market is in a healthy state, the timer decrements.

For every second that the market spends with its delinquency timer above the grace period, the delinquency fee is applied to the interest rate.

This system results in the borrower being penalized for two seconds for every second they allow `timeDelinquent` to exceed the grace period: once on the way up while the market is delinquent, and once on the way down when the market is healthy.

### Interest Rates

Borrowers pay interest based on three rates, all of which are denominated in annual bips (1 = 0.01%):

* `annualInterestBips` - The base interest rate set by the borrower. Accrues solely to lenders.
* `delinquencyFeeBips` - An additional fee added to the base interest rate whenever the borrower is in penalized delinquency. Accrues solely to lenders.
* `protocolFeeBips` - A fraction of `annualInterestBips` which accrues to the protocol (in excess of the rate paid to lenders, not extracted from it). This is not affected by delinquency fees.

Every state update, the sum of these rates is applied to the current `scaleFactor` (with the delinquency fee only being applied for the number of seconds the market was in penalized delinquency), compounding the market's interest.

### State Update

At the start of every stateful external function on a market which is the first such transaction in a block, a state update occurs to bring the market state up-to-date.

The basic state update sequence is:

1. Accrues the base interest rate and protocol fees, as well as the delinquency fee for any seconds since the last update during which the market was in [penalized delinquency](https://github.com/wildcat-finance/v2-protocol/blob/main/docs/Core%20Behavior.md#delinquency)
2. Updates the delinquency timer, increasing if the previous state was delinquent and decreasing if it was not (to a minimum of zero).
3. Applies any available liquidity to the pending withdrawal batch if there is one.

If, at the start of the transaction, the current pending withdrawal batch has expired, the state update will be split into two iterations of the above sequence:

* The first will use the last update time as the start date and the withdrawal batch expiry as the end date, and it will handle [batch expiry](https://github.com/wildcat-finance/v2-protocol/blob/main/docs/Core%20Behavior.md#withdrawal-expiry--priority) in the third step after reserving available liquidity.
  * This ensures that the borrower does not pay interest on withdrawals that can be retroactively paid off at the time of expiry.
* The second will use the expiry as the start date and the current time as the end date.

### Withdrawals

Withdrawal batches group together withdrawal requests from multiple lenders over a period of time (the `withdrawalBatchDuration` parameter) to ensure a fair distribution of available assets when a market is insufficiently liquid to fully honor all withdrawals in a batch.

When a lender requests a withdrawal, they will be entered into the current withdrawal batch if one exists; otherwise, a new one will be created.

From the time a withdrawal batch is created until the time it expires, new lenders may enter the batch by creating a withdrawal request. At the time of the request, the lender is credited for the scaled token amount their withdrawal is equivalent to, giving them pro-rata ownership of the batch according to that scaled amount. These scaled tokens are removed from the lender's balance, but the total supply is only reduced upon payment.

Withdrawal *execution*, or the claiming of paid withdrawals, is only possible after expiry.

Withdrawal batches can be in one of three states:

* Current: The batch represented by `state.pendingWithdrawalExpiry`. Can be added to by lenders until it expires.
  * Note: The "current" batch can also be expired until the state update function is executed and converts it to an unpaid or paid batch.
* Unpaid: A batch which has expired without sufficient assets to cover all withdrawals.
* Paid: A batch which has been fully paid off.
  * Note: "paid off" means that assets are reserved and available for execution, not necessarily that all the withdrawals have been executed.

### **Withdrawal Expiry & Priority**

If a batch expires without sufficient assets to cover all requests in it, it is moved into a first-in-first-out queue of "unpaid" batches. Earlier withdrawal batches receive priority over newer batches for payment, but lenders within the same batch have a pro-rata claim to the underlying assets allocated to it regardless of the order of their requests.

When a withdrawal batch expires, the liquidity which can immediately be reserved to pay it off is equal to the market's total assets minus the *unavailable* assets, which is the sum of:

* unclaimed (paid) withdrawals (`state.normalizedUnclaimedWithdrawals`)
* previous unpaid withdrawals (`state.scaledPendingWithdrawals - batch.scaledOwedAmount`)
* unclaimed protocol fees (`state.accruedProtocolFees`)

Note that while earlier batches receive priority, **this does not mean they always actually get paid first**. When a current batch expires, it can be fully paid off even if there are currently unpaid withdrawal batches in the queue, but only provided that the market has sufficient assets available to cover both. Once a batch is marked as unpaid, it can not have assets reserved for it until all previous unpaid batches are processed.

> Note: Skipping over unpaid batches is allowed for expiring batches because it is trivial to calculate the sum of previous withdrawals as the current batch expires, but doing so for a batch in the middle of the unpaid queue would be much more costly.

### **Withdrawal Payment**

The scaled tokens associated with a withdrawal request are subtracted from a lender's balance immediately, but those tokens are not *burned* until they are honored, meaning they only stop accruing interest once underlying assets have been reserved to pay for them. The batch owns these scaled tokens and accrues their interest until they are burned by a payment, and the interest is distributed pro-rata to the lenders in the batch.

As assets become available, they can be paid to the withdrawal batch. A check for (and payment of) available assets occurs:

* when a lender adds a request to a batch,
* during the state update at the start of a transaction (for the current batch but not for unpaid (already expired) batches),
* upon a call to `repayAndProcessUnpaidWithdrawalBatches` (for unpaid batches).

Once an amount of underlying assets is paid to the batch, the corresponding scaled amount is actually burned: it is removed from the market's total supply, stops accruing interest and becomes available for withdrawal execution by lenders in the batch. These paid-for withdrawals are then moved into the pool of *unclaimed withdrawals* (`state.normalizedUnclaimedWithdrawals`) representing the amount of underlying assets that are still in the market but which can not be borrowed against and can not be counted toward the reserve ratio, protocol fees or new withdrawal payments.


# V1 -> V2 Changelog

If you have previously reviewed the Wildcat V1 codebase, these are the major changes made for V2.

## Lens

Removed the lens contracts from the core protocol repository.

## Market Deployment

### **CREATE2 Restrictions**

Borrowers are no longer restricted to deploying one market per combination of (asset, name, symbol), which was an issue when a borrower needed to close and recreate an existing market.

When deploying a market, the borrower can now provide an arbitrary salt in the style of 0age's ImmutableCreate2Factory, where the first 20 bytes must either be zero or match the borrower's address, and the remaining 12 bytes can be any value so long as the full salt has not already been used.

### **Name/Symbol Length**

Increased maximum supported name/symbol length for underlying contract from 32 to `63 - prefix.length`. The name/symbol queries now support arbitrary length strings; once combined with their prefixes, each must fit into two slots, with one byte reserved for the string length.

## Markets

### **Accounts**

* Accounts no longer have a `role` field, their ability to access various functions (other than borrower-only ones) is not restricted within the market itself, this is delegated to the market's hooks.

### **Handling Of Sanctioned Accounts**

* Removed `stunningReversal` because accounts no longer have roles marking them as sanctioned.
* Market tokens are forced into a withdrawal batch rather than being transferred to an escrow when an account is marked as sanctioned. Withdrawal execution on a sanctioned account still transfers the underlying assets to the corresponding escrow.
* Functions which are not accessible to sanctioned entities no longer fail gracefully (in V1 they would block the account rather than revert). They now revert with an `AccountBlocked` error when the account is sanctioned.

### **Withdrawal Batch Rounding**

Normalised values for withdrawal batch payments are now rounded down rather than up to prevent a bug where closed markets could have their last withdrawal batch become uncloseable due to underpayment by a few wei.

### **Token Rescue Function**

For assets other than the market token itself or the underlying asset, ERC20 tokens sent to the contract can be recovered by the borrower.

### **Market Closure**

* When a borrower closes a market that has pending withdrawals or unpaid withdrawal batches, rather than reverting, the market now steps through the list of unpaid batches and closes them after transferring all remaining debt from the borrower.
* `closeMarket` now callable by borrower rather than controller.

### **ReentrancyGuard**

The ReentrancyGuard now uses transient storage, using a modified version of 0age's ReentrancyGuard from Seaport.

### **APR/Reserve Ratio Setters**

* Removed `setAnnualInterestBips` and `setReserveRatioBips`
* Added `setAnnualInterestAndReserveRatioBips`
* Now callable by borrower rather than controller

### **Miscellaneous**

Replaced most of the remaining ABI decoders/encoders for calls and large structs with manual assembly coder functions.

* Custom encoder for writing MarketState to storage.
* Custom decoder for constructor parameters and factory call.
* Custom encoders for all sentinel calls in market.
* Custom name/symbol query functions
* Custom state initialisation in constructor, only touching slots that are actually initialised.

## Market Control

Market controllers have been removed in favour of borrower-controlled markets with hooks that can impose their own restrictions. By default, the market itself does not restrict basic access to the market.


# Known Issues

Some aspects and quirks of the protocol codebase that may raise concern.

## **Avoiding Delinquency Fees**

If the borrower closes a Wildcat market while it is still in penalized delinquency, they will not have to pay out the remaining time worth of penalized delinquency fees as the timer will be set to zero.

We decided that this is an acceptable trade-off enabling lenders to access their funds immediately, rather than waiting what could range from days to weeks for a borrower to come good on their word.

## **Malicious/Delinquent Borrowers Can Lead To Loss Of Funds**

This one is fairly obvious but worth stating - if a borrower fails to repay their debt for any reason, lenders will inevitably lose funds.

If the borrower is malicious, they can hurt lenders in a variety of ways, including but not limited to: not repaying debt; adding themselves as a lender in order to withdraw beyond the borrow limit on a market they intend to default on; slowly reducing the APR by 25% every two weeks to avoid the penalty of an increased reserve ratio, and several other things.

## **Newer Withdrawals Lose Some Of Their Accrued Interest To Previous Withdrawals In The Same Batch**

This one is intentional but may initially seem erroneous.

If Alice creates a withdrawal batch with a request to withdraw 100 tokens while the scale factor is 1, and then Bob later requests a withdrawal of 200 tokens when the scale factor is 2 and they are in the same batch, Alice and Bob will both receive 150 underlying tokens: they have each been credited for 100 scaled tokens given to the batch.

This is very much desired behavior, as it prevents earlier lenders from being penalized for creating a batch (which benefits the other lenders). All interest earned on scaled tokens entered into a batch is distributed evenly to the lenders in the batch, as if they had all created their withdrawal requests at the same time.

The example given is also an extreme one: in practice it'd much more likely be a fraction of a percent.

## **Bad Hook Implementations**

If any of the hooks that are enabled for a market can revert unexpectedly, the corresponding market function may become permanently disabled. This is considered a known/unfixable issue with respect to the market, but if such an issue is actually discovered in a hooks template that has been developed and deployed, this is a major vulnerability that should be reported.

## **Sanctioned Account Handling Can Lead To Unexpected Behaviour On Markets With Withdrawal Restrictions**

If a market uses a hook with a withdrawal restriction, e.g. to prevent withdrawals before a specified date, sanctioned account handling may not work correctly as it will attempt to force the lender into a withdrawal, and those withdrawals are treated the same as any other.

This could lead to unavoidable interest payments to a sanctioned entity's escrow address (where the funds will go when withdrawals are eventually unrestricted).

## **Hooks Lack Some Specificity**

While one of the stated objectives of hooks is to enable auxiliary behavior based on the state of a Wildcat market (one example is a Masterchef-style contract), the hooks do not necessarily provide enough information to replicate the market state 1:1 in real time.

Specifically, because payment towards a withdrawal batch does not have its own hook, the hooks instance would need to query additional data and perform additional calculations to precisely track the balance of an account including its pending withdrawals in real time, or to know the exact state of a pending/unpaid withdrawal batch.

We anticipate that, for any features added in the future, considering an account to have burned their market tokens at the time a withdrawal is queued will be sufficient precision for the purposes we expect to need this for, and as such we consider the loss of 100% precision on the exact internal market state to be a reasonable sacrifice considering the additional cost such precision would impose.

Any other issues with the ability of a hooks instance to track the state of the market should be reported.

## **Conversion Between Scaled And Normalised Amounts Have Some Rounding Error**

We are aware that deposits, withdrawals, and even transfers incur some inevitable rounding error. We will only accept findings that show either:

* This dust is sufficient to break something in the market, or
* The rounding error can realistically be more than dust

So for example, we would not accept a finding that says you could do ten million transfers to accumulate ten million wei worth of the market token. On the other hand, in V1 there was a finding where the dust could cause a market to be impossible to close, which is why we now round down for withdrawal payments to a batch.

## **Some Assembly Blocks Leave Dirty Bits In Memory**

For example, in `HooksConfig`, all of the calls from a market to the various hook functions are done in assembly, with the calldata written to unallocated memory that is left as is at the end of the call. We would only accept a finding on this subject if it demonstrated a specific attack showing this is unsafe or can lead to buggy behavior.

## **Markets Can Be Constructed In A Way That Makes It Impossible For Anyone To Request A Withdrawal**

While we tried our best to ensure lenders who deposit to a market can not have their withdrawal rights revoked (by ensuring the deposit/transfer hooks are always enabled if the withdrawal hook is enabled), it is still possible for a borrower to maliciously prevent lenders from ever acquiring the necessary credential for withdrawals.

The way this would work is:

* Create a market with credentials required for withdrawal but not for deposit or transfers.
* Never add any role providers.
* Lenders can deposit, but since they'll never have a credential, they will never be given the `isKnownLender` flag, and thus can never withdraw.

Unfortunately it is not possible to remove this problem without eliminating certain kinds of market that are desirable, so we consider this in a similar vein to the issue with malicious borrowers simply not repaying their debt, in that it's up to lenders to be selective with who they lend to. As a mitigation, we force all markets deployed through the Wildcat frontend as having credentials required for deposit.

## **Reliance On Chainalysis**

If the Chainalysis sanctions oracle were to be compromised or otherwise start flagging accounts as sanctioned that in reality are not, that would lead to those accounts being frozen on all Wildcat markets they lend to.


# Hooks

Overview of the hooks system that gates and reacts to market actions.

Wildcat V2 markets support hooks which can add additional behaviour to the markets, such as handling access control or adding new features.

The goal of the hooks feature is two-fold: to allow restrictions to be set for individual markets and to enable secondary actions that occur in reaction to market actions.

Some examples of the individualized restrictions hooks enable are:

* An access control scheme that allows lenders to access markets without manual approval by the borrower,
* Minimum deposit requirements,
* Time restrictions on withdrawals, i.e. no withdrawals for the first 3 months.

An example of the additional behaviour hooks enable is the ability to add a Masterchef-style system that distributes rewards to lenders, which requires tracking token balances for the market on a separate contract.

This hooks system was chosen to make Wildcat V2 more modular than V1 and improve our ability to develop and deploy new features for Wildcat markets without changing the rest of our core infrastructure such as factories or the base market contract, or needing to re-audit the static parts of the codebase.

## Hooks Templates

The Wildcat Labs team will develop various templates for hooks contracts, with each intended for use with a separate kind of market. For example, our initial hooks template only provides access control for lenders and some basic restrictions on APR changes, whereas future templates might provide for withdrawal time limits on hooked markets or token rewards distribution.

Approved templates will be deployed as stored initcode (constructor code with a leading zero byte to prevent execution) and approved on the HooksFactory contract. Borrowers who are registered on the archcontroller can then select from the available templates when deploying new markets.

## Hooks Deployment

Hooks contracts can be deployed by borrowers registered on the archcontroller. Borrowers can choose to deploy a new hooks instance for each market (which they might want to do if the markets need different requirements for access, or they want to use a different hooks template), or to re-use the same hooks instance for several markets (if they want the same kind of market and the hooks instance supports use with multiple markets).

Each hooks instance defines a set of optional hooks and a set of required hooks. When deploying a market, the borrower specifies which hooks the market should utilize, and the market will use the hooks which are marked as required by the hooks instance or marked optional and selected by the borrower.

Once a market is deployed, its hooks instance cannot be edited, nor can the set of hooks it uses.

## Source Code \[repo not yet public]

Links TBA

## Further Reading

How Hooks Work

Access Control Hooks


# How Hooks Work

The hookable market functions, HooksConfig flags, intermediate state, and the extraData calldata buffer.

Each of the following is considered a core function within the WildcatMarket contract which we may want a hooks contract to be able to track, impose restrictions on, or otherwise react to in some way:

* `deposit` (+ `depositUpTo`)
* `queueWithdrawal` (+ `queueFullWithdrawal`)
* `executeWithdrawal` (+ `executeWithdrawals`)
* `transfer` (+ `transferFrom`)
* `borrow`
* `repay` (+ `repayOutstandingDebt`, `repayDelinquentDebt`)
* `closeMarket`
* `setMaxTotalSupply`
* `nukeFromOrbit`
* `setAnnualInterestAndReserveRatioBips`

Each of these functions has a corresponding hook that can be called on the configured hooks contract, as well as a flag in the market's hooks configuration (`HooksConfig`) indicating whether the hook *should* be called.

When one of these functions on a market is called, the market will check if the corresponding hook is enabled; if it is, it will call the hook function on the configured hooks contract, providing the intermediate state (prior to applying the full effects of the relevant action, but after accruing interest and fees), the relevant data for the action, the caller address (except for borrower-only functions) and an optional `extraData` buffer supplied by the caller.

Hooks can not modify internal behavior of the market and do not have any privileged access to its state; rather, they are designed to be *reactive to* and *restrictive of* market actions. This means, for example, that a hook can not change who receives a transfer or force a lender into a withdrawal, but it can prevent a transfer from occurring or keep some internal state about the withdrawal.

## **Exceptions To The Above**

There are two exceptions to the behavior described above.

1\) The rule about not modifying the market behavior is violated by `setAnnualInterestAndReserveRatioBips` - when a market's APR or reserve ratio are changed, the associated hook has the ability to modify those two values.

2\) The rule about only providing intermediate state (i.e. before execution of the action) is violated by the `queueWithdrawal` functions - when a withdrawal is queued, the intermediate state provided to the hooks call is the state *after* the market's `pendingWithdrawalExpiry` is updated. This ensures the hook has access to the withdrawal expiry if that is ever needed.

## `extraData` Buffer

In a call to one of the core functions listed above, the caller can append arbitrary bytes to the end of the function calldata. If they do, these bytes will be provided to the call to the hooks contract in the `bytes extraData` field. The primary use-case for this field is for the access control hooks, where the caller may need to provide a signature, merkle proof, or some other verification data in order to be authenticated to a particular market.

The `extraData` field is not part of the market's function signatures; the raw bytes must be appended to the end without ABI offset or length fields, and without padding to the closest word (otherwise the calculated length will be incorrect).

For calls to `executeWithdrawals` and `nukeFromOrbit`, the optional buffer cannot be provided.


# Access Control Hooks

The access-control hooks template: role providers (pull/push), credential validation, and the access-resolution flow.

In the access control hooks, the borrower can configure a set of "role providers" - accounts which grant credentials to lenders.

Within the hooks contract, the borrower configures each provider with a TTL - the amount of time a credential granted by the provider is valid.

The provider itself defines whether it is a "pull provider", meaning whether the hooks contract can query the role provider to check if a lender has a credential, using only the lender's address.

## Role Providers

Role providers can "push" credentials to the hooks contract by calling `grantRole`:

* `grantRole(address account, uint32 roleGrantedTimestamp) external`

There are three functions that the hooks contract can call on role providers:

* `isPullProvider() external view returns (bool)`
  * Defines whether the hooks contract can retrieve credentials using `getCredential`
* `getCredential(address account) external view returns (uint32 timestamp)`
  * Looks up a credential for an account using only its address, so it must already be stored somewhere.
* `validateCredential(address account, bytes calldata data) external returns (uint32 timestamp)`
  * Attempts to validate a credential from some arbitrary data (e.g. ecdsa signature or merkle proof).

Role providers do not *have* to implement any of these functions - a role provider can be an EOA.

***

## tryValidateAccess(address lender, bytes hooksData)

When a restricted function is called, the access control contract will attempt to validate the caller's access to the market in several ways.

1. If lender has an unexpired credential from a provider that is still supported, return true.
2. If the lender provided `hooksData`, run [`handleHooksData(lender, hooksData)`](https://github.com/wildcat-finance/v2-protocol/blob/main/docs/hooks/templates/Access%20Control%20Hooks.md#handleHooksDataaddress-lender-bytes-hooksData)
   * If it returns a valid credential, go to step 5
3. If the lender has an expired credential from a pull provider that is still supported, try to refresh their credential with `getCredential` (see: [tryPullCredential](https://github.com/wildcat-finance/v2-protocol/blob/main/docs/hooks/templates/Access%20Control%20Hooks.md#tryPullCredentialaddress-provider-address-lender))
   * If it returns a valid credential, go to step 5
4. Loop over every pull provider in `pullProviders` (other than the existing provider and provider in `hooksData`, if they exist)
   * Run [tryPullCredential](https://github.com/wildcat-finance/v2-protocol/blob/main/docs/hooks/templates/Access%20Control%20Hooks.md#tryPullCredentialaddress-provider-address-lender) on each provider.
   * If any returns a valid credential, break the loop and go to step 5
5. If any provider yielded a valid credential, update the lender's status in storage with the new credential and return.
6. Otherwise, throw an error.

```mermaid
flowchart TD
    validateAccess[["tryValidateAccess(address lender, bytes hooksData)"]] --> hasUnexpiredCredential{Lender has\nunexpired credential?}
    hasUnexpiredCredential -- yes --> returnTrue([Access verified])
    hasUnexpiredCredential -- no --> providedHooksData{hooksData?}
    providedHooksData -- yes --> callHandleHooksData[["handleHooksData(lender, hooksData)"]]
    callHandleHooksData -- valid credential --> step5[(Write credential\nto storage)] --> returnTrue
    callHandleHooksData -- no valid credential --> expiredCredential{Lender has\nexpired credential?}
    providedHooksData -- no --> expiredCredential
    expiredCredential -- yes --> callTryPullCredential1[["tryPullCredential(existing provider, lender)"]]
    callTryPullCredential1 -- valid credential --> step5
    callTryPullCredential1 -- no valid credential --> loopStart
    expiredCredential -- no --> loopStart

    subgraph loopProviders [Loop over pull providers]
        loopStart{Next provider}
        loopStart -. next provider .-> callTryPullCredential2[["tryPullCredential(next provider, lender)"]]
        callTryPullCredential2 -. no valid credential .-> loopStart
        loopStart -- no more providers --> throwErrorHandle{{Throw}}
    end
    callTryPullCredential2 -- valid credential --> step5
```

***

## tryPullCredential(address provider, address lender)

1. If the provider is not approved, return with no valid credential
2. Call `getCredential` on the provider
   * If it reverts, return with no valid credential
3. Add the returned `timestamp` to the provider's TTL to get the expiry
4. If the resulting credential is expired, return with no valid credential
5. Return with valid credential

```mermaid
flowchart TD
    A[["tryPullCredential(address provider, address lender)"]] --> B{provider\n approved?}
    B -- yes --> X{"provider is\npull provider?"}
    B -- no --> C([No valid credential])
    X -- yes --> D["Call provider.getCredential(lender)"]
    X -- no --> C
    D -- revert --> C
    D -- invalid data --> C
    D -- timestamp --> T[+ provider's TTL = expiry] --> F{expired?}
    F -- yes --> C
    F -- no --> G([Valid credential])
```

***

## handleHooksData(address lender, bytes hooksData)

1. Is `hooksData` 20 bytes?
   * If not, go to 2
   * Set `provider` to `hooksData`
   * Return result of `tryPullCredential(provider, lender)`
2. Is `hooksData` more than 20 bytes?
   * If not, return false
3. Take first 20 bytes as `provider`, the rest is `validateData`
4. If the provider is not approved, return false
5. Call `validateCredential(lender, validateData)`
   * If it reverts, return false
   * If it returns invalid data, throw an error because the call could have side effects
6. Add the returned timestamp to the provider's TTL to calculate the expiry
7. If it is expired, return false
8. Return true

```mermaid
flowchart TD
    handleData[["handleHooksData(address lender, bytes hooksData)"]] --> check20Bytes{is hooksData\n20 bytes?}
    check20Bytes -- no --> checkMoreThan20Bytes{more than\n20 bytes?}
    checkMoreThan20Bytes -- no --> invalidCredential([No valid credential])
    checkMoreThan20Bytes -- yes --> extractProviderAndData["provider = hooksData[0:20]\nvalidateData = hooksData[20:]"]
    extractProviderAndData --> isProviderApproved{provider\n approved?}
    isProviderApproved -- no --> invalidCredential
    isProviderApproved -- yes --> callValidateCredential["Call provider.validateCredential(lender, validateData)"]
    callValidateCredential -- revert --> invalidCredential
    callValidateCredential -- timestamp --> calculateExpiry["+ provider's TTL = expiry"] --> checkExpiry{expired?}
    callValidateCredential -- invalid data --> throwError{{Throw}}
    checkExpiry -- yes --> invalidCredential
    checkExpiry -- no --> validCredential([Valid credential])
    check20Bytes -- yes --> extractProvider["provider = hooksData"] --> callPullCredential[["tryPullCredential(provider, lender)"]]
    callPullCredential -.-> invalidCredential
    callPullCredential -.-> validCredential
```


# Fixed Term Loan Hooks

The fixed-term variant of the access-control hooks, adding a withdrawal-blocking fixed term.

The fixed term loan hooks template is identical to the access control hooks template with one additional feature - the borrower can define a timestamp before which the market is considered a "closed term" loan, where withdrawals are disallowed. This expiry time can be reduced but can not be set to a later date after deployment.

## `onCreateMarket`

When deploying a market, the borrower must provide an ABI encoded timestamp for the market's `fixedTermEndTime` in the `hooksData` field of `HooksFactory.deployMarket` or `HooksFactory.deployMarketAndHooks`. This time cannot be in the past and can not be more than one year in the future. They can optionally provide a minimum deposit amount by setting `hooksData` to the ABI encoded tuple `(fixedTermEndTime, minimumDeposit)`.

The `onQueueWithdrawal` hook will always be enabled, but will only require access if the borrower's provided config had `useOnQueueWithdrawal` enabled, which will also affect the transfer and deposit hooks in the same way as `AccessControlHooks`.


# Wildcat 4626 Wrapper

Developer reference for the Wildcat4626Wrapper and its factory — functions, rounding, exchange-rate helpers and error codes.

The `Wildcat4626Wrapper` is a vault that wraps a Wildcat market's rebasing debt token with a non-rebasing ERC-4626 share token. Wrapper shares mirror the market's *scaled* balances while the underlying "asset" is the rebasing market token itself.

Make sure you understand the [scale factor](https://docs.wildcat.finance/technical-overview/security-developer-dives/the-scale-factor) before continuing: the wrapper leans on it heavily for all share/asset conversions.

Deployed addresses for factories can be found [here](https://docs.wildcat.finance/technical-overview/contract-deployments).

### TLDR

The 'wrapper' is itself an ERC-4626 vault where:

* The **asset** is the Wildcat market token (the rebasing debt token).
* **Shares** are equivalent to the market's *scaled* token amounts: 1 wrapper share represents `1 * scaleFactor` market tokens at any given time.
* The **exchange rate** between shares and assets is the market's `scaleFactor`. As interest accrues and the scale factor grows, each wrapper share becomes convertible to more market tokens, but the share balance itself does not change.

This means a holder of wrapper shares sees a stable balance that appreciates in *value* over time (via the increasing exchange rate), rather than a balance that constantly rebases upward.

### Contracts

#### `Wildcat4626Wrapper`

An ERC‑4626 vault where:

* **Asset** is the Wildcat market debt token (rebasing ERC‑20).
* **Shares** are a wrapper ERC‑20 that mirrors the market’s *scaled* accounting (non‑rebasing).

The wrapper uses the market's current `scaleFactor` as the exchange rate between shares and assets. Converting assets to shares means dividing the rebasing market-token amount by the scale factor, while converting shares back to assets means multiplying the share amount by that same factor. Because the scale factor grows as interest accrues, a holder's wrapper share balance stays constant while the amount of market tokens those shares can redeem for increases over time.

#### Metadata

**`name()`**

Returns `"<marketSymbol> [4626 Vault Shares]"`.

**`symbol()`**

Returns `"v-<marketSymbol>"`.

**`decimals()`**

Returns `wrappedMarket.decimals()` (same decimals as the market token / underlying asset).

#### Mutating functions

**`deposit(assets, receiver)`**

Deposits `assets` worth of market tokens from the caller and mints shares to `receiver`.

**`mint(shares, receiver)`**

Mints exactly `shares` to `receiver` and pulls the corresponding market tokens from the caller.

**`withdraw(assets, receiver, owner)`**

Burns shares from `owner` and sends `assets` worth of market tokens to `receiver`.

**`redeem(shares, receiver, owner)`**

Burns exactly `shares` from `owner` and sends the corresponding assets to `receiver`.

**`sweep(token, to)`**

Allows the market owner (borrower) to recover `token` sent to the wrapper contract. For the wrapped market token, only surplus above what is owed to share holders is sweepable.

#### Preview functions

**`convertToShares(assets)`**

Returns how many shares `assets` would convert to at the current `scaleFactor`, rounding down.

**`convertToAssets(shares)`**

Returns how many market tokens `shares` would convert to at the current `scaleFactor`, rounding down.

**`maxDeposit(receiver)`**

Returns the maximum amount of market tokens `receiver` can deposit before the wrapper hits the market's `maxTotalSupply`. Returns `0` for sanctioned receivers.

**`previewDeposit(assets)`**

Returns the number of shares a deposit of `assets` would mint, using ERC-4626 preview rounding.

**`maxMint(receiver)`**

Returns the maximum number of shares `receiver` can mint before the wrapper hits the market's `maxTotalSupply`. Returns `0` for sanctioned receivers.

**`previewMint(shares)`**

Returns the amount of market tokens required to mint `shares`, rounding up.

**`maxWithdraw(owner)`**

Returns the maximum amount of market tokens `owner` can withdraw with their current share balance. Returns `0` for sanctioned owners.

**`previewWithdraw(assets)`**

Returns the number of shares that would be burned to withdraw `assets`, rounding up.

**`maxRedeem(owner)`**

Returns the maximum number of shares `owner` can redeem. Returns `0` for sanctioned owners.

**`previewRedeem(shares)`**

Returns how many market tokens would be returned for redeeming `shares`, rounding down.

#### Sentinel

**`sanctionsSentinel`**

Returns the sanctions sentinel used by the wrapper. This is copied from the wrapped market during construction.

**Sanctions checks**

The wrapper uses the sentinel to block sanctioned addresses from interacting with the vault.

#### `Wildcat4626WrapperFactory`

A small factory contract that deploys `Wildcat4626Wrapper` instances and ensures there is at most one wrapper per market.

**`archController`**

Returns the `ArchController` used to verify that a market is registered before a wrapper can be deployed.

**`wrapperForMarket(market)`**

Returns the wrapper address for `market`, if one has already been deployed.

**`createWrapper(market)`**

Deploys a new wrapper for `market`. Reverts if `market` is the zero address, if a wrapper already exists, or if the market is not registered in the `ArchController`.

### Usage Notes

#### Do not transfer tokens directly to the vault

Direct token transfers do not mint shares in return. While there are pathways for recovery please just don't do this.

#### Allowances and approvals

Before calling `deposit` or `mint`, the caller must approve the wrapper to transfer the required amount of market tokens on their behalf. If there is insufficient allowance, the call will fail before any shares are minted. This approval is for the rebasing market token itself, not for the underlying base asset of the market.

#### Preview vs execution rounding

The preview functions follow standard ERC-4626 rounding conventions, which means `previewDeposit` and `previewRedeem` round down while `previewMint` and `previewWithdraw` round up. The actual state-changing functions are aligned to Wildcat's own conversion math and underlying transfer behaviour, so they may not return exactly the same values as the previews. In practice, this means a real `deposit` can mint slightly more shares than `previewDeposit` quoted, and a real `mint` can require slightly fewer assets than `previewMint` suggested. This is expected behaviour rather than slippage or accounting drift.

Previews are therefore suitable for upper- and lower-bound quoting, but should not be used as exact assertions in routers, tests, or accounting flows. If a caller needs deterministic settlement around a target amount, it should choose the state-changing function that fixes that side of the trade, such as `mint` for exact shares or `withdraw` for exact assets.

#### Exiting to the underlying asset

The wrapper does not interact with the underlying market's withdrawal queue at all. When you call `withdraw(assets, receiver, owner)` or `redeem(shares, receiver, owner)`, the wrapper burns your vault shares and executes a `safeTransfer` of the rebasing market token to the `receiver`.

If you subsequently want to convert those market tokens into the actual underlying asset (e.g., USDC), you must interact with the Wildcat market directly following the market’s withdrawal flow (withdrawal request → batch expiry → execution/claim). For more detail on that lifecycle, see [Core Behaviour](/technical-overview/security-developer-dives/core-behaviour) and the terminology entries for [Withdrawal Request](/using-wildcat/terminology#withdrawal-request) and [Claim](/using-wildcat/terminology#claim).

#### Raw exchange rate helpers

For integrators who want the raw exchange rate without picking an arbitrary sample size:

* `assetsPerShareRay()` — returns the market's `scaleFactor` directly. This is a ray value (`1e27 = 1.0`), so a return value of `1.05e27` means each share is currently worth `1.05` market tokens.
* `sharesPerAssetRay()` — returns the inverse (`RAY * RAY / scaleFactor`). Useful for computing how many shares a given deposit would yield.

### Errors

#### `Wildcat4626Wrapper`

**`ZeroAddress()`**

Thrown when the market address, borrower, or sentinel is zero at construction. Also thrown if `sweep` is called with a zero `token` or `to` address.

**`ZeroAssets()`**

Thrown when a `deposit` or `withdraw` amount is zero, when a `mint` or `redeem` request converts to zero assets, or when `sweep` finds no recoverable surplus or token balance.

**`ZeroShares()`**

Thrown when a `mint` or `redeem` amount is zero, or when a `deposit` or `withdraw` request would produce zero shares.

**`CapExceeded()`**

Thrown when a `deposit` or `mint` would push the wrapper past the market's `maxTotalSupply`.

**`SharesMismatch(expected, actual)`**

Thrown when the actual scaled balance delta after a transfer does not match the wrapper's prediction. This acts as a safety check against unexpected market behaviour or rounding mismatches.

**`NotMarketOwner()`**

Thrown when someone other than the borrower calls `sweep`.

**`SanctionedAccount(account)`**

Thrown when a sanctioned address is involved in the operation.

#### `Wildcat4626WrapperFactory`

**`WrapperAlreadyExists(market)`**

Thrown by `Wildcat4626WrapperFactory` when `createWrapper` is called for a market that already has a deployed wrapper.

**`NotRegisteredMarket(market)`**

Thrown by `Wildcat4626WrapperFactory` when `createWrapper` is called for a market that is not registered in the `ArchController`.


# Function/Event Signatures

Index of per-contract function, event and error signatures for the V2 codebase.

This page includes the names/parameters and signatures for most functions and events within Wildcat V2.

Note: you can generate this yourself via the `calculate_function_signatures.py` Python script in the `/scripts` directory of the repository.

We have not included everything here (e.g. mock contracts or widely-used libraries), but rather everything that is related to the mainnet deployment of Wildcat.


# /access

Function, event and error signatures for the access-control contracts.


# AccessControlHooks.sol

Function, event and error signatures for AccessControlHooks.sol.

## Functions:

addRoleProvider(address,uint32) 0xea5b13bd

blockFromDeposits(address) 0x064ed53b

borrower() 0x7df1f1b9

config() 0x79502c55

factory() 0xc45a0155

getHookedMarket(address) 0x2ccf4667

getLenderStatus(address) 0x22a4a19f

getParameterConstraints() 0xa11ef067

getPreviousLenderStatus(address) 0xb037096d

getPullProviders() 0x8f8ef419

getRoleProvider(address) 0xbfd269be

grantRole(address,uint32) 0x6b2b369b

grantRoles(address\[],uint32\[]) 0x9d2a76fe

isKnownLenderOnMarket(address,address) 0xa9ff2dbf

onBorrow(uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0xb1cfda0d

onCloseMarket((bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x9ecc64e6

onCreateMarket(address,address,(address,string,string,uint128,uint16,uint16,uint32,uint16,uint32,uint256),bytes) 0x28fd0307

onDeposit(address,uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x5aeb713f

onExecuteWithdrawal(address,uint128,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x2970403d

onNukeFromOrbit(address,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x8b3ce9b3

onQueueWithdrawal(address,uint32,uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x3521cccc

onRepay(uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x83d9e1eb

onSetAnnualInterestAndReserveRatioBips(uint16,uint16,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0xcc452642

onSetMaxTotalSupply(uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x849da129

onSetProtocolFeeBips(uint16,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x03473d8d

onTransfer(address,address,address,uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0xa018f90e

removeRoleProvider(address) 0x8adfe0f8

revokeRole(address) 0x80e52e3f

setMinimumDeposit(address,uint128) 0x1c4b3694

temporaryExcessReserveRatio(address) 0xfeb368e2

unblockFromDeposits(address) 0xaa948689

version() 0x54fd4d50

## Events:

AccountAccessGranted(address,address,uint32) 0xa04eb478

AccountAccessRevoked(address) 0x47695aa9

AccountBlockedFromDeposits(address) 0x25b0d183

AccountMadeFirstDeposit(address) 0x69da6af3

AccountUnblockedFromDeposits(address) 0x7201a401

MinimumDepositUpdated(address,uint128) 0x4e39f532

RoleProviderAdded(address,uint32,uint24) 0xbe2909d8

RoleProviderRemoved(address,uint24) 0x096f563e

RoleProviderUpdated(address,uint32,uint24) 0x0c641c0a

TemporaryExcessReserveRatioActivated(address,uint256,uint256,uint256) 0x16f9a191

TemporaryExcessReserveRatioCanceled(address) 0x2045c970

TemporaryExcessReserveRatioExpired(address) 0x145c143a

TemporaryExcessReserveRatioUpdated(address,uint256,uint256,uint256) 0xf813e17e


# IRoleProvider.sol

Interface signatures for IRoleProvider.sol.

## Functions:

getCredential(address) 0xccdad14b

isPullProvider() 0x256909f1

validateCredential(address,bytes) 0x54560cb2


# MarketConstraintHooks.sol

Function, event and error signatures for MarketConstraintHooks.sol.

## Functions:

config() 0x79502c55

factory() 0xc45a0155

getParameterConstraints() 0xa11ef067

onBorrow(uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0xb1cfda0d

onCloseMarket((bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x9ecc64e6

onCreateMarket(address,address,(address,string,string,uint128,uint16,uint16,uint32,uint16,uint32,uint256),bytes) 0x28fd0307

onDeposit(address,uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x5aeb713f

onExecuteWithdrawal(address,uint128,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x2970403d

onNukeFromOrbit(address,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x8b3ce9b3

onQueueWithdrawal(address,uint32,uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x3521cccc

onRepay(uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x83d9e1eb

onSetAnnualInterestAndReserveRatioBips(uint16,uint16,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0xcc452642

onSetMaxTotalSupply(uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x849da129

onSetProtocolFeeBips(uint16,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x03473d8d

onTransfer(address,address,address,uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0xa018f90e

temporaryExcessReserveRatio(address) 0xfeb368e2

version() 0x54fd4d50

## Events:

TemporaryExcessReserveRatioActivated(address,uint256,uint256,uint256) 0x16f9a191

TemporaryExcessReserveRatioCanceled(address) 0x2045c970

TemporaryExcessReserveRatioExpired(address) 0x145c143a

TemporaryExcessReserveRatioUpdated(address,uint256,uint256,uint256) 0xf813e17e


# /interfaces

Interface signatures for the core protocol interfaces.


# IHooks.sol

Interface signatures for IHooks.sol.

## Functions:

config() 0x79502c55

factory() 0xc45a0155

onBorrow(uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0xb1cfda0d

onCloseMarket((bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x9ecc64e6

onCreateMarket(address,address,(address,string,string,uint128,uint16,uint16,uint32,uint16,uint32,uint256),bytes) 0x28fd0307

onDeposit(address,uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x5aeb713f

onExecuteWithdrawal(address,uint128,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x2970403d

onNukeFromOrbit(address,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x8b3ce9b3

onQueueWithdrawal(address,uint32,uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x3521cccc

onRepay(uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x83d9e1eb

onSetAnnualInterestAndReserveRatioBips(uint16,uint16,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0xcc452642

onSetMaxTotalSupply(uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x849da129

onSetProtocolFeeBips(uint16,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0x03473d8d

onTransfer(address,address,address,uint256,(bool,uint128,uint128,uint128,uint104,uint104,uint32,bool,uint32,uint16,uint16,uint16,uint112,uint32),bytes) 0xa018f90e

version() 0x54fd4d50


# IMarketEventsAndErrors.sol

Event and error signatures for IMarketEventsAndErrors.sol.

## Events:

AccountSanctioned(address) 0x4f30ec08

AnnualInterestBipsUpdated(uint256) 0xff7b6c8b

Approval(address,address,uint256) 0x8c5be1e5

Borrow(uint256) 0xb848ae6b

DebtRepaid(address,uint256) 0xe8b606ac

Deposit(address,uint256,uint256) 0x90890809

FeesCollected(uint256) 0x860c0aa5

InterestAndFeesAccrued(uint256,uint256,uint256,uint256,uint256,uint256) 0x18247a39

MarketClosed(uint256) 0x9dc30b8e

MaxTotalSupplyUpdated(uint256) 0xf2672935

ProtocolFeeBipsUpdated(uint256) 0x4b347052

ReserveRatioBipsUpdated(uint256) 0x72877a15

SanctionedAccountAssetsQueuedForWithdrawal(address,uint256,uint256,uint256) 0xe12b220b

SanctionedAccountAssetsSentToEscrow(address,address,uint256) 0x571e706c

SanctionedAccountWithdrawalSentToEscrow(address,address,uint32,uint256) 0x0d0843a0

StateUpdated(uint256,bool) 0x9385f9ff

Transfer(address,address,uint256) 0xddf252ad

WithdrawalBatchClosed(uint256) 0xcbdf25bf

WithdrawalBatchCreated(uint256) 0x5c9a946d

WithdrawalBatchExpired(uint256,uint256,uint256,uint256) 0x9262dc39

WithdrawalBatchPayment(uint256,uint256,uint256) 0x52720347

WithdrawalExecuted(uint256,address,uint256) 0xd6cddb3d

WithdrawalQueued(uint256,address,uint256,uint256) 0xecc966b2


# IWildcatArchController.sol

Interface signatures for IWildcatArchController.sol.

## Functions:

acceptSphereXAdminRole() 0x8426b968

addBlacklist(address) 0x9cfe42da

changeSphereXEngine(address) 0x4c6c848f

changeSphereXOperator(address) 0x4ee8f858

getBlacklistedAssets() 0x79adfa6c

getBlacklistedAssets(uint256,uint256) 0x8b984bb3

getBlacklistedAssetsCount() 0xb9d5dfe8

getRegisteredBorrowers() 0xb9bccae8

getRegisteredBorrowers(uint256,uint256) 0xbe736ff8

getRegisteredBorrowersCount() 0x1ce28ab7

getRegisteredControllerFactories(uint256,uint256) 0x0e572082

getRegisteredControllerFactories() 0x6e0fb58d

getRegisteredControllerFactoriesCount() 0x78e9c224

getRegisteredControllers(uint256,uint256) 0xa1c4bff8

getRegisteredControllers() 0xdb316dbc

getRegisteredControllersCount() 0x3d05a1d3

getRegisteredMarkets() 0x46762101

getRegisteredMarkets(uint256,uint256) 0x7ade7f20

getRegisteredMarketsCount() 0x84b870ab

isBlacklistedAsset(address) 0xb0018c60

isRegisteredBorrower(address) 0x0787c1fe

isRegisteredController(address) 0x8cdcb3e6

isRegisteredControllerFactory(address) 0x99882f70

isRegisteredMarket(address) 0x4a58e49e

owner() 0x8da5cb5b

pendingSphereXAdmin() 0x9aa9019e

registerBorrower(address) 0xabad7426

registerController(address) 0xd91ae8c2

registerControllerFactory(address) 0x1b4f512c

registerMarket(address) 0xa79b9ec9

removeBlacklist(address) 0xeb91e651

removeBorrower(address) 0x76c7fc55

removeController(address) 0xf6a74ed7

removeControllerFactory(address) 0x8b13e382

removeMarket(address) 0xdb913236

sphereXAdmin() 0x99e80f3b

sphereXEngine() 0x3c231166

sphereXOperator() 0xe7e5db4f

transferSphereXAdminRole(address) 0xdaba7ef7

## Events:

AssetBlacklisted() 0x47426645

AssetPermitted() 0x2ba88237

BorrowerAdded(address) 0xf936762b

BorrowerRemoved(address) 0xeb319987

ChangedSpherexEngineAddress(address,address) 0xf33499cc

ChangedSpherexOperator(address,address) 0x2ac55ae7

ControllerAdded(address,address) 0x09703263

ControllerFactoryAdded(address) 0x8968daf7

ControllerFactoryRemoved(address) 0x92b171cd

ControllerRemoved(address) 0x33d83959

MarketAdded(address,address) 0x7772c85e

MarketRemoved(address) 0x59d7b1e5

NewAllowedSenderOnchain(address) 0x6de0a1fd

SpherexAdminTransferCompleted(address,address) 0x67ebaebc

SpherexAdminTransferStarted(address,address) 0x5778f154


# IWildcatSanctionsEscrow\.sol

Interface signatures for IWildcatSanctionsEscrow\.sol.

## Functions:

account() 0x5dab2420

balance() 0xb69ef8a8

borrower() 0x7df1f1b9

canReleaseEscrow() 0xa4972b47

escrowedAsset() 0x3d02b19c

releaseEscrow() 0x757a5543

sentinel() 0xf58c251c

## Events:

EscrowReleased(address,address,uint256) 0xddb6c734


# IWildcatSanctionsSentinel.sol

Interface signatures for IWildcatSanctionsSentinel.sol.

## Functions:

WildcatSanctionsEscrowInitcodeHash() 0xb8b45361

archController() 0x54635570

chainalysisSanctionsList() 0x4973203d

createEscrow(address,address,address) 0xa1054f6b

getEscrowAddress(address,address,address) 0x1cdf58b0

isFlaggedByChainalysis(address) 0x95c09839

isSanctioned(address,address) 0x06e74444

overrideSanction(address) 0x681909a0

removeSanctionOverride(address) 0x490a8653

sanctionOverrides(address,address) 0x380c3431

tmpEscrowParams() 0xb1d62668

## Events:

NewSanctionsEscrow(address,address,address) 0x23e05aa5

SanctionOverride(address,address) 0xf7314dc6

SanctionOverrideRemoved(address,address) 0x23bb3a3a


# /market

Function, event and error signatures for the market contracts.


# WildcatMarketConfig.sol

Function, event and error signatures for WildcatMarketConfig.sol.

## Functions:

accruedProtocolFees() 0x0cd1a5b6

annualInterestBips() 0x11057cd0

archController() 0x54635570

asset() 0x38d52e0f

borrowableAssets() 0x76636017

borrower() 0x7df1f1b9

changeSphereXEngine(address) 0x4c6c848f

coverageLiquidity() 0x739ccdd3

currentState() 0x0c3f6acf

decimals() 0x313ce567

delinquencyFeeBips() 0x4be687c6

delinquencyGracePeriod() 0x514a4cd6

factory() 0xc45a0155

feeRecipient() 0x46904840

hooks() 0xcd7033c4

isClosed() 0xc2b6b58c

maxTotalSupply() 0x2ab4d052

maximumDeposit() 0x54b302c5

name() 0x06fdde03

nukeFromOrbit(address) 0xdcd549d4

previousState() 0x0c1e3fea

reserveRatioBips() 0xd98e0fe8

scaleFactor() 0x683dd191

scaledBalanceOf(address) 0x1da24f3e

scaledTotalSupply() 0xb1bf962d

sentinel() 0xf58c251c

setAnnualInterestAndReserveRatioBips(uint16,uint16) 0xe5adc635

setMaxTotalSupply(uint256) 0x3f3e4c11

setProtocolFeeBips(uint16) 0xae6ea191

sphereXEngine() 0x3c231166

sphereXOperator() 0xe7e5db4f

symbol() 0x95d89b41

totalAssets() 0x01e1d114

totalDebts() 0x14a1c32d

version() 0x54fd4d50

withdrawableProtocolFees() 0x1e3cef53

withdrawalBatchDuration() 0x9e6f9802

## Events:

AccountSanctioned(address) 0x4f30ec08

AnnualInterestBipsUpdated(uint256) 0xff7b6c8b

Approval(address,address,uint256) 0x8c5be1e5

Borrow(uint256) 0xb848ae6b

ChangedSpherexEngineAddress(address,address) 0xf33499cc

ChangedSpherexOperator(address,address) 0x2ac55ae7

DebtRepaid(address,uint256) 0xe8b606ac

Deposit(address,uint256,uint256) 0x90890809

FeesCollected(uint256) 0x860c0aa5

InterestAndFeesAccrued(uint256,uint256,uint256,uint256,uint256,uint256) 0x18247a39

MarketClosed(uint256) 0x9dc30b8e

MaxTotalSupplyUpdated(uint256) 0xf2672935

ProtocolFeeBipsUpdated(uint256) 0x4b347052

ReserveRatioBipsUpdated(uint256) 0x72877a15

SanctionedAccountAssetsQueuedForWithdrawal(address,uint256,uint256,uint256) 0xe12b220b

SanctionedAccountAssetsSentToEscrow(address,address,uint256) 0x571e706c

SanctionedAccountWithdrawalSentToEscrow(address,address,uint32,uint256) 0x0d0843a0

StateUpdated(uint256,bool) 0x9385f9ff

Transfer(address,address,uint256) 0xddf252ad

WithdrawalBatchClosed(uint256) 0xcbdf25bf

WithdrawalBatchCreated(uint256) 0x5c9a946d

WithdrawalBatchExpired(uint256,uint256,uint256,uint256) 0x9262dc39

WithdrawalBatchPayment(uint256,uint256,uint256) 0x52720347

WithdrawalExecuted(uint256,address,uint256) 0xd6cddb3d

WithdrawalQueued(uint256,address,uint256,uint256) 0xecc966b2


# WildcatMarketToken.sol

Function, event and error signatures for WildcatMarketToken.sol.

## Functions:

accruedProtocolFees() 0x0cd1a5b6

allowance(address,address) 0xdd62ed3e

approve(address,uint256) 0x095ea7b3

archController() 0x54635570

asset() 0x38d52e0f

balanceOf(address) 0x70a08231

borrowableAssets() 0x76636017

borrower() 0x7df1f1b9

changeSphereXEngine(address) 0x4c6c848f

coverageLiquidity() 0x739ccdd3

currentState() 0x0c3f6acf

decimals() 0x313ce567

delinquencyFeeBips() 0x4be687c6

delinquencyGracePeriod() 0x514a4cd6

factory() 0xc45a0155

feeRecipient() 0x46904840

hooks() 0xcd7033c4

name() 0x06fdde03

previousState() 0x0c1e3fea

scaleFactor() 0x683dd191

scaledBalanceOf(address) 0x1da24f3e

scaledTotalSupply() 0xb1bf962d

sentinel() 0xf58c251c

sphereXEngine() 0x3c231166

sphereXOperator() 0xe7e5db4f

symbol() 0x95d89b41

totalAssets() 0x01e1d114

totalDebts() 0x14a1c32d

totalSupply() 0x18160ddd

transfer(address,uint256) 0xa9059cbb

transferFrom(address,address,uint256) 0x23b872dd

version() 0x54fd4d50

withdrawableProtocolFees() 0x1e3cef53

withdrawalBatchDuration() 0x9e6f9802

## Events:

AccountSanctioned(address) 0x4f30ec08

AnnualInterestBipsUpdated(uint256) 0xff7b6c8b

Approval(address,address,uint256) 0x8c5be1e5

Borrow(uint256) 0xb848ae6b

ChangedSpherexEngineAddress(address,address) 0xf33499cc

ChangedSpherexOperator(address,address) 0x2ac55ae7

DebtRepaid(address,uint256) 0xe8b606ac

Deposit(address,uint256,uint256) 0x90890809

FeesCollected(uint256) 0x860c0aa5

InterestAndFeesAccrued(uint256,uint256,uint256,uint256,uint256,uint256) 0x18247a39

MarketClosed(uint256) 0x9dc30b8e

MaxTotalSupplyUpdated(uint256) 0xf2672935

ProtocolFeeBipsUpdated(uint256) 0x4b347052

ReserveRatioBipsUpdated(uint256) 0x72877a15

SanctionedAccountAssetsQueuedForWithdrawal(address,uint256,uint256,uint256) 0xe12b220b

SanctionedAccountAssetsSentToEscrow(address,address,uint256) 0x571e706c

SanctionedAccountWithdrawalSentToEscrow(address,address,uint32,uint256) 0x0d0843a0

StateUpdated(uint256,bool) 0x9385f9ff

Transfer(address,address,uint256) 0xddf252ad

WithdrawalBatchClosed(uint256) 0xcbdf25bf

WithdrawalBatchCreated(uint256) 0x5c9a946d

WithdrawalBatchExpired(uint256,uint256,uint256,uint256) 0x9262dc39

WithdrawalBatchPayment(uint256,uint256,uint256) 0x52720347

WithdrawalExecuted(uint256,address,uint256) 0xd6cddb3d

WithdrawalQueued(uint256,address,uint256,uint256) 0xecc966b2


# WildcatMarketWithdrawals.sol

Function, event and error signatures for WildcatMarketWithdrawals.sol.

## Functions:

accruedProtocolFees() 0x0cd1a5b6

archController() 0x54635570

asset() 0x38d52e0f

borrowableAssets() 0x76636017

borrower() 0x7df1f1b9

changeSphereXEngine(address) 0x4c6c848f

coverageLiquidity() 0x739ccdd3

currentState() 0x0c3f6acf

decimals() 0x313ce567

delinquencyFeeBips() 0x4be687c6

delinquencyGracePeriod() 0x514a4cd6

executeWithdrawal(address,uint32) 0x34bca29c

executeWithdrawals(address\[],uint32\[]) 0x74058859

factory() 0xc45a0155

feeRecipient() 0x46904840

getAccountWithdrawalStatus(address,uint32) 0x02372c4f

getAvailableWithdrawalAmount(address,uint32) 0x088fee5e

getUnpaidBatchExpiries() 0x878eb921

getWithdrawalBatch(uint32) 0xdbcd50b4

hooks() 0xcd7033c4

name() 0x06fdde03

previousState() 0x0c1e3fea

queueFullWithdrawal() 0x7243d96c

queueWithdrawal(uint256) 0x6b174f35

repayAndProcessUnpaidWithdrawalBatches(uint256,uint256) 0x6731ba6d

scaleFactor() 0x683dd191

scaledBalanceOf(address) 0x1da24f3e

scaledTotalSupply() 0xb1bf962d

sentinel() 0xf58c251c

sphereXEngine() 0x3c231166

sphereXOperator() 0xe7e5db4f

symbol() 0x95d89b41

totalAssets() 0x01e1d114

totalDebts() 0x14a1c32d

version() 0x54fd4d50

withdrawableProtocolFees() 0x1e3cef53

withdrawalBatchDuration() 0x9e6f9802

## Events:

AccountSanctioned(address) 0x4f30ec08

AnnualInterestBipsUpdated(uint256) 0xff7b6c8b

Approval(address,address,uint256) 0x8c5be1e5

Borrow(uint256) 0xb848ae6b

ChangedSpherexEngineAddress(address,address) 0xf33499cc

ChangedSpherexOperator(address,address) 0x2ac55ae7

DebtRepaid(address,uint256) 0xe8b606ac

Deposit(address,uint256,uint256) 0x90890809

FeesCollected(uint256) 0x860c0aa5

InterestAndFeesAccrued(uint256,uint256,uint256,uint256,uint256,uint256) 0x18247a39

MarketClosed(uint256) 0x9dc30b8e

MaxTotalSupplyUpdated(uint256) 0xf2672935

ProtocolFeeBipsUpdated(uint256) 0x4b347052

ReserveRatioBipsUpdated(uint256) 0x72877a15

SanctionedAccountAssetsQueuedForWithdrawal(address,uint256,uint256,uint256) 0xe12b220b

SanctionedAccountAssetsSentToEscrow(address,address,uint256) 0x571e706c

SanctionedAccountWithdrawalSentToEscrow(address,address,uint32,uint256) 0x0d0843a0

StateUpdated(uint256,bool) 0x9385f9ff

Transfer(address,address,uint256) 0xddf252ad

WithdrawalBatchClosed(uint256) 0xcbdf25bf

WithdrawalBatchCreated(uint256) 0x5c9a946d

WithdrawalBatchExpired(uint256,uint256,uint256,uint256) 0x9262dc39

WithdrawalBatchPayment(uint256,uint256,uint256) 0x52720347

WithdrawalExecuted(uint256,address,uint256) 0xd6cddb3d

WithdrawalQueued(uint256,address,uint256,uint256) 0xecc966b2


# WildcatMarketBase.sol

Function, event and error signatures for WildcatMarketBase.sol.

## Functions:

accruedProtocolFees() 0x0cd1a5b6

archController() 0x54635570

asset() 0x38d52e0f

borrowableAssets() 0x76636017

borrower() 0x7df1f1b9

changeSphereXEngine(address) 0x4c6c848f

coverageLiquidity() 0x739ccdd3

currentState() 0x0c3f6acf

decimals() 0x313ce567

delinquencyFeeBips() 0x4be687c6

delinquencyGracePeriod() 0x514a4cd6

factory() 0xc45a0155

feeRecipient() 0x46904840

hooks() 0xcd7033c4

name() 0x06fdde03

previousState() 0x0c1e3fea

scaleFactor() 0x683dd191

scaledBalanceOf(address) 0x1da24f3e

scaledTotalSupply() 0xb1bf962d

sentinel() 0xf58c251c

sphereXEngine() 0x3c231166

sphereXOperator() 0xe7e5db4f

symbol() 0x95d89b41

totalAssets() 0x01e1d114

totalDebts() 0x14a1c32d

version() 0x54fd4d50

withdrawableProtocolFees() 0x1e3cef53

withdrawalBatchDuration() 0x9e6f9802

## Events:

AccountSanctioned(address) 0x4f30ec08

AnnualInterestBipsUpdated(uint256) 0xff7b6c8b

Approval(address,address,uint256) 0x8c5be1e5

Borrow(uint256) 0xb848ae6b

ChangedSpherexEngineAddress(address,address) 0xf33499cc

ChangedSpherexOperator(address,address) 0x2ac55ae7

DebtRepaid(address,uint256) 0xe8b606ac

Deposit(address,uint256,uint256) 0x90890809

FeesCollected(uint256) 0x860c0aa5

InterestAndFeesAccrued(uint256,uint256,uint256,uint256,uint256,uint256) 0x18247a39

MarketClosed(uint256) 0x9dc30b8e

MaxTotalSupplyUpdated(uint256) 0xf2672935

ProtocolFeeBipsUpdated(uint256) 0x4b347052

ReserveRatioBipsUpdated(uint256) 0x72877a15

SanctionedAccountAssetsQueuedForWithdrawal(address,uint256,uint256,uint256) 0xe12b220b

SanctionedAccountAssetsSentToEscrow(address,address,uint256) 0x571e706c

SanctionedAccountWithdrawalSentToEscrow(address,address,uint32,uint256) 0x0d0843a0

StateUpdated(uint256,bool) 0x9385f9ff

Transfer(address,address,uint256) 0xddf252ad

WithdrawalBatchClosed(uint256) 0xcbdf25bf

WithdrawalBatchCreated(uint256) 0x5c9a946d

WithdrawalBatchExpired(uint256,uint256,uint256,uint256) 0x9262dc39

WithdrawalBatchPayment(uint256,uint256,uint256) 0x52720347

WithdrawalExecuted(uint256,address,uint256) 0xd6cddb3d

WithdrawalQueued(uint256,address,uint256,uint256) 0xecc966b2


# /spherex

Function, event and error signatures for the SphereX integration contracts.


# ISphereXEngine.sol

Interface signatures for ISphereXEngine.sol.

## Functions:

addAllowedSenderOnChain(address) 0x11ede2e6

sphereXValidateInternalPost(int256,uint256,bytes32\[],bytes32\[]) 0x04e6279a

sphereXValidateInternalPre(int256) 0x3e884943

sphereXValidatePost(int256,uint256,bytes32\[],bytes32\[]) 0xf0bd9468

sphereXValidatePre(int256,address,bytes) 0x8925ca5a

supportsInterface(bytes4) 0x01ffc9a7


# ISphereXProtectedRegisteredBase.sol

Interface signatures for ISphereXProtectedRegisteredBase.sol.

## Functions:

changeSphereXEngine(address) 0x4c6c848f

sphereXEngine() 0x3c231166

sphereXOperator() 0xe7e5db4f

## Events:

ChangedSpherexEngineAddress(address,address) 0xf33499cc

ChangedSpherexOperator(address,address) 0x2ac55ae7


# SphereXConfig.sol

Function, event and error signatures for SphereXConfig.sol.

## Functions:

acceptSphereXAdminRole() 0x8426b968

changeSphereXEngine(address) 0x4c6c848f

changeSphereXOperator(address) 0x4ee8f858

pendingSphereXAdmin() 0x9aa9019e

sphereXAdmin() 0x99e80f3b

sphereXEngine() 0x3c231166

sphereXOperator() 0xe7e5db4f

transferSphereXAdminRole(address) 0xdaba7ef7

## Events:

ChangedSpherexEngineAddress(address,address) 0xf33499cc

ChangedSpherexOperator(address,address) 0x2ac55ae7

NewAllowedSenderOnchain(address) 0x6de0a1fd

SpherexAdminTransferCompleted(address,address) 0x67ebaebc

SpherexAdminTransferStarted(address,address) 0x5778f154


# HooksFactory.sol

Function, event and error signatures for HooksFactory.sol.

## Functions:

addHooksTemplate(address,string,address,address,uint80,uint16) 0x3476b76d

archController() 0x54635570

changeSphereXEngine(address) 0x4c6c848f

computeMarketAddress(bytes32) 0xc29a7677

deployHooksInstance(address,bytes) 0xcd01e52a

deployMarket((address,string,string,uint128,uint16,uint16,uint32,uint16,uint32,uint256),bytes,bytes32,address,uint256) 0xe7ca86e3

deployMarketAndHooks(address,bytes,(address,string,string,uint128,uint16,uint16,uint32,uint16,uint32,uint256),bytes,bytes32,address,uint256) 0xad78e45a

disableHooksTemplate(address) 0x9f2f94b3

getHooksTemplateDetails(address) 0x2812d2de

getHooksTemplateForInstance(address) 0x2b07f280

getHooksTemplates() 0x6e50f960

getHooksTemplates(uint256,uint256) 0xcdbb8374

getHooksTemplatesCount() 0xd9d58025

getMarketParameters() 0x04032dbb

getMarketsForHooksTemplate(address) 0x1caab59d

getMarketsForHooksTemplate(address,uint256,uint256) 0xeae6ff66

getMarketsForHooksTemplateCount(address) 0xd1a0745c

isHooksInstance(address) 0xd19bd571

isHooksTemplate(address) 0x3fd83e1e

marketInitCodeHash() 0xaeefe08c

marketInitCodeStorage() 0x356dd352

pushProtocolFeeBipsUpdates(address) 0x155733ef

pushProtocolFeeBipsUpdates(address,uint256,uint256) 0x33ee81f2

registerWithArchController() 0x41f259b8

sanctionsSentinel() 0x4272711d

sphereXEngine() 0x3c231166

sphereXOperator() 0xe7e5db4f

updateHooksTemplateFees(address,address,address,uint80,uint16) 0x9c5cd31a

## Events:

ChangedSpherexEngineAddress(address,address) 0xf33499cc

ChangedSpherexOperator(address,address) 0x2ac55ae7

HooksInstanceDeployed(address,address) 0xa1d2f67e

HooksTemplateAdded(address,string,address,address,uint80,uint16) 0x7735fb05

HooksTemplateDisabled(address) 0xf53ee7e1

HooksTemplateFeesUpdated(address,address,address,uint80,uint16) 0xba32e46a

MarketDeployed(address,address,string,string,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256) 0x6f8c7c94


# IHooksFactory.sol

Interface signatures for IHooksFactory.sol.

## Functions:

addHooksTemplate(address,string,address,address,uint80,uint16) 0x3476b76d

archController() 0x54635570

computeMarketAddress(bytes32) 0xc29a7677

deployHooksInstance(address,bytes) 0xcd01e52a

deployMarket((address,string,string,uint128,uint16,uint16,uint32,uint16,uint32,uint256),bytes,bytes32,address,uint256) 0xe7ca86e3

deployMarketAndHooks(address,bytes,(address,string,string,uint128,uint16,uint16,uint32,uint16,uint32,uint256),bytes,bytes32,address,uint256) 0xad78e45a

disableHooksTemplate(address) 0x9f2f94b3

getHooksTemplateDetails(address) 0x2812d2de

getHooksTemplateForInstance(address) 0x2b07f280

getHooksTemplates() 0x6e50f960

getHooksTemplates(uint256,uint256) 0xcdbb8374

getHooksTemplatesCount() 0xd9d58025

getMarketParameters() 0x04032dbb

getMarketsForHooksTemplate(address) 0x1caab59d

getMarketsForHooksTemplate(address,uint256,uint256) 0xeae6ff66

getMarketsForHooksTemplateCount(address) 0xd1a0745c

isHooksInstance(address) 0xd19bd571

isHooksTemplate(address) 0x3fd83e1e

marketInitCodeHash() 0xaeefe08c

marketInitCodeStorage() 0x356dd352

pushProtocolFeeBipsUpdates(address) 0x155733ef

pushProtocolFeeBipsUpdates(address,uint256,uint256) 0x33ee81f2

registerWithArchController() 0x41f259b8

sanctionsSentinel() 0x4272711d

updateHooksTemplateFees(address,address,address,uint80,uint16) 0x9c5cd31a

## Events:

HooksInstanceDeployed(address,address) 0xa1d2f67e

HooksTemplateAdded(address,string,address,address,uint80,uint16) 0x7735fb05

HooksTemplateDisabled(address) 0xf53ee7e1

HooksTemplateFeesUpdated(address,address,address,uint80,uint16) 0xba32e46a

MarketDeployed(address,address,string,string,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256) 0x6f8c7c94


# WildcatArchController.sol

Function, event and error signatures for WildcatArchController.sol.

## Functions:

acceptSphereXAdminRole() 0x8426b968

addBlacklist(address) 0x9cfe42da

cancelOwnershipHandover() 0x54d1f13d

changeSphereXEngine(address) 0x4c6c848f

changeSphereXOperator(address) 0x4ee8f858

completeOwnershipHandover(address) 0xf04e283e

getBlacklistedAssets() 0x79adfa6c

getBlacklistedAssets(uint256,uint256) 0x8b984bb3

getBlacklistedAssetsCount() 0xb9d5dfe8

getRegisteredBorrowers() 0xb9bccae8

getRegisteredBorrowers(uint256,uint256) 0xbe736ff8

getRegisteredBorrowersCount() 0x1ce28ab7

getRegisteredControllerFactories(uint256,uint256) 0x0e572082

getRegisteredControllerFactories() 0x6e0fb58d

getRegisteredControllerFactoriesCount() 0x78e9c224

getRegisteredControllers(uint256,uint256) 0xa1c4bff8

getRegisteredControllers() 0xdb316dbc

getRegisteredControllersCount() 0x3d05a1d3

getRegisteredMarkets() 0x46762101

getRegisteredMarkets(uint256,uint256) 0x7ade7f20

getRegisteredMarketsCount() 0x84b870ab

isBlacklistedAsset(address) 0xb0018c60

isRegisteredBorrower(address) 0x0787c1fe

isRegisteredController(address) 0x8cdcb3e6

isRegisteredControllerFactory(address) 0x99882f70

isRegisteredMarket(address) 0x4a58e49e

owner() 0x8da5cb5b

ownershipHandoverExpiresAt(address) 0xfee81cf4

pendingSphereXAdmin() 0x9aa9019e

registerBorrower(address) 0xabad7426

registerController(address) 0xd91ae8c2

registerControllerFactory(address) 0x1b4f512c

registerMarket(address) 0xa79b9ec9

removeBlacklist(address) 0xeb91e651

removeBorrower(address) 0x76c7fc55

removeController(address) 0xf6a74ed7

removeControllerFactory(address) 0x8b13e382

removeMarket(address) 0xdb913236

renounceOwnership() 0x715018a6

requestOwnershipHandover() 0x25692962

sphereXAdmin() 0x99e80f3b

sphereXEngine() 0x3c231166

sphereXOperator() 0xe7e5db4f

transferOwnership(address) 0xf2fde38b

transferSphereXAdminRole(address) 0xdaba7ef7

updateSphereXEngineOnRegisteredContracts(address\[],address\[],address\[]) 0xf631241e

## Events:

AssetBlacklisted(address) 0x10c0fc3a

AssetPermitted(address) 0xbfd78d1a

BorrowerAdded(address) 0xf936762b

BorrowerRemoved(address) 0xeb319987

ChangedSpherexEngineAddress(address,address) 0xf33499cc

ChangedSpherexOperator(address,address) 0x2ac55ae7

ControllerAdded(address,address) 0x09703263

ControllerFactoryAdded(address) 0x8968daf7

ControllerFactoryRemoved(address) 0x92b171cd

ControllerRemoved(address) 0x33d83959

MarketAdded(address,address) 0x7772c85e

MarketRemoved(address) 0x59d7b1e5

NewAllowedSenderOnchain(address) 0x6de0a1fd

OwnershipHandoverCanceled(address) 0xfa7b8eab

OwnershipHandoverRequested(address) 0xdbf36a10

OwnershipTransferred(address,address) 0x8be0079c

SpherexAdminTransferCompleted(address,address) 0x67ebaebc

SpherexAdminTransferStarted(address,address) 0x5778f154


# WildcatSanctionsEscrow\.sol

Function, event and error signatures for WildcatSanctionsEscrow\.sol.

## Functions:

account() 0x5dab2420

balance() 0xb69ef8a8

borrower() 0x7df1f1b9

canReleaseEscrow() 0xa4972b47

escrowedAsset() 0x3d02b19c

releaseEscrow() 0x757a5543

sentinel() 0xf58c251c

## Events:

EscrowReleased(address,address,uint256) 0xddb6c734


# WildcatSanctionsSentinel.sol

Function, event and error signatures for WildcatSanctionsSentinel.sol.

## Functions:

WildcatSanctionsEscrowInitcodeHash() 0xb8b45361

archController() 0x54635570

chainalysisSanctionsList() 0x4973203d

createEscrow(address,address,address) 0xa1054f6b

getEscrowAddress(address,address,address) 0x1cdf58b0

isFlaggedByChainalysis(address) 0x95c09839

isSanctioned(address,address) 0x06e74444

overrideSanction(address) 0x681909a0

removeSanctionOverride(address) 0x490a8653

sanctionOverrides(address,address) 0x380c3431

tmpEscrowParams() 0xb1d62668

## Events:

NewSanctionsEscrow(address,address,address) 0x23e05aa5

SanctionOverride(address,address) 0xf7314dc6

SanctionOverrideRemoved(address,address) 0x23bb3a3a


# Protocol Structs

All V2 structs (MarketState, MarketParameters, WithdrawalBatch, and more) with their field types.

This page includes details of the structs used within Wildcat V2.

Note: you can generate this yourself via the `calculate_structs.py` Python script in the `/scripts` directory of the repository.

## File: src/HooksFactory.sol

### Struct: TmpMarketParameterStorage

address borrower

address asset

address feeRecipient

uint16 protocolFeeBips

uint128 maxTotalSupply

uint16 annualInterestBips

uint16 delinquencyFeeBips

uint32 withdrawalBatchDuration

uint16 reserveRatioBips

uint32 delinquencyGracePeriod

bytes32 packedNameWord0

bytes32 packedNameWord1

bytes32 packedSymbolWord0

bytes32 packedSymbolWord1

uint8 decimals

HooksConfig hooks // NOTE: type HooksConfig is uint256;<br>

## File: src/IHooksFactory.sol

## Struct: HooksTemplate

/// @dev Asset used to pay origination fee

address originationFeeAsset

/// @dev Amount of \`originationFeeAsset\` paid to deploy a new market using

/// an instance of this template.

uint80 originationFeeAmount

/// @dev Basis points paid on interest for markets deployed using hooks

/// based on this template

uint16 protocolFeeBips

/// @dev Whether the template exists

bool exists

/// @dev Whether the template is enabled

bool enabled

/// @dev Index of the template address in the array of hooks templates

uint24 index

/// @dev Address to pay origination and interest fees

address feeRecipient

/// @dev Name of the template

string name

## File: src/types/LenderStatus.sol

### Struct: LenderStatus

bool isBlockedFromDeposits

address lastProvider

bool canRefresh

uint32 lastApprovalTimestamp

## File: src/access/AccessControlHooks.sol

### Struct: HookedMarket

bool isHooked

bool transferRequiresAccess

bool depositRequiresAccess

uint128 minimumDeposit<br>

## File: src/access/FixedTermLoanHooks.sol

### Struct: HookedMarket

bool isHooked

bool transferRequiresAccess

bool depositRequiresAccess

bool withdrawalRequiresAccess

uint128 minimumDeposit

uint32 fixedTermEndTime

## File: src/access/MarketConstraintHooks.sol

### Struct: TemporaryReserveRatio

uint16 originalAnnualInterestBips

uint16 originalReserveRatioBips

uint32 expiry

## File: src/libraries/MarketState.sol

### Struct: MarketState

bool isClosed

uint128 maxTotalSupply

uint128 accruedProtocolFees

// Underlying assets reserved for withdrawals which have been paid

// by the borrower but not yet executed.

uint128 normalizedUnclaimedWithdrawals

// Scaled token supply (divided by scaleFactor)

uint104 scaledTotalSupply

// Scaled token amount in withdrawal batches that have not been

// paid by borrower yet.

uint104 scaledPendingWithdrawals

uint32 pendingWithdrawalExpiry

// Whether market is currently delinquent (liquidity under requirement)

bool isDelinquent

// Seconds borrower has been delinquent

uint32 timeDelinquent

// Fee charged to borrowers as a fraction of the annual interest rate

uint16 protocolFeeBips

// Annual interest rate accrued to lenders, in basis points

uint16 annualInterestBips

// Percentage of outstanding balance that must be held in liquid reserves

uint16 reserveRatioBips

// Ratio between internal balances and underlying token amounts

uint112 scaleFactor

uint32 lastInterestAccruedTimestamp

### Struct: Account

uint104 scaledBalance

## File: src/libraries/Withdrawal.sol

### Struct: WithdrawalBatch

// Total scaled amount of tokens to be withdrawn

uint104 scaledTotalAmount

// Amount of scaled tokens that have been paid by borrower

uint104 scaledAmountBurned

// Amount of normalized tokens that have been paid by borrower

uint128 normalizedAmountPaid

### Struct: AccountWithdrawalStatus

uint104 scaledAmount

uint128 normalizedAmountWithdrawn

### Struct: WithdrawalData

FIFOQueue unpaidBatches

mapping(uint32 => WithdrawalBatch) batches

mapping(uint256 => mapping(address => AccountWithdrawalStatus)) accountStatuses

## File: src/libraries/FIFOQueue.sol

### Struct: FIFOQueue

uint128 startIndex

uint128 nextIndex

mapping(uint256 => uint32) data

## File: src/spherex/ISphereXEngine.sol

### Struct: ModifierLocals

bytes32\[] storageSlots

bytes32\[] valuesBefore

uint256 gas

address engine<br>

## File: ../src/interfaces/IWildcatSanctionsSentinel.sol

### Struct: TmpEscrowParams

address borrower

address account

address asset<br>

## File: src/interfaces/WildcatStructsAndEnums.sol

### Struct: MarketParameters

address asset

uint8 decimals

bytes32 packedNameWord0

bytes32 packedNameWord1

bytes32 packedSymbolWord0

bytes32 packedSymbolWord1

address borrower

address feeRecipient

address sentinel

uint128 maxTotalSupply

uint16 protocolFeeBips

uint16 annualInterestBips

uint16 delinquencyFeeBips

uint32 withdrawalBatchDuration

uint16 reserveRatioBips

uint32 delinquencyGracePeriod

address archController

address sphereXEngine

HooksConfig hooks

### Struct: DeployMarketInputs

address asset

string namePrefix

string symbolPrefix

uint128 maxTotalSupply

uint16 annualInterestBips

uint16 delinquencyFeeBips

uint32 withdrawalBatchDuration

uint16 reserveRatioBips

uint32 delinquencyGracePeriod

HooksConfig hooks

### Struct: MarketControllerParameters

address archController

address borrower

address sentinel

address marketInitCodeStorage

uint256 marketInitCodeHash

uint32 minimumDelinquencyGracePeriod

uint32 maximumDelinquencyGracePeriod

uint16 minimumReserveRatioBips

uint16 maximumReserveRatioBips

uint16 minimumDelinquencyFeeBips

uint16 maximumDelinquencyFeeBips

uint32 minimumWithdrawalBatchDuration

uint32 maximumWithdrawalBatchDuration

uint16 minimumAnnualInterestBips

uint16 maximumAnnualInterestBips

address sphereXEngine

### Struct: ProtocolFeeConfiguration

address feeRecipient

address originationFeeAsset

uint80 originationFeeAmount

uint16 protocolFeeBips

### Struct: MarketParameterConstraints

uint32 minimumDelinquencyGracePeriod

uint32 maximumDelinquencyGracePeriod

uint16 minimumReserveRatioBips

uint16 maximumReserveRatioBips

uint16 minimumDelinquencyFeeBips

uint16 maximumDelinquencyFeeBips

uint32 minimumWithdrawalBatchDuration

uint32 maximumWithdrawalBatchDuration

uint16 minimumAnnualInterestBips

uint16 maximumAnnualInterestBips


# Contract Deployments

Core contract deployment addresses across chains — Ethereum mainnet, Plasma, and Sepolia testnet.

## Ethereum

### Mainnet \[V2]

<table><thead><tr><th width="288">Contract Name</th><th>Contract Address</th></tr></thead><tbody><tr><td>MarketLens</td><td><a href="https://etherscan.io/address/0xfDA5C5B96bb198D2fca1A01d759620B64Ae5afE7">0xfDA5C5B96bb198D2fca1A01d759620B64Ae5afE7</a></td></tr><tr><td>WildcatArchController</td><td><a href="https://etherscan.io/address/0xfEB516d9D946dD487A9346F6fee11f40C6945eE4">0xfEB516d9D946dD487A9346F6fee11f40C6945eE4</a></td></tr><tr><td>WildcatSanctionsSentinel</td><td><a href="https://etherscan.io/address/0x437e0551892C2C9b06d3fFd248fe60572e08CD1A">0x437e0551892C2C9b06d3fFd248fe60572e08CD1A</a></td></tr><tr><td>WildcatHooksFactory</td><td><a href="https://etherscan.io/address/0xdd7dd3b5076cf89440d05585ff56d246386207be">0xdd7dd3b5076cf89440d05585ff56d246386207be</a></td></tr><tr><td>Wildcat4626WrapperFactory</td><td><a href="https://etherscan.io/address/0xEA6DE11f8F3F83c79bD9d8Db5517fCFDf2Bb148a">0xEA6DE11f8F3F83c79bD9d8Db5517fCFDf2Bb148a</a></td></tr><tr><td>FixedTermHooks Template</td><td><a href="https://etherscan.io/address/0x7e49CabA6FB53CDc70CD98829731A2b8d76dfc36">0x7e49CabA6FB53CDc70CD98829731A2b8d76dfc36</a></td></tr><tr><td>OpenTermHooks Template</td><td><a href="https://etherscan.io/address/0x4c62B4844C8371f321541E8d564A4B3896cEceC7">0x4c62B4844C8371f321541E8d564A4B3896cEceC7</a></td></tr><tr><td>WildcatFeeRecipient</td><td><a href="https://etherscan.io/address/0x35A5D1bd68F3139971027b92c1eE9384A0708554#code">0x35A5D1bd68F3139971027b92c1eE9384A0708554</a></td></tr></tbody></table>

### Deprecated Ethereum Mainnet \[V1]

<table><thead><tr><th width="288">Contract Name</th><th>Contract Address</th></tr></thead><tbody><tr><td>MarketLens</td><td><a href="https://etherscan.io/address/0xf1D516954f96c1363f8b0aE48D79c8ddE6237847">0xf1D516954f96c1363f8b0aE48D79c8ddE6237847</a></td></tr><tr><td>WildcatMarketControllerFactory</td><td><a href="https://etherscan.io/address/0xFd31007613C9F671df6A8D4234901324986Bfd13">0xFd31007613C9F671df6A8D4234901324986Bfd13</a></td></tr></tbody></table>

### Sepolia Testnet \[V1, components of pre-audited V2]

Note: incomplete V2 deployment dated 5th August 2024 - only of archival interest to auditors.

Will be refreshing this soon with current Sepolia addresses of appropriate contracts.

<table><thead><tr><th width="287">Contract Name</th><th>Contract Address</th></tr></thead><tbody><tr><td>AccessControlHooks_initCodeStorage</td><td><a href="https://sepolia.etherscan.io/address/0x42893972c752E731c3457d0d541a2BC6fAdFE751">0x42893972c752E731c3457d0d541a2BC6fAdFE751</a></td></tr><tr><td>HooksFactory</td><td><a href="https://sepolia.etherscan.io/address/0x6Cb3512b541733d340Aa520b63105586588BD600">0x6Cb3512b541733d340Aa520b63105586588BD600</a></td></tr><tr><td>MarketLens</td><td><a href="https://sepolia.etherscan.io/address/0xb3925B31A8AeDCE8CFc885e0D5DAa057A1EA8A72">0xb3925B31A8AeDCE8CFc885e0D5DAa057A1EA8A72</a></td></tr><tr><td>MockArchControllerOwner</td><td><a href="https://sepolia.etherscan.io/address/0xa476920af80B587f696734430227869795E2Ea78">0xa476920af80B587f696734430227869795E2Ea78</a></td></tr><tr><td>MockChainalysis</td><td><a href="https://sepolia.etherscan.io/address/0x9d1060f8DEE8CBCf5eC772C51Ec671f70Cc7f8d9">0x9d1060f8DEE8CBCf5eC772C51Ec671f70Cc7f8d9</a></td></tr><tr><td>MockERC20Factory</td><td><a href="https://sepolia.etherscan.io/address/0x54A3103904977DCb3C2fB782059F5431db90C96e">0x54A3103904977DCb3C2fB782059F5431db90C96e</a></td></tr><tr><td>WildcatArchController</td><td><a href="https://sepolia.etherscan.io/address/0xC003f20F2642c76B81e5e1620c6D8cdEE826408f">0xC003f20F2642c76B81e5e1620c6D8cdEE826408f</a></td></tr><tr><td>WildcatMarketControllerFactory</td><td><a href="https://sepolia.etherscan.io/address/0xEb97C8E52d7Fdf978a64a538F28271Fd8499b864">0xEb97C8E52d7Fdf978a64a538F28271Fd8499b864</a></td></tr><tr><td>Wildcat4626WrapperFactory</td><td><a href="https://sepolia.etherscan.io/address/0x0566Fe57682164af689f1440cb3BCEedEe3bf843">0x0566Fe57682164af689f1440cb3BCEedEe3bf843</a></td></tr><tr><td>WildcatMarket_initCodeStorage</td><td><a href="https://sepolia.etherscan.io/address/0xB666C1C67A20814E3eEE15A06780E0821Ae30dd1">0xB666C1C67A20814E3eEE15A06780E0821Ae30dd1</a></td></tr><tr><td>WildcatSanctionsSentinel</td><td><a href="https://sepolia.etherscan.io/address/0xFBCE262eC835be5e6A458cE1722EeCe0E453316B">0xFBCE262eC835be5e6A458cE1722EeCe0E453316B</a></td></tr></tbody></table>

## Plasma

### Mainnet

<table><thead><tr><th width="287">Contract Name</th><th>Contract Address</th></tr></thead><tbody><tr><td>ChainalysisProxy</td><td><a href="https://plasmascan.to/address/0x38056F7fE6396417b191BF7Dc6a3aA04235f3f46">0x38056F7fE6396417b191BF7Dc6a3aA04235f3f46</a></td></tr><tr><td>FixedTermHooks_initCodeStorage</td><td><a href="https://plasmascan.to/address/0x59010b706959c15977304C2553F3f4c697A73018">0x59010b706959c15977304C2553F3f4c697A73018</a></td></tr><tr><td>HooksFactory</td><td><a href="https://plasmascan.to/address/0xB46bae25AC6D23148531ed1853a8881FD842E517">0xB46bae25AC6D23148531ed1853a8881FD842E517</a></td></tr><tr><td>MarketLens</td><td><a href="https://plasmascan.to/address/0x7e5d6d9f9a2091dD781118514F5397A8107c81c5">0x7e5d6d9f9a2091dD781118514F5397A8107c81c5</a></td></tr><tr><td>OpenAccessRoleProvider</td><td><a href="https://plasmascan.to/address/0x792F1368f8B8f450c14875eb6FF0028dFc2629b4">0x792F1368f8B8f450c14875eb6FF0028dFc2629b4</a></td></tr><tr><td>OpenTermHooks_initCodeStorage</td><td><a href="https://plasmascan.to/address/0x40217f6e5891C8F1524744C0747e07d316a0c798">0x40217f6e5891C8F1524744C0747e07d316a0c798</a></td></tr><tr><td>SphereXEngine</td><td><a href="https://plasmascan.to/address/0x931fe4a88e1C1f1A7402dF6A40988f38503f1061">0x931fe4a88e1C1f1A7402dF6A40988f38503f1061</a></td></tr><tr><td>WildcatArchController</td><td><a href="https://plasmascan.to/address/0xdb2e0DE97d6d96aa56754635704a4273E0F348ae">0xdb2e0DE97d6d96aa56754635704a4273E0F348ae</a></td></tr><tr><td>WildcatCopyOfChainalysisList</td><td><a href="https://plasmascan.to/address/0xfEB516d9D946dD487A9346F6fee11f40C6945eE4">0xfEB516d9D946dD487A9346F6fee11f40C6945eE4</a></td></tr><tr><td>WildcatMarket_initCodeStorage</td><td><a href="/users/2TRfflxT5XWeCC2FWBHrdSm9gSs1">0x74b253041BE30b7698B5f69239c271Ea8DB57261</a></td></tr><tr><td>WildcatSanctionsSentinel</td><td><a href="https://plasmascan.to/address/0x37064895ba2C1e269EAF7FF32564818d08903f5B">0x37064895ba2C1e269EAF7FF32564818d08903f5B</a></td></tr><tr><td>WildcatFeeRecipient</td><td><a href="https://plasmascan.to/address/0x437e0551892C2C9b06d3fFd248fe60572e08CD1A">0x437e0551892C2C9b06d3fFd248fe60572e08CD1A</a></td></tr></tbody></table>


# Code Security Reviews

Independent and Code4rena security reviews of the Wildcat V1 and V2 contracts, with reports.

The Wildcat protocol contracts have been subjected to independent security reviews and crowdsourced review via Code4rena.

The code repository for V2 is available

The results of these reviews (and associated reports) are available here:

## Wildcat V2 Reviews

### [alpeh\_v](https://x.com/alpeh_v) \[Independent Security Review]

**Date**: 12 - 23rd August 2024

**Scope**: Entire protocol

**LOC**: \~4,700

**Results**:

* 2 medium
* 2 low
* 2 notes

**Report**: <https://hackmd.io/@geistermeister/BJk4Ekt90>

### [Code4rena](https://code4rena.com/) \[$100,000 Competitive Public Audit]

**Date**: 31 August - 18 September 2024

**Scope**: See README/Scope [here](https://github.com/code-423n4/2024-08-wildcat/tree/main?tab=readme-ov-file#scope).

**LOC**: 3,784

**Results**:

* 1 high
* 8 medium

**Report**: <https://code4rena.com/audits/2024-08-the-wildcat-protocol>

Followed up by two subsequent mitigation reviews by [alpeh\_v](https://x.com/alpeh_v).<br>

***

## Wildcat V1 Reviews

### [alpeh\_v](https://x.com/alpeh_v) \[Independent Security Review]

**Date**: 13 - 29th September 2023

**Scope**: `src/markets/*`, `src/libraries/*`, `src/ReentrancyGuard.sol`

**LOC**: \~1,500

**Results**:

* 1 critical
* 2 high
* 4 medium
* 2 low
* Various notes

**Report**: <https://hackmd.io/@geistermeister/r15gj_y1p>

### [Code4rena](https://code4rena.com/) \[$60,500 Competitive Public Audit]

**Date**: 16 - 25th October 2023

**Scope**: Everything except `src/interfaces/*`

**LOC**: 2,332

**Results**:

* 6 high
* 11 medium

**Report**: <https://code4rena.com/contests/2023-10-the-wildcat-protocol>


# SphereX Protection

How Wildcat uses SphereX on-chain runtime protection to reject exploit-shaped transactions.

The Wildcat protocol contracts are protected on-chain by [SphereX](https://www.spherex.xyz/).

Without going into too much detail here, all external functions are wrapped in a modifier which sanity-checks any given transaction against a training set, reverting said transaction if it deviates too far from expected behaviour.

The net effect of this is that transactions which appear 'exploit-like' in shape (in that they take a novel path through function calls, interact strangely with contract storage, utilise an abnormal amount of gas and so on) are not permitted to execute, with a report of the transaction being sent to an off-chain analytics engine in order to determine the root cause of the rejection.

In the event that the transaction is legitimate (e.g. follows a path that had not been covered by training data), the Wildcat team are capable of updating the reference set to permit that transaction - and others like it - to succeed going forwards.

The nature of this protection means that access to Wildcat markets - and the wider protocol - is continuous even while under attack: deposits and withdrawals are be permitted as usual, whereas hostile transactions are rejected.

In the event that SphereX ceases to exist, the on-chain nature of the protection means that we would only lose access to the off-chain analytics engine and ability to update the reference set. In this (extreme) scenario, we can simply detach the engine and continue on as before, albeit with some wasted gas costs on existing contracts due to routing through a dead modifier.

It is worth noting however, that as with all security measures, the existence of SphereX within the Wildcat codebase does not *guarantee* total safety. In the event that Wildcat's team is compromised, it is possible to update the reference set with a hostile transaction after it has first been identified and subsequently replay the transaction. More generally, it is possible for the engine to be replaced with a trivial variant that rejects *every* transaction, effectively freezing the protocol in place.


# Bug Bounty Program

Wildcat's Immunefi bug bounty (V1), its scope and reward tiers.

**NOTE: A bug bounty program is&#x20;*****not*****&#x20;yet active for Wildcat V2.**

***

We operate a bug bounty program for Wildcat V1, facilitated by [Immunefi](https://immunefi.com/).

At this stage, the total amount allocated to the program is US$50,000.

{% embed url="<https://immunefi.com/bounty/wildcatprotocol/>" %}

The ranges of bounties available for various bug severities is:

* **Critical**: $7,500 - $10,000
* **High**: $5,000 - $7,500
* **Medium**: $3,000
* **Low**: $2,000


# Proving You Are An Affected Lender in a Default

How affected lenders use Juris to prove their position after a protocol-level default and ask the Wildcat Foundation for permitted borrower information.

## Proving Your Lender Position

If you lent capital to a market that has gone into default, [Juris](https://juris.wildcat.finance/) can produce a signed claim proving that you are one of its lenders. Wildcat Labs built and hosts Juris. The data you submit through it goes to the Wildcat Foundation, which handles the claim from that point on. Send the resulting *verification bundle* to the Foundation; the same proof supports any request for borrower information collected during KYC / KYB onboarding.

{% hint style="warning" %}
**Disclaimer:** The Foundation can share only information it is *actually permitted* to share. A valid proof gets your request reviewed; it does not guarantee that anything comes back. The Foundation treats indications of bad-faith conduct seriously. If it determines that a borrower has ceased to act in good faith, become unresponsive, abandoned its obligations, or engaged in conduct that may violate applicable law, it may restrict that borrower's access to the Products, report the matter to the appropriate authorities, cooperate with regulatory or law-enforcement investigations, and take any other steps available under the Terms of Use and applicable law.
{% endhint %}

Juris checks one narrow, protocol-observable condition: whether a market has been delinquent for longer than its grace period plus 90 days. That is the only kind of default it can validate from on-chain state. It is *not* the same thing as an Event of Default under a Master Loan Agreement. An MLA is a contract between you and the borrower; a default under it may occur earlier, or for reasons the protocol never sees at all. That is a matter for the agreement and your advisors, not something Juris can confirm. Juris shows the protocol-level status of each market so you can at least confirm that much with your own eyes before signing anything.

### Before You Start

You will want two things to hand:

* **The borrower address** of the market you lent to. You can find it on the borrower's profile at [app.wildcat.finance](https://app.wildcat.finance). The profile also carries the basics on the borrower, including its legal name and registered-address details, so have a read while you are there.
* **The wallet you hold the relevant debt tokens in.** This matters: the proof attests to the address that holds your position, so connecting the wrong wallet produces a proof for the wrong lender.

### Producing Your Proof

Wildcat Labs hosts Juris at [juris.wildcat.finance](https://juris.wildcat.finance/). Everything from finding the market to producing the signed bundle happens there, in five steps.

1. **Find your market.** Paste the borrower address into *Borrower & Market* and hit **Find markets**. Pick your market from the list, and check that it shows as *in default* before you go any further.
2. **Connect your wallet.** Click **Connect wallet** and connect the wallet you lent with. This is the address the proof will vouch for, so make sure it is the right one.
3. **Check your eligibility.** Juris shows you the market, the borrower address, and the amount owed to your connected wallet. Have a look and make sure it matches the position you think you hold.
4. **Fill in your details.** Give your full name, a way to reach you (an email, or another contact method such as Telegram or Signal, at least one of the two), and your country.
5. **Sign and submit.** Tick the box confirming that your details are accurate and that you intend to submit the proof as evidence of your eligibility. Click **Sign & submit claim**, then sign in your wallet when prompted. This is a message signature, not an on-chain transaction, so there is no gas to pay. Juris checks your eligibility again at submission and sends the claim data to the Wildcat Foundation.

Once it goes through, Juris confirms the wallet, amount owed, market and block it read, then generates the verification bundle.

### Sending It to the Foundation

After submission, Juris produces a section labelled **Verification bundle (send this to the Wildcat Foundation)**. This is what the Foundation needs to verify your request: the signed data, your signature, the address recovered from it, and the market, lender and amount owed as read back from the server. Taken together, those show that you control the lender address behind the claim.

To send it:

* Click **Copy verification bundle**, then paste it directly into the body of your email. Paste it exactly as copied, without editing it (a bundle that has been trimmed or reformatted may not verify).
* Do not send the bundle as an attachment. Paste the text straight into the email itself. The Foundation may not open files, screenshots or documents, and cannot act on a proof it cannot read.
* Email it to <contact@thewildcat.foundation>.
* Use the subject line `Default Lender - [Your wallet address]`.
* Alongside the pasted bundle, tell the Foundation in a line or two what information you want.

### What Happens Next

The Foundation will reply as soon as it reasonably can. Give it some time, though: sensitive information may need legal review and sign-off before it can leave the Foundation's hands. Legal review is not instant, and requests are often worked through in batches rather than one at a time.

An email without a valid verification bundle *pasted into the body* from the correct lender wallet, a way to contact you, and a note explaining what you want will not get a reply. A bundle sent as an attachment counts as incomplete. The Foundation cannot act on a request it cannot verify, so paste the complete bundle into the email before sending it.

### The Bit That Bears Repeating

Anything the Foundation provides remains subject to applicable law, the [Wildcat Terms of Use](https://docs.wildcat.finance/legal/wildcat-terms-of-use), the [Privacy Policy](https://docs.wildcat.finance/legal/protocol-ui-privacy-policy), and any contractual restrictions, including those arising from third-party KYC / KYB provider arrangements. Within those limits, it may pass on only the limited borrower-identifying information available to it that it considers reasonably necessary for you to evaluate and, if you choose, pursue any rights and remedies open to you under the Master Loan Agreement, applicable law, or equity. The Foundation weighs every request against those same constraints.

None of this is advice on whether or how to pursue a claim. The Foundation is not a party to your agreement with the borrower, does not enforce it, and is not responsible for repayment, recovery or the outcome of a dispute. Those calls are for you and your advisors to make.


# Wildcat Terms Of Use

Last Updated: 12 February 2025; SHA: 711a9e6707e6cf85166786461a0a45aa3b926b22b414abe8dfcc6c1afef020d1

> This page is formatted using markdown. To verify the agreement hash, please see the [plaintext version](https://github.com/wildcat-finance/wildcat-docs/tree/main/legal/wildcat-terms-of-use.txt) formatted for readability in wallet signature requests.

## 1. Introduction and Agreement

### 1.1 Welcome and Overview

Welcome! These Terms of Use (’Terms’) govern your access to and use of the products, services and related information and materials (collectively, the ’Products’) offered by Wildcat Foundation (’Company,’ ’we,’ ’us,’ or ’our’), which includes wildcat.finance, app.wildcat.finance and the interface and related services that facilitate interaction with the Wildcat Protocol (the ’Protocol’). You understand and acknowledge that the Protocol is not a Product. See Section 4 below titled ’Products vs. Protocol’ for an overview.

### 1.2 Binding Agreement

These Terms form a legally binding agreement between you and us. By accessing or using the Products, you confirm that you accept these Terms and agree to comply with them. If you do not agree, you must cease using the Products immediately.

### 1.3 Incorporation of Other Terms and Policies

Your use of the Products is also subject to any other Product-specific terms we may provide or include with the Products – such as licence terms included in the files of downloadable software components – as well as our Risk Disclosures and Privacy Policy, which are all incorporated by reference. Please review these documents carefully as they also contain important information.

ARBITRATION NOTICE: THESE TERMS CONTAIN AN ARBITRATION CLAUSE BELOW. EXCEPT FOR CERTAIN TYPES OF DISPUTES MENTIONED IN THAT ARBITRATION CLAUSE, YOU AND WE AGREE THAT ANY DISPUTES RELATING TO THE PRODUCTS WILL BE RESOLVED BY MANDATORY BINDING ARBITRATION, AND YOU WAIVE ANY RIGHT TO A TRIAL BY JURY OR TO PARTICIPATE IN A CLASS ACTION LAWSUIT OR CLASS-WIDE ARBITRATION.

## 2 Modification of Terms

### 2.1 Right to Modify

We reserve the right to modify, amend, or update these Terms at our discretion. Any changes will be effective immediately upon posting on the Products, with the ’Last Updated’ date reflecting the revision. We may also provide notice of modifications via email, pop-up notifications, or announcements on or through the Products. It is your responsibility to review the updated Terms, and your continued use of the Products constitutes acceptance of the changes.

### 2.2 Continued Use

If you continue using the Products after any modifications, you accept the updated Terms. If you do not agree with the changes, you must discontinue your use of the Products.

### 2.3 Retroactive Application

Modifications to these Terms will apply only prospectively. If any modification is found to be unenforceable, it will be applied within the bounds of enforceability without affecting other provisions.

## 3 Disclaimers and Acknowledgments

### 3.1 No Custodial Services

We do not provide custodial services or control your digital assets. You are responsible for managing your digital wallet and private keys, securing your digital assets, and safeguarding against unauthorised access. We disclaim all liability for any loss or damage resulting from your loss of control over these keys or any unauthorised access to your digital assets.

### 3.2 Risks of Digital Assets

You acknowledge that digital assets can be volatile, and you may lose some or all of your digital assets. Using the Protocol involves significant risks outlined in our Risk Disclosures – see also Section 4 below (titled ’Products vs. Protocol’).

### 3.3 No Financial Advice

We do not provide financial, legal, or tax advice. Consult a professional advisor before using the Products and/or making decisions related to or engaging in any transactions with the Protocol.

### 3.4 We are not Intermediaries

Due to the non-custodial and decentralised nature of the Products and Protocol, we are not intermediaries, agents, advisors, or custodians, and we do not have a fiduciary relationship or obligation to you or any third-party regarding any other decisions or activities that you affect when using the Products or Protocol.

## 4 Products vs. Protocol

### 4.1 Products Overview

The Products include the websites wildcat.finance and app.wildcat.finance, along with related applications and tools. The Protocol, as further explained below, is a decentralised finance (DeFi) application for the lending and borrowing of Ethereum-based crypto assets. The Products provide a user interface and other means of interacting with the Protocol but do not include the Protocol itself. Neither the Company nor the Products manage or control transactions or assets using the Protocol beyond dictating who is eligible to deploy Markets using the Products - see Section 6.1 below (titled ’Markets Overview’).

### 4.2 Your responsibility to understand and accept Risk Disclosures Policy

Before interacting with the Products or Protocol, you are strongly encouraged to thoroughly review the Risk Disclosures document available at <https://docs.wildcat.finance/legal/risk-disclosure-statement>. This document outlines the significant risks associated with decentralised finance applications, blockchain technology, and digital assets. BY USING THE PRODUCTS AND PROTOCOL, YOU ACKNOWLEDGE THAT YOU HAVE READ, UNDERSTOOD, AND ACCEPTED THE RISKS DETAILED IN THE RISK DISCLOSURES. The Company disclaims all liability for losses resulting from these inherent risks, including but not limited to, smart contract vulnerabilities, market volatility, unforeseen interactions with other blockchain protocols, services and products. Your continued use of the Products and Protocol signifies your acceptance of these risks and your agreement to be bound by the terms outlined in the Risk Disclosures.

### 4.3 Protocol Independence

We disclaim all responsibility for the operation, performance, or security of the Protocol. Users are solely responsible for reviewing and understanding any updates, forks, or modifications to the Protocol before interacting with it. The Company disclaims liability for any actions based on outdated or incorrect information.

### 4.4 User Responsibility

Users are solely responsible for their interactions with the Products and Protocol and any transactions they conduct. Users must understand the decentralised nature of the Products and Protocol and the inherent risks associated with blockchain technology.

### 4.5 No Warranties on Products or Protocol

The Company makes no representations or warranties, express or implied, regarding the security, reliability, functionality, or availability of the Products and Protocol. Users acknowledge that the Products and Protocol operate independently of the Company, which has no control over the Products or Protocol, and bears no responsibility for, any bugs, vulnerabilities, or failures in the Products or Protocol. Users are solely responsible for understanding the risks of interacting with the Products and Protocol, including potential losses due to changes, forks, or failures in smart contracts.

### 4.6 Experimental Technology

You acknowledge that the Protocol and our Products operate on experimental technology. As such, you accept the inherent risks associated with using decentralised finance applications built on this technology. These risks include, but are not limited to, smart contract vulnerabilities, potential loss of digital assets, unforeseen interactions with other blockchain protocols or events, lack of warranties or other performance guarantees, lack of maintenance obligations, cyberattack vulnerabilities, and potential intellectual property infringement claims.

### 4.7 Assumption of Risk

By accessing and using the Protocol and Products, you acknowledge and agree that the Protocol operates autonomously on decentralised blockchain networks and that the Company has no control over the Protocol, its smart contracts, or their execution. You further acknowledge that interactions with the Protocol may expose you to significant risks, including but not limited to, irreversible transactions, market volatility, smart contract vulnerabilities, and potential loss of digital assets. You agree that you fully assume these risks and understand that the Company disclaims all liability for any such risks, including but not limited to, losses resulting from protocol errors, network failures, or interactions with other blockchain systems.

## 5 Your Products and Services

### 5.1 Obligations to Your Users

Certain Products allow you to configure and deploy your own products and services to your own users and other third parties using the Protocol. You are solely responsible for those products and services and the activities conducted by you or anyone else in connection with those products and services. You, on behalf of yourself and your third-party users, expressly waive and release us from any and all liability, claims, causes of action, losses and damages arising from or in any way relating to your products and services. By using our Products, you agree that you will include in your agreement(s) with the users of your products and services the necessary waivers and disclaimers to ensure that those users do not seek any recourse or recovery from us.

### 5.2 Indemnification

You agree to indemnify, defend, and hold harmless the Company, its affiliates, and their respective officers, directors, employees, agents, and contractors from and against any claims, liabilities, damages, losses, costs, and expenses (including reasonable attorneys’ fees) arising out of or in connection with your use of the Products and Protocol or your products and services, including, but not limited to, any claims related to third-party rights, applicable laws, tax obligations, or regulatory violations.

## 6 Markets: Borrowers and Lenders

### 6.1 Markets Overview

The Products allow certain users to use the Wildcat Protocol to create and deploy custom smart contract markets (’Markets’) to facilitate credit lines involving digital assets. The Company does not control, influence, permission or monitor the design, parameters, or operation of any Markets created by any party using the Wildcat Protocol or otherwise created using the Products. All Markets are entirely user-generated, and the Company bears no responsibility for any aspect of their creation, management, or outcomes.

### 6.2 Market Deployers/Borrowers: Responsibility and Liability

As a creator of a Market, you acknowledge and agree that:

You assume full responsibility for all risks associated with the creation, deployment, and operation of your Market, and of use of your Markets by any party. This includes, but is not limited to, risks arising from coding errors, vulnerabilities, hacks, attacks, or interactions with other users, other smart contracts or blockchain events.

The Company has no control over, and disclaims any responsibility for, the risk parameters, attributes, and performance of your Market. You understand that the Company does not provide oversight or validation of your Market’s design or execution.

You are solely responsible for determining and ensuring compliance with all applicable laws, regulations, and tax obligations in your jurisdiction and in the jurisdiction of users of your Markets. The Company will not be held liable for any legal or regulatory violations arising from your Market, and it is your responsibility to ensure that your Market operates within the applicable legal regime, including AML/KYC, sanctions compliance, and tax laws of your jurisdiction and in other jurisdictions whose law may apply to the users of your Markets.

By creating and deploying a Market, you agree to indemnify, defend, and hold harmless the Company and its affiliates from any claims, liabilities, damages, losses, costs, or expenses (including reasonable attorneys’ fees) arising from or related to your Market(s), including any third-party claims or legal actions of any kind.

By creating and deploying a Market, you explicitly agree to repay all debt incurred by your Market in accordance with the terms applicable to your Market. This obligation includes, but is not limited to, principal amounts, interest, protocol fees, and any other associated costs.\
\
By creating and deploying a Market, whether or not a Loan Agreement is utilised, you explicitly acknowledge and accept that if your Market enters into a delinquent state and has incurred the penalty rate (as determined by the grace tracker) for a continuous period of ninety (90) days, your Market will be considered in default. This default status may trigger enforcement actions, including but not limited to, liquidation of assets, legal proceedings, or other remedies as permitted under applicable law and the terms governing the Market. In the event that a Loan Agreement is in place, this paragraph is superseded by that Loan Agreement.

### 6.3 Market Users/Lenders: Acknowledgment of Risk and Responsibility

As a user of a Market, you acknowledge and agree that:

You are solely responsible to conduct thorough due diligence before interacting with any Market. The Company makes no representations or warranties regarding the security, reliability, or performance of any Market and does not endorse, review, or vet any Market deployed by third parties.

You understand that Market are user-generated, and the Company has no control over their risk parameters, functionality, or any potential updates. Your use of a Market is entirely at your own risk, and you bear full responsibility for any losses, damages, or liabilities incurred as a result.

You must familiarise yourself with the Company’s Risk Disclosures and are bound to the terms therein. By using a Market, you confirm that you have reviewed and understand the risks associated with interacting with decentralised finance applications, including the potential for complete loss of digital assets.

You are solely responsible for determining and ensuring compliance with all applicable laws, regulations, and tax obligations in your jurisdiction. The Company will not be held liable for any legal or regulatory violations arising from your use of any Market, and it is your responsibility to ensure that you are using the Markets in compliance with the applicable legal regime, including tax laws of your jurisdiction.

As a Market user, you are subject to all terms and conditions outlined in these Terms, including Section 3 (Disclaimers and Acknowledgments), Section 13 (Limitation of Liability), and Section 14 (Indemnification). You further agree that your use of any Market is governed by these provisions, and the Company disclaims all liability for any consequences of your interactions with Markets.

### 6.4 No Control or Warranties

The Company makes no warranties, express or implied, regarding the security, reliability, functionality, or performance of any Market created or used on the Protocol. All Markets operate independently of the Company, which has no control over, and disclaims all responsibility for, any issues, bugs, vulnerabilities, hacks, attacks, or failures related to Markets. Users and creators of Markets must understand that their interactions with Markets are at their own risk and that the Company disclaims all liability for any associated losses.

### 6.5 No Guarantee of Performance or Security

The Company expressly disclaims any and all warranties, whether express or implied, regarding the security, reliability, functionality, or performance of any Market or the Protocol itself. Users of the Market and Protocol assume all risks associated with their use, including but not limited to, the risk of smart contract failures, unauthorised access, or market volatility. The Company shall not be held liable for any losses, damages, or liabilities arising from the use of Market or the Protocol.

### 6.6 Indemnification

You agree to indemnify, defend, and hold harmless the Company, its affiliates, and their respective officers, directors, employees, agents, and contractors from and against any claims, liabilities, damages, losses, costs, and expenses (including reasonable attorneys’ fees) arising out of or in connection with your use of any Market, including, but not limited to, any claims related to third-party rights, applicable laws, tax obligations, or regulatory violations.

## 7 Eligibility and Access

### 7.1 Eligibility Requirements

To access and use the Products, you must:

* Be at least 18 years old or of legal age to form a binding contract in your jurisdiction.
* Not be a resident or located in any jurisdiction where the use of the Products or Protocol is prohibited by law.

### 7.2 Duty to Disclose

You agree to notify the Company immediately if your eligibility status changes. The Company reserves the right to verify your eligibility at any time and may restrict or terminate access if eligibility cannot be confirmed.

### 7.3 No Access from Restricted Jurisdiction

You represent and warrant that you will not access or use the Products from any jurisdiction where such access or use is prohibited by law. You further agree not to use any virtual private network (’VPN’) or other tools to circumvent restrictions. Any attempt to do so may result in immediate termination of your access and potential legal actions.

### 7.4 Geographic Restrictions

The Products and Protocol are not intended for use by individuals or entities located in, incorporated in, or residing in countries or jurisdictions where such use is prohibited by law, including but not limited to any jurisdiction subject to comprehensive sanctions or embargoes – including those jurisdictions listed in Section 7.5 below (titled “Sanctioned Jurisdictions”). Users are prohibited from accessing the Products from these jurisdictions, and any attempt to use technology, such as a VPN, to circumvent these restrictions is strictly forbidden. By using the Products or Protocol, you represent and warrant that you are not located in or accessing the Products from any prohibited jurisdiction or Sanctioned Jurisdiction. Access to certain features or products may be restricted or only available to certain users based upon their location, residence or other information. Users should confirm that all functions required to manage any positions taken or transactions of assets initiated or performed using the Protocol or Products are available to them at all times, and users hereby acknowledge and affirm that they may not have access to all functions should they attempt to access any the Protocol or Products from a different jurisdiction, or geographical location, or via a VPN.

### 7.5 Sanctioned Jurisdictions

As of the ’Last Updated’ date above, the list of Sanctioned Jurisdictions is as follows:

* Iran
* Cuba
* North Korea (DPRK)
* Syria
* Crimea, Donetsk, and Luhansk regions in Ukraine
* Russia

### 7.6 Sanctioned Persons

You hereby agree and affirm that you are not a ’Sanctioned Person’ or accessing the Products or Protocol on behalf of, for the benefit of, or at the direction of any Sanctioned Person. For purposes of this Section 7.6, a Sanctioned Person is any of the following:

An individual or entity that is designated under blocking and asset freeze-type sanctions of any jurisdiction including but not limited to the Specially Designated Nationals and Blocked Persons List, which is enforced by the U.S. Department of the Treasury’s Office of Foreign Assets Control, the HM Treasury (HMT) Financial Sanctions List (also known as the UK Consolidated Financial Sanctions List), and the Consolidated Financial Sanctions List enforced by member states of the European Union;

Any entity that is owned 50% or more directly or indirectly, either individually or in the aggregate, by one or more Sanctioned Persons, or otherwise subject to the control of a Sanctioned Person;

The government of any Sanctioned Jurisdiction or the Government of Venezuela, including any subdivision or instrumentality thereof; or Any individual or entity located in, incorporated in, or residing in any Sanctioned Jurisdiction.

Violating this Section 7.6 may result in immediate termination of your access, reporting to authorities, and other legal actions.

## 8 Prohibited Use

### 8.1 Compliance with Laws

You agree to comply with all applicable laws, regulations, and guidelines when using the Products and interacting with the Protocol.

### 8.2 Prohibited Activities

Without limiting the foregoing, you will not:

* Use the Products or Protocol for illegal or unauthorised purposes.
* Attempt to gain unauthorised access to the Products or related systems.
* Use the Products or Protocol to conduct or facilitate money laundering, terrorist financing, or other illegal activities.
* Circumvent security measures implemented by us or the Protocol.
* Engage in market manipulation, wash trading, or other fraudulent activities.

Additional prohibited actions include:

* Engaging in fraudulent activities such as front-running, spoofing, or deceiving other users.
* Using automated means, such as bots, to access or interact with the Products or Protocol without our prior written consent.
* Circumventing content-filtering techniques or security measures, including using a VPN to bypass geographic restrictions.

### 8.3 Consequences of Prohibited Use

Violating this Section 8 may result in immediate termination of your access, reporting to authorities, and other legal actions.

### 8.4 Monitoring and Reporting

The Company reserves the right (but is not obligated) to monitor all activities conducted through the Products to ensure compliance with these Terms and applicable laws. Any suspicious activity may be reported to law enforcement or regulatory authorities.

### 8.5 Cooperation with Authorities

You agree that the Company may cooperate with government or regulatory authorities in investigating any suspected illegal activities. This may include providing information about your activities or identity as required by law.

## 9 User-Generated Content

### 9.1 Ownership and License

By submitting information or other content to us, you grant us a non-exclusive, worldwide, royalty-free, perpetual, irrevocable, sublicensable, and transferable licence to use, reproduce, modify, distribute, and display such content. This licence includes the right to sublicense and distribute your content to third parties. By creating or submitting content to us, including but not limited to Markets or smart contracts, you represent and warrant that such content does not infringe the intellectual property, privacy, or other rights of any third party, and that it complies with all applicable laws and regulations. You further agree that the Company shall have no liability for any claims, disputes, or damages arising from your content, and you assume full responsibility for any legal consequences that may result from your content or its use on the Products.

### 9.2 Prohibited Content

You agree that you will not submit content that is illegal, infringing, defamatory, or harmful. We are not obligated to monitor the content but reserve the right to remove any content that violates these Terms.

### 9.3 No Endorsement

The submission of user-generated content does not constitute the Company’s endorsement of such content. The Company disclaims liability arising from user-generated content.

### 9.4 Responsibility for Content

You are solely responsible for any content you submit, including ensuring it does not violate laws or third-party rights. You agree to indemnify, defend, and hold the Company harmless from and against any claims arising from your content. You acknowledge and agree that the Company is not responsible for, and will not be held liable for, any disputes or claims arising from your content, including but not limited to, intellectual property disputes, privacy violations, or any regulatory actions.

## 10 Fees and Transactions

### 10.1 Transaction Costs

Wildcat Foundation does not charge fees for using the Products. However, usage of Markets may result in fees being paid by Market creators depending on the specific asset, product or service. Users are responsible to check the configuration and fee parameters of any Products with which they interact. Additionally, the Ethereum network may impose transaction fees (e.g. gas fees). You are solely responsible for paying these fees. All transactions are final and irreversible, even if made in error or resulting from unauthorised access.

### 10.2 Irreversibility of Transactions

Transactions on the Ethereum blockchain are irreversible. Ensure all transaction details are correct before submission, as errors cannot be corrected by the Company. All transactions facilitated through the Products are final and non-refundable. This includes any and all fees, including gas fees, as well as any amounts sent or received through the Protocol. Users acknowledge that once a transaction has been broadcast to the blockchain, it cannot be reversed or modified in any way.

## 11 Intellectual Property

### 11.1 Ownership

All intellectual property rights in the Products, including text, graphics, logos, and software, are owned by or licensed to the Company. Your use of the Products does not grant you any ownership rights.

### 11.2 Restrictions on Use

Except as expressly permitted, you may not copy, modify, distribute, or create derivative works based on the Products without our prior written consent. Unauthorised use of the Products’ intellectual property is strictly prohibited and may result in legal action.

## 12 Privacy

### 12.1 Data Collection

We collect and use your personal data in accordance with our Privacy Policy available at <https://docs.wildcat.finance/legal/protocol-ui-privacy-policy>. By using the Products, you consent to the collection, use, and sharing of your data as described in the Privacy Policy.

### 12.2 Blockchain Data

Transactions conducted on the Ethereum blockchain, whether or not using the Products or Protocol, are public, immutable, and beyond the control of the Company. Users are solely responsible for ensuring that any personal information they include in blockchain transactions is minimised and does not compromise their privacy or security. The Company disclaims all liability for any loss, damage, or claim arising from the inclusion of personal data in blockchain transactions, including any claim related to privacy or data protection laws. By using the Products, you acknowledge that the Company has no ability to control or erase personal data recorded on the blockchain, and you assume full responsibility for the consequences of your actions.

## 13 Limitation of Liability

### 13.1 General Limitation

To the maximum extent permitted by law, we disclaim all liability for any damages, losses, or expenses, whether direct or indirect, arising from your use of the Products or the Protocol. This includes but is not limited to:

* Acts of third parties, including other users or external attackers.
* Unauthorised access to or use of your account or digital assets.
* Any interruption, suspension, or termination of the Products, whether intentional or unintentional.
* Errors, omissions, or delays in the transmission or delivery of information.
* The inclusion of personal data in blockchain transactions, which cannot be modified or erased by the Company.
* Your failure to comply with these Terms, including any misuse of the Products.

The Company’s total liability for any claim shall not exceed the greater of (i) $1,000 USD, or (ii) the total amount you paid to the Company for the use of the Products within the twelve (12) months preceding the event giving rise to the claim. The Company shall not be liable for any damages arising from software bugs, vulnerabilities, or failures in smart contracts associated with the Products or Protocol. You acknowledge that the Products operate on an experimental basis and may encounter unforeseen issues that the Company cannot predict or mitigate. Furthermore, the Company disclaims all liability for any interruptions or errors caused by third-party service providers, such as those related to blockchain infrastructure or network access.

To the fullest extent permitted by law, all other warranties, including but not limited to, implied warranties of merchantability, fitness for a particular purpose, and non-infringement, are expressly waived. The Products and Protocol are provided on an ’as is’ and ’as available’ basis, and you use them entirely at your own risk.

### 13.2 Maximum Liability

In no event shall we, our affiliates, or any of our respective directors, officers, employees, agents, or contractors be liable to you or any third party for any incidental, indirect, special, punitive, consequential, or similar damages or liabilities whatsoever (including damages for loss of data, information, revenue, profits, or other business or financial benefit) arising out of or in connection with the Products or Protocol, whether under contract, tort (including negligence), civil liability, statute, strict liability, or other theory of liability, and whether or not we have been advised of the possibility of such damages.

Our total liability for any claim arising out of or relating to the Products or Protocol shall not exceed the greater of (i) $1,000 USD, or (ii) the total amount you paid us for accessing or using the Products within the twelve (12) months preceding the event giving rise to the claim.

### 13.3 No Liability for Cyberattacks or Third-Party Malicious Activity

The Company cannot guarantee that the Products or the Protocol will be free from cyberattacks, viruses, or other malicious code that may result in unauthorised access to or loss of digital assets. By using the Products, you acknowledge and accept that the Company shall not be held liable for any damages or losses resulting from denial-of-service attacks, viruses, or other forms of cyberattacks. In addition, the Company shall not be responsible for any losses arising from phishing attacks, social engineering, or other fraudulent activities that target users outside of the Company’s control. Users must exercise caution and implement robust security measures to protect their assets and personal information.

The Company cannot guarantee that the Products or the Protocol will be free from cyberattacks, viruses, or other malicious code that may result in unauthorised access to or loss of digital assets. By using the Products, you acknowledge and accept that the Company shall not be held liable for any damages or losses resulting from denial-of-service attacks, viruses, or other forms of cyberattacks. In addition, the Company shall not be responsible for any losses arising from phishing attacks, social engineering, or other fraudulent activities that target users outside of the Company’s control. Users must exercise caution and implement robust security measures to protect their assets and personal information.

### 13.4 Third-Party Dependencies

You agree that any losses incurred due to third-party services are solely your responsibility, and you hold the Company harmless from any related claims. The Company expressly disclaims any responsibility for, and shall not be held liable for, the actions or inactions of any third-party service providers, including but not limited to, third-party decentralised applications, blockchain nodes, oracles, or any other service integrated or used in conjunction with the Products. Any reliance on third-party services is solely at the user’s risk, and the Company shall not be responsible for any interruptions, failures, inaccuracies, or damages caused by such services. Users are encouraged to independently verify the reliability and security of third-party services before use.

## 14 Indemnification

### 14.1 User Responsibility

In addition to all other indemnification obligations set forth in these Terms, you agree to indemnify, defend, and hold harmless the Company, its affiliates, and their respective officers, directors, employees, agents, and contractors (collectively, the ’Indemnified Parties’) from and against any claims, liabilities, damages, losses, costs, and expenses (including reasonable attorneys’ fees and court costs) arising out of or in connection with:

* Your use of, or conduct in connection with, the Products or the Protocol.
* Digital assets associated with your Ethereum address.
* Any feedback, content, or other information you provide to the Company concerning the Products.
* Your violation of these Terms or any applicable law.
* Your infringement or misappropriation of the rights of any other person or entity.

You further agree to indemnify, defend, and hold harmless the Indemnified Parties from any and all claims, liabilities, damages, losses, costs, and expenses (including reasonable attorneys’ fees) arising out of or in connection with: (i) your interactions with any third-party services or platforms accessed through the Products or Protocol; (ii) your failure to comply with any applicable laws, regulations, or tax obligations in your jurisdiction or the jurisdiction of any user of any product or service based on the Products; (iii) any claims or disputes related to intellectual property, privacy, or data protection arising from content you generate or transactions you conduct on the Products or Protocol; and (iv) any regulatory enforcement actions or penalties imposed due to your use of the Products or Protocol.

This indemnification also extends to any intellectual property disputes arising from your use of the Products, including but not limited to claims related to copyright, trademark, or patent infringement. Additionally, you agree to indemnify, defend and hold the Company harmless against any third-party claims related to your conduct, such as defamation, breach of contract, or violation of applicable laws and regulations.

With respect to all obligations of indemnification contained in these Terms, the Indemnified Parties shall have the exclusive right to control any such action or proceeding and to determine whether the Company wishes to settle, and if so, on what terms. You agree to cooperate fully with the Indemnified Parties in defending any claims and to cover all costs associated with such defence, including reasonable attorneys’ fees and expenses.

### 14.2 Third-Party Enforcement Rights

Any Indemnified Party not being a direct party to these Terms may enforce any rights granted to it under this section as if it were a party to these Terms. Notwithstanding any other provision of these Terms, the consent of or notice to any such third party shall not be required for any termination, variation, waiver, or settlement under these Terms. The Indemnified Parties shall retain all rights under this section, and any such rights are cumulative and not exclusive of any other rights available at law or in equity.

## 15 Governing Law and Dispute Resolution

### 15.1 Governing Law

These Terms shall be governed by and construed in accordance with the laws of the Cayman Islands, without regard to its conflict of law principles. By using the Products or interacting with the Protocol, you expressly consent to the exclusive jurisdiction of the courts specified herein and agree that any disputes will be resolved under the governing law selected by the Company. You waive any objection to the venue or forum on the grounds of inconvenience or otherwise.

### 15.2 Arbitration

Any dispute, claim, or disagreement (each a ’Dispute’) arising out of or related to these Terms, the Products or the Protocol, including any Dispute that arose before the effective date of these Terms, shall be resolved through binding individual arbitration. The arbitration shall be confidential, and the arbitrator, the parties, and any involved persons shall maintain the confidentiality of the arbitration proceedings and any related information unless disclosure is required by law. The parties agree to limit the scope of discovery to what is strictly necessary for the resolution of the dispute.

The arbitration shall be conducted in accordance with the rules of the London Court of International Arbitration (’LCIA’). The arbitration shall be conducted by a single arbitrator selected in accordance with the LCIA rules. The arbitrator shall have no authority to award punitive or exemplary damages, attorney’s fees, or costs to either party, except as may be expressly provided by law, and shall limit any award of damages to damages proven by the claiming party, subject to limitations of Section 13. The parties agree to limit the scope of discovery to what is strictly necessary for the resolution of the dispute. The arbitrator shall issue a reasoned award explaining the basis of any decision. All arbitration proceedings and outcomes shall remain strictly confidential, except as required by law. The arbitrator shall have the authority to decide all disputes relating to the scope, interpretation, applicability, and enforceability of this arbitration agreement. The parties waive their rights to a judge or jury trial.

### 15.3 Class Action Waiver

You agree that any Dispute will be resolved solely through individual arbitration and will not be brought as a class arbitration, class action, or any other type of group or collective or representative proceeding. You further waive any objection to the enforcement of such an award on the grounds of lack of jurisdiction, improper venue, or any similar grounds, and agree not to seek to invalidate or circumvent the arbitration proceedings or the enforcement of the resulting award.

### 15.4 Jurisdiction for Non-Arbitrable Disputes

For any disputes that are not subject to arbitration under these Terms, you agree that such disputes will be governed by the laws of England and Wales and will be resolved exclusively in the courts of London, England. You hereby irrevocably submit to the exclusive jurisdiction of these courts and waive any objection to the venue of any such proceeding on the grounds of venue, jurisdiction, or inconvenience of the forum.

### 15.5 Limitation on Time to File Claims

Any claim arising out of or relating to these Terms or the use of the Products or Protocol must be brought within twelve (12) months from the date the cause of action accrues, or the date you become aware of the facts giving rise to the claim, whichever is later. Any claims not filed within this period shall be deemed waived and time-barred. The parties expressly agree that this limitation period supersedes any statutory limitations that might otherwise apply.

## 16 Bug Bounties and Security Contests

### 16.1 Independent Rules

Any bug bounty programs or security contests (’Contests’) offered by the Company will be governed by their own specific terms and conditions, which will be provided separately. These terms may include details regarding eligibility, scope, rewards, confidentiality, and other conditions related to participation in the Contests. Participation in any such Contest is subject to your acceptance of the specific rules and conditions applicable to that Contest.

### 16.2 No Guarantee of Payment

The Company reserves the right to determine, in its sole discretion, the eligibility of submissions, the severity of identified issues, and the corresponding rewards or compensation. The Company further reserves the right to modify, suspend, or terminate any bug bounty or security contest program at any time, without prior notice. The Company may, in its sole discretion, determine whether any submissions fall within the scope of the program and whether they meet the criteria for rewards. Participation in any such program does not constitute any contractual relationship between you and the Company, and you agree that the Company is under no obligation to provide any payment or compensation for your submissions. The Company is under no obligation to pay any reward or compensation for submissions that it deems invalid, out of scope, or in violation of the Contest rules.

### 16.3 Limitation of Liability

The Company disclaims all liability arising from or related to any Contest. By participating in a Contest, you agree to release the Company from any and all claims, liabilities, or damages that may arise in connection with your participation, including any issues related to the submission, evaluation, or reward process.

### 16.4 No Contractual Relationship

Participation in a Contest does not create any contractual relationship between you and the Company, nor does it grant you any rights beyond those explicitly outlined in the specific Contest terms. The Company reserves the right to modify, suspend, or terminate any Contest at any time, without notice and at its sole discretion.

## 17 Termination

### 17.1 Termination by Us

We may terminate your access to the Products at any time, for any reason, without notice. Termination may also occur if you breach any provision of these Terms, engage in illegal activities, violate any applicable laws or regulations, or use the Products in a manner that could harm the Company or other users. In the event of termination, the Company may provide notice by email or through the Products. Upon termination, all rights granted to you under these Terms will immediately cease, and you must discontinue all use of the Products. The Company reserves the right to pursue any remedies available under applicable law or in equity in connection with your violation of these Terms. Upon termination, all rights granted to you under these Terms will immediately cease. We reserve the right, in our sole discretion, to modify, suspend, or discontinue, temporarily or permanently, any part of the Products, the Protocol, or any services provided through the Products at any time, with or without prior notice. We shall not be liable to you or any third party for any modification, suspension, or discontinuance of the Products, Protocol, or services.

### 17.2 Survival of Terms

Upon termination of your access to the Products or the discontinuation of any services, the following sections of these Terms will survive: Section 3 (Disclaimers and Acknowledgments), Section 4 (Products vs. Protocol), Section 5 (Your Products and Services), Section 6 (Markets: Borrowers and Lenders), Section 13 (Limitation of Liability), Section 14 (Indemnification), Section 15 (Governing Law and Dispute Resolution), Section 18 (Miscellaneous), and any other provision that by its nature is intended to survive termination.

## 18 Miscellaneous

### 18.1 Entire Agreement

These Terms, along with the Risk Disclosures, Privacy Policy and any other terms incorporated herein by reference, constitute the entire agreement between you and us regarding the use of the Products and supersede all prior and contemporaneous agreements.

### 18.2 Severability

If any provision of these Terms is found to be invalid or unenforceable, the remaining provisions will continue in full force and effect. The invalid or unenforceable provision shall be deemed modified so that it is valid and enforceable to the maximum extent permitted by law. If such modification is not possible, the invalid provision will be deemed severed from these Terms, and the remaining provisions will continue in full force and effect.

### 18.3 Waiver

Our failure to enforce any right or provision of these Terms will not be deemed a waiver of such right or provision. Any waiver of any provision of these Terms will be effective only if in writing and signed by a duly authorised representative of the Company.

### 18.4 Assignment

You may not assign or transfer any of your rights or obligations under these Terms without our prior written consent. We may freely assign or transfer our rights and obligations under these Terms without restriction.

### 18.5 Force Majeure

We shall not be liable for any delays or failures to perform any obligation under these Terms due to events beyond our reasonable control, including, but not limited to, acts of God, war, terrorism, riots, embargoes, acts of civil or military authorities, fire, floods, accidents, pandemics, strikes, or shortages of transportation, facilities, fuel, energy, labour, or materials. In the event of a force majeure occurrence, the Company will use commercially reasonable efforts to resume performance as soon as practicable. The Company will not be held responsible for any failure to meet its obligations under these Terms due to circumstances beyond its control, including but not limited to, interruptions in internet service, power outages, or other disruptions caused by third-party service providers.

### 18.6 Language

These Terms are provided in the English language, which shall be the official and binding version for all purposes. Any translations of these Terms into other languages are provided for convenience only and shall have no legal effect. In the event of any discrepancy between the English version and a translation, the English version shall prevail.

### 18.7 Notices

All notices, requests, demands, and other communications under these Terms shall be in writing and may be delivered by email to the address provided by you during registration or by posting on the Products. You agree that any notices, agreements, disclosures, or other communications that we send to you electronically will satisfy any legal communication requirements, including that such communications be in writing.

## 19 Contact Information

If you have any questions or concerns regarding these Terms or the Products, please contact us at:

Wildcat Foundation Email: <contact@thewildcat.foundation> Address: PO Box 448, Elgin Court, Elgin Avenue, George Town, Grand Cayman, KY1-1106, Cayman Islands

## Acknowledgment

By accessing or using the Products, you acknowledge that you have read, understood, and agree to be bound by these Terms of Use, as well as the Risk Disclosures, and Privacy Policy.

Updated and effective: 12 February 2025


# Risk Disclosure Statement

Updated and effective: 16 January 2025

## I. Introduction

Purpose: This Risk Disclosure document is designed to inform users of the products, (including the Wildcat Protocol), services and related information and materials offered by the Wildcat Foundation, which includes wildcat.finance, app.wildcat.finance and the interface and related services that facilitate interaction with the Wildcat Protocol (the "Protocol"), and including any markets created by third parties, and derivative and ancillary products related thereto (collectively known as the "Products"), of the potential risks associated with using the Wildcat Protocol (defined as the protocol launched by the Wildcat Foundation and expressly including any product, service or application built using or incorporating any aspects of the protocol, including using any code, software, application or function published by or enabled by the Wildcat Foundation, irrespective of the party or person who has deployed, designed, permitted access to, or in any way utilised it).

These disclosures aim to provide clarity on the inherent uncertainties and responsibilities involved in interacting with decentralised finance (DeFi) platforms.

Scope: The disclosures outlined herein apply to all interactions with the Wildcat Protocol, including the use of its smart contracts, participation in its development and/or governance, and engagement with its associated services, including services deployed, designed, permitted access to, utilised, modified, or deployed by any third party.

General: The Wildcat Protocol is a decentralised finance (DeFi) application designed to provide technology services. By engaging with the Wildcat Protocol, you acknowledge and accept that you are participating in a highly experimental and rapidly evolving space.

The risks associated with protocols and applications like the Wildcat Protocol are significant, and you should only use the Wildcat Protocol if you fully understand these risks and can bear full losses.

Under no circumstances will Wildcat be liable for any loss or damage resulting from your use of the Wildcat Protocol.

## II. Experimental Nature

The Wildcat Protocol and all related software, including blockchain technology, smart contracts, markets, and digital asset wallets are experimental and in continuous development. The Wildcat Protocol is provided "As Is" "Where Is" and "As Available" without any warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, or non-infringement. Users should be aware that the experimental nature of the Wildcat Protocol could lead to unexpected outcomes, including the total loss of assets that interact with the Wildcat Protocol.

## III. General Risks

Volatility of Cryptocurrency Markets: The cryptocurrency markets are highly volatile, with prices fluctuating widely in short periods. This volatility can significantly affect the value of assets held within the Wildcat Protocol, and a given person's ability to access services, products, transactions, or assets facilitated by the operation of the Wildcat Protocol.

Regulatory Risks and Legal Uncertainty: The legal landscape for DeFi is evolving. Changes in regulations, positions of regulators, legislative enactments, or enforcement actions could impact your ability to use the Wildcat Protocol or result in adverse legal consequences. Users should stay informed about the legal environment that may affect their use of digital assets, cryptocurrencies, digital assets wallets, DeFi, smart contracts and the Wildcat Protocol and should comply with all applicable laws.

## IV. Security Risks

Cyberattacks and Hacking: The Wildcat Protocol, like all DeFi platforms, is susceptible to cyberattacks, hacking, and other security breaches. While we implement rigorous security measures, no system is entirely immune to threats. Risks include, but are not limited to, phishing, malware, distributed denial-of-service (DDoS) attacks, "zero days," and other malicious activities.

Smart Contract Vulnerabilities: Despite rigorous testing and auditing, smart contracts may still contain vulnerabilities, such as reentrancy attacks, front-running, timestamp manipulation, inherited vulnerabilities from third party libraries, and other potential exploits. Users should be aware that exploiting these vulnerabilities could lead to a loss of access to, control of, or use of assets, and significant financial losses.

Nation-State and Black Hat Attacks: The Wildcat Protocol, like other blockchain systems, may be targeted by highly sophisticated cyberattacks from nation-state actors or "black hat" i.e. malicious hackers. These attackers may exploit known or unknown vulnerabilities, resulting in severe disruptions or loss of assets.

Unknown Vulnerabilities: As technology evolves, new vulnerabilities may be discovered that could affect the security of the Wildcat protocol. These include potential risks from advances in cryptography, such as quantum computing, which could undermine current blockchain security measures. Although Wildcat has undertaken reasonable, market standard practices to identify vulnerabilities in the Wildcat Protocol, Wildcat does not guarantee that the Wildcat Protocol is free of any defect, flaw or vulnerability.

Risk of Theft: There is no assurance against the theft of digital assets due to sophisticated cyber-attacks or exploitation of vulnerabilities in the Wildcat Protocol, the underlying infrastructure relied upon by the Wildcat Protocol or users of the Wildcat Protocol including digital assets wallets, blockchain(s), or associated third-party services, service providers, or functions not within Wildcat's control. Such incidents could lead to the partial or complete loss of access to, control of or use of your assets.

Service Availability: The Wildcat Protocol may experience downtime or become inaccessible due to maintenance, third-party service disruptions, attacks or compromises of third-party services or products, or blockchain network congestion, attacks or related issues. Wildcat does not guarantee continuous availability or functionality of the Wildcat Protocol, and users should be prepared for potential interruptions to access, or to functionalities provided by the Wildcat Protocol.

## V. Technical Risks

Software Bugs and Technical Failures: The Wildcat Protocol operates on complex software that may contain bugs or experience failures, potentially leading to loss of assets, access to assets, or interruption of services. These risks may be increased by the rapid pace of technological change, which may introduce new unforeseen vulnerabilities or attack vectors that may impact the function, availability, and security of the Protocol.

Impact of Advances in Technology: Emerging technologies, such as quantum computing, may pose future risks to the security of blockchain-based systems and systems built upon and that rely on encryption of underlying systems, including the Wildcat Protocol. Users should be aware that such advances could undermine the cryptographic security relied upon by the Wildcat protocol.

Flawed Logic and Design: The underlying logic and design of the Wildcat Protocol and related software may be flawed, defective, or impaired. This could result in the Protocol operating incorrectly or not as intended, leading to unintended transactions or losses of a loss of access to, control of, or use of assets, and significant financial losses.

## VI. Protocol-Specific Risks

Smart Contract Risks: The Wildcat Protocol's smart contracts are designed to be secure but are not infallible. Vulnerabilities may exist, and their exploitation could lead to a loss of access to, control of, or use of assets, and significant financial losses.

Counterparty/Default Risk: The Wildcat Protocol involves undercollateralised lending, and this comes with risk of the borrower defaulting or otherwise refusing to return collateral to a market deployed through the protocol when asked. Users are expected to have performed their desired level of due diligence and research on their counterparties in order to determine creditworthiness. In the event of a default, there may be substantial or total loss of assets for Users, depending on the reserve ratio of a given market and withdrawal queue ordering.

Malicious Parameter Adjustment: The ability to adjust parameters of a market is one that can only be invoked by the deployer of a market - the borrower. Regardless of any off-chain agreement that may be in place, the borrower has the power to change these at will, and while there are some lender-oriented safeguards in place (such as potentially requiring a temporarily increased reserve ratio when reducing the APR, as documented at <https://docs.wildcat.finance>), Wildcat itself cannot prevent or revert such adjustments.

Functionality and Performance: Wildcat does not guarantee continuous, uninterrupted, error-free, timely or expected operation of the Wildcat Protocol. Users should be aware of potential issues that may impact its functionality and performance.

User Interface: Certain user interface elements or design decisions within the Wildcat Protocol may be complex, confusing or unclear to some users, which may result in a User executing a different action or transaction than that user may have intended or desired. Users are advised to proceed with caution and verify their actions before finalising any transactions. Users may access documentation explaining the functions of the Wildcat Protocol at <https://docs.wildcat.finance>.

## VII. Third-Party Risks

Reliance on Third-Party Services and Data: The Wildcat Protocol may rely on third-party services, including smart contracts, oracles, and data feeds. Failures, flaws, delays, compromises, attacks on, manipulations of, and defects or inaccuracies in these third-party services could negatively impact the Wildcat Protocol's operation or lead to incorrect or unexpected transaction executions and transaction execution outputs, and could lead to a loss of access to, control of, or use of assets, and significant financial losses.

Third Party-related Risks: Certain functions within the Wildcat Protocol or its underlying blockchain may depend on timely actions by third parties. Delays or failures of those Third Parties could result in inaccessibility of protocol functionality or loss of assets.

## VIII. Open-Source and Experimental Technology

The Wildcat protocol relies on open-source and experimental technology, and there are inherent risks associated with using DeFi services, products, applications and protocols built on this technology. These risks include, but are not limited to, smart contract vulnerabilities, potential loss of digital assets, and unforeseen interactions with other blockchain protocols or events, lack of warranties or other performance guarantees, lack of maintenance obligations, cyberattack vulnerabilities, and potential intellectual property infringement claims.

## IX. User Responsibility

Legal Compliance: Users are solely responsible to ensure that their use of the Wildcat Protocol complies with all applicable civil, criminal, and regulatory laws, regulations and duties, as may apply, including tax obligations, anti-money laundering (AML) regulations, and other relevant legal requirements applicable in their jurisdiction. Users must not use the Wildcat Protocol in a manner that violates any duties, laws or regulations, including those related to AML, counter-terrorist financing, and trade sanctions. Users should not use the Wildcat Protocol to avoid or circumvent compliance with any civil, criminal or regulatory law, duty, or obligation.

Self-Custody: Users are fully responsible for the security of their private keys and other credentials required to interact with their own assets and with the Wildcat Protocol, and any product, system or application using any part of the Wildcat Protocol. Any loss of access to private keys or other access credentials due to negligence or malicious activity is solely the user's responsibility, and Wildcat Foundation cannot recover lost keys or reverse transactions.

Transaction Accountability: All transactions performed using the Wildcat Protocol are final, irrevocable, and irreversible. Users must understand the implications of their transactions and should conduct thorough due diligence before interacting with the Wildcat Protocol.

Securing Digital Assets: Users are responsible for securing their digital assets, including the use of secure digital asset wallets and should conduct appropriate information security practices to protect against unauthorised access. Loss or compromise of private keys or other access credentials can result in irreversible and complete loss of access to, control of or use of assets.

Due Diligence and Professional Advice: Users should conduct thorough research and consider seeking professional financial, legal, tax, and technological advice before engaging with the Wildcat Protocol.

## X. Legal Uncertainty

Impact of Legal Changes: The DeFi space is subject to potential legal changes that could affect the legality and functionality of the Wildcat Protocol. Users should be prepared for such changes and ensure compliance with all relevant civil, criminal and regulatory legal obligations related to the ownership and control of digital assets, and the use of the Wildcat Protocol.

Legal Risks and Compliance: Our activities are subject to various laws and regulations in the countries where we operate. Regulatory actions, orders, or inquiries may adversely affect the Wildcat Protocol and its availability. Additionally, changes in applicable laws or evolving interpretations of existing laws could increase compliance costs, impact the Wildcat Protocol's functionality, or necessitate the acquisition of specific licences.

## XI. No Professional Advice or Fiduciary Duties

Information Disclaimer: All information provided by Wildcat Foundation and its affiliates, whether on its websites, platforms, or communications, is intended for informational purposes only. It does not constitute financial, legal, or professional advice, and should not be relied upon as such. Users are encouraged to seek independent professional advice tailored to their specific circumstances before making any financial decisions related to the use of the Wildcat Protocol.

No Fiduciary Relationship: Wildcat Foundation does not act as an advisor or fiduciary to any user. Neither Wildcat Foundation nor the Wildcat Protocol nor its governors owe any fiduciary duties to users, and by using the Wildcat Protocol, users agree that they alone are responsible for their financial decisions and actions.

## XII. Assumption of Risks and Limitation of Liability

User Assumption of Risk: By using the Wildcat Protocol, users acknowledge and accept all associated risks, including those related to the security, functionality, and regulatory environment of the Wildcat Protocol. Users acknowledge that participating in DeFi involves significant risks, and they should only engage with the Wildcat Protocol if they are fully aware of and willing to accept these risks.

Limitation of Liability: To the fullest extent permitted by law, Wildcat Foundation and its representatives are not liable for any losses, damages, or claims arising from the use of the Wildcat Protocol. This includes, but is not limited to, losses resulting from defaults, security breaches, regulatory actions, service interruptions, or any other risks described in this risk disclosure. Users agree to hold Wildcat harmless from any claims or liabilities related to their use of the Wildcat Protocol.

## XIII. Incident Reporting and Transparency

Incident Disclosures: Wildcat is committed to transparency. Any significant incidents, such as security breaches, manipulation attempts, or major protocol failures, will be disclosed to the community promptly. However, Wildcat cannot guarantee the prevention of such incidents and disclaims all liability for any losses arising from them.

## XIV. Mitigation Strategies

Audits and Security Measures: The Wildcat Protocol has undergone multiple security audits by third parties. Additionally, Wildcat Foundation operates a bug bounty program to encourage the identification and reporting of vulnerabilities. While these measures are in place to enhance security, they do not eliminate all risks, and it's imperative that users remain vigilant.

## Acknowledgment of Risks

By using the Wildcat Protocol, you acknowledge that you have read, understood, and agree to this risk disclosure policy. You accept all risks associated with using the protocol and agree that Wildcat is not liable for any losses or damages, whether direct or indirect, arising from your use of the protocol.

Updated and effective: 16 January 2025


# Template MLA

The optional open-source Master Loan Agreement template borrowers can attach to a market.

**This template master loan agreement (MLA) can be adopted by borrowers for their use when deploying a market, in which case lenders are required to countersign before they can deposit through the frontend. The borrower may also elect to not offer this, in which case instances of what constitutes default are less explicitly defined for that market: caveat emptor.**

**As a lender, please ensure that you are comfortable with the agreement and terms you are presented with by a market before engaging.**

Note that this template does not require personal details of the *lender* to be attested to, rather relying on ownership of the wallet entering into the agreement. This is done to minimise the personal data tied to lenders that sits server-side, despite being stored in an encrypted format.

Fields highlighted <mark style="background-color:yellow;">{{in this way}}</mark> correspond to data which is either inserted into the agreement based on the borrower profile, parameters selected at market deployment and dates signed, or otherwise require selection by the borrower.

Regardless of the form it takes, if an MLA is adopted for a market, it is pre-signed by the borrower and presented to each lender to countersign prior to their first deposit into a market via the frontend.

Encrypted hashes of the resulting agreement are stored on a standalone server, and can only be decrypted and viewed by lenders/borrowers in possession of the private keys to relevant Ethereum addresses. This is to account for the possibility that in the future a borrower presents customised MLA variants which requires certain personal details of the lender - such as their name - to be provided.

***

## WILDCAT PROTOCOL MASTER LOAN AGREEMENT

This Master Loan Agreement (this \`**Agreement\`**) is made on this <mark style="background-color:yellow;">{{lender.timeSigned}}</mark> by and between <mark style="background-color:yellow;">{{borrower.name}}</mark> (the \`**Borrower\`**), a <mark style="background-color:yellow;">{{borrower.jurisdiction}}</mark> <mark style="background-color:yellow;">{{borrower.entityKind}}</mark> with registered address at <mark style="background-color:yellow;">{{borrower.physicalAddress}}</mark> and the individual or entity that has ownership of the Specified Wallet Address provided in Exhibit A hereto (the \`**Lender\`**). Lender and Borrower are individually, a \`**Party\`**, and collectively the \`**Parties\`**.

### RECITALS

WHEREAS, subject to the terms and conditions of this Agreement, the Borrower wishes to utilise a Market via the Protocol, pursuant to which the Borrower wishes to borrow the Assets from the Lender, and the Borrower will pay the Base APR and/or Penalty APR, as applicable, and return such Assets to the Market for Withdrawal by the Lender upon the termination of the Loan; and

NOW, THEREFORE, in consideration of the foregoing and other good and valuable consideration, the receipt and sufficiency of which hereby acknowledged, the Borrower and the Lender hereby agree as follows:

### **1) Definitions**

**\`Amount of Digital Asset To Be Loaned\`** means the capacity of the Market, being the amount of Assets the Borrower is willing to borrow and pay the Base APR and/or Penalty APR on.

**\`Applicable Law\`** means any law (including common law), constitution, statute or statutory instrument, treaty, directive, rule (including, for the avoidance of doubt, the FCA Handbook), regulation, ordinance, order, injunction, writ, decree or award of any regulatory body.

**\`Assets\`** means any assets that the Borrower may attempt to borrow from a Lender as specified in the Market.

**\`Base APR\`** means the interest rate that the Lender will receive on the Assets that they have deposited into the Market, in the absence of the Penalty APR being enforced.

**\`Business Day\`** means a day other than a Saturday or Sunday and upon which banks are typically open for business in London, United Kingdom.

**\`Chain ID\`** means the unique number identifying a particular EVM blockchain network.

**\`Chainalysis Sanctions Screening Oracle\`** means a smart contract that can be queried to determine whether a particular Wallet Address is included in a sanctions designation, as defined at <https://go.chainalysis.com/chainalysis-oracle-docs.html>.

**\`Communication Platform\`** means digital communication platforms such as electronic mail, Telegram, Slack, X or other similar platforms, as specified by the Borrower on the Website.

**\`Delinquent\`** means, with respect to the Market, any period of time in which there are insufficient Assets in the Market to meet the Reserve Ratio specified by the Borrower in the Term Sheet, which may be as a result of (a) the amount of Assets held within a Market falling below the Reserve Ratio as a result of Market Token Supply growth resulting from the Base APR and/or the Penalty APR and/or the removal from the Market of any accrued Protocol Fees, (b) the Reserve Ratio increasing as a result of Withdrawal requests that cannot be completed given the amount of Equivalent Loan Assets in the Market or (c) the Reserve Ratio temporarily increasing as a result of a reduction of the Base APR, each as may be further explained in the Wildcat Protocol Documentation.

**\`Deposit Credential\`** means, with respect to a Market, permission – either temporary or permanent, as configured by the Borrower – to deposit Assets into a Market granted by a Role Provider according to a Lender Check Process determined by the Borrower.

**\`Equivalent\`** means, with respect to Loaned Assets, Assets equivalent to those Loaned Assets, as determined by the Borrower in its sole reasonable discretion or as mutually agreed between the Parties in writing.

**\`Fixed Term State\`** means the optional Borrower-configured period of time after the deployment of a Market during which Withdrawals from Lenders are rejected.

**\`Grace Period\`** means the period of time for which a Market can be Delinquent on a rolling basis before the Penalty APR becomes payable.

**\`Known Lender\`** means, with respect to a Market, a state assigned to any Wallet Address that – while holding a valid, unexpired Deposit Credential – either (i) enters into a Loan by depositing Assets into the Market, or (ii) receives Market Tokens from a third party Wallet Address provided that the Market supports sufficient Token Transferability.

**\`Lender Check Process\`** means any process of due diligence, anti-money laundering and/or \`know your customer\` screening which the Borrower has chosen to implement to determine the suitability of a Lender to enter into a Loan via this Market under this Agreement.

**\`Loan\`** means the loan of Assets made pursuant to and in accordance with the Market, this Agreement and the Term Sheet.

**\`Loan Documents\`** means this Agreement and any and all Loan Term Sheets entered into between the Lender and the Borrower.

**\`Loaned Assets\`** means any Assets transferred in a Loan hereunder until an Equivalent Asset to such Asset is transferred to Lender hereunder.

**\`Loss\`** means damage, loss, cost, claim, liability, obligation or expense (including legal costs and expenses of any kind), of any kind whatsoever under any theory of liability, including direct, indirect, consequential, incidental or special losses, economic losses or loss of profits, loss of data, loss of goodwill or business reputation, loss of opportunity, cost of obtaining substitute tokens, or other tangible and intangible loss.

**\`Market\`** means the market that the Borrower has deployed.

**\`Market Token\`** means the token issued by the Market to the Lender in exchange for their Loan, the Amount of which increases over time in accordance with the currently active Base APR and/or Penalty APR of a Market as set forth in the Wildcat Protocol Documentation, and which represents the amount of the Loaned Asset which a Lender is eligible to reclaim via Withdrawal.

**\`Market Token Supply\`** means the balance of Market Tokens issued across all Loans made using the Market central to this Agreement.

**\`Open Term State\`** means, with respect to a Market, that it is not in a Fixed Term State as a result of (i) the Market having been initially deployed as Open Term, or (ii) the term to maturity of the Fixed Term State specified in the Term Sheet having elapsed.

**\`Penalty APR\`** means the additional interest rate to be paid in addition to the Base APR that is applied if the Market is Delinquent for longer than the Grace Period.

**\`Protocol\`** means the Wildcat Protocol, as defined by <https://docs.wildcat.finance>.

**\`Protocol Fee\`** means any additional fee – denominated in Assets – accruing to the Protocol itself, over and above the Base APR and/or Penalty APR due to the Lenders.

**\`Reserve Ratio\`** means the percentage of the Market Token Supply of the Market as a whole that must be kept in the Market in the form of Equivalent Assets.

**\`Risk Disclosure Statement\`** means the risk disclosure statement, as may be amended from time to time, set out at <https://docs.wildcat.finance/legal/risk-disclosure-statement> and any risk disclosure statement made available from time to time through the Website.

**\`Role Provider\`** means, with respect to a Market, an Ethereum smart contract or Wallet Address deployed or controlled by the Borrower which sets forth a Lender Check Process, the successful completion of which grants a Lender a Deposit Credential.

**\`Sanctions Escrow\`** means, with respect to a Market, a smart contract deployed by the Sentinel to hold the Equivalent Loaned Assets associated with Lender in the event that their Wallet Address is marked as sanctioned by the Chainalysis Sanctions Screening Oracle, as further detailed in Section 13.

**\`Sanctions Event\`** means, with respect to a Market, the presence of a Wallet Address on the Chainalysis Sanctions Screening Oracle.

**\`Sentinel\`** means, with respect to a Market, a smart contract that determines whether a Wallet Address attempting to interact with the Protocol appears on the Chainalysis Sanctions Screening Oracle, either rejecting new Loans or creating escrow contracts to sever the existing Loan exposure of such Wallet Addresses, as further detailed in Section 13.

**\`Service Provider\`** means both Wildcat Foundation, a foundation incorporated under the laws of the Cayman Islands, and any affiliated entities, subsidiaries, or third-party service providers contracted by Wildcat Foundation.

**\`Specified Wallet Address\`** means the Ethereum Wallet Address of a Party notified to the other Party for the purposes of this Agreement.

**\`Term Sheet\`** means the term sheet attached hereto as Exhibit A as may be modified by the Borrower after the date hereof.

**\`Terms of Use**\` means the Wildcat Protocol Terms of Use accessible at [https://docs.wildcat.finance//legal/wildcat-terms-of-use](https://docs.wildcat.finance/legal/wildcat-terms-of-use) which sets out the terms and conditions under which the Parties access the Wildcat Protocol and use the Products provided by the Service Provider as further detailed in the Terms of Use, which Terms of Use has been agreed to by each of the Lender and the Borrower.

**\`Token Transferability\`** means, with respect to Market Tokens, the ability of the Lender to transfer to third party Wallet Addresses, which may be constrained by the Borrower on Market deployment to one of three options: (i) freely transferable, (ii) transferable only to Known Lenders or Wallet Addresses holding valid Deposit Credentials, or (iii) transferable only back to the Market during Withdrawals.

**\`Wallet Address\`** means a cryptographic public private key pair or string of unique characters associated with a virtual wallet which is used to send and receive virtual currency.

**\`Website\`** means [https://app.wildcat.finance](https://app.wildcat.finance/).

**\`Wildcat Protocol Documentation\`** means the Protocol documentation accessible at <https://docs.wildcat.finance> and the version of the Terms of Use accessible at [https://docs.wildcat.finance//legal/wildcat-terms-of-use](https://docs.wildcat.finance/legal/wildcat-terms-of-use).

**\`Withdrawal\`** means the process of reclaiming Equivalent Loaned Assets from the Market as further detailed in Section 2(f).

### 2) General Loan Terms

#### a) General Loan Terms

Subject to the terms and conditions hereof, the Lender will make a Loan to the Borrower of the Assets specified on the Term Sheet and the Lender shall extend such Loan on the terms set forth on the Term Sheet.

The Borrower may, at any time, modify the terms of a Loan by amending the Market. Should the Lender not want to proceed with the Loan on the terms of such amendments, the Lender may exit the Market by requesting a Withdrawal, provided the Market is in an Open Term State.

#### b) Base APR Amendment

The Borrower may, at any time (subject to the constraints on increases and decreases laid out in the Wildcat Protocol Documentation), amend the Base APR of a Market in accordance with the terms of Section 2(a).

#### c) Amount of Digital Asset To Be Loaned Amendment

The Borrower may, at any time, amend the Amount of Digital Asset To Be Loaned in accordance with the terms of Section 2(a).

#### d) Minimum Deposit Amendment

The Borrower may, at any time, amend the Minimum Deposit amount in accordance with the terms of Section 2(a).

#### e) Fixed Term Maturity Amendment

The Borrower may, at any time (provided that the Market is currently in a Fixed Term state and the Fixed Term Maturity Reduction flag was enabled on Market deployment) amend the Fixed Term maturity to an earlier date, in accordance with the terms of Section 2(a).

#### f) Withdrawals

If the Lender is looking to reclaim Equivalent Loaned Assets from the Market, the Lender may request a Withdrawal via the Market while the latter is in an Open Term State, which Withdrawal may be in full or pro rata with other lenders depending on (i) the reserves of Assets in the Market at the time of the Withdrawal request and (ii) how many other lenders are simultaneously requesting a Withdrawal of such Assets.

#### g) Closing a Market

The Borrower may elect to close a Market by ensuring that sufficient Assets are deposited into the Market such that any lender, including the Lender, that submits a Withdrawal request will be able to reclaim all Equivalent Loaned Assets. Once a Market has been closed, interest will cease to accrue and no further amendments of the terms of the Loan or borrowing under the Market will be possible. The configuration of a Market may prevent its closure while it is in a Fixed Term State.

#### h) Termination of Loan

A Loan will terminate upon the earlier of:

(i) the Withdrawal by the Lender of all Equivalent Loaned Assets from the Market;

(ii) the closing of the Market by the Borrower;

(iii) the date notified by the non-defaulting Party to the Defaulting Party as the effective date of termination of the Loan upon the occurrence of an Event of Default as defined in Section 4 of this Agreement; provided that the non-defaulting Party shall have the right in its sole discretion to suspend the termination of a Loan under this subsection (iii) and reinstate the Loan. In the event of reinstatement of the Loan pursuant to this paragraph, the non-defaulting Party does not waive its right to terminate the Loan hereunder and the Event of Default shall be deemed to continue unless it is waived in writing by the non-defaulting Party; or

iv) the date notified by the Borrower where the Borrower considers, in its sole and reasonable discretion, that any activity conducted in connection with this Agreement could result in a breach of applicable law and regulation, including, but not limited to, any or all of the Loaned Assets becoming at risk of being considered a security, swap, derivative, or other similarly-regulated financial instrument or asset by any applicable regulatory authority or by any applicable court of law, dispute resolution organisation, arbitrator, or mediator.

#### i) Taxes and Fees

Neither the Borrower nor the Lender shall have any liability to the other Party for any taxes due under this Agreement.

### 3) Representations, Warranties and Covenants

The Parties hereby make the following representations and warranties, which shall continue during the term of this Agreement and any Loan hereunder:

a) Each Party represents and warrants that (i) it has the power to execute and deliver this Agreement, to enter into the Loans contemplated hereby and to perform its obligations hereunder, (ii) it has taken all necessary action to authorise such execution, delivery and performance, and (iii) this Agreement constitutes a legal, valid, and binding obligation enforceable against it in accordance with its terms;

b) Each Party hereto represents and warrants that it has not relied on the other for any tax or accounting advice concerning this Agreement and that it has made its own determination as to the tax and accounting treatment of any Loan, any Asset, or funds received or provided hereunder;

c) Each Party hereto represents and warrants that it is acting for its own account;

d) Each Party hereto represents and warrants that it is a sophisticated party and fully familiar with the inherent risks involved in the transaction contemplated in this Agreement, including, without limitation, risk of new financial regulatory requirements, potential loss of money and risks due to volatility of the price of the Loaned Assets, and voluntarily takes full responsibility for any risk to that effect;

e) Each Party represents and warrants that it is not insolvent and is not subject to any bankruptcy or insolvency proceedings under any Applicable Laws;

f) Each Party represents and warrants there are no proceedings pending or, to its knowledge, threatened, which could reasonably be anticipated to have any adverse effect on the transactions contemplated by this Agreement or the accuracy of the representations and warranties hereunder or thereunder;

g) The Lender represents and warrants that it has, or will have at the time of the transfer of any Loaned Assets, the right to transfer such Assets, subject to the terms and conditions hereof, and free and clear of all security, liens, charges, mortgages and encumbrances;

h) The Borrower represents and warrants that it has, or will have at the time of the transfer of any Assets (as Equivalent Loaned Assets), the right to transfer such Assets subject to the terms and conditions hereof, and free and clear of all security, liens, charges, mortgages and encumbrances other than those arising under this Agreement;

i) Each Party represents and warrants that it has all consents of any governmental or other authority that are required to be obtained by it with respect to this Agreement to which it is a Party and will use all reasonable efforts to maintain these in full force and effect, and obtain any that may become necessary in the future;

j) Each Party represents and warrants that it shall provide such information considered reasonably necessary to allow the other Party to conduct appropriate anti-money laundering and know your customer checks as may be required;

k) Each Party represents and warrants that, to the best of its knowledge and belief, no Assets, as Loaned Assets, are, or are related to, the proceeds of criminal activity;

l) Each Party represents and warrants that it has (i) undertaken sufficient due diligence regarding the Chainalysis Sanctions Screening Oracle (the \`**Oracle\`**) operation; (ii) understood that a Lender’s Equivalent Loaned Assets may be transferred to a Sanctions Escrow contingent on a Sanctions Event; and (iii) agreed to bear all risks associated with potential Oracle errors or misdesignations, subject to the dispute resolution process outlined in Section 13 of this Agreement; and

m) Each Party represents and warrants that it has agreed to be bound by the terms and conditions of the Terms of Use;

### **4) Default**

Any of the following events in respect of a Party (the \`**Defaulting Party\`**) shall constitute an event of default, and shall be herein referred to as an \`Event of Default\`:

a) the failure of the Borrower to return enough Equivalent Loaned Assets to honour a Lender's Withdrawal request such that the Penalty APR has applied for 90 days;

b) a material default by either Party in the performance of any provision of this Agreement, and a Party’s failure to cure such material default within ten Business Days;

c) the commencement of any form of moratorium, creditor compromise, administration, bankruptcy, reorganisation, winding-up, liquidation or insolvency proceedings or actions (or other similar or equivalent proceedings or actions), or the taking of any steps by any party with a view to the commencement of aforementioned proceedings or actions in respect of either Party which are not dismissed within thirty (30) days of initiation of said proceedings;

d) any representation or warranty made by either Party in any of the Loan Documents that proves to be incorrect or untrue in any material respect as of the date of making or deemed making thereof; provided that a Party shall have ten (10) Business Days to cure such Event of Default; provided further that if a Borrower becomes insolvent such that the representation made by the Borrower in Section 3(e) is incorrect or untrue and such insolvency occurs as a result of the Borrower entering into the Loan or otherwise as a result of taking on credit through the Protocol, the Lender may agree that such incorrect or untrue representation shall not constitute an Event of Default under this Section 4(d).

### 5) Remedies

Upon the occurrence and during the continuation of any Event of Default by the Defaulting Party, the non-defaulting Party may, upon reasonable prior written notice to the Defaulting Party, at its option: (1) terminate this Agreement and any Loan hereunder; or (2) exercise all other rights and remedies available to such non-defaulting Party hereunder, under Applicable Law, or in equity. The Borrower shall determine or calculate any amounts hereunder at its sole reasonable discretion.

### 6) Limitations on Liability

a) In no event will either Party be liable to the other Party or any Third Party Beneficiary (as defined below) for any indirect, special, incidental, punitive or consequential Losses or damages (including, but not limited to, loss of profits, goodwill, reputation, loss of business opportunity or anticipated savings) arising out of or in connection with this Agreement, whether such liability arises from any claim based upon contract, warranty, tort (including negligence), strict liability or otherwise, and whether or not such party has been advised of the possibility of such loss or damage.

b) In no event will the Borrower be responsible or liable for any direct liabilities, costs, expenses, damages or Losses, including all interest, penalties and legal costs (calculated on a full indemnity basis) suffered by the Lender or any Third Party Beneficiary (as defined below) unless such damages or Losses directly result from the gross negligence, willful default or fraud of the Borrower.

c) Borrower shall not be deemed to have breached its obligations under this Agreement where such breach arises as a result of any event beyond its control, including but not limited to, technical failure, disruptions, downtime or outages of exchanges, blockchains, networks, custodial services or any other entity in the same or similar industry, acts of God, fire, flood, drought, earthquake or other natural disaster, epidemic or pandemic; terrorist attack, civil war, civil commotion or riots, war, threat of or preparation for war, armed conflict, imposition of sanctions, embargo, or breaking off of diplomatic relations; any law or any action taken by a regulatory or governmental authority; or any labour or trade dispute, strikes, industrial action or lockouts (other than in each case by the party seeking to rely on this clause, or companies in the same group as that party) (a \`**Force Majeure Event\`**). Borrower shall not be responsible, and shall have no liability to the Lender, for any direct or indirect Losses or damages incurred by the Lender for any failure by Borrower to perform its obligations under this Agreement if such performance is prevented, hindered or delayed by a Force Majeure Event. In these circumstances, Borrower’s obligations will be suspended for as long as the Force Majeure Event continues or remains in effect.

d) Neither party will be liable for any Loss arising from any attack on the Protocol, including any such potential attacks as may be detailed in the Risk Disclosure Statement. For the avoidance of doubt, in no event shall the Service Provider be liable for any such Loss arising from any attack on the Protocol.

### 7) Alternative Arrangements in the Event of Loss of Wallet Address Access

It is possible that either Party may lose access to the Wallet Address through which they have engaged with the Market (a \`**Loss of Access\`**), with the result of such Loss of Access being the inability of such Party to engage with the Market to meet its obligations under this Agreement. If a Loss of Access occurs, the Parties agree to engage with each other to implement an alternative method for returning each other to the position they would be in had the Market been terminated by the Borrower at the time such Loss of Access was first communicated to the other Party via a Communication Platform.

### 8) Transfer of Title

Notwithstanding the use of expressions such as \`loan\`, which are used to reflect terminology used in the market for transactions of the kind provided for in this Agreement, all right, title and interest in and to the Assets transferred or paid under this Agreement (as Loaned Assets) shall pass to the Borrower upon transfer or payment, the obligation of the Borrower being an obligation to return Equivalent Assets. The Borrower shall be entitled to use the Assets transferred to it in any manner, including transferring such Assets to any account or wallet or for any other purpose.

In the event the Borrower is entitled to receive or receives any additional token(s) (the \`**Additional Tokens**\`) in connection with or arising from the Loaned Assets (including, but not limited to, an airdrop, ownership or possession of Loaned Assets, hard fork, or any other event) during the term of the Loan, the Borrower shall be deemed the sole and rightful owner of such Additional Tokens. The Lender acknowledges and agrees that all rights, title, and interest in and to such Additional Tokens shall vest in the Borrower, and such Additional Tokens shall not be considered part of the Loaned Assets subject to repayment obligations under this Agreement or the Term Sheet. For clarity, Additional Tokens refer solely to tokens received in addition to the Loaned Assets and do not include any Replacement Tokens (as defined below).

If the Borrower receives any tokens in substitution of or as replacement for the Loaned Assets (the \`**Replacement Tokens\`**) as a result of any event (including, but not limited to, a hard fork, protocol upgrade, or migration), the Borrower shall be deemed to have satisfied its obligation to repay the Loan under this Agreement to the extent the Borrower returns the Replacement Tokens as if they are, and in lieu of, the original Loaned Assets. For the avoidance of doubt, this shall not affect Borrower’s ability to repay the Loan as otherwise specified under this Agreement or the Term Sheet.

### 9) Rights and Remedies Cumulative

No delay or omission by a Party in exercising any right or remedy hereunder shall operate as a waiver of the future exercise of that right or remedy or of any other rights or remedies hereunder, provided that upon the occurrence of an Event of Default such default shall be deemed waived if a Party does not begin exercising remedies with respect to such Event of Default within 30 days of notice of its occurrence. All rights of each Party stated herein are cumulative and in addition to all other rights provided by law, in equity.

### 10) Survival of Rights and Remedies

All remedies hereunder and all obligations with respect to any Loan shall survive the termination of the relevant Loan, return of Loaned Assets, and termination of this Agreement.

### 11) Governing Law; Dispute Resolution

This Agreement, and any non-contractual rights or obligations arising out of or in relation to it, is governed by, and shall be construed and enforced under the laws of England and Wales. The English courts shall have exclusive jurisdiction to settle any dispute (whether contractual or non-contractual and including a dispute relating to the existence, validity or termination of this Agreement) arising out of this Agreement.

Where the Lender or any Third Party Beneficiary, as may be relevant, is not established or located in England, it shall appoint an agent (a \`**Process Agent**\`) established in England or Wales and communicate the contact details of such agent to the Borrower to receive the service of any proceedings for or on its behalf in connection with or in relation to this Agreement. If for any reason such a Process Agent is unable to act as such, the Lender or the Third Party Beneficiary will promptly notify the Borrower and within 30 days appoint a substitute Process Agent acceptable to Borrower. The Lender or the Third Party Beneficiary, as may be relevant, agrees that if the Lender or such Third Party Beneficiary fails to appoint the Process Agent forthwith and in any event within 10 days of the execution of this Agreement, the Borrower may appoint a Process Agent for service of process on Lender or the Third Party Beneficiary. Lender or the Third Party Beneficiary, as may be relevant, shall be solely responsible for any costs associated with the appointment of its Process Agent by the Borrower. Nothing in this Agreement will affect the right of either Party to serve process in any other manner permitted by Applicable Law.

### 12) Third Party Beneficiaries

a) Per the implementation of the Protocol, the Market Tokens associated with a given Loan, which must be transferred back to the Market by a Lender in order to effect a Withdrawal, can be transferred by the Lender to any Wallet Address that is permitted by the Token Transferability level of the Market, which, for the avoidance of doubt, need not be a Specified Wallet Address.

b) This Agreement is enforceable in its entirety by any third party (a \`**Third Party Beneficiary\`**) which has ownership over a Wallet Address holding Market Tokens; provided that such Third Party Beneficiary successfully completes any Lender Check Processes as may be specified via Role Providers by the Borrower. For the avoidance of doubt, any Known Lender in possession of Market Tokens is capable of enforcing this Agreement in its entirety.

c) If a Third Party Beneficiary cannot clear or will not engage with such Lender Check Processes, such Third Party Beneficiary shall not be entitled to enforce any rights under this Agreement and may be prevented from initiating Withdrawals in accordance with the specific rules of the Market.

d) If a Third Party Beneficiary possesses Market Tokens that have been acquired through any event as contemplated as being within the scope of Section 6 of this Agreement, this Section 12 shall not apply to such Third Party Beneficiary and such Third Party Beneficiary shall have no right to enforce the terms of this Agreement.

Notwithstanding the foregoing, Third Party Beneficiary possessing such Market Tokens need not have acquired said Market Tokens directly from a Lender in order for this Section 12 to apply.

### 13) Treatment of Sanctioned Entities

a) All Markets deployed via the Protocol are monitored by a Chainalysis Sanctions Screening Oracle (the \`**Oracle\`**) via the Sentinel to determine whether Wallet Addresses are present on various sanctions designations such as those maintained by the US, EU and UN.

b) The Parties agree that the Oracle shall serve as the definitive source for determining whether any Wallet Address associated with a Party is subject to sanctions.

c) In the event that a Lender Wallet Address is sanctioned, the Sentinel will perform the following actions following the earlier of (i) the Lender attempting to make a Withdrawal, or (ii) the Borrower or any other third party triggering a removal function within the Market:

1. A Sanctions Escrow smart contract will be created,
2. The sanctioned Lender will be forced into an immediate Withdrawal request for the balance of their Market Tokens, and
3. The Equivalent Loaned Assets will not be returned to the Lender, but rather transferred to the Sanctions Escrow, whereupon they can be reclaimed by the Lender either (x) when the Lender Wallet Address is no longer subject to a Sanctions Event, or (y) if the Borrower explicitly overrides the sanction via the Market, which they may do if they determine the Oracle designation was erroneous.

e) In the event that a Lender disputes a Sanctions Event:

1. The burden of proof shall rest solely with the Lender to demonstrate, by clear and convincing evidence, that the Oracle's designation was erroneous;
2. The Lender must provide substantial evidence of their non-sanctioned status, which may include, but is not limited to:
   1. Documentation demonstrating ownership and control of the relevant Wallet Addresses;
   2. Evidence of the true beneficial owner of the Wallet Addresses in question; and
   3. Evidence showing the Oracle's designation conflicts with verifiable sanctions data.
3. Until such time as either (x) the Oracle removes the sanctions designation or (y) the Borrower explicitly overrides the sanction via the Market, all provisions in this Section 13 shall remain in full force and effect.

### 14) Third Party Rights

Except as otherwise stated under this Agreement, no term of this Agreement is enforceable by a person who is not a Party to this Agreement. The rights of the Parties to rescind or vary this Agreement are not subject to the consent of any other person.

### 15) Notices

Unless otherwise provided in this Agreement, all notices or demands relating to this Agreement shall be sent by a Communication Platform to the respective Party, as specified through the Website.

### 16) Variation, Assignment, Successors and Assigns

a) No variation of this Agreement shall be valid unless it is in writing and signed by or on behalf of each of the Parties.

b) This Agreement is binding on and inures to the benefit of the parties and their respective successors, heirs, personal representatives, and permitted assigns.

c) No Party may assign or delegate its rights or obligations hereunder without the prior written consent of the other Party, provided that the Borrower may assign or delegate its rights or obligations hereunder to an affiliate.

### 17) Single Agreement

The Borrower and the Lender acknowledge that, and have entered into this Agreement in reliance on the fact that, all Loans hereunder constitute a single business and contractual relationship and have been entered into in consideration of each other. Accordingly, the Borrower and the Lender hereby agree that payments, deliveries, and other transfers made by either of them in respect of any Loan shall be deemed to have been made in consideration of payments, deliveries, and other transfers in respect of any other Loan hereunder, and the obligations to make any such payments, deliveries and other transfers may be applied against each other and netted. In addition, the Borrower and the Lender acknowledge that, and have entered into this Agreement in reliance on the fact that, all Loans hereunder have been entered into in consideration of each other.

### 18) Entire Agreement

This Agreement and the Term Sheet constitutes the entire Agreement among the parties with respect to the subject matter hereof and supersede any prior negotiations, understandings and agreements with respect to the subject matter of this Agreement. Nothing in this Section 18 shall be construed to conflict with or negate Section 17 above.

### 19) Partial Invalidity

If any provision of this Agreement is or becomes or is found by a court or other competent authority to be illegal, invalid or unenforceable in any respect, in whole or in part, under any law of any jurisdiction, neither the legality, validity and enforceability in that jurisdiction of any other provision or part of this Agreement, nor the legality, validity or enforceability in any other jurisdiction of that provision or part or of any other provision of this Agreement, shall be affected or impaired.

### 20) Intention to be Bound

By clicking on the \`Sign\` (or similar) button, the Borrower and the Lender intend to be legally bound by the terms and conditions of this Agreement.

### 21) No Relationship

This Agreement does not create any kind of partnership, joint venture, fiduciary, agency or trustee relationship or any similar relationship or legal arrangement between the Parties or between either Party and any other person.

### 22) No Waiver

Save as otherwise agreed, the failure of or delay by either Party to enforce an obligation or exercise a right or remedy under any provision of this Agreement or to exercise any election in this Agreement shall not be construed as a waiver of such provision, and any such delay or failure to enforce, the waiver of, a particular obligation in one circumstance will not prevent such Party from subsequently requiring compliance with the obligation or exercising the right or remedy in the future. No waiver or modification by either Party of any provision of this Agreement shall be deemed to have been made unless expressed in writing and signed by both parties.

### 23) Termination of Agreement

In the event of a termination of this Agreement, any Loaned Assets shall be redelivered immediately, unless otherwise agreed to by the Parties, and any fees owed shall be payable immediately.

### 24) Miscellaneous

Whenever used herein, the singular number shall include the plural, the plural the singular, and the use of the masculine, feminine, or neuter gender shall include all genders where necessary and appropriate. The section headings are for convenience only and shall not affect the interpretation or construction of this Agreement. The Parties agree that none of the Agreement’s provisions will be construed against the drafter.

***

## EXHIBIT A

### TERM SHEET

This term sheet (this \`**Term Sheet\`**) dated <mark style="background-color:yellow;">{{borrower.timeSigned}}</mark>, incorporates all the terms of the Master Loan Agreement (the \`**Agreement\`**) entered into by <mark style="background-color:yellow;">{{borrower.name}}</mark> (\`**Borrower\`**) and the individual or entity that has ownership of the Specified Wallet Address on the Chain ID mentioned herein (\`**Lender\`**) on <mark style="background-color:yellow;">{{lender.timeSigned}}</mark>, and the following specific terms:

The following Loan shall be made by the Lender to the Borrower in accordance with the terms and mechanics of the Market, as set forth in the Wildcat Protocol Documentation. All terms used in this Term Sheet and not otherwise defined shall have the meaning ascribed to them in the Agreement or the Wildcat Protocol Documentation, as applicable.

**Market Address**: <mark style="background-color:yellow;">{{market.address}}</mark>

**Digital Asset To Be Loaned**: <mark style="background-color:yellow;">{{asset.address}}</mark>

**Maximum Amount of Digital Asset To Be Loaned**: <mark style="background-color:yellow;">{{market.capacity}}</mark>

**Base APR**: <mark style="background-color:yellow;">{{market.apr}}</mark>

**Penalty APR**: <mark style="background-color:yellow;">{{market.delinquencyFee}}</mark>

**Minimum Reserve Ratio**: <mark style="background-color:yellow;">{{market.reserveRatio}}</mark>

**Withdrawal Cycle Duration**: <mark style="background-color:yellow;">{{market.withdrawalBatchDuration}}</mark>

**Maximum Grace Period Duration**: <mark style="background-color:yellow;">{{market.delinquencyGraceDuration}}</mark>

**Minimum Deposit Amount**: <mark style="background-color:yellow;">{{market.minimumDeposit}}</mark>

**Loan Type**: <mark style="background-color:yellow;">{{market.marketType}}</mark>

**Fixed Term Maturity**: <mark style="background-color:yellow;">{{market.fixedTermEndTime}}</mark>

**Early Fixed Term Closure Enabled**: <mark style="background-color:yellow;">{{market.allowClosureBeforeTerm}}</mark>

**Fixed Term Maturity Reduction Enabled**: <mark style="background-color:yellow;">{{market.allowTermReduction}}</mark>

**Market Token Transferability**: <mark style="background-color:yellow;">{{market.transferAccess}}</mark>

**Chain ID**: <mark style="background-color:yellow;">{{network.chainID}}</mark>

**Chainalysis Sanctions Screening Oracle**: <mark style="background-color:yellow;">{{chainalysisOracle.address}}</mark>

**Loan Effective Date**: <mark style="background-color:yellow;">{{lender.timeSigned}}</mark>

The Lender hereby acknowledges that it is aware that the Base APR, Maximum Amount of Digital Asset To Be Loaned, Minimum Deposit Amount and Fixed Term Maturity (if applicable) can be adjusted by the Borrower in accordance with Section 2 of the Agreement. The Lender further acknowledges that if the Market is in a Fixed Term State, no Withdrawal requests will be processed until the earlier of i) the maturity specified above elapsing since the deployment of the Market, ii) the maturity being reduced by the Borrower to a period which has elapsed, or iii) the Market being terminated by the Borrower.\
\
Borrower: <mark style="background-color:yellow;">{{borrower.name}}</mark>

Borrower Wallet: <mark style="background-color:yellow;">{{borrower.address}}</mark>

Signed By: <mark style="background-color:yellow;">{{ECDSA Signature}}</mark>

Specified Wallet Address: <mark style="background-color:yellow;">{{lender.address}}</mark>

Signed By: <mark style="background-color:yellow;">{{ECDSA Signature}}</mark>


# Privacy Policy

Updated and effective: 16 January 2025

## Introduction

Wildcat Foundation is committed to protecting and respecting your privacy. This Privacy Policy (the “Policy”) describes how Wildcat and its affiliates (“we”, “us”, or “our”), might collect, use, and/or share your personal data when you access our company websites, including but not limited to, wildcat.finance (including the Wildcat app) and its sub-domains, and all of our other properties, products, and services (collectively the “Services”).

For the purposes of this Policy, personal data is any data related to an identified or identifiable individual. Your use of the Services is subject to this Policy as well as our Terms of Use. If you do not agree with the terms of this Policy, do not access or use these Services, or any other aspect of our business.

## What Personal Data We Collect

When you visit our company websites and use our Services, we may collect the following data:

Publicly available blockchain data when you connect your non-custodial wallet to the Services. When you connect your non-custodial blockchain wallet to the Services, we may collect and log your publicly-available blockchain address in order to learn more about your use of the Services and to screen your wallet for any prior illicit activity. Note that blockchain addresses are publicly-available data that are not created or assigned by us or any central party, and by themselves are not personally identifying.

Information from localStorage and other tracking technologies. We and our third-party services providers may access and collect data from localStorage, mobile deviceID, cookies, web beacons, and other similar technologies to provide and personalise the Services and features of the Services for you across sessions.

Direct Communications that you send to us. Whenever you reach out to us through email, social media, or other support channels like X, Discord, or Telegram, or engage in surveys or questionnaires, we will receive the data and communications you share. It's important to note that we will not try to link any of this data to your wallet address, IP address, or any other personal details.

Information from job applicants. When you apply for a position with us, we collect all data you may provide, including name, email phone, work and immigration status, and any other resume, cover letter, or free form text you include.

## How We Use Your Data

As the operator of the Websites and Services, we take the protection of your personal data very seriously. We may use your personal data for the following purposes:

User support and communication. We may use the data we collect to provide you with support and to answer any requests you may have about the Services, and to share information with you about our Services.

Providing services if applicable. We use the data we collect to provide, maintain, customise and improve our Services and features of our Services. We may use this data in an aggregated form, to compile information across multiple users.

Safety and security. We may use the data we collect to protect against, investigate, and stop fraudulent, unauthorised, or illegal activity. We may also use it to address security risks, solve potential security issues such as bugs, enforce our agreements, and protect our users.

Legal and regulatory compliance. We may use the data we collect as needed or requested by regulators, government entities, and law enforcement to comply with applicable laws and regulations.

Due diligence processing. If applicable, we may use the data we collect to process your job application (or other relevant counterparty due diligence required).

Data anonymisation and aggregation. We may aggregate or anonymise your personal data, so it no longer identifies you as an individual. We may use this aggregated or anonymised data for statistical analysis, research, or other purposes to improve our Services and better understand our customer base.

Other. If we need to use your personal data for any other purpose, we will ask you for consent and will use your data only on receiving your consent and then, only for the purpose(s) for which grant consent unless we are required to do otherwise by law.

You may opt-out of direct marketing communications by writing to us at <contact@thewildcat.foundation>. Do note that if you do not allow us to collect or process the required personal information or withdraw the consent to process the same for the required purposes, you may not be able to access or use the services for which your information was sought.

We may use personal data relevant to any legal claims, disputes, or regulatory inquiries to comply with applicable laws and regulations. This includes using such data to investigate or address claims or disputes relating to the use of our Services, or as required by regulators, government entities, and official inquiries.

We use cookies (small, often encrypted, text files that are stored on your computer or mobile device) and similar technologies (such as web beacons, pixels, and scripts) (collectively, “Cookies”) to provide you with certain functions on our Services and help collect data. This section explains how we use Cookies to collect information about the way you use our Services and how you can control them.

## How We Use Cookies

We use Cookies to track how you use our Services by providing usage statistics. Cookies are also used to deliver our information (including updates) and allow account authentication to you based upon your browsing history and previous visits to the Services. We may combine the information we collect from Cookies with personal information that we have collected from you to learn more about how you use our Services to improve it.

## Types of Cookies

We may use both session Cookies (which expire once you close your web browser) and persistent Cookies (which stay on your device until you delete them). To make it easier for you to understand why we need them, the Cookies we use on our Services can be grouped into the following categories:

Strictly Necessary: These Cookies are necessary for the Services to work properly. They include any essential authentication and authorisation Cookies for our Services.

Functional: These Cookies enable technical performance and allow us to remember the choices you make while browsing our Services, including any preferences you set. They also include sign-in and authentication Cookies and IDs that enable you to return without additional sign-in.

Performance/Analytic&#x73;**:** These Cookies allow us to collect certain information about how you navigate the Services and services running on your device. They help us understand which areas you use and what we can do to improve them.\
We use third-party analytics services, including Hotjar, to better understand how users interact with our Services, diagnose technical issues, and improve overall user experience.\
Hotjar collects pseudonymised information such as:

* Device type, operating system, and browser details
* Geographic location (country only)
* Preferred language settings
* Anonymised interaction data (mouse movements, clicks, scrolls, navigation patterns)

This information is stored in a pseudonymised user profile and processed solely for analytics purposes in accordance with applicable data protection laws.\
For more information on how Hotjar processes data, please visit: <https://www.hotjar.com/legal/policies/privacy/>

**Opt-Out:** You can disable Hotjar tracking at any time by following the instructions at: <https://www.hotjar.com/legal/compliance/opt-out\\>
We only activate Hotjar and other non-essential analytics cookies after obtaining your explicit consent through our Banner. You may withdraw or change your consent at any time via our cookie settings.

Targeting: These Cookies are used to deliver relevant information related to our Services to an identified machine or other device (not a named or otherwise identifiable person) which has previously been used to visit our Services. Some of these types of Cookies on our Services are operated by third parties with our permission and are used to identify advertising sources that are effectively driving customers to our Services.

How to Control and Delete Cookies Cookies can be controlled, blocked, or restricted through your web browser settings. Information on how to do this can be found within the Help section of your browser. All Cookies are browser specific. Therefore, if you use multiple browsers or devices to access the Services, you will need to manage your Cookie preferences across these environments.

Find out how to manage Cookies on popular browsers:

Google Chrome, available at <https://support.google.com/accounts/answer/61416?co=GENIE.Platform%3DDesktop\\&hl=en>

Microsoft Edge, available at <https://privacy.microsoft.com/en-us/windows-10-microsoft-edge-and-privacy>

Mozilla Firefox, available at <https://support.mozilla.org/en-US/kb/enable-and-disable-cookies-webServices-preferences>

Microsoft Internet Explorer, available at <https://support.microsoft.com/en-gb/help/17442/windows-internet-explorer-delete-manage-cookies>

Opera, available at <https://www.opera.com/help/tutorials/security/privacy/>

Apple Safari, available at <https://support.apple.com/guide/safari/manage-cookies-sfri11471/mac>

If you are using a mobile device to access the Services, you will need to refer to your instruction manual or other help/settings resource to find out how you can control Cookies on your device. For more information about cookies, and how to disable cookies, visit <http://www.allaboutcookies.org>.

Please note that if you restrict, disable or block any or all Cookies from your web browser or mobile or other device, the Services may not operate properly, and you may not have access to our services available through the Services. We are not responsible for your inability to use our Services or any degraded function you may experience that may be caused by your settings and choices regarding Cookies.

We do not control third parties’ collection or use of your information to serve interest-based advertising. However, these third parties may provide you with ways to choose not to have your information collected or used in this way. You can opt out of receiving targeted ads from members of the Network Advertising Initiative (“NAI”) on the NAI’s website.

## How We Share Your Data

We may share or disclose the data we collect in the limited circumstances as described below:

With regulators, government entities, and law enforcement to comply with our legal obligations

With service providers, including Hotjar, to help us understand how users interact with our Services, improve functionality, and diagnose technical issues. These providers act as our data processors under applicable privacy laws, process data solely on our behalf, and are bound by data processing agreements. They may collect pseudonymised information as described in the “Performance/Analytics” section.

With blockchain security analytics providers to ensure the safety and security of our Services and to screen your wallet for any prior illicit activity

To enforce your agreements with us, including this Privacy Policy, and to respond to claims that your use of the Service violates any third-party rights

We require such third parties to use the personal data we share with them only for the purpose for which the data was transferred and not to retain it for longer than is required for fulfilling the said purpose.

## International Data Transfers

We, along with our affiliates, subsidiaries, and trusted third-party providers, may handle your personal information in countries outside of your own. The data privacy laws in these countries may differ from, and potentially offer less protection than, those in your home country.

When transferring your personal information internationally, and in accordance with applicable legal requirements, we will implement appropriate safeguards to ensure your data is adequately protected and compliant with relevant data protection laws. For further details on how we manage international data transfers, please contact us through the information provided in the “Contact Us” section of this policy.

This section will ensure that users are informed about how their data is managed when transferred internationally, in line with the rest of the privacy policy.

## Security

The security of your data is important to us, and we take reasonable security measures to prevent the loss, misuse, unauthorised access, modification, or disclosure of your personal data under our control. The security measures in place will, from time to time, be reviewed in line with legal and technical developments.

However, given the inherent risks, we cannot guarantee absolute security and give no guarantee that such loss, misuse, unauthorised access, modification, or disclosure will not occur. You are responsible for all of your activity on the Services, including the security of your blockchain network addresses, cryptocurrency wallets, and their cryptographic keys.

## Age Limitations

Our Services are not intended for use by anyone under the age of 18. If we learn that we have collected personal data from an individual under 18 without verification of parental consent, we will delete that information promptly. If you believe we may have any information from or about a person under 18, please contact us.

## Links

There may be links from our Sites to other websites and resources provided by third parties. This Privacy Policy applies only to our Sites. Accessing those third-party websites or sources requires you to leave our Sites. We do not control those third-party sites or any of the content contained therein, and you agree that we are in no circumstances responsible or liable for any of those third-party sites, including, without limitation, their content, policies, failures, promotions, products, services or actions and/or any damages, losses, failures or problems caused by, related to or arising from those sites. We encourage you to review all policies, rules, terms and regulations, including the privacy policies, of each site that you visit.

## Changes to the Policy

Please note that we may modify this Privacy Policy at any time without any prior notice. The revised Policy will be effective immediately from when the revised Policy is posted in the Service and your continued access or use of the Service after such time will constitute your acceptance of the revised Privacy Policy. We encourage you to regularly review the latest version of this Privacy Policy

## Retention of Personal Information

We retain the personal data we collect only for as long as necessary to fulfil the purposes for which it was collected, to provide our Services, to resolve disputes, to enforce our agreements, and to comply with legal obligations. This period may vary depending on the nature of the data and the reasons for collecting it, having regard to the purposes described in this Privacy Policy and our own legal and regulatory requirements.

## Contact Information

If you have any questions, comments, or concerns regarding our Privacy Policy, please contact us at <contact@thewildcat.foundation>.

## Acknowledgment of Risks

By using the Wildcat Protocol, you acknowledge that you have read, understood, and agree to this privacy policy.

Updated and effective: 16 January 2025


