Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,15 @@

## Unreleased

- added: Robinhood Chain swaps via SideShift, LI.FI, Rango, ChangeNow, Swapuz and LetsExchange.
- added: `AGENTS.md` and `.cursor/BUGBOT.md`, recording the swap plugin conventions that recent provider reviews settled.
- added: A test suite for the swap plugin template, covering the max-quote probe, limit handling, the trust boundary on provider amounts, and memo cleaning. A new integration can copy it alongside the template.
- added: Swapter swap provider
- changed: The swap plugin template now models the max-quote probe, the trust boundary on provider-returned amounts, integer native-amount rounding, and funds-safe memo cleaning, so a new integration starts from them rather than rediscovering them in review.
- changed: `docs/CREATING_AN_EXCHANGE_PLUGIN.md` covers max quotes and amount rounding in depth, and ends with a pre-PR checklist drawn from findings on shipped integrations.
- changed: `docs/API_REQUIREMENTS.md` requires providers to document which address formats they accept per chain, to accept every encoding of a format they do support rather than string-matching what the caller sent, to match EVM contract addresses case-insensitively, to keep their asset list in agreement with what the order endpoint accepts, both in chain identifiers and in availability, and to give a rejected address and a retryable failure their own error codes.

## 2.53.0 (2026-08-18)

- added: Swapter swap provider

## 2.52.2 (2026-07-27)

