Skip to main content
Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Eine Kurvenregel ist die Antwort einer Plattform auf die Frage „welche Starts bin ich bereit zu hosten?”. GlobalConfig setzt die Protokoll-Untergrenze — mindestens 10M Supply, mindestens 20% der Supply auf der Kurve verkauft, und so weiter — und diese Untergrenzen sind absichtlich weit gefasst, damit jede Art von Plattform darunter passt. Eine Kurvenregel ist der Ort, an dem Sie diese auf die Form eingrenzen, die Ihr Produkt tatsächlich unterstützt.Regeln leben in ihrem eigenen PlatformCurveRule-Konto, eines pro (Plattform, GlobalConfig)-Paar. Sie können nur das einengen, was die Config bereits erlaubt; eine Regel kann niemals eine Protokoll-Obergrenze aufheben.

Das mentale Modell

Drei Ebenen, von außen nach innen:
Die zwei Verschachtelungsebenen machen dies ausdrucksstark:
  • Constraints innerhalb einer Gruppe werden UND-verknüpft. Alle müssen erfüllt sein.
  • Gruppen innerhalb einer Regel werden ODER-verknüpft. Ein Start ist erlaubt, sobald er eine einzelne Gruppe erfüllt.
Eine Gruppe ist also eine zulässige Form, und die Regel ist das Menü der Formen, die Sie anbieten. Eine Regel kann bis zu 10 Gruppen enthalten, und eine Gruppe bis zu 25 Constraints. Zwei Grenzfälle sind es wert, sich zu merken: Eine Regel tritt nur in Kraft, während PlatformConfig.restrict_curve_param auf 1 gesetzt ist. Bei 0 liest das Programm Regeln überhaupt nicht, was auch der Schalter ist, den Sie zum Ausrollen und Zurückrollen einer Regel verwenden.

Constraints

Ein Constraint ist ein (Feld, Operator, Wert)-Tripel. Nichts anderes — keine Ausdrücke, keine Verschachtelung.
Ein Bereich sind zwei Constraints auf demselben Feld innerhalb einer Gruppe: ein Gte für die Untergrenze und ein Lte für die Obergrenze. Das gleiche (Feld, Operator)-Paar darf nicht zweimal in einer Gruppe vorkommen, was verhindert, dass Sie zwei widersprüchliche Mindestwerte schreiben.

Felder

Feld-IDs sind dauerhaft. Neue Felder werden nur angehängt, daher ändert sich eine ID nie in ihrer Bedeutung, sobald ein Regelkonto sie enthält.
Die abgeleiteten Felder sind diejenigen, die Regeln portierbar machen. Das Festlegen von Supply und TotalFundRaisingB auf exakte Zahlen fixiert eine Startform; das Einschränken von FundRaisingRateB fixiert die Beziehung zwischen ihnen und lässt einen Ersteller jede Supply wählen, die sie beibehält.
Ratenfelder sind nur innerhalb einer GlobalConfig vergleichbar, da ihre Nenner von der Quote-Mint dieser Config und ihren Dezimalstellen abhängen. Das ist in der Praxis keine Einschränkung: eine Regel ist konstruktionsbedingt auf eine Config begrenzt.

Die neun Playbooks

Jedes Playbook unten ist eine Regel. Constraints werden als (Feld, Operator, Wert) geschrieben.

1. Eine Standard-Stufe

Die einfachste Regel und das exakte Verhalten, das die eingestellte Kurvenparameter-Whitelist bot: eine Form, festgelegt. Jeder Start, der in einem der drei abweicht, wird mit CurveParamNotMatchPlatformRule abgelehnt.

2. Ein Band statt einer Zahl

Der Grund, warum Bänder existieren: Ein Ersteller wählt ein Fundraising-Ziel, mit dem Sie sich wohlfühlen, ohne dass Sie jeden Wert aufzählen müssen. Eine Gruppe, vier Constraints, und der Ersteller hat einen 50–200 SOL-Korridor. Unter der alten Whitelist brauchte dies einen Eintrag pro zulässigem Wert, und die Obergrenze von zehn Einträgen machte es unmöglich.

3. Stufen nebeneinander

Gruppen werden ODER-verknüpft, daher ist jede Stufe eine Gruppe. Die Reihenfolge ist wichtig für die Berechnung, nicht für die Semantik: Die Auswertung stoppt bei der ersten Gruppe, die passt, daher sollten Sie Ihre am häufigsten verwendete Stufe zuerst platzieren.

