Invite Code

Refer a new LP to any SukukFi vault, and when that LP deploys capital for 30 days or more you earn a monthly commission paid in trUST. The CommissionRegistry contract on Berachain mainnet handles code registration, LP linking, deployment tracking, and commission payouts. No intermediary, no off-chain state.

Who Is an Introducer?

An introducer brings new capital providers to SukukFi: a financial advisor directing clients toward DeFi yield, a fund operator bringing partners, or a business development contact onboarding institutional depositors. Any Berachain wallet can register a code with no approval process. Commission accrues once the referred LP's capital is deployed and eligible.

Track A: LP Introducer Commission

The pool is protocol-wide, not per-vault. Introducers earn proportionally to referred deployed capital across all vaults, so pushing LPs toward any particular pool offers no advantage.

Commission Calculation

Each month:

  1. The protocol collects fees from vault activity across all active pools
  2. 5% of those fees form the LP Introducer Commission pool
  3. Each introducer's share equals: eligible capital they introduced / total eligible deployed capital across the protocol
  4. The operator transfers the resulting trUST directly to each introducer's wallet via distribute()

Example:

Capital deployed fewer than 30 days does not count in a given distribution. Capital deployed on day 28 counts in the next month's calculation.

The 30-Day Minimum

A 6-month cliff would mean earning nothing for half a year while your referred LP's capital generates protocol revenue from day one. That gap makes introducing economically irrational.

30 days works differently. Capital deployed for one full month counts in the next distribution. Commission accrues from month 2 onward for as long as the LP stays deployed. No cliff, no ramp, no vesting.

The window is long enough to rule out flash deposits. LP capital in ERC-7540 async vaults is naturally sticky — 15-day invoice settlement cycles make early withdrawal rare. 30 days confirms real deployment without penalising introducers with a long wait.

When an LP withdraws, their contribution drops to zero in the next pool weight calculation and commission stops. No clawback. The stop is automatic.

How the Invite Code Works

Each introducer gets a unique bytes32 code derived from their wallet address:

code = keccak256(abi.encodePacked(introducerAddress, 0))

No server generates this and no database stores it. The same address always produces the same code. Any party can verify a code's origin on-chain by checking whether keccak256(abi.encodePacked(claimedAddress, 0)) matches the registered code.

Codes are first-come, first-served. One address, one code. The registry maps both directions: code to introducer and introducer to code.

A referral link takes the form:

https://app.sukuk.fi/?ref=0xYOUR_CODE_HEX#vault

When an LP clicks your link, the app saves the code. At deposit time, the app calls linkLP(code) on-chain. That link is permanent and cannot be updated.

Step-by-Step Flow

For Introducers

  1. Register. Navigate to Invite Code in the app, connect your wallet, and click Register as Introducer. One transaction: registerCode(bytes32 code), where the code derives from your address. Once confirmed, your code is live.
  2. Share your referral link. The app shows a shareable URL: app.sukuk.fi/?ref=0x...#vault. Share it.
  3. LP deposits via your link. When the LP deposits, the app calls linkLP(yourCode) on their behalf. Your code is linked to their wallet on-chain.
  4. Deployment gets recorded. The SukukFi operator calls recordDeployment(lpAddress) once the LP's capital is active in a vault. This starts the 30-day clock. Your dashboard shows a countdown per referred LP.
  5. Commission distributes monthly. After 30 days of deployment, the LP counts in the next pool weight calculation. The operator calls distribute(introducers[], amounts[]) and trUST lands in your wallet. Your Total Paid counter updates immediately.

For LPs Being Referred

Referred LPs do nothing differently. Arriving via a referral link, the app calls linkLP() at deposit time, in the same transaction flow as the deposit. No extra step, no additional gas.

An LP links once. Re-depositing later via a different link or without one leaves the original link in place. LPs cannot change their introducer after the first deposit.

LPs who deposit without a referral link have no introducer on their wallet. Their capital contributes to no one's pool weight.

The Introducer Dashboard

The Invite Code view in the app shows three states:

Not connected: Prompt to connect wallet.

Connected, not registered: Three steps to onboard:

  1. Connect your wallet (done)
  2. Register as an introducer by sending registerCode()
  3. Share your referral link

Connected and registered: Your introducer dashboard showing:

Smart Contract Reference

ContractCommissionRegistry
Address0x0eEF48743f52Ce317222692DB03143D53C4257ac
NetworkBerachain mainnet (chainId 80094)
Deployment tx0x452bc1653b440602803c68b2cc5194c1711f56226ed6f0f8fb5b5828f856e9b9
Payment tokentrUST (0xdaB8586b5126b7B1FCA5611543905597c9910670)
Minimum deployment30 days
StandardNon-upgradeable Solidity ^0.8.24

Key Functions

FunctionCallerDescription
registerCode(bytes32 code) Introducer Registers the caller as an introducer with the given code. Code must equal keccak256(abi.encodePacked(msg.sender, 0)). Reverts if the address already has a code or the code is already taken.
linkLP(bytes32 code) LP (at deposit) Links the caller's wallet to the introducer who owns code. Can only be called once per LP address. Reverts if LP is already linked or code is unregistered.
recordDeployment(address lp) Admin / Keeper Records the timestamp at which the LP's capital was deployed into a vault. Starts the 30-day eligibility clock. Can only be called by the protocol operator.
recordDeployments(address[] lps) Admin / Keeper Batch version of recordDeployment. Processes multiple LPs in one transaction.
isEligible(address lp) View (anyone) Returns true if the LP's capital has been deployed for 30 or more days.
daysUntilEligible(address lp) View (anyone) Returns the number of days remaining until the LP becomes eligible. Returns type(uint256).max if deployment has not been recorded yet.
distribute(address[] introducers, uint256[] amounts) Admin Transfers trUST from the operator to each introducer address. Amounts are calculated off-chain using pool weights, then pushed on-chain. Updates totalPaid for each introducer.
getIntroducer(address lp) View (anyone) Returns the introducer address associated with a given LP wallet, or address(0) if unlinked.
codeOf(address introducer) View (anyone) Returns the bytes32 code registered to an introducer address, or bytes32(0) if not registered.
lpCode(address lp) View (anyone) Returns the code the LP linked at deposit time, or bytes32(0) if unlinked.
totalPaid(address introducer) View (anyone) Cumulative trUST paid to an introducer across all distribution cycles.
introducerOf(bytes32 code) View (anyone) Reverse lookup: returns the introducer address that registered a given code.

Distribution Mechanics

Each month: off-chain pool weight calculation, then a single on-chain settlement transaction.

At month end the protocol operator:

  1. Identifies all LPs with a recorded deployment timestamp 30+ days old (isEligible())
  2. Queries each LP's linked introducer via getIntroducer()
  3. Calculates each introducer's pool weight: eligible introduced capital / total eligible deployed capital
  4. Applies the 5% fee pool to compute each introducer's trUST amount
  5. Calls distribute(introducers[], amounts[]), pushing trUST to all qualifying introducers in one transaction

Every distribution is a traceable trUST transfer on Berachain. The totalPaid mapping updates in the same transaction, so the cumulative record is always current.

Frequently Asked Questions

Can I have multiple codes? No. One address, one code. A second wallet would need separate registration.

Can an LP change their referral link after depositing? No. The link sets on the first deposit and cannot be changed. This prevents switching referrers after capital is already deployed.

What happens if my referred LP withdraws and re-deposits? Withdrawal ends the deployment record and removes the LP from pool weight calculations. Re-depositing lets the operator call recordDeployment() again, restarting the 30-day clock. The original introducer link persists across the withdrawal and re-deposit.

Is there a minimum deposit size to qualify? None at the CommissionRegistry level. Any LP with a recorded deployment contributes to pool weight, regardless of deposit size.

When exactly does the 30-day clock start? When the operator calls recordDeployment(lpAddress), not at deposit time. A short lag exists between an LP's ERC-7540 async deposit completing and the operator confirming deployment on-chain.

How do I know my referred LPs have been recorded? Check your introducer dashboard. It shows a countdown per referred LP. You can also call daysUntilEligible(lpAddress) on the contract directly. type(uint256).max means no deployment has been recorded yet.

Can I refer myself? You can, but there is no advantage. Commission on your own capital is money you would receive as an LP anyway, routed through an unnecessary step.

Is the code registered to my address or my ENS name? Your raw EVM address. ENS names resolve to that address, and the contract uses the resolved value.