Skip to content

Add hosted STAMPYSWAP swap route#1095

Open
arwyn6969 wants to merge 9 commits into
stampchain-io:devfrom
arwyn6969:codex/swap-route-integration
Open

Add hosted STAMPYSWAP swap route#1095
arwyn6969 wants to merge 9 commits into
stampchain-io:devfrom
arwyn6969:codex/swap-route-integration

Conversation

@arwyn6969
Copy link
Copy Markdown
Collaborator

Summary

This PR adds Stampchain x STAMPYSWAP as a dedicated hosted route at /swap.
It integrates the full STAMPYSWAP trading experience into the Stampchain repo without rewriting the trading logic into Fresh components.

What This Includes

  • standalone /swap route served by the Stampchain app
  • co-branded hosted page shell
  • vendored STAMPYSWAP frontend bundle under static/swap-assets/
  • tool navigation entry linking to /swap
  • repo-local handoff note in docs/stampyswap-swap-route-handoff.md

What Was Intentionally Left Unchanged

  • no Counterparty protocol changes
  • no Stampchain API contract changes
  • no change to the existing STAMPYSWAP wallet model:
    • Leather direct signing
    • Xverse direct signing
    • watch-only + Freewallet QR signing

Manual Validation Required Before Deploy

  • Leather direct-sign flow
  • Xverse direct-sign flow
  • watch-only + QR flow
  • mainnet/testnet explorer behavior
  • mobile layout under real Stampchain site navigation

Notes

  • This is a thin-hosting integration for fast adoption.
  • The hosted route vendors the built STAMPYSWAP bundle instead of porting the app source into Fresh islands.
  • Follow-up work can port the feature deeper into the Stampchain design system once the hosted route is accepted and validated.