- fixed: Maya swaps spending RUNE now send to Maya's inbound address instead of depositing into THORChain's own state machine, which misrouted the swap (THORChain read Maya's `=:d:` DASH memo as an unparseable DOGE swap and the deposit failed).
Expand Down
4 changes: 4 additions & 0 deletions scripts/mappings/changenowMappings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,10 @@ changenow.set('hkd', null)
// Display Name: hnl
changenow.set('hnl', null)

// Currency Count: 3
// Display Name: hood
changenow.set('hood', 'robinhood')

// Currency Count: 1
// Display Name: hrk
changenow.set('hrk', null)
Expand Down
3 changes: 3 additions & 0 deletions scripts/mappings/letsexchangeMappings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -991,6 +991,9 @@ letsexchange.set('REEF', null)
// Display Name: REI
letsexchange.set('REI', null)

// Display Name: ROBINHOOD
letsexchange.set('ROBINHOOD', 'robinhood')

// Display Name: ROCK
letsexchange.set('ROCK', null)

Expand Down
3 changes: 3 additions & 0 deletions scripts/mappings/lifiMappings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,9 @@ lifi.set('opb', 'opbnb')
// Display Name: Optimism
lifi.set('opt', 'optimism')

// Display Name: Robinhood Chain
lifi.set('out', 'robinhood')

// Display Name: Plasma
lifi.set('pla', null)

Expand Down
3 changes: 3 additions & 0 deletions scripts/mappings/rangoMappings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,9 @@ rango.set('POLYGONZK', null)
// Display Name: Regen Network
rango.set('REGEN', null)

// Display Name: Robinhood
rango.set('ROBINHOOD', 'robinhood')

// Display Name: Scroll
rango.set('SCROLL', null)

Expand Down
3 changes: 3 additions & 0 deletions scripts/mappings/sideshiftMappings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ sideshift.set('polygon', 'polygon')
// Display Name: ripple
sideshift.set('ripple', 'ripple')

// Display Name: robinhood
sideshift.set('robinhood', 'robinhood')

// Display Name: ronin
sideshift.set('ronin', null)

Expand Down
3 changes: 3 additions & 0 deletions scripts/mappings/swapuzMappings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,9 @@ swapuz.set('REDBELLY', null)
// Display Name: REEF
swapuz.set('REEF', null)

// Display Name: ROBINHOOD
swapuz.set('ROBINHOOD', 'robinhood')

// Display Name: RONIN
swapuz.set('RON', null)

Expand Down
1 change: 1 addition & 0 deletions src/mappings/changehero.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ changehero.set('pulsechain', null)
changehero.set('qtum', 'qtum')
changehero.set('ravencoin', null)
changehero.set('ripple', 'ripple')
changehero.set('robinhood', null)
changehero.set('rsk', null)
changehero.set('sepolia', null)
changehero.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/changelly.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ changelly.set('pulsechain', null)
changelly.set('qtum', 'qtum')
changelly.set('ravencoin', 'ravencoin')
changelly.set('ripple', 'ripple')
changelly.set('robinhood', null)
changelly.set('rsk', 'rootstock')
changelly.set('sepolia', null)
changelly.set('smartcash', 'smartcash')
Expand Down
1 change: 1 addition & 0 deletions src/mappings/changenow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ changenow.set('pulsechain', 'pulse')
changenow.set('qtum', 'qtum')
changenow.set('ravencoin', 'rvn')
changenow.set('ripple', 'xrp')
changenow.set('robinhood', 'hood')
changenow.set('rsk', null)
changenow.set('sepolia', null)
changenow.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/exolix.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ exolix.set('pulsechain', null)
exolix.set('qtum', 'QTUM')
exolix.set('ravencoin', 'RVN')
exolix.set('ripple', 'XRP')
exolix.set('robinhood', null)
exolix.set('rsk', null)
exolix.set('sepolia', null)
exolix.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/godex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ godex.set('pulsechain', null)
godex.set('qtum', 'QTUM')
godex.set('ravencoin', 'RVN')
godex.set('ripple', 'XRP')
godex.set('robinhood', null)
godex.set('rsk', 'RSK')
godex.set('sepolia', null)
godex.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/letsexchange.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ letsexchange.set('pulsechain', 'PLS')
letsexchange.set('qtum', 'QTUM')
letsexchange.set('ravencoin', 'RVN')
letsexchange.set('ripple', 'XRP')
letsexchange.set('robinhood', 'ROBINHOOD')
letsexchange.set('rsk', 'RSK')
letsexchange.set('sepolia', null)
letsexchange.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/lifi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ lifi.set('pulsechain', null)
lifi.set('qtum', null)
lifi.set('ravencoin', null)
lifi.set('ripple', null)
lifi.set('robinhood', 'out')
lifi.set('rsk', 'rsk')
lifi.set('sepolia', null)
lifi.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/mayaprotocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ mayaprotocol.set('pulsechain', null)
mayaprotocol.set('qtum', null)
mayaprotocol.set('ravencoin', null)
mayaprotocol.set('ripple', null)
mayaprotocol.set('robinhood', null)
mayaprotocol.set('rsk', null)
mayaprotocol.set('sepolia', null)
mayaprotocol.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/nexchange.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ nexchange.set('pulsechain', null)
nexchange.set('qtum', null)
nexchange.set('ravencoin', null)
nexchange.set('ripple', 'XRP')
nexchange.set('robinhood', null)
nexchange.set('rsk', null)
nexchange.set('sepolia', null)
nexchange.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/rango.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ rango.set('pulsechain', null)
rango.set('qtum', null)
rango.set('ravencoin', null)
rango.set('ripple', 'XRPL')
rango.set('robinhood', 'ROBINHOOD')
rango.set('rsk', null)
rango.set('sepolia', null)
rango.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/sideshift.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ sideshift.set('pulsechain', null)
sideshift.set('qtum', null)
sideshift.set('ravencoin', null)
sideshift.set('ripple', 'ripple')
sideshift.set('robinhood', 'robinhood')
sideshift.set('rsk', 'rootstock')
sideshift.set('sepolia', null)
sideshift.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/swapkit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ swapkit.set('pulsechain', null)
swapkit.set('qtum', null)
swapkit.set('ravencoin', null)
swapkit.set('ripple', null)
swapkit.set('robinhood', null)
swapkit.set('rsk', null)
swapkit.set('sepolia', null)
swapkit.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/swapuz.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ swapuz.set('pulsechain', null)
swapuz.set('qtum', 'QTUM')
swapuz.set('ravencoin', 'RAVENCOIN')
swapuz.set('ripple', 'XRP')
swapuz.set('robinhood', 'ROBINHOOD')
swapuz.set('rsk', null)
swapuz.set('sepolia', null)
swapuz.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/thorchain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ thorchain.set('pulsechain', null)
thorchain.set('qtum', null)
thorchain.set('ravencoin', null)
thorchain.set('ripple', 'XRP')
thorchain.set('robinhood', null)
thorchain.set('rsk', null)
thorchain.set('sepolia', null)
thorchain.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/mappings/xgram.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ xgram.set('pulsechain', null)
xgram.set('qtum', 'QTUM')
xgram.set('ravencoin', 'RVN')
xgram.set('ripple', 'XRP')
xgram.set('robinhood', null)
xgram.set('rsk', null)
xgram.set('sepolia', null)
xgram.set('smartcash', null)
Expand Down
1 change: 1 addition & 0 deletions src/util/edgeCurrencyPluginIds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ export const edgeCurrencyPluginIds = [
'qtum',
'ravencoin',
'ripple',
'robinhood',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Swapter omits robinhood mapping

Low Severity

Adding robinhood to the plugin-id list updated every generated map and the hand-maintained changelly and nexchange files, but src/mappings/swapter.ts still jumps from ripple to rsk. That full matrix is supposed to carry an explicit null for a checked-unsupported chain so a later maintainer can tell a deliberate skip from a missed one.

Fix in Cursor Fix in Web

Triggered by project rule: Bugbot Review Rules

Reviewed by Cursor Bugbot for commit 876a757. Configure here.

'rsk',
'sepolia',
'smartcash',
Expand Down
Loading