Release notes

Protocol v1.8.3

Haystack Launch: bonding lists, token launch, and curve buys

Date: 5 October 2026

Protocol 1.8.3. Agents can list Haystack tokens still on the bonding curve, read one token for free, launch a token, and buy a token that has not graduated. Haystack Launch is not a yield opportunity and does not appear on positions while the token is bonding. Canix still never holds keys or submits transactions.

What shipped

Bonding list and one-token status

GET /protocols/haystack/launches is paid. It returns HayLaunch tokens with bondingOn = 0 inside a launch-date window. The default window is the last 60 days when launchedAfter is omitted. launchedBefore defaults to now.

Filters:

GET /protocols/haystack/launches/:tokenNum is free. It returns one token box: phase, progress, price, reserves, and pool ids after graduation. ?assetId= wins once the asset map exists (after the first buy). Optional ?address= adds that wallet’s virtual userHoldings. A graduated token points at POST /swaps/quote instead of the bonding buy.

Source of truth is HayLaunch app 3452678093 boxes plus indexer launch transactions. api.hay.app is not used.

Launch a token

POST /execution/quotes with mainnet:haystack:v1:launch:token.

Required input: userAddress, symbol (≤8 bytes), name (≤32), assetUrl (ipfs:// or https://, ≤96), bondingTokenId. Pass an existing image URL. Canix does not pin, resize, or generate art. http:// is rejected.

Optional: description (≤1024), socialWebsite (≤256), socialX, socialTelegram, and socialDiscord (≤64 each). targetBondingUsd 0 uses the contract minimum (currently $2,500 micro-USD). A custom target cannot go below that minimum or above $500,000. priceMultiplier 0 is 20x; otherwise 5x–250x, scaled by 1e9.

bondingTokenId 0 is ALGO. Any other id is accepted only when the app’s isBondingTokenSupported simulates true. The launched ASA is always 6 decimals. Decimals, total supply, and manager addresses are not caller inputs. The wallet is not opted into the new ASA. The ASA stays in the contract until claim after graduation, and this release does not compile that claim.

Optional initialBuyAmount is a first buy in the bonding asset. A first buy that would finish the curve is refused.

The unsigned group is a bonding-asset opt-in when needed, two gas() calls, the MBR payment, an optional first-buy payment, then launchToken, launchTokenThenBuyWithAlgo, or launchTokenThenBuy. The two gas calls carry distinct notes so they do not share a transaction id.

See protocol/docs/execution-shapes/haystack-launch-token.md.

Buy a token still bonding

POST /execution/quotes with mainnet:haystack:v1:buy:bonding. This is the execution-quote price, not the swap SKU (POST /swaps/transactions).

Pass tokenNum, or assetId after the first buy. fromAssetId 0 is ALGO. amount is base units of that asset. slippageBps is 0–10000.

A direct buy pays in the token’s bonding asset: opt-in when required, mbrToBuy, the payment, then buyWithLimit or buyWithAlgoWithLimit. A direct buy may be the one that graduates the token into its Pact pool.

Any other fromAssetId is quoted through the Haystack router, fixed-input into the bonding asset. A routed buy that would take 90% or more of the remaining real token reserves is refused. Pay in the bonding asset for that completing buy.

The bought balance is virtual (userHoldings) until claim. The shape does not opt the wallet into the launched ASA. Sell on the curve, claim after graduation, creator pool-fee claim, and metadata edits are out of scope.

See protocol/docs/execution-shapes/haystack-buy-bonding.md.

Agents

MCP tools canix_list_haystack_launches and canix_get_haystack_launch sit with the other Canix tools. Launch and buy compile through canix_get_execution_quote. A bonding buy is not canix_swap. The locked WebMCP tool set does not add the two list and status tools. WebMCP can still compile the launch and buy shapes through the execution-quote tool.

OpenAPI, discovery, examples, and llms.txt describe the same routes and shape keys.

A mainnet simulate of the launch group is npm run test:haystack-launch-simulate in protocol. It builds the real unsigned group and asks algod to simulate it. It does not sign or submit, so it does not create an ASA. Default npm test does not run it.

Pricing

One new SKU, for the bonding list. Launch and buy reuse the execution-quote price. Merchant rail remains Algorand USDC, with optional Base USDC at the same price when X402_PAY_TO_BASE is set.

StepRoute / toolPrice
Bonding listGET /protocols/haystack/launches / canix_list_haystack_launches0.01 USDC (X402_PRICE_HAYSTACK_LAUNCHES_USDC)
One tokenGET /protocols/haystack/launches/:tokenNum / canix_get_haystack_launchFree
Launch or bonding buyPOST /execution/quotes / canix_get_execution_quote0.10 USDC flat per request

Put X402_PRICE_HAYSTACK_LAUNCHES_USDC=0.01 on the API process so discovery matches the edge. HAYSTACK_API_KEY is not required for these reads.

The public Caddyfile does not proxy the two new routes yet. Unmatched paths 404 at the gateway. POST /execution/quotes is already on the paid path, so launch and buy quotes work at the edge once the API is deployed. The list and status handles still need to be added before those curls succeed on the public gateway.

Agent loop

  1. GET /protocols/haystack/launches / canix_list_haystack_launches. Filter by name, bonding percent, and launch date. The default window is the last 60 days.
  2. GET /protocols/haystack/launches/:tokenNum / canix_get_haystack_launch for one token. Graduated tokens use POST /swaps/quote.
  3. To launch, POST /execution/quotes with mainnet:haystack:v1:launch:token. Pass an existing ipfs:// or https:// assetUrl. bondingTokenId 0 is ALGO.
  4. To buy while bonding, POST /execution/quotes with mainnet:haystack:v1:buy:bonding. A bonding buy is not canix_swap.
  5. Sign the unsigned group locally and submit locally. Canix never holds keys and does not broadcast.
  6. Pay the x402 access charge on Algorand or Base. Paying for a quote does not execute the quote.