reinamora137 and others added 9 commits March 1, 2026 23:21
…, MySQL 8.4 prep

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1029)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Release: Stamping Tool improvements, Dropdown finetuning, BIP-322 & wallet fixes (#1036)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1030)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1029)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Dropdown finetuning (#1032)

* feat(form): move SearchInputField and SearchErrorDisplay components

- Moved SearchInputField and SearchErrorDisplay
- Updated form index to export new components for easier access.

This enhances the user experience in search functionalities across the application.

* refactor(card): update CSS classes for consistency

- Changed class from `pt-[100%]` to `aspect-square` in WalletStampCard and StampImage components to improve layout consistency and responsiveness.

* feat(form): add SearchErrorDisplay and SearchInputField components

- Introduced SearchErrorDisplay and SearchInputField components to the form module for enhanced search functionality.
- Updated the manifest to include these new components.
- Adjusted CSS to ensure proper styling for input fields when dropdowns are open.

* feat(stamp): enhance StampSendTool with dropdown functionality and animation

- Added dropdown state management and animation handling to the StampSendTool component.
- Introduced refs for dropdown animation cleanup and click-outside handling.
- Refactored state management for loading stamps and fee estimation.
- Improved user experience by ensuring dropdown closes with animation when clicking outside.

* fix(modal): update image class for consistent styling

- Changed image class from `object-cover` to `object-contain` with `pixelart` for better visual consistency in SearchSRC20Modal and SearchStampModal components.

* feat(gallery): add SVG content handling in Carousel component

- Implemented asynchronous fetching of SVG content to check for recursive external references.
- Updated state management to conditionally render SVGs as links with images if external references are found.
- Maintained default rendering for non-recursive SVGs and handled network errors gracefully.

* feat(stamp): enhance SVG handling in StampSendTool

- Added functionality to validate and render SVG images in the StampSendTool component.
- Implemented asynchronous fetching of SVG content, with error handling for network issues.
- Updated state management to conditionally display placeholders for unsupported or failed SVGs.
- Removed fallback icon logic in favor of improved SVG loading indicators.

* refactor(stamp): simplify initial stamp selection and improve user feedback

- Removed automatic selection of the first stamp when stamps are available.
- Enhanced user feedback by conditionally displaying messages based on wallet connection and stamp availability.
- Updated cursor styles for better interaction cues in the StampSendTool component.

* refactor(stamp): simplify stamp number prefix handling

- Changed the stampNumberPrefix from an object with exact and range properties to a simple string prefix.
- Updated query logic to perform a string prefix match for stamp searches, enhancing search functionality and simplifying the codebase.

* feat(stamp): enhance image handling in SearchStampModal and API

- Introduced a new StampResultImage component to manage image loading and error states, improving user experience in the SearchStampModal.
- Updated the search API to exclude SRC-101 entries, enhancing the filtering capabilities of the stamp search functionality.
- Added excludeSrc101 option in the StampRepository for better control over search results.

* Stamping Tool UI, UX & Robustness Improvements (#1035)

* feat(stamping): add recursive HTML preview functionality

- Introduced `createRecursiveHtmlPreviewUrl` to generate blob URLs for HTML files, allowing for proper rendering of recursive stamps with relative paths.
- Implemented state management for `htmlPreviewUrl` in `StampingToolMain`, ensuring previews are correctly revoked and updated based on file selection.
- Updated modal handling to support HTML previews, enhancing user experience when viewing recursive HTML stamps.

This feature improves the handling of HTML files in the stamping tool, ensuring that relative paths are resolved correctly during previews.

* import update

* fix(stamping): add overflow handling to image preview container

- Updated the `image-preview` div in `StampingToolMain` to include `overflow-hidden` class, ensuring that any overflowing content is properly hidden. This change enhances the visual presentation of the image preview, preventing layout issues during user interactions.

* feat(fee-calculator): add CPID display for stamp type

- Enhanced the `FeeCalculatorBase` component to conditionally display the CPID when the stamp type is selected. This addition improves user visibility of the CPID, providing clearer information during the fee calculation process.
- Updated the `ExtendedBaseFeeCalculatorProps` interface to include an optional `cpid` property, ensuring type safety and consistency across components.
- Modified the `StampingToolMain` to pass the `cpid` prop when available, integrating it seamlessly into the fee calculation workflow.

* feat(button): enhance ButtonProcessing component and integrate into FeeCalculatorBase

- Updated the ButtonProcessing component to display a loading spinner and "PROCESSING" text when the button is in a submitting state, improving user feedback during asynchronous operations.
- Integrated the ButtonProcessing component into FeeCalculatorBase, replacing the standard Button to provide a more informative user experience during form submissions.
- Added debug logging for service fee calculations to assist in troubleshooting and monitoring.

* feat(stamping): improve transaction broadcast feedback in StampingTool

- Updated the success toast message to indicate successful transaction broadcasting with a link to the transaction hash on a block explorer, enhancing user experience.
- Modified the warning toast message to clarify when a transaction is signed but the txid is not returned, guiding users to check their wallet history for confirmation.

* feat(toast): add body prop to ToastComponent and ToastProvider

- Introduced a new optional `body` prop in `ToastComponent` to allow for more flexible content display.
- Updated `ToastProvider` to support the new `body` prop when creating toast notifications.
- Modified type definitions for `BaseToast` and `ToastProviderProps` to include the `body` property, ensuring type safety.
- Enhanced the `showToast` function to accept and pass the `body` parameter, improving the toast notification functionality.

* feat(stamping): enhance form validation and reset functionality in StampingTool

- Added additional validation to ensure that the stamp name is required only when not using a Posh stamp.
- Introduced a resetForm function to clear all form fields and state, improving user experience by ensuring a clean slate after submissions.
- Updated the handleIsPoshStamp function to clear stamp name and error states when switching between Posh and Custom CPID options.
- Ensured the resetForm function is called after successful submissions to maintain consistent form state.

* feat(stamping): expand library file detection in StampCard and WalletStampCard

- Updated the library file detection logic to include support for JSON and text/json mime types in StampCard, WalletStampCard, and StampImage components.

* feat(stamping): update sorting logic in stamp search handler

- Added a new `sortColumn` property to the query options, setting it to "stamp" for consistent sorting.
- Modified the `sortBy` logic to dynamically determine the order based on the value of `num`, ensuring correct sorting for both negative and positive stamp values.

* feat(stamping): add error handling for unrenderable stamp content

- Implemented error handling in StampCard and WalletStampCard components to display a placeholder image when the stamp's image URL is missing or the mime type is unknown or unsupported.
- Enhanced SearchStampModal to include similar error handling for stamp previews, ensuring a consistent user experience across components when dealing with unrenderable content.

* feat(stamping): enhance unrenderable content handling in StampImage component

- Added logic to identify unrenderable stamp content based on mime type, including cases for unknown and octet-stream types.
- Updated the rendering logic to display an appropriate placeholder image when the stamp is unrenderable, improving user experience and consistency across components.

* fix(input-field): adjust error message styling and import order

- Updated the error message in InputField to use a smaller text size for better readability.
- Reordered the import statements for consistency, moving the type import to the correct position.

---------

Co-authored-by: Claude Code <claude@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: babalicious <142315627+babalicious-io@users.noreply.github.com>

* Release: GIF preview fix, OG image direct URLs, HTML stamp preview in galleries (#1042)

* test: add creator name keyboard & wallet profile unit tests (#1039)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1029)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Release: Stamping Tool improvements, Dropdown finetuning, BIP-322 & wallet fixes (#1036)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1030)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1029)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Dropdown finetuning (#1032)

* feat(form): move SearchInputField and SearchErrorDisplay components

- Moved SearchInputField and SearchErrorDisplay
- Updated form index to export new components for easier access.

This enhances the user experience in search functionalities across the application.

* refactor(card): update CSS classes for consistency

- Changed class from `pt-[100%]` to `aspect-square` in WalletStampCard and StampImage components to improve layout consistency and responsiveness.

* feat(form): add SearchErrorDisplay and SearchInputField components

- Introduced SearchErrorDisplay and SearchInputField components to the form module for enhanced search functionality.
- Updated the manifest to include these new components.
- Adjusted CSS to ensure proper styling for input fields when dropdowns are open.

* feat(stamp): enhance StampSendTool with dropdown functionality and animation

- Added dropdown state management and animation handling to the StampSendTool component.
- Introduced refs for dropdown animation cleanup and click-outside handling.
- Refactored state management for loading stamps and fee estimation.
- Improved user experience by ensuring dropdown closes with animation when clicking outside.

* fix(modal): update image class for consistent styling

- Changed image class from `object-cover` to `object-contain` with `pixelart` for better visual consistency in SearchSRC20Modal and SearchStampModal components.

* feat(gallery): add SVG content handling in Carousel component

- Implemented asynchronous fetching of SVG content to check for recursive external references.
- Updated state management to conditionally render SVGs as links with images if external references are found.
- Maintained default rendering for non-recursive SVGs and handled network errors gracefully.

* feat(stamp): enhance SVG handling in StampSendTool

- Added functionality to validate and render SVG images in the StampSendTool component.
- Implemented asynchronous fetching of SVG content, with error handling for network issues.
- Updated state management to conditionally display placeholders for unsupported or failed SVGs.
- Removed fallback icon logic in favor of improved SVG loading indicators.

* refactor(stamp): simplify initial stamp selection and improve user feedback

- Removed automatic selection of the first stamp when stamps are available.
- Enhanced user feedback by conditionally displaying messages based on wallet connection and stamp availability.
- Updated cursor styles for better interaction cues in the StampSendTool component.

* refactor(stamp): simplify stamp number prefix handling

- Changed the stampNumberPrefix from an object with exact and range properties to a simple string prefix.
- Updated query logic to perform a string prefix match for stamp searches, enhancing search functionality and simplifying the codebase.

* feat(stamp): enhance image handling in SearchStampModal and API

- Introduced a new StampResultImage component to manage image loading and error states, improving user experience in the SearchStampModal.
- Updated the search API to exclude SRC-101 entries, enhancing the filtering capabilities of the stamp search functionality.
- Added excludeSrc101 option in the StampRepository for better control over search results.

* Stamping Tool UI, UX & Robustness Improvements (#1035)

* feat(stamping): add recursive HTML preview functionality

- Introduced `createRecursiveHtmlPreviewUrl` to generate blob URLs for HTML files, allowing for proper rendering of recursive stamps with relative paths.
- Implemented state management for `htmlPreviewUrl` in `StampingToolMain`, ensuring previews are correctly revoked and updated based on file selection.
- Updated modal handling to support HTML previews, enhancing user experience when viewing recursive HTML stamps.

This feature improves the handling of HTML files in the stamping tool, ensuring that relative paths are resolved correctly during previews.

* import update

* fix(stamping): add overflow handling to image preview container

- Updated the `image-preview` div in `StampingToolMain` to include `overflow-hidden` class, ensuring that any overflowing content is properly hidden. This change enhances the visual presentation of the image preview, preventing layout issues during user interactions.

* feat(fee-calculator): add CPID display for stamp type

- Enhanced the `FeeCalculatorBase` component to conditionally display the CPID when the stamp type is selected. This addition improves user visibility of the CPID, providing clearer information during the fee calculation process.
- Updated the `ExtendedBaseFeeCalculatorProps` interface to include an optional `cpid` property, ensuring type safety and consistency across components.
- Modified the `StampingToolMain` to pass the `cpid` prop when available, integrating it seamlessly into the fee calculation workflow.

* feat(button): enhance ButtonProcessing component and integrate into FeeCalculatorBase

- Updated the ButtonProcessing component to display a loading spinner and "PROCESSING" text when the button is in a submitting state, improving user feedback during asynchronous operations.
- Integrated the ButtonProcessing component into FeeCalculatorBase, replacing the standard Button to provide a more informative user experience during form submissions.
- Added debug logging for service fee calculations to assist in troubleshooting and monitoring.

* feat(stamping): improve transaction broadcast feedback in StampingTool

- Updated the success toast message to indicate successful transaction broadcasting with a link to the transaction hash on a block explorer, enhancing user experience.
- Modified the warning toast message to clarify when a transaction is signed but the txid is not returned, guiding users to check their wallet history for confirmation.

* feat(toast): add body prop to ToastComponent and ToastProvider

- Introduced a new optional `body` prop in `ToastComponent` to allow for more flexible content display.
- Updated `ToastProvider` to support the new `body` prop when creating toast notifications.
- Modified type definitions for `BaseToast` and `ToastProviderProps` to include the `body` property, ensuring type safety.
- Enhanced the `showToast` function to accept and pass the `body` parameter, improving the toast notification functionality.

* feat(stamping): enhance form validation and reset functionality in StampingTool

- Added additional validation to ensure that the stamp name is required only when not using a Posh stamp.
- Introduced a resetForm function to clear all form fields and state, improving user experience by ensuring a clean slate after submissions.
- Updated the handleIsPoshStamp function to clear stamp name and error states when switching between Posh and Custom CPID options.
- Ensured the resetForm function is called after successful submissions to maintain consistent form state.

* feat(stamping): expand library file detection in StampCard and WalletStampCard

- Updated the library file detection logic to include support for JSON and text/json mime types in StampCard, WalletStampCard, and StampImage components.

* feat(stamping): update sorting logic in stamp search handler

- Added a new `sortColumn` property to the query options, setting it to "stamp" for consistent sorting.
- Modified the `sortBy` logic to dynamically determine the order based on the value of `num`, ensuring correct sorting for both negative and positive stamp values.

* feat(stamping): add error handling for unrenderable stamp content

- Implemented error handling in StampCard and WalletStampCard components to display a placeholder image when the stamp's image URL is missing or the mime type is unknown or unsupported.
- Enhanced SearchStampModal to include similar error handling for stamp previews, ensuring a consistent user experience across components when dealing with unrenderable content.

* feat(stamping): enhance unrenderable content handling in StampImage component

- Added logic to identify unrenderable stamp content based on mime type, including cases for unknown and octet-stream types.
- Updated the rendering logic to display an appropriate placeholder image when the stamp is unrenderable, improving user experience and consistency across components.

* fix(input-field): adjust error message styling and import order

- Updated the error message in InputField to use a smaller text size for better readability.
- Reordered the import statements for consistency, moving the type import to the correct position.

---------

Co-authored-by: Claude Code <claude@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: babalicious <142315627+babalicious-io@users.noreply.github.com>

* fix: GIF preview rendering + direct OG image URLs for social sharing

GIF stamps (52, 54, 60, 72, 83, 94) showed placeholder instead of actual
content because Image.decode() throws on animated GIFs and the Chrome
fallback sent raw URLs (grey background in default viewer).

Fix 1: Use ImageScript GIF.decode() to extract first frame for pixel-perfect
upscaling. Wrap Chrome fallback images in HTML for proper centering.

Fix 2: When S3 storage is active, og:image meta tags now point directly to
CloudFront URLs (200 PNG) instead of the preview endpoint (302 redirect
that some social media crawlers don't follow).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test: add creator name keyboard and wallet profile unit tests

Add two passing unit test files from creator name feature development:
- EditCreatorNameModal keyboard navigation & accessibility tests (92 steps)
- WalletProfileDetails component edit button integration tests

Remove 4 broken integration test files (bad mock setup, syntax errors)
and manual test plan doc (already tracked, belongs in docs/).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: babalicious <142315627+babalicious-io@users.noreply.github.com>

* fix: use preview PNG instead of iframe for HTML stamps in gallery views (#1040)

Replace iframe rendering with cached preview PNG images for HTML stamps
in Carousel (homepage) and WalletStampCard (wallet page) to match the
existing StampCard pattern. This prevents full HTML execution in grid
views and shows proper preview thumbnails instead.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: babalicious <142315627+babalicious-io@users.noreply.github.com>

* Release: recursive HTML stamp preview rendering fix (#1045)

fix: use URL mode for recursive HTML stamps in preview renderer (#1044)

HTML stamps containing iframes or external references (ordinals.com,
arweave.net, github.io) now render via URL mode instead of inline HTML
mode. When Chrome renders inline HTML (html: parameter), the page has
no origin, so cross-origin iframes are blocked. URL mode navigates
Chrome to the actual CDN URL, allowing iframes to load normally.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Release: LEO/SEO optimization + HTML stamp preview fixes (#1047)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1030)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1029)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Dropdown finetuning (#1032)

* feat(form): move SearchInputField and SearchErrorDisplay components

- Moved SearchInputField and SearchErrorDisplay
- Updated form index to export new components for easier access.

This enhances the user experience in search functionalities across the application.

* refactor(card): update CSS classes for consistency

- Changed class from `pt-[100%]` to `aspect-square` in WalletStampCard and StampImage components to improve layout consistency and responsiveness.

* feat(form): add SearchErrorDisplay and SearchInputField components

- Introduced SearchErrorDisplay and SearchInputField components to the form module for enhanced search functionality.
- Updated the manifest to include these new components.
- Adjusted CSS to ensure proper styling for input fields when dropdowns are open.

* feat(stamp): enhance StampSendTool with dropdown functionality and animation

- Added dropdown state management and animation handling to the StampSendTool component.
- Introduced refs for dropdown animation cleanup and click-outside handling.
- Refactored state management for loading stamps and fee estimation.
- Improved user experience by ensuring dropdown closes with animation when clicking outside.

* fix(modal): update image class for consistent styling

- Changed image class from `object-cover` to `object-contain` with `pixelart` for better visual consistency in SearchSRC20Modal and SearchStampModal components.

* feat(gallery): add SVG content handling in Carousel component

- Implemented asynchronous fetching of SVG content to check for recursive external references.
- Updated state management to conditionally render SVGs as links with images if external references are found.
- Maintained default rendering for non-recursive SVGs and handled network errors gracefully.

* feat(stamp): enhance SVG handling in StampSendTool

- Added functionality to validate and render SVG images in the StampSendTool component.
- Implemented asynchronous fetching of SVG content, with error handling for network issues.
- Updated state management to conditionally display placeholders for unsupported or failed SVGs.
- Removed fallback icon logic in favor of improved SVG loading indicators.

* refactor(stamp): simplify initial stamp selection and improve user feedback

- Removed automatic selection of the first stamp when stamps are available.
- Enhanced user feedback by conditionally displaying messages based on wallet connection and stamp availability.
- Updated cursor styles for better interaction cues in the StampSendTool component.

* refactor(stamp): simplify stamp number prefix handling

- Changed the stampNumberPrefix from an object with exact and range properties to a simple string prefix.
- Updated query logic to perform a string prefix match for stamp searches, enhancing search functionality and simplifying the codebase.

* feat(stamp): enhance image handling in SearchStampModal and API

- Introduced a new StampResultImage component to manage image loading and error states, improving user experience in the SearchStampModal.
- Updated the search API to exclude SRC-101 entries, enhancing the filtering capabilities of the stamp search functionality.
- Added excludeSrc101 option in the StampRepository for better control over search results.

* Stamping Tool UI, UX & Robustness Improvements (#1035)

* feat(stamping): add recursive HTML preview functionality

- Introduced `createRecursiveHtmlPreviewUrl` to generate blob URLs for HTML files, allowing for proper rendering of recursive stamps with relative paths.
- Implemented state management for `htmlPreviewUrl` in `StampingToolMain`, ensuring previews are correctly revoked and updated based on file selection.
- Updated modal handling to support HTML previews, enhancing user experience when viewing recursive HTML stamps.

This feature improves the handling of HTML files in the stamping tool, ensuring that relative paths are resolved correctly during previews.

* import update

* fix(stamping): add overflow handling to image preview container

- Updated the `image-preview` div in `StampingToolMain` to include `overflow-hidden` class, ensuring that any overflowing content is properly hidden. This change enhances the visual presentation of the image preview, preventing layout issues during user interactions.

* feat(fee-calculator): add CPID display for stamp type

- Enhanced the `FeeCalculatorBase` component to conditionally display the CPID when the stamp type is selected. This addition improves user visibility of the CPID, providing clearer information during the fee calculation process.
- Updated the `ExtendedBaseFeeCalculatorProps` interface to include an optional `cpid` property, ensuring type safety and consistency across components.
- Modified the `StampingToolMain` to pass the `cpid` prop when available, integrating it seamlessly into the fee calculation workflow.

* feat(button): enhance ButtonProcessing component and integrate into FeeCalculatorBase

- Updated the ButtonProcessing component to display a loading spinner and "PROCESSING" text when the button is in a submitting state, improving user feedback during asynchronous operations.
- Integrated the ButtonProcessing component into FeeCalculatorBase, replacing the standard Button to provide a more informative user experience during form submissions.
- Added debug logging for service fee calculations to assist in troubleshooting and monitoring.

* feat(stamping): improve transaction broadcast feedback in StampingTool

- Updated the success toast message to indicate successful transaction broadcasting with a link to the transaction hash on a block explorer, enhancing user experience.
- Modified the warning toast message to clarify when a transaction is signed but the txid is not returned, guiding users to check their wallet history for confirmation.

* feat(toast): add body prop to ToastComponent and ToastProvider

- Introduced a new optional `body` prop in `ToastComponent` to allow for more flexible content display.
- Updated `ToastProvider` to support the new `body` prop when creating toast notifications.
- Modified type definitions for `BaseToast` and `ToastProviderProps` to include the `body` property, ensuring type safety.
- Enhanced the `showToast` function to accept and pass the `body` parameter, improving the toast notification functionality.

* feat(stamping): enhance form validation and reset functionality in StampingTool

- Added additional validation to ensure that the stamp name is required only when not using a Posh stamp.
- Introduced a resetForm function to clear all form fields and state, improving user experience by ensuring a clean slate after submissions.
- Updated the handleIsPoshStamp function to clear stamp name and error states when switching between Posh and Custom CPID options.
- Ensured the resetForm function is called after successful submissions to maintain consistent form state.

* feat(stamping): expand library file detection in StampCard and WalletStampCard

- Updated the library file detection logic to include support for JSON and text/json mime types in StampCard, WalletStampCard, and StampImage components.

* feat(stamping): update sorting logic in stamp search handler

- Added a new `sortColumn` property to the query options, setting it to "stamp" for consistent sorting.
- Modified the `sortBy` logic to dynamically determine the order based on the value of `num`, ensuring correct sorting for both negative and positive stamp values.

* feat(stamping): add error handling for unrenderable stamp content

- Implemented error handling in StampCard and WalletStampCard components to display a placeholder image when the stamp's image URL is missing or the mime type is unknown or unsupported.
- Enhanced SearchStampModal to include similar error handling for stamp previews, ensuring a consistent user experience across components when dealing with unrenderable content.

* feat(stamping): enhance unrenderable content handling in StampImage component

- Added logic to identify unrenderable stamp content based on mime type, including cases for unknown and octet-stream types.
- Updated the rendering logic to display an appropriate placeholder image when the stamp is unrenderable, improving user experience and consistency across components.

* fix(input-field): adjust error message styling and import order

- Updated the error message in InputField to use a smaller text size for better readability.
- Reordered the import statements for consistency, moving the type import to the correct position.

---------

Co-authored-by: Claude Code <claude@anthropic.com>

* chore: sync dev with main post-release #1036 (#1037)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1029)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Release: Stamping Tool improvements, Dropdown finetuning, BIP-322 & wallet fixes (#1036)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1030)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1029)

* fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* chore: sync dev with main (#1027)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1026)

fix(wallet): fix Leather signMessage and remove duplicate CI triggers (#1025)

fix(wallet): fix Leather signMessage response extraction and remove duplicate CI triggers

Leather wallet wraps signMessage response in {result: {signature: ...}} but
the extraction was reading from top level, causing undefined signature to be
sent to the API. Also adds client-side signature validation in the modal.

Removes push triggers from 6 quality check workflows that duplicated
pull_request checks (api-schema-validation, type-check, newman, validate-imports,
lighthouse-ci, schema-validation). PRs are required to both dev and main anyway.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(auth): support BIP-322 signature verification for modern wallets (#1028)

Leather wallet returns BIP-322 format signatures for p2wpkh addresses,
which are longer than the 65-byte legacy format that bitcoinjs-message
expects. Added bip322-js as fallback verifier — tries legacy first,
then BIP-322. Also adds checkSegwitAlways flag for segwit addresses.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* Dropdown finetuning (#1032)

* feat(form): move SearchInputField and SearchErrorDisplay components

- Moved SearchInputField and SearchErrorDisplay
- Updated form index to export new components for easier access.

This enhances the user experience in search functionalities across the application.

* refactor(card): update CSS classes for consistency

- Changed class from `pt-[100%]` to `aspect-square` in WalletStampCard and StampImage components to improve layout consistency and responsiveness.

* feat(form): add SearchErrorDisplay and SearchInputField components

- Introduced SearchErrorDisplay and SearchInputField components to the form module for enhanced search functionality.
- Updated the manifest to include these new components.
- Adjusted CSS to ensure proper styling for input fields when dropdowns are open.

* feat(stamp): enhance StampSendTool with dropdown functionality and animation

- Added dropdown state management and animation handling to the StampSendTool component.
- Introduced refs for dropdown animation cleanup and click-outside handling.
- Refactored state management for loading stamps and fee estimation.
- Improved user experience by ensuring dropdown closes with animation when clicking outside.

* fix(modal): update image class for consistent styling

- Changed image class from `object-cover` to `object-contain` with `pixelart` for better visual consistency in SearchSRC20Modal and SearchStampModal components.

* feat(gallery): add SVG content handling in Carousel component

- Implemented asynchronous fetching of SVG content to check for recursive external references.
- Updated state management to conditionally render SVGs as links with images if external references are found.
- Maintained default rendering for non-recursive SVGs and handled network errors gracefully.

* feat(stamp): enhance SVG handling in StampSendTool

- Added functionality to validate and render SVG images in the StampSendTool component.
- Implemented asynchronous fetching of SVG content, with error handling for network issues.
- Updated state management to conditionally display placeholders for unsupported or failed SVGs.
- Removed fallback icon logic in favor of improved SVG loading indicators.

* refactor(stamp): simplify initial stamp selection and improve user feedback

- Removed automatic selection of the first stamp when stamps are available.
- Enhanced user feedback by conditionally displaying messages based on wallet connection and stamp availability.
- Updated cursor styles for better interaction cues in the StampSendTool component.

* refactor(stamp): simplify stamp number prefix handling

- Changed the stampNumberPrefix from an object with exact and range properties to a simple string prefix.
- Updated query logic to perform a string prefix match for stamp searches, enhancing search functionality and simplifying the codebase.

* feat(stamp): enhance image handling in SearchStampModal and API

- Introduced a new StampResultImage component to manage image loading and error states, improving user experience in the SearchStampModal.
- Updated the search API to exclude SRC-101 entries, enhancing the filtering capabilities of the stamp search functionality.
- Added excludeSrc101 option in the StampRepository for better control over search results.

* Stamping Tool UI, UX & Robustness Improvements (#1035)

* feat(stamping): add recursive HTML preview functionality

- Introduced `createRecursiveHtmlPreviewUrl` to generate blob URLs for HTML files, allowing for proper rendering of recursive stamps with relative paths.
- Implemented state management for `htmlPreviewUrl` in `StampingToolMain`, ensuring previews are correctly revoked and updated based on file selection.
- Updated modal handling to support HTML previews, enhancing user experience when viewing recursive HTML stamps.

This feature improves the handling of HTML files in the stamping tool, ensuring that relative paths are resolved correctly during previews.

* import update

* fix(stamping): add overflow handling to image preview container

- Updated the `image-preview` div in `StampingToolMain` to include `overflow-hidden` class, ensuring that any overflowing content is properly hidden. This change enhances the visual presentation of the image preview, preventing layout issues during user interactions.

* feat(fee-calculator): add CPID display for stamp type

- Enhanced the `FeeCalculatorBase` component to conditionally display the CPID when the stamp type is selected. This addition improves user visibility of the CPID, providing clearer information during the fee calculation process.
- Updated the `ExtendedBaseFeeCalculatorProps` interface to include an optional `cpid` property, ensuring type safety and consistency across components.
- Modified the `StampingToolMain` to pass the `cpid` prop when available, integrating it seamlessly into the fee calculation workflow.

* feat(button): enhance ButtonProcessing component and integrate into FeeCalculatorBase

- Updated the ButtonProcessing component to display a loading spinner and "PROCESSING" text when the button is in a submitting state, improving user feedback during asynchronous operations.
- Integrated the ButtonProcessing component into FeeCalculatorBase, replacing the standard Button to provide a more informative user experience during form submissions.
- Added debug logging for service fee calculations to assist in troubleshooting and monitoring.…
…tampchain-io#1077)

* fix: use tiered-timeout in CF Worker for reliable HTML stamp rendering

Stamps using Append framework or complex recursive loading keep network
connections alive indefinitely, causing networkidle2 to hang until the
45s timeout. This made ~6% of HTML stamps fail to render.

Strategy: try networkidle2 with 20s timeout first. If it times out,
the page content is already loaded — wait 12s more for rendering to
complete, then screenshot anyway. Tracks fallback usage via
X-Tiered-Fallback response header.

Results: 5 of 6 previously-failing stamps now render successfully.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: skip URL retry when time budget insufficient for preview rendering

Stamps with complex CSS animations (like embedded WOFF fonts + 3D
transforms) can exhaust 28s on the inline render attempt. If less than
15s remain before the 55s handler timeout, skip the URL-mode retry
instead of attempting a 37s render that would inevitably time out.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: apply tiered timeout to inline HTML mode and increase fetch timeout

The CF Worker's inline HTML mode (page.setContent) was timing out at
25s with networkidle0 for stamps with CSS animations and embedded fonts.
Now uses same tiered approach: try networkidle0 at 15s, on timeout wait
8s more and screenshot anyway.

Also increases the ECS handler's fetch timeout for inline renders from
30s to 40s to accommodate the tiered fallback timing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
)

- Replace regional us-east-1 RDS cert with full global CA bundle
  (supports all AWS regions, future-proof for cross-region failover)
- Add TLS env vars to .env.sample with documentation comments
- Add TLS/SSL section to database-connection-variables.md with table
  documenting DB_ENABLE_TLS and DB_CA_CERT_PATH variables
- Replace silent catch in databaseManager.ts with console.warn that
  explains the MySQL 8.4 auth failure and provides the fix command

Infrastructure changes (RDS, proxy, firewall) already completed
separately. This commit ensures developers get TLS working on
git clone with zero extra steps.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: animated GIF preview foundations — detection, multi-frame, S3 format

Three independent subtasks for task 22 (Animated GIF Previews):

1. Animation detection heuristic (22.1): `detectAnimation()` function
   identifies HTML stamps with meaningful CSS/JS animation (keyframes,
   requestAnimationFrame, canvas drawing, Web Animations API). Gates
   GIF generation to avoid wasting resources on static HTML.

2. CF Worker multi-frame capture (22.2): new `frames` and `frameInterval`
   parameters. When frames > 1, captures N screenshots at 400x400
   resolution and returns JSON array of base64 PNGs. Single-frame path
   (frames=1, default) remains completely unchanged.

3. S3 storage format support (22.3): added `PreviewFormat` type and
   `format` parameter to getS3Key, previewExists, uploadPreview, and
   getPreviewUrl. Defaults to "png" for full backward compatibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: GIF preview pipeline — format routing, assembly, and S3 caching

Subtask 22.4: Complete animated GIF generation pipeline integrated into
the preview endpoint.

- Format parameter: ?format=gif|png routes to GIF or PNG handler
- GIF handler timeout: 120s (vs 55s for PNG) — GIF is opt-in, expected slow
- handleS3GifPreview(): S3 cache check → animation detection → CF Worker
  multi-frame capture → ImageScript GIF assembly → S3 upload → redirect
- renderMultiFrameWithCloudflare(): dedicated function for multi-frame
  requests (90s timeout, no retries — best effort)
- Graceful fallback: any GIF failure redirects to existing PNG preview
- X-Gif-Skipped header reports why GIF was skipped (not-html, not-animated,
  capture-failed, error) for diagnostics

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: route GIF requests to S3 handler regardless of PREVIEW_STORAGE mode

GIF generation always uses S3 storage (GIFs are too large for Redis
caching). The format=gif path now bypasses the useS3Storage check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: reduce GIF frame count and delay to fit ALB 60s idle timeout

First-time GIF generation must complete within ALB's 60s idle timeout.
Reduced from 20 frames/5s delay to 10 frames/3s delay (still captures
2s of animation at 5fps). Handler timeout reduced from 120s to 58s.
Once generated, GIF is cached in S3 and served instantly via CloudFront.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: GIF handler uses HTML mode for inline stamps, URL mode for recursive

Inline HTML stamps (non-recursive, like stamp 798710) need HTML mode
rendering (page.setContent) not URL mode (page.goto). This mirrors
the same logic used in the PNG path's renderHtmlPreview().

Also allows non-animated recursive stamps to be skipped correctly —
animation detection checks the raw HTML, which for recursive stamps
is typically just a <script> loader with no animation patterns.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: add granular error reporting to GIF assembly and S3 upload steps

X-Gif-Skipped header now reports specific failure step:
- assembly-error: ImageScript decode/encode failed
- upload-error: S3 PutObject failed
- error: other unexpected failure
Each includes truncated error message for remote diagnostics.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: strip trailing slash from S3 image dir to prevent double-slash keys

AWS_S3_IMAGE_DIR defaults to "stamps/" (with trailing slash). This
produced S3 keys like "stamps//previews/123.gif" which didn't match
the IAM policy resource "stamps/previews/*", causing Access Denied.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat: configure S3 as default preview storage with correct bucket name

- .env.sample: add AWS_S3_BUCKETNAME, AWS_S3_IMAGE_DIR, PREVIEW_STORAGE,
  CLOUDFRONT_PREVIEW_DOMAIN with documented values
- production.json: fix placeholder bucket name to "stampchain.io",
  remove trailing slash from image dir

Previews are stored at s3://stampchain.io/stamps/previews/{stamp}.png|gif
alongside the original stamp files at s3://stampchain.io/stamps/*.
CloudFront serves both from the same domain.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…nd MySQL TLS (stampchain-io#1087)

* fix(ci): resolve 27 Newman assertion failures and daily regression crash

- Newman tests: Add 403-tolerant pattern to 12 Dev recent-sales tests in
  comprehensive.json and 6 tests in regression-v23.json. The internal
  stamp-recent-sales endpoint requires browser Origin headers which
  Newman cannot provide, so 403 is expected in CI alongside 200.
- Daily regression: Remove npm cache requirement and change npm ci to
  npm install since package-lock.json is gitignored (Deno Fresh project).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(ci): disable TLS for CI Docker MySQL connections

The MySQL 8.4 TLS change (PR stampchain-io#1065) added RDS CA cert verification to
all DB connections. In CI, the Docker MySQL uses a self-signed cert that
doesn't match the RDS CA, causing TLS handshake failure → 5s timeout →
500 on all endpoints. Set DB_ENABLE_TLS=false in all CI workflows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ain-io#1089)

fix(ci): exclude encrypted .env.enc from security validation check

The security validation step rejects any .env* files in the repo, but
.env.enc is an encrypted backup that's intentionally tracked. Add
-not -name "*.enc" to the find exclusion list.

Co-authored-by: Claude Code <claude@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…nifest

- robots.txt: explicit Allow rules with 2s crawl-delay for 30+ AI
  crawlers (GPTBot, ClaudeBot, GrokBot, PerplexityBot, etc.)
- MetaTags: JSON-LD WebSite and Organization structured data for
  enhanced search engine and AI discovery
- .well-known/ai-plugin.json: OpenAI-style plugin manifest pointing
  to stampchain.io API docs for LLM tool discovery

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@reinamora137 reinamora137 force-pushed the dev branch 2 times, most recently from 87471f8 to 64434b7 Compare April 29, 2026 03:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants