Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

  • Rate: 5% of the protocol-wide fee pool per distribution period
  • Weighting: Proportional to introduced deployed capital versus total deployed capital across all vaults
  • Start condition: 30 days of continuous deployment (no cliff)
  • Stop condition: Commission stops when the referred LP exits a vault
  • Payment currency: trUST
  • Frequency: Monthly

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:

  • Total eligible deployed capital: $2,000,000
  • Capital you introduced (all eligible): $200,000
  • Your pool weight: 10%
  • Total protocol fees this month: $80,000
  • LP Introducer pool (5%): $4,000
  • Your commission: $400 in trUST

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.

Commission is paid in trUST, SukukFi’s settlement token, backed 1:1 by stablecoins. To convert it to a stablecoin, submit a redemption request through the app. The SukukFi operator approves it before the vault releases the underlying stablecoin, the same redemption that applies to all trUST.

That operator review is one of the program’s controls. It works with the 30-day deployment minimum and the automatic stop when a referred LP exits. Together these keep commissions tied to capital that stays. trUST is operator-reviewed on both minting and redemption, so payouts run through the operator rather than an open on-chain loop.

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:

  • Your Code: the bytes32 hex value registered to your address
  • Your Referral Link: the shareable URL
  • Referred LPs: count of wallets linked to your code
  • Total Paid: cumulative trUST paid to you across all distributions
  • Days Until Eligible: countdown for the nearest LP approaching 30 days

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)IntroducerRegisters 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 / KeeperRecords 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 / KeeperBatch 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)AdminTransfers 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. Register a second wallet if you need a separate code.

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?

Your introducer dashboard 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 use my invite code to supplement my own yield?

Yes, with two wallets. Register an invite code on a second wallet, then deposit from your primary wallet using that second wallet’s referral link. Your primary wallet earns LP yield on its deployed capital; your second wallet earns commission on that same capital from the 5% introducer pool. That is additive yield, not a redirect of it. Single-wallet self-referral does not work the same way: commission on your own deposit from the same address is yield you were already receiving as an LP.

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.