0.7.47-1FE5

This commit is contained in:
2026-05-31 16:43:19 +02:00
parent 7bd6593015
commit 8b09e82b3b
39 changed files with 24260 additions and 332 deletions

View File

@@ -138,13 +138,85 @@
<input id="demo3TargetPoolAdminInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="pool_admin" />
<label for="demo3TargetPoolAdminInput" class="form-check-label">pool_admin</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetBurnInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="burn" />
<label for="demo3TargetBurnInput" class="form-check-label">burn</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetMintInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="mint" />
<label for="demo3TargetMintInput" class="form-check-label">mint</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetTransferInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="transfer" />
<label for="demo3TargetTransferInput" class="form-check-label">transfer</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetCloseAccountInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="close_account" />
<label for="demo3TargetCloseAccountInput" class="form-check-label">close_account</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetTokenAccountCreateInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="token_account_create" />
<label for="demo3TargetTokenAccountCreateInput" class="form-check-label">token_account_create</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetWrapSolInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="wrap_sol" />
<label for="demo3TargetWrapSolInput" class="form-check-label">wrap_sol</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetUnwrapSolInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="unwrap_sol" />
<label for="demo3TargetUnwrapSolInput" class="form-check-label">unwrap_sol</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetStakeInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="stake" />
<label for="demo3TargetStakeInput" class="form-check-label">stake</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetUnstakeInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="unstake" />
<label for="demo3TargetUnstakeInput" class="form-check-label">unstake</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetOrderPlaceInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="order_place" />
<label for="demo3TargetOrderPlaceInput" class="form-check-label">order_place</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetOrderCancelInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="order_cancel" />
<label for="demo3TargetOrderCancelInput" class="form-check-label">order_cancel</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetOrderFillInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="order_fill" />
<label for="demo3TargetOrderFillInput" class="form-check-label">order_fill</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetSettleFundsInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="settle_funds" />
<label for="demo3TargetSettleFundsInput" class="form-check-label">settle_funds</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetConsumeEventsInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="consume_events" />
<label for="demo3TargetConsumeEventsInput" class="form-check-label">consume_events</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetMarketCreateInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="market_create" />
<label for="demo3TargetMarketCreateInput" class="form-check-label">market_create</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetOpenOrdersCreateInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="open_orders_create" />
<label for="demo3TargetOpenOrdersCreateInput" class="form-check-label">open_orders_create</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetOpenOrdersCloseInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="open_orders_close" />
<label for="demo3TargetOpenOrdersCloseInput" class="form-check-label">open_orders_close</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetCloseMarketInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="close_market" />
<label for="demo3TargetCloseMarketInput" class="form-check-label">close_market</label>
</div>
<div class="form-check form-check-inline">
<input id="demo3TargetUnknownNonSwapInput" class="form-check-input" type="checkbox" name="demo3TargetEventInput" value="unknown_non_swap" />
<label for="demo3TargetUnknownNonSwapInput" class="form-check-label">unknown_non_swap</label>
</div>
</div>
<div class="form-text">Leave all unchecked for generic discovery. Check several surfaces to scan once and keep candidates matching any selected target.</div>
<div class="form-text">Use this to find corpus signatures for non-swap decoders without promoting unverified events.</div>
<div class="form-text">Use this to find corpus signatures for non-swap decoders without promoting unverified events. Leave all unchecked to request target='any'.</div>
</div>
<div class="col-6">
<label for="demo3HttpRoleInput" class="form-label">HTTP role</label>

View File