4. Ein Abschluss-Valuierungsband

FundRaisingRateB ist TotalFundRaisingB / Supply in Millionsten. Das Einschränken davon begrenzt, wie wertvoll ein Token unabhängig von der Supply, die der Ersteller wählte, abschließen kann. Mit einer 1e12 Supply und einer 9-dezimalen Quote-Mint sitzt 85e9 / 1e12 × 1e6 = 85_000 innerhalb dieses Bandes. Ein Ersteller, der die Supply verdoppelt, muss das Ziel ungefähr verdoppeln, um darin zu bleiben — das ist der Sinn. Zwei Constraints ersetzen, was sonst eine Tabelle von (Supply, Ziel)-Paaren wäre.

5. Eine Migrationsuntergrenze

MigrateRateA ist der Anteil der Supply, der beim Abschluss tatsächlich in den CPMM-Pool gelangt: Supply − TotalSellA − TotalLockedAmount, über Supply. Es ist die Tiefe des abgeschlossenen Pools und es ist der einzige Protokoll-Knopf ohne plattformseitiges Äquivalent vor Regeln. Mindestens 15% der Supply erreichen den Pool. Ein Ersteller kann nicht 95% auf der Kurve verkaufen und ein flaches Buch hinterlassen.
Wenn die Parameter nicht aufgehen — ein gesperrter Betrag größer als das, was nach dem Kurvenverkauf übrig bleibt — kann der abgeleitete Wert nicht berechnet werden und das Constraint schlägt geschlossen fehl, daher wird der Start abgelehnt, anstatt stillschweigend erlaubt zu werden.

6. Vesting, das Sie tatsächlich durchsetzen

GlobalConfig.max_lock_rate begrenzt Vesting von oben. Eine Regel kann eine Untergrenze darunter setzen und einen echten Cliff erfordern. Zwischen 5% und 20% der Supply gesperrt, mit mindestens einem 30-Tage-Cliff. Nützlich für eine Plattform, deren Pitch „keine Instant-Unlock-Starts” ist.

7. Token-Typ-Gating

BaseTokenProgram und TransferFeeEnabled sind unabhängig, was wichtig ist: Eine Token-2022-Mint ohne TransferFeeConfig meldet TransferFeeEnabled = 0 genau wie eine SPL Token-Mint.

8. Eine bedingte Transfergebühr-Obergrenze

Es gibt keinen „if”-Operator, und keiner ist nötig — zwei Gruppen drücken die Bedingung aus. Eine Null-Rate TransferFeeConfig rutscht nicht durch Gruppe 0: die Erweiterung ist vorhanden, daher ist TransferFeeEnabled 1 und nur Gruppe 1 kann sie akzeptieren.

9. Eine zeitlich begrenzte Promo, im Voraus geplant

UnixTimestamp ist die Blockzeit des Starts, daher kann eine Gruppe ihr eigenes Gültigkeitsfenster tragen. Sie schreiben beide Gruppen heute und der Wechsel passiert von selbst. An der Grenze ist keine Transaktion erforderlich. Die Kosten sind zwei Gruppenplätze statt eines.

Kurventyp-Einschränkungen

Vier Felder lesen TotalSellA: TotalSellA, SellRateA, MigrateAmountA und MigrateRateA. Bei einer Constant-Product-Config liefert der Ersteller diese Zahl. Bei einer Fixed-Price- oder Linear-Price-Config leitet die Kurve sie stattdessen ab, und der Wert, den das Programm vergleicht, ist 0, was jeden Start ablehnen würde. Anstatt Sie eine Regel schreiben zu lassen, die Ihre eigene Config stillschweigend blockiert, weigert sich das Programm, diese vier Felder zum Schreibzeitpunkt bei einer Non-Constant-Product-Config zu akzeptieren, mit CurveRuleFieldNotSupportedByCurve. Nur Constant-Product-Configs existieren heute, daher werden Sie diesen Fehler in der Praxis nicht antreffen.

Prüfen Sie vor dem Senden

Beide Richtungen der On-Chain-Prüfung sind Off-Chain verfügbar, daher muss weder ein Ersteller noch eine Plattform eine Regel durch das Beobachten von Transaktionsrückgängigmachungen lernen.
Versionsbanner.
  • SDK: @raydium-io/raydium-sdk-v2@0.2.42-alpha ist die Version, auf die jede andere Code-Demo auf dieser Website gepinnt ist. Die beiden Helfer unten kommen mit der SDK-Version, die Kurvenregel-Unterstützung ausliefert; bis dahin portieren Sie sie aus der platform_curve_rule.rs des Programms oder rufen das Programm auf und lesen den Fehlercode.
  • Cluster: testen Sie zuerst auf Solana devnet — siehe Testen Sie zuerst auf devnet.
  • Programm-ID: siehe reference/program-addresses
