Skip to content

Commit 11a8fbc

Browse files
committed
Add HoudiniSwap prototype swap plugin
Prototype CEX swap plugin for HoudiniSwap built on the v2 partner API: resolve Edge assets to Houdini token ids via GET /tokens, fetch quotes, pick the best private route, and create the exchange. Credentials are wired through testconfig.json as { apiKey, apiSecret }. Includes a standalone acceptance harness that drives BTC->ETH and ETH->USDC quote plus order creation, caching every API response to disk so repeat runs replay from fixtures and stay inside the free-tier rate budget.
1 parent 2b84468 commit 11a8fbc

13 files changed

Lines changed: 859 additions & 0 deletions

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
- added: HoudiniSwap prototype swap plugin (private CEX routing) with a cached acceptance harness.
6+
57
## 2.46.0 (2026-04-18)
68

79
- changed: Migrate Thorchain swap endpoints off NineRealms (thornode, tx tracker, Midgard sync fallback).

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { makeChangeHeroPlugin } from './swap/central/changehero'
66
import { makeChangeNowPlugin } from './swap/central/changenow'
77
import { makeExolixPlugin } from './swap/central/exolix'
88
import { makeGodexPlugin } from './swap/central/godex'
9+
import { makeHoudiniPlugin } from './swap/central/houdini'
910
import { makeLetsExchangePlugin } from './swap/central/letsexchange'
1011
import { makeNexchangePlugin } from './swap/central/nexchange'
1112
import { makeSideshiftPlugin } from './swap/central/sideshift'
@@ -36,6 +37,7 @@ const plugins = {
3637
cosmosibc: makeCosmosIbcPlugin,
3738
exolix: makeExolixPlugin,
3839
godex: makeGodexPlugin,
40+
houdini: makeHoudiniPlugin,
3941
letsexchange: makeLetsExchangePlugin,
4042
lifi: makeLifiPlugin,
4143
nexchange: makeNexchangePlugin,

src/mappings/houdini.ts

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/**
2+
* Maps Edge `EdgeCurrencyPluginId` -> HoudiniSwap chain `shortName` (v2 `GET /chains`),
3+
* or `null` when Houdini has no compatible non-memo chain for that asset.
4+
*
5+
* Hand-authored for the HoudiniSwap prototype from the Phase 1 coverage matrix.
6+
* Memo-required chains (XRP/XLM/Cosmos-family) are intentionally `null` because the
7+
* prototype does not yet plumb a deposit memo / `destinationTag`.
8+
*/
9+
10+
import { EdgeCurrencyPluginId } from '../util/edgeCurrencyPluginIds'
11+
12+
export const houdini = new Map<EdgeCurrencyPluginId, string | null>()
13+
houdini.set('abstract', null)
14+
houdini.set('algorand', 'algorand')
15+
houdini.set('amoy', null)
16+
houdini.set('arbitrum', 'arbitrum')
17+
houdini.set('avalanche', 'avalanche')
18+
houdini.set('axelar', null)
19+
houdini.set('badcoin', null)
20+
houdini.set('base', 'base')
21+
houdini.set('binance', null)
22+
houdini.set('binancesmartchain', 'bsc')
23+
houdini.set('bitcoin', 'bitcoin')
24+
houdini.set('bitcoincash', 'bitcoincash')
25+
houdini.set('bitcoincashtestnet', null)
26+
houdini.set('bitcoingold', null)
27+
houdini.set('bitcoingoldtestnet', null)
28+
houdini.set('bitcoinsv', 'bsv')
29+
houdini.set('bitcointestnet', null)
30+
houdini.set('bitcointestnet4', null)
31+
houdini.set('bobevm', null)
32+
houdini.set('botanix', null)
33+
houdini.set('calibration', null)
34+
houdini.set('cardano', 'cardano')
35+
houdini.set('cardanotestnet', null)
36+
houdini.set('celo', 'celo')
37+
houdini.set('coreum', null)
38+
houdini.set('cosmoshub', null)
39+
houdini.set('dash', 'dash')
40+
houdini.set('digibyte', null)
41+
houdini.set('dogecoin', 'doge')
42+
houdini.set('eboost', null)
43+
houdini.set('ecash', 'eCash')
44+
houdini.set('eos', null)
45+
houdini.set('ethDev', null)
46+
houdini.set('ethereum', 'ethereum')
47+
houdini.set('ethereumclassic', null)
48+
houdini.set('ethereumpow', null)
49+
houdini.set('fantom', 'fantom')
50+
houdini.set('feathercoin', null)
51+
houdini.set('filecoin', null)
52+
houdini.set('filecoinfevm', null)
53+
houdini.set('filecoinfevmcalibration', null)
54+
houdini.set('fio', null)
55+
houdini.set('groestlcoin', null)
56+
houdini.set('hedera', null)
57+
houdini.set('holesky', null)
58+
houdini.set('hyperevm', 'hyperevm')
59+
houdini.set('liberland', null)
60+
houdini.set('liberlandtestnet', null)
61+
houdini.set('litecoin', 'litecoin')
62+
houdini.set('mayachain', null)
63+
houdini.set('monad', null)
64+
houdini.set('monero', 'monero')
65+
houdini.set('nym', null)
66+
houdini.set('opbnb', 'opbnb')
67+
houdini.set('optimism', 'optimism')
68+
houdini.set('osmosis', null)
69+
houdini.set('piratechain', null)
70+
houdini.set('pivx', 'pivx')
71+
houdini.set('polkadot', 'polkadot')
72+
houdini.set('polygon', 'polygon')
73+
houdini.set('pulsechain', 'pulsechain')
74+
houdini.set('qtum', null)
75+
houdini.set('ravencoin', null)
76+
houdini.set('ripple', null)
77+
houdini.set('rsk', 'rootstock')
78+
houdini.set('sepolia', null)
79+
houdini.set('smartcash', null)
80+
houdini.set('solana', 'solana')
81+
houdini.set('sonic', 'sonic')
82+
houdini.set('stellar', null)
83+
houdini.set('sui', 'sui')
84+
houdini.set('suitestnet', null)
85+
houdini.set('telos', 'telos')
86+
houdini.set('tezos', null)
87+
houdini.set('thorchainrune', null)
88+
houdini.set('thorchainrunestagenet', null)
89+
houdini.set('ton', null)
90+
houdini.set('tron', 'tron')
91+
houdini.set('ufo', null)
92+
houdini.set('vertcoin', null)
93+
houdini.set('wax', null)
94+
houdini.set('zano', null)
95+
houdini.set('zcash', 'Zcash')
96+
houdini.set('zcoin', null)
97+
houdini.set('zksync', 'zksync-era')

0 commit comments

Comments
 (0)