@@ -0,0 +1,54 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
/**
* One upstream registry entry exposed through Demo3.
*/
export type Demo3UpstreamRegistryEntry = {
/**
* Repository name or bootstrap locator that produced the entry.
*/
sourceRepo: string | null,
/**
* Repository-relative path or bootstrap path that produced the entry.
*/
sourcePath: string | null,
/**
* Stable decoder code used by the registry.
*/
decoderCode: string,
/**
* Optional Solana program id when already known by the source entry.
*/
programId: string | null,
/**
* Program family used to group related programs.
*/
programFamily: string,
/**
* Surface kind such as AMM, CLMM, launch, aggregator or core Solana.
*/
surfaceKind: string,
/**
* Entry kind: instruction, event, account or program.
*/
entryKind: string,
/**
* Source-level entry name.
*/
entryName: string,
/**
* Optional discriminator bytes encoded as lowercase hexadecimal.
*/
discriminatorHex: string | null,
/**
* Optional discriminator byte length.
*/
discriminatorLen: number | null,
/**
* Current proof status.
*/
proofStatus: string,
/**
* Notes that preserve uncertainty and validation requirements.
*/
notes: string, };

View File

@@ -0,0 +1,15 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { Demo3UpstreamRegistryResult } from "./Demo3UpstreamRegistryResult";
/**
* Payload returned by the Demo3 upstream registry command.
*/
export type Demo3UpstreamRegistryPayload = {
/**
* Pretty JSON representation of the registry result.
*/
resultJson: string,
/**
* Structured registry result.
*/
result: Demo3UpstreamRegistryResult, };

View File

@@ -0,0 +1,21 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { Demo3UpstreamRegistryEntry } from "./Demo3UpstreamRegistryEntry";
import type { Demo3UpstreamRegistrySearchRequest } from "./Demo3UpstreamRegistrySearchRequest";
import type { Demo3UpstreamRegistrySummary } from "./Demo3UpstreamRegistrySummary";
/**
* Structured upstream registry result exposed through Demo3.
*/
export type Demo3UpstreamRegistryResult = {
/**
* Normalized request used by kb_lib.
*/
request: Demo3UpstreamRegistrySearchRequest,
/**
* Registry summary.
*/
summary: Demo3UpstreamRegistrySummary,
/**
* Matching entries.
*/
entries: Array<Demo3UpstreamRegistryEntry>, };

View File

@@ -0,0 +1,34 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
/**
* Search request for the static upstream registry exposed through Demo3.
*/
export type Demo3UpstreamRegistrySearchRequest = {
/**
* Optional decoder-code filter.
*/
decoderCode: string | null,
/**
* Optional program-id filter.
*/
programId: string | null,
/**
* Optional program-family filter.
*/
programFamily: string | null,
/**
* Optional surface-kind filter.
*/
surfaceKind: string | null,
/**
* Optional entry-kind filter.
*/
entryKind: string | null,
/**
* Optional proof-status filter.
*/
proofStatus: string | null,
/**
* Optional maximum number of entries to return.
*/
limit: number | null, };

View File

@@ -0,0 +1,58 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
/**
* Summary of the upstream registry snapshot exposed through Demo3.
*/
export type Demo3UpstreamRegistrySummary = {
/**
* Total static registry entry count before filtering.
*/
totalEntryCount: number,
/**
* Returned entry count after filtering.
*/
returnedEntryCount: number,
/**
* Number of entries that have a program id.
*/
entriesWithProgramIdCount: number,
/**
* Number of entries that have a discriminator.
*/
entriesWithDiscriminatorCount: number,
/**
* Number of program-level seed entries.
*/
programEntryCount: number,
/**
* Number of instruction entries.
*/
instructionEntryCount: number,
/**
* Number of event entries.
*/
eventEntryCount: number,
/**
* Number of account entries.
*/
accountEntryCount: number,
/**
* Number of entries still unverified from upstream Git or seed data.
*/
upstreamGitUnverifiedCount: number,
/**
* Number of entries mapped into decoders but not locally observed.
*/
upstreamGitMappedUnverifiedCount: number,
/**
* Number of entries observed in the local corpus.
*/
upstreamGitLocalCorpusObservedCount: number,
/**
* Number of entries materialized in local business tables.
*/
upstreamGitLocalCorpusMaterializedCount: number,
/**
* Number of layout entries still unverified locally.
*/
upstreamGitLayoutUnverifiedCount: number, };