Beide Helfer sind reine Funktionen. Sie berühren kein RPC, daher sind sie sicher, auf jedem Tastendruck in einem Formular auszuführen.

Vor einem Start: Werden diese Parameter bestehen?

checkLaunchAgainstCurveRule spiegelt die Startzeit-Prüfung des Programms genau wider, einschließlich ihres Fail-Closed-Verhaltens. Führen Sie es in Ihrem Startformular aus und Sie können die Schaltfläche „Senden” mit einem Grund deaktivieren, anstatt den Ersteller für eine rückgängig gemachte Transaktion bezahlen zu lassen.
Drei Dinge, die der Helfer reproduziert, anstatt sie zu approximieren:
  • Ein fehlendes Regelkonto und eine Regel ohne Gruppe bestehen beide. Ebenso eine Gruppe ohne Constraints. Übergeben Sie rule: undefined für ein nicht existierendes Konto; behandeln Sie es nicht als Ablehnung.
  • Nicht berechenbare Werte schlagen geschlossen fehl. Eine Null-Supply hat keine Raten, und ein gesperrter Betrag größer als das, was der Kurvenverkauf hinterlässt, hat keinen Migrationsbetrag. actual kommt als undefined zurück und das Constraint zählt als unerfüllt, genau wie On-Chain.
  • Alle fehlgeschlagenen Constraints werden gemeldet, nicht nur das erste. Das Programm nimmt eine Abkürzung, weil es nur ein Urteil braucht; der Helfer sammelt alles, damit Ihr Formular jedes Problem auf einmal auflisten kann.
Das Einzige, das es nicht wissen kann, ist die Blockzeit, auf der Ihre Transaktion tatsächlich landen wird. Wenn eine Regel UnixTimestamp in der Nähe einer Grenze verwendet, behandeln Sie einen Pass als vorläufig.

Vor dem Schreiben einer Regel: Ist diese Gruppe gültig?

checkCurveRuleGroupWritable spiegelt die Schreibzeit-Validierung von UpdatePlatformCurveRule wider — Constraint-IDs, die doppelte (Feld, Operator)-Regel, beide Zählgrenzen und die Kurventyp-Einschränkung. Führen Sie es in Ihrem Plattform-Admin-Tool aus, bevor Sie signieren.
Das Bestehen dieser Prüfung bedeutet, dass die Transaktion nicht wegen Fehlformation abgelehnt wird. Es sagt nichts darüber aus, ob die Regel das ist, was Sie gemeint haben — eine Gruppe kann perfekt gültig sein und trotzdem jeden Start ablehnen, den Ihre UI produzieren kann. Das ist der Grund für die Startseite-Prüfung oben: Nach dem Schreiben einer Gruppe führen Sie jede Form, die Ihr Produkt anbietet, durch checkLaunchAgainstCurveRule aus und bestätigen, dass jede immer noch eine Gruppe findet.

Testen Sie zuerst auf devnet

Das Aktivieren von restrict_curve_param auf mainnet ändert, was Ihre Ersteller tun können, sofort, für jeden Start. Üben Sie die gesamte Sequenz auf devnet, bevor Sie mainnet berühren:
  1. Erstellen Sie eine Plattform-Config und eine Regel auf devnet, und schreiben Sie die gleichen Gruppen, die Sie ausliefern möchten.
  2. Führen Sie jede Startform, die Ihre UI produzieren kann, durch checkLaunchAgainstCurveRule aus, und bestätigen Sie, dass die Urteile die sind, die Sie erwarten — sowohl die Formen, die bestehen sollten, als auch die Formen, die abgelehnt werden sollten.
  3. Aktivieren Sie restrict_curve_param, dann starten Sie tatsächlich einen Token, der bestehen sollte, und einen, der abgelehnt werden sollte. Der zweite sollte mit CurveParamNotMatchPlatformRule (6025) fehlschlagen, nicht mit NotEnoughRemainingAccounts (6018) — letzteres bedeutet, dass Ihr Builder die Regel-PDA nicht anhängt und die Prüfung nicht wirklich ausgeübt wird.
  4. Nur dann auf mainnet wiederholen, in der gleichen Reihenfolge.
