
@tare_io is an onchain loan exchange for regulated, institutional credit originators and investors. Tare's Loan Management System manages the end-to-end loan lifecycle with asset-level NFTs, native double-entry accounting, programmatic settlement, and ERC-7540 vaults priced with transparency.
Scope
On what chains are the smart contracts going to be deployed?
Avalanche C-Chain.
If you are integrating tokens, are you allowing only whitelisted tokens to work with the codebase or any complying with the standard? Are they assumed to have certain properties, e.g. be non-reentrant? Are there any types of weird tokens you want to integrate?
In this first version, Tare only supports USDC: https://snowscan.xyz/token/0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e
Are there any limitations on values set by admins (or other roles) in the codebase, including restrictions on array lengths?
Role trust assumptions
Limitations on values set by roles
Because the value-setting functions below are reachable only by trusted roles, they intentionally do not enforce economic upper bounds. Specifically:
accrue, chargeMiscFee, applyWaterfall, and createLedgerEntries accept amounts that are computed off-chain, the servicer is trusted to submit correct figures.setDiscountFactor and setPortfolioFactor set the multipliers used to value the portfolio. Discount factors and the portfolio factor sit under fixed/Guardian-configured caps, but within those caps the Calculating Agent is trusted to choose values that are correct (including haircuts). Realistically portfolio factor will be ≤ 1.setMaxNavAge and setMaxNavComputationTime accept any positive value; there is no upper bound preventing an unreasonably long staleness or computation window. In practice, maxNavAge and maxNavComputationTime will be set to ~4h/10h and ~30 mins / 1h respectively.setMaxLoansPerOffer accepts any positive value with no upper bound. Realistically this will be set to ~100-200.setAllowance on the trusted-spender module accepts an arbitrary amount up to its type maximum; there is no economic cap.addLoansToNav / removeLoansFromNav), smart-account configuration arrays (owners, delegates, currencies, NFT collections, trusted recipients), and trusted-call batch registration — do not impose a maximum array length. Any resulting gas/DoS exposure requires a trusted role to supply an oversized array and is therefore out of scope.Any value or array-length input reachable by an untrusted party (Borrower, Investor, or an arbitrary caller) that is not adequately bounded is in scope.
Are there any limitations on values set by admins (or other roles) in protocols you integrate with, including restrictions on array lengths?
N/A.
Is the codebase expected to comply with any specific EIPs?
See specs.
Issues breaking EIPs can be considered valid only if they lead to Medium or higher impact and qualify for Medium or higher severity definitions
Are there any off-chain mechanisms involved in the protocol (e.g., keeper bots, arbitrage bots, etc.)? We assume these mechanisms will not misbehave, delay, or go offline unless otherwise specified.
There are no independent keeper bots, arbitrage bots, liquidation bots,… At the beginning most of the transactions will be submitted by Tare taking on different “roles” (see below).
TrustedCalls -> role Smart Account path; the role Smart Account is the contract-visible caller.borrower role to the end borrower's bank account. On repayment, the backend bridges borrower fiat back to the borrower Smart Account and calls pay; future deployments may assign the borrower role to a retail wallet/EVM address and accept payments more directly onchain.| Area | Contract touchpoint | Trigger mode |
|---|---|---|
| Servicing accrual | Loans.accrue | Human/API-triggered via backend for standalone accruals; automated when part of payment processing |
| Payment settlement | Loans.pay, Loans.applyWaterfall | Automated backend settlement after a payment intent and required payment-rail steps complete |
| Withdrawals | investorWithdraw, servicerWithdraw, borrowerWithdraw, originatorWithdraw | Human/operator-triggered via backend or authorized role account |
| Account setup/delegation | SmartAccountFactory, TrustedCalls, TrustedSpender config | Manual/multisig |
| Exchange | LoansExchange.createOffer, acceptOffer, cancelOffer | Human/operator-triggered via backend after offchain negotiation |
| Vault operations | loan curation, NAV updates, NAV factor configuration, deposit/redemption approvals | NAV updates, curation, and deposit/redemption approvals are vault-manager-triggered (PORTFOLIO_MANAGER/INVESTOR_MANAGER) via the backend; NAV factor configuration is CALCULATING_AGENT-triggered; other configuration is manual/timelocked |
| Governance/config | guardian/admin setters, timelock operations | Manual/multisig/timelock |
CALCULATING_AGENT; the NAV value is refreshed by a vault manager (PORTFOLIO_MANAGER/INVESTOR_MANAGER) calling updateNav(this must be done especially before any approving any deposit/redemption) and there is no automated NAV schedule today.What properties/invariants do you want to hold even if breaking them has a low/unknown impact?
See specs/invariants.md in the repo.
Issues breaking Invariants can be considered valid only if they lead to Medium or higher impact and qualify for Medium or higher severity definitions
Please discuss any design choices you made.
See specs and in particular SECURITY.md at the root of the repo.
Please provide links to previous audits (if any) and all the known issues or acceptable risks.
See SECURITY.md and the reports of the previous audits here: https://drive.google.com/drive/folders/1mtasFc-19EDRivo8jTAEv56L6oZgmP7K?usp=sharing
Please list any relevant protocol resources.
All docs are in the repository directly under /specs. Additionally, architecture diagrams can be found here: https://drive.google.com/drive/folders/1mtasFc-19EDRivo8jTAEv56L6oZgmP7K?usp=sharing
Additional audit information.
This is a non-exhaustive list but we are interested in findings that relate to:
Total Rewards
Contest Pool
Lead Senior Watson
Lead Judge
27,000 USDC
19,000 USDC
4,000 USDC
Status
Scope
Start Time
End Time
Judging Rules