View File

@@ -36,6 +36,22 @@ const presets: Demo3Preset[] = [
{ label: "Meteora DBC", dexCode: "meteora_dbc", programId: "dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN", description: "Meteora DBC." },
{ label: "Orca Whirlpools", dexCode: "orca_whirlpools", programId: "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", description: "Orca Whirlpools CLMM." },
{ label: "FluxBeam", dexCode: "fluxbeam", programId: "FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X", description: "FluxBeam." },
{ label: "GooseFX V1 (Vybe)", dexCode: "goosefx_v1", programId: "GAMMA7meSFWaBXF25oSUgmGRwaW6sCMFLmBNiMSdbHVT", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Obric V2 (Vybe)", dexCode: "obric_v2", programId: "obriQD1zbpyLz95G5n7nJe6a4DPjpFwa5XYPoNm113y", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Ondo Global Market (Vybe)", dexCode: "ondo_global_market", programId: "XzTT4XB8m7sLD2xi6snefSasaswsKCxx5Tifjondogm", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Scorch (Vybe)", dexCode: "scorch", programId: "SCoRcH8c2dpjvcJD6FiPbCSQyQgu3PcUAWj2Xxx3mqn", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "ZeroFi (Vybe)", dexCode: "zerofi", programId: "ZERor4xhbUycZ6gb9ntrhqscUcZmAbQDjEAtCf4hbZY", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Manifest CLOB (Vybe)", dexCode: "manifest_clob", programId: "MNFSTqtC93rEfYHB6hF82sKdZpUDFWkViLByLd1k1Ms", description: "Entrée Vybe orderbook; à vérifier par corpus local." },
{ label: "AlphaQ (Vybe)", dexCode: "alphaq", programId: "ALPHAQmeA7bjrVuccPsYPiCvsi428SNwte66Srvs4pHA", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Goonfi (Vybe)", dexCode: "goonfi", programId: "goonERTdGsjnkZqWuVjs73BZ3Pb9qoCUdBUL17BnS5j", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Goonfi V2 (Vybe)", dexCode: "goonfi_v2", programId: "goonuddtQRrWqqn5nFyczVKaie28f3kDkHWkHtURSLE", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Byreal (Vybe)", dexCode: "byreal", programId: "REALQqNEomY6cQGZJUGwywTBD2UmDT32rZcNnfxQ5N2", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "BisonFi (Vybe)", dexCode: "bisonfi", programId: "BiSoNHVpsVZW2F7rx2eQ59yQwKxzU5NvBcmKshCSUypi", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "FusionAMM (Vybe)", dexCode: "fusionamm", programId: "fUSioN9YKKSa3CUC2YUc4tPkHJ5Y6XW1yz8y6F7qWz9", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Woofi (Vybe)", dexCode: "woofi", programId: "WooFif76YGRNjk1pA8wCsN67aQsD9f9iLsz4NcJ1AVb", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Aquifer (Vybe)", dexCode: "aquifer", programId: "AQU1FRd7papthgdrwPTTq5JacJh8YtwEXaBfKU3bTz45", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "Humidifi (Vybe)", dexCode: "humidifi", programId: "9H6tua7jkLhdm3w8BvgpTn5LZNU7g4ZynDmCiNN3q6Rp", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "SolFi V2 (Vybe)", dexCode: "solfi_v2", programId: "SV2EYYJyRz2YhfXwXnhNAevDEui5Q6yrfyo13WtupPF", description: "Entrée Vybe; à vérifier par corpus local." },
{ label: "DexLab", dexCode: "dexlab", programId: "DSwpgjMvXhtGn6BsbqmacdBZyfLj6jSWf3HJpdJtmg6N", description: "DexLab Swap/Pool." },
{ label: "Aldrin (historical)", dexCode: "aldrin", programId: "AMM55ShdkoGRB5jVYPjWziwk8m5MpwyDgsMWHaMSQWH6", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Aldrin V2 (historical)", dexCode: "aldrin_v2", programId: "CURVGoZn8zycx6FXwwevgBTB2gVvdbGTEpvMJDbgs2t4", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
@@ -49,7 +65,6 @@ const presets: Demo3Preset[] = [
{ label: "Phoenix (historical)", dexCode: "phoenix", programId: "PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Saber (historical)", dexCode: "saber", programId: "SSwpkEEcbUqx4vtoEByFjSkhKdCT862DNVb52nZg1UZ", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "OpenBook V2 (historical)", dexCode: "openbook_v2", programId: "opnb2LAfJYbRMAHHvqjCwQxanZn7ReEHp1k81EohpZb", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "OpenBook (historical)", dexCode: "openbook", programId: "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Fox (historical)", dexCode: "fox", programId: "HyhpEq587ANShDdbx1mP4dTmDZC44CXWft29oYQXDb53", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Sanctum Infinity (historical)", dexCode: "sanctum_infinity", programId: "5ocnV1qiCgaQR8Jb8xWnVbApfaygJ8tNoZfgPwsgx9kx", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Saros (historical)", dexCode: "saros", programId: "SSwapUtytfBdBn1b9NUGG6foMVPtcWgpRU32HToDUZr", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
@@ -70,15 +85,8 @@ const presets: Demo3Preset[] = [
{ label: "Invariant (historical)", dexCode: "invariant", programId: "HyaB3W9q6XdA5xwpU4XnSZV94htfmbmqJXZcEbRaJutt", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Token Swap (historical)", dexCode: "token_swap", programId: "SwaPpA9LAaLfeLi3a68M4DjnLqgtticKg6CnyNwgAC8", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Helium Network (historical)", dexCode: "helium_network", programId: "treaf4wWBBty3fHdyBpo35Mz84M8k3heKXmjmi9vFt5", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Raydium Legacy V2 (historical)", dexCode: "raydium_legacy_v2", programId: "27haf8L6oxUeXrHrgEgsexjSY5hbVUWEmvv9Nyxg8vQv", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Raydium Legacy V3 (historical)", dexCode: "raydium_legacy_v3", programId: "7quYqsZdpWSZ3qgDextersDqoKjZy7aCgwHBBfRb7KPt", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Serum V3 (historical)", dexCode: "serum_v3", programId: "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Mango Private Pools (historical)", dexCode: "mango_private_pools", programId: "AtdP2iyfh6xBGwVZzHvY73E7uKKkZBTH2siHh3ZuEf1P", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Marinade Liquid Staking (historical)", dexCode: "marinade_liquid_staking", programId: "MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Step Finance Pools (historical)", dexCode: "step_finance_pools", programId: "StepAscQoEioFxxWGnh2sLBDFp9d8rvKz2Yp39iDpyT", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Francium Yield Pools (historical)", dexCode: "francium_yield_pools", programId: "FC81tbGt6JWRXidaWYFXxGnTk4VgobhJHATvTRVMqgWj", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Cropper Legacy (historical)", dexCode: "cropper_legacy", programId: "CyZuD7RPDcrqCGbNvzrNVs1zpCQehqp7SuXB7rdFKSzo", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Dexlab Beta (historical)", dexCode: "dexlab_beta", programId: "9qvG1zP8ZzY1sTnExx7mkyxhW1063YHVYZxMYz2HkM4m", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Marinade Governance (historical)", dexCode: "marinade_governance", programId: "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Serum DAO (historical)", dexCode: "serum_dao", programId: "SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Port Finance (historical)", dexCode: "port_finance", programId: "Port7uDYB3wk6GJAw4KT1WpTeMtSu9bTcChBHkX2LfR", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
@@ -88,10 +96,12 @@ const presets: Demo3Preset[] = [
{ label: "Raydium Staking Early (historical)", dexCode: "raydium_staking_early", programId: "EhhTKczWMGQt46ynNeRX1WfeagwwJd7ufHvCDjRxjo5Q", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Orca Aquafarm V1 (historical)", dexCode: "orca_aquafarm_v1", programId: "82yxjeMsvaURa4MbZZ7WZZHfobirZYkH1zF8fmeGtyaQ", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "Quarry Merge Mining (historical)", dexCode: "quarry_merge_mining", programId: "QMNeHCGYnLVDn1icRAfQZpjPLBNkfGbSKRB83G5d8KB", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "SWAB Finance Beta (historical)", dexCode: "swab_finance_beta", programId: "SWABxNGyxEBVoNRGn6RvYBt5UqercSE5PBHuJeYXYHq", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "CRAFT Early (historical)", dexCode: "craft_early", programId: "CrAFTUv7zKXBaS5471aBiARBu6x7nP4rDzr8xwBewbr1", description: "Program id historique importé depuis entities.py; à vérifier par corpus." },
{ label: "metaDAO", dexCode: "metadao", programId: "", description: "DEX à vérifier. Aucun program id n'est inventé." },
{ label: "Printr", dexCode: "printr", programId: "", description: "DEX à vérifier. Aucun program id n'est inventé." },
{ label: "Printr", dexCode: "printr", programId: "T8HsGYv7sMk3kTnyaRqZrbRPuntYzdh12evXBkprint", description: "Candidat Printr; à vérifier par corpus local." },
{ label: "metaDAO — umbrella (manual)", dexCode: "metadao", programId: "", description: "Umbrella MetaDAO. Choisir de préférence une surface spécifique ci-dessous." },
{ label: "metaDAO Launchpad v0.7.0", dexCode: "metadao_launchpad_v0_7_0", programId: "moontUzsdepotRGe5xsfip7vLPTJnVuafqdUWexVnPM", description: "Programme MetaDAO officiel candidat; à vérifier par corpus local." },
{ label: "metaDAO Bid Wall v0.7.0", dexCode: "metadao_bid_wall_v0_7_0", programId: "WALL8ucBuUyL46QYxwYJjidaFYhdvxUFrgvBxPshERx", description: "Programme MetaDAO officiel candidat; à vérifier par corpus local." },
{ label: "metaDAO Futarchy v0.6.0", dexCode: "metadao_futarchy_v0_6_0", programId: "FUTARELBfJfQ8RDGhg1wdhddq1odMAJUePHFuBYfUxKq", description: "Programme MetaDAO officiel candidat; à vérifier par corpus local." },
{ label: "metaDAO AMM v0.5.0", dexCode: "metadao_amm_v0_5_0", programId: "AMMJdEiCCa8mdugg6JPF7gFirmmxisTfDJoSNSUi5zDJ", description: "Programme MetaDAO officiel candidat; à vérifier par corpus local." },
];
let lastResultJson = "";
@@ -109,6 +119,16 @@ function valueOrNull(value: string): string | null {
return trimmed === "" ? null : trimmed;
}
function invalidBase58Characters(value: string): string[] {
const invalid = new Set<string>();
for (const character of value.trim()) {
if (!/^[1-9A-HJ-NP-Za-km-z]$/.test(character)) {
invalid.add(character);
}
}
return Array.from(invalid);
}
function isSolanaAddressLike(value: string): boolean {
const trimmed = value.trim();
if (trimmed.length < 32 || trimmed.length > 44) {
@@ -161,6 +181,10 @@ function validateOnchainRequest(request: Demo3OnchainDexDiscoveryRequest): void
validateOptionalSignature(request.beforeSignature, "Before signature");
validateOptionalSignature(request.untilSignature, "Until signature");
if (request.programId !== null && !isSolanaAddressLike(request.programId)) {
const invalidCharacters = invalidBase58Characters(request.programId);
if (invalidCharacters.length > 0) {
throw new Error(`Program id filter must be a valid Solana base58 program id. Invalid character(s): ${invalidCharacters.join(", ")}.`);
}
throw new Error("Program id filter must be a valid Solana program id, or empty when using a preset that resolves it.");
}
}