Punkt 3 ist der, auf dem es sich lohnt zu bestehen. Der Off-Chain-Helfer und das On-Chain-Programm sind zwei Implementierungen der gleichen Regeln, und ein devnet-Start ist das, was beweist, dass sie für Ihre Regel übereinstimmen — einschließlich dass Ihr Start-Builder das Konto überhaupt anhängt.

Eine Regel betreiben

Der delegierte Manager

Das Bearbeiten von Regeln ist Routinearbeit; ein Plattform-Admin-Schlüssel ist normalerweise ein Multisig. PlatformConfig.curve_rule_manager existiert genau dafür: setzen Sie ihn einmal durch UpdatePlatformConfig::CurveRuleManager, und dieser Hot Wallet kann dann Regelkonten auf eigene Faust erstellen, aktualisieren, entfernen und schließen. Der Plattform-Admin behält die gleiche Macht parallel, daher ist ein verlorener Manager-Schlüssel wiederherstellbar — rotieren Sie ihn mit einem anderen Admin-Aufruf. Umfang eines kompromittierten Manager-Schlüssels: Er kann Ihre Parameterregeln lockern oder löschen und die Miete eines Regelkontos zurückfordern. Er kann Gebühren-Wallets, Vesting, die CPMM-Config nicht berühren, kann restrict_curve_param nicht umschalten und kann eine GlobalConfig-Grenze nicht brechen. Behandeln Sie ihn als Konfigurationsschlüssel, nicht als Treasury-Schlüssel.

Miete folgt dem Inhalt

Ein Regelkonto wird erstellt, das keine Gruppe hält, und wird bei jeder Änderung vergrößert, daher zahlen Sie für die Regeln, die Sie tatsächlich geschrieben haben. Das Entfernen einer Gruppe erstattet die Differenz an den Unterzeichner.

Ausrollungsreihenfolge

  1. Üben Sie die gesamte Sequenz auf devnet — siehe Testen Sie zuerst auf devnet.
  2. Erstellen Sie das Regelkonto und schreiben Sie seine Gruppen. Noch nichts ändert sich — mit restrict_curve_param immer noch 0 liest das Programm sie nicht.
  3. Prüfen Sie die Regel Off-Chain mit checkLaunchAgainstCurveRule: für jede Startform, die Ihre UI produzieren kann, bestätigen Sie, dass eine Gruppe sie akzeptiert.
  4. Setzen Sie restrict_curve_param auf 1. Von diesem Moment an werden die Starts Ihrer Ersteller geprüft.
  5. Zum Zurückrollen setzen Sie es auf 0 zurück. Das Regelkonto bleibt intakt.
Ihr Start-Builder muss die Regel-PDA zu remaining_accounts anhängen, während restrict_curve_param 1 ist. Das Programm erfordert, dass das Konto vorhanden ist, auch wenn es noch nicht existiert, damit ein Ersteller die Prüfung nicht durch Auslassung überspringen kann — ein fehlendes Konto ist NotEnoughRemainingAccounts, kein Pass. Die Ableitung ist [b"platform_curve_rule", platform_config, global_config].

Kosten zum Startzeitpunkt

Die Prüfung läuft bei jedem Start, während sie aktiviert ist, daher ist ihre Rechenkosten eine Pro-Start-Steuer. Gemessen von Ende zu Ende — PDA-Ableitung, der remaining_accounts-Scan, Deserialisierung und Auswertung: „Billig” ist ein direktes Feldlesen wie Supply; „abgeleitet” ist ein berechnetes wie MigrateRateA, das etwa 223 CU pro Constraint kostet, gegenüber etwa 48. Selbst eine vollständig beladene Regel abgeleiteter Constraints bleibt unter einem Drittel des Standard-Budgets von 200 000 CU pro Anweisung, und eine realistische Drei-Gruppen-Regel liegt unter 6 000. Gruppen werden ausgewertet, bis eine passt, daher ist das Platzieren Ihrer häufigen Stufe zuerst kostenlose Einsparungen.

Wo es weitergeht

Quellen:
  • raydium-launch/programs/launchpad/src/states/platform_curve_rule.rsPlatformCurveRule, CurveRuleGroup, ParamConstraint, die Feld- und Operator-ID-Räume und CurveRuleContext::value_of.
  • raydium-launch/programs/launchpad/src/utils/platform_curve_rule.rs — die Startzeit-Prüfung.
  • raydium-launch/programs/launchpad/src/instructions/platform/create, update, remove und close_platform_curve_rule.