@switch-win/sdk 1.2.6 → 1.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LIMIT-ORDERS.md +37 -13
- package/README.md +36 -16
- package/ROBINHOOD.md +44 -33
- package/abi/SwitchLimitOrderABI.json +1 -1
- package/abi/SwitchRouterABI.json +1 -1
- package/package.json +1 -1
- package/src/constants.ts +158 -40
- package/src/index.ts +23 -4
- package/src/networks/robinhood.ts +11 -5
package/LIMIT-ORDERS.md
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
| API network | Chain ID | Native currency | Current limit-order contract | Native flow contract |
|
|
8
8
|
|---|---:|---|---|---|
|
|
9
|
-
| `pulsechain` | 369 | PLS | `
|
|
10
|
-
| `robinhood` | 4663 | ETH | `
|
|
9
|
+
| `pulsechain` | 369 | PLS | `0x2afBf0aB8d958a0227742F7a8BdA00c96372E4D7` | `0x0362177FF2ad25a33a879c881a5055575C63a4cE` |
|
|
10
|
+
| `robinhood` | 4663 | ETH | `0x1E05115387f314398bbb1A808B25308E71150396` | `0x8170a3B0e2FD2e4333E0Ca9c9414B2D3dd6aF689` |
|
|
11
11
|
|
|
12
12
|
Pass `network: "pulsechain"` or `network: "robinhood"` to every SDK API
|
|
13
13
|
helper. Call `fetchLimitOrderConfig({ network })` at startup and treat its
|
|
@@ -242,7 +242,9 @@ native-currency neutral:
|
|
|
242
242
|
- **No approval needed** — users send the native currency directly to the contract
|
|
243
243
|
- **No EIP-712 signature** — the contract creates the order on-chain immediately
|
|
244
244
|
- **Single transaction** — wrap + approve + place order all in one tx
|
|
245
|
-
- **Fully indexed** — the backend discovers orders via `PLSOrderCreated` events
|
|
245
|
+
- **Fully indexed** — the backend discovers orders via `PLSOrderCreated` events
|
|
246
|
+
- **Drain-mode capable** — maintainers can disable new native deposits without
|
|
247
|
+
blocking fills or cancellations of existing orders
|
|
246
248
|
|
|
247
249
|
### Native-flow contract address
|
|
248
250
|
|
|
@@ -250,7 +252,7 @@ native-currency neutral:
|
|
|
250
252
|
import { getNativeFlowAddress, PLS_FLOW_ABI } from "@switch-win/sdk";
|
|
251
253
|
|
|
252
254
|
const robinhoodNativeFlow = getNativeFlowAddress("robinhood");
|
|
253
|
-
// "
|
|
255
|
+
// "0x8170a3B0e2FD2e4333E0Ca9c9414B2D3dd6aF689"
|
|
254
256
|
```
|
|
255
257
|
|
|
256
258
|
### Creating a native ETH limit order on Robinhood
|
|
@@ -381,7 +383,23 @@ When `feeOnOutput=false`, the LO contract pulls all tokens to itself first — o
|
|
|
381
383
|
|
|
382
384
|
When `feeOnOutput=true`, the Router pulls tokens directly from the maker. If an operator also tries to take excess input via the LO contract, that requires a second approval the maker typically hasn't granted — the transaction would simply revert. The operator loses gas; the maker loses nothing and the order remains active for another operator. In practice, operators use output-side profit for `feeOnOutput=true` orders.
|
|
383
385
|
|
|
384
|
-
> **Impact on fillability:** `feeOnOutput=true` orders are still fully fillable, but operators have less flexibility. In tight-margin or low-liquidity situations, this *could* reduce the likelihood of a fill since operators cannot optimize their profit-taking strategy on both sides.
|
|
386
|
+
> **Impact on fillability:** `feeOnOutput=true` orders are still fully fillable, but operators have less flexibility. In tight-margin or low-liquidity situations, this *could* reduce the likelihood of a fill since operators cannot optimize their profit-taking strategy on both sides.
|
|
387
|
+
|
|
388
|
+
### Protected settlement
|
|
389
|
+
|
|
390
|
+
The current PulseChain and Robinhood deployments charge a 30 bps (0.30%)
|
|
391
|
+
limit-order fee. They are exempt from the Router's separate 10 bps regular-swap
|
|
392
|
+
fee, so the two fees are not stacked.
|
|
393
|
+
|
|
394
|
+
For routed fills, operator-retained surplus is capped at 5%. Input-side profit
|
|
395
|
+
is capped at 5% of executable input; output-side profit is capped at 5% of the
|
|
396
|
+
signed `minAmountOut`. Any additional routing improvement is returned to the
|
|
397
|
+
maker.
|
|
398
|
+
|
|
399
|
+
Direct fills are protected by the configured `directFillQuoter`. The maker must
|
|
400
|
+
receive at least the greater of the signed `minAmountOut` and 95% of the best
|
|
401
|
+
current direct-adapter quote. A missing or zero protected quote fails closed,
|
|
402
|
+
and any post-fee output sent above the protected floor belongs to the maker.
|
|
385
403
|
|
|
386
404
|
### Tax token decision guide
|
|
387
405
|
|
|
@@ -705,11 +723,12 @@ The EIP-712 domain and types must match the on-chain contract exactly:
|
|
|
705
723
|
{ name: "minAmountOut", type: "uint256" },
|
|
706
724
|
{ name: "deadline", type: "uint256" },
|
|
707
725
|
{ name: "nonce", type: "uint256" },
|
|
708
|
-
{ name: "feeOnOutput", type: "bool" },
|
|
709
|
-
{ name: "recipient", type: "address" },
|
|
710
|
-
{ name: "unwrapOutput", type: "bool" },
|
|
711
|
-
|
|
712
|
-
|
|
726
|
+
{ name: "feeOnOutput", type: "bool" },
|
|
727
|
+
{ name: "recipient", type: "address" },
|
|
728
|
+
{ name: "unwrapOutput", type: "bool" },
|
|
729
|
+
{ name: "partnerAddress", type: "address" },
|
|
730
|
+
]
|
|
731
|
+
}
|
|
713
732
|
```
|
|
714
733
|
|
|
715
734
|
These are exported as `LIMIT_ORDER_EIP712_DOMAIN` and `LIMIT_ORDER_EIP712_TYPES` from `@switch-win/sdk/constants`.
|
|
@@ -727,11 +746,16 @@ These are exported as `LIMIT_ORDER_EIP712_DOMAIN` and `LIMIT_ORDER_EIP712_TYPES`
|
|
|
727
746
|
| `InvalidTokens()` | tokenIn and tokenOut are the same, or zero address |
|
|
728
747
|
| `NonceAlreadyUsed()` | This nonce has already been filled or invalidated |
|
|
729
748
|
| `OrderExpired()` | `block.timestamp > deadline` (and deadline > 0) |
|
|
730
|
-
| `RouteInputExceedsMax()` | Route's total input exceeds the order's `amountIn` |
|
|
731
|
-
| `
|
|
749
|
+
| `RouteInputExceedsMax()` | Route's total input exceeds the order's `amountIn` |
|
|
750
|
+
| `NativeFlowInputNotFullyConsumed()` | Native-flow output-surplus route did not consume all executable input |
|
|
751
|
+
| `RouteTokenInMismatch()` | A route does not start with the signed input token |
|
|
752
|
+
| `RouteTokenOutMismatch()` | A route does not end with the signed output token |
|
|
753
|
+
| `DirectFillQuoteUnavailable()` | The protected direct-fill quote is missing or zero |
|
|
754
|
+
| `DirectFillPriceTooLow()` | The maker would receive less than the protected direct-fill floor |
|
|
755
|
+
| `TransferFailed()` | Token transfer failed (insufficient balance or allowance) |
|
|
732
756
|
|
|
733
757
|
---
|
|
734
758
|
|
|
735
759
|
*See also: [README.md](README.md) for swap API docs, constants, and general integration info.*
|
|
736
760
|
|
|
737
|
-
*Last updated:
|
|
761
|
+
*Last updated: August 2026*
|
package/README.md
CHANGED
|
@@ -230,7 +230,7 @@ The SwitchRouter contract supports two fee modes:
|
|
|
230
230
|
- **`feeOnOutput=true`** — The full input is routed through DEX pools, then the protocol fee is deducted from the output.
|
|
231
231
|
- **`feeOnOutput=false`** — The protocol fee is deducted from the input *before* routing, and the reduced amount enters the DEX pools.
|
|
232
232
|
|
|
233
|
-
Due to AMM curve concavity (Jensen's inequality), `AMM(amount × 0.
|
|
233
|
+
Due to AMM curve concavity (Jensen's inequality), `AMM(amount × 0.999) ≠ AMM(amount) × 0.999`. This means the backend **must know which mode you'll use** to compute an exact `expectedOutputAmount`. If the backend routes as `feeOnOutput=true` but you send the `tx` (fee on input), the expected output will be slightly over-estimated (always in the user's favor — they receive more than quoted).
|
|
234
234
|
|
|
235
235
|
By passing `feeOnOutput` explicitly, the backend adjusts routing to match the actual on-chain execution, giving you a spot-on estimate.
|
|
236
236
|
|
|
@@ -421,20 +421,26 @@ curl -H "x-api-key: YOUR_KEY" "https://quote.switch.win/swap/adapters?network=pu
|
|
|
421
421
|
{ "index": 10, "name": "pDexV3", "address": "0xb718836aca6ddb8745a0cecc687467dda648bdf2" },
|
|
422
422
|
{ "index": 11, "name": "DextopV3", "address": "0x8b8024ca2a4fdb34697620b80320e76c41a67124" },
|
|
423
423
|
{ "index": 12, "name": "Phux", "address": "0x98ae0249da42f789b9745b248d346a727f37e937" },
|
|
424
|
-
{ "index": 13, "name": "Tide", "address": "
|
|
424
|
+
{ "index": 13, "name": "Tide", "address": "0xd9a17779db4173d099064e26a5d5916717dacf5" },
|
|
425
425
|
{ "index": 14, "name": "PulseXStable", "address": "0xf3b9742c859d089b6a2e3b3228dabb2c842b57d2" },
|
|
426
426
|
{ "index": 15, "name": "AgoraX", "address": "0x79ea0ec76b510d08bf4ca9a4a53a1f9f80ea1697" },
|
|
427
427
|
{ "index": 16, "name": "JoltOTC", "address": "0x033372eb8df4baad260e20d716742a825f1f113f" },
|
|
428
|
-
{ "index": 17, "name": "SwitchLimitOrder", "address": "
|
|
428
|
+
{ "index": 17, "name": "SwitchLimitOrder", "address": "0x7b9761484301a8fe4a2ba47194f7646eef8e1cdd" },
|
|
429
429
|
{ "index": 18, "name": "SwitchX", "address": "0xf8744452598883792f235b92452127f4a8587db3" },
|
|
430
430
|
{ "index": 19, "name": "LibertySwapV3", "address": "0xba24bb413ab32f02073385850907ebcf0a357e70" },
|
|
431
|
-
{ "index": 20, "name": "FinvestaV3", "address": "0x012c44d0c465819ef3ceac208e0c1b272087a8b4" }
|
|
431
|
+
{ "index": 20, "name": "FinvestaV3", "address": "0x012c44d0c465819ef3ceac208e0c1b272087a8b4" },
|
|
432
|
+
{ "index": 21, "name": "TrenchV2", "address": "0xaf48bb0936d9fa522650236917321d89978a8591" },
|
|
433
|
+
{ "index": 22, "name": "TrenchV3", "address": "0x01957ec5fcc079f1bb388b9f261278dac42cf2e9" }
|
|
432
434
|
]
|
|
433
435
|
}
|
|
434
436
|
```
|
|
435
437
|
|
|
436
438
|
Finvesta is a Liberty-style V3 venue with fee tiers `100`, `500`, `2500`, and
|
|
437
439
|
`10000`. It can be selected for normal routes, but it is not transfer-tax safe.
|
|
440
|
+
Trench V2 is a direct-pair adapter with dynamic pair-specific fees and is
|
|
441
|
+
eligible for transfer-tax-sensitive hops. Trench V3 uses direct pool simulation
|
|
442
|
+
across fee tiers `100`, `500`, `2500`, `3000`, and `10000`; like other V3
|
|
443
|
+
callback adapters, it is not transfer-tax safe.
|
|
438
444
|
Always treat the live `/swap/adapters` response as the runtime source of truth.
|
|
439
445
|
|
|
440
446
|
#### Using adapter indices to filter routing
|
|
@@ -592,7 +598,7 @@ Returns the optimal split-route for a swap and (optionally) a ready-to-send tran
|
|
|
592
598
|
| `sender` | No* | address | — | Sender wallet address. **Required to receive `tx` calldata in the response.** |
|
|
593
599
|
| `receiver` | No | address | `sender` | Custom recipient address. If omitted, output tokens are sent to `sender`. |
|
|
594
600
|
| `slippage` | No | integer | `50` | Slippage tolerance in **basis points** (bps). `50` = 0.50 %. Range: `0`–`5000`. |
|
|
595
|
-
| `fee` | No | integer | `
|
|
601
|
+
| `fee` | No | integer | `10` | Protocol fee in basis points (0.10 %). Range: `10`–`100`. Defaults to `10` if omitted. |
|
|
596
602
|
| `partnerAddress` | No | address | `0x0…0` | Your partner wallet to receive 50 % of collected fees. Omit or pass `0x0` for no partner. |
|
|
597
603
|
| `feeOnOutput` | No | string | `"false"` | Controls fee mode. `"true"` = fee deducted from output. `"false"` = fee deducted from input (default). Affects `expectedOutputAmount` accuracy — see [Swap Integration Flow](#swap-integration-flow). |
|
|
598
604
|
| `adapters` | No | string | — | Comma-separated adapter indices to restrict routing (e.g. `"3"` for PulseXV2 only, `"3,7"` for PulseXV2 + UniswapV3). Get available indices from [List Adapters](#list-adapters). |
|
|
@@ -602,7 +608,7 @@ Returns the optimal split-route for a swap and (optionally) a ready-to-send tran
|
|
|
602
608
|
#### Example Request
|
|
603
609
|
|
|
604
610
|
```
|
|
605
|
-
GET /swap/quote?network=pulsechain&from=0xA1077a294dDE1B09bB078844df40758a5D0f9a27&to=0x95B303987A60C71504D99Aa1b13B4DA07b0790ab&amount=1000000000000000000&sender=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&slippage=100&fee=
|
|
611
|
+
GET /swap/quote?network=pulsechain&from=0xA1077a294dDE1B09bB078844df40758a5D0f9a27&to=0x95B303987A60C71504D99Aa1b13B4DA07b0790ab&amount=1000000000000000000&sender=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&slippage=100&fee=10&partnerAddress=0xYourPartnerWallet&feeOnOutput=true
|
|
606
612
|
```
|
|
607
613
|
|
|
608
614
|
#### Example Response
|
|
@@ -674,13 +680,13 @@ GET /swap/quote?network=pulsechain&from=0xA1077a294dDE1B09bB078844df40758a5D0f9a
|
|
|
674
680
|
// Transaction object — only present when `sender` is provided
|
|
675
681
|
// ⚠️ Always use tx.to from this response — do NOT hardcode the router address
|
|
676
682
|
"tx": {
|
|
677
|
-
"to": "
|
|
683
|
+
"to": "0x2dFc8B6e13fF7F04e37Ef97006084805D65a6F19",
|
|
678
684
|
"data": "0x...", // ABI-encoded goSwitch() calldata with feeOnOutput = false
|
|
679
685
|
"value": "0" // "0" for ERC-20 input; amountIn for native-currency input
|
|
680
686
|
},
|
|
681
687
|
// Same swap but with fee taken from the output token instead
|
|
682
688
|
"txFeeOnOutput": {
|
|
683
|
-
"to": "
|
|
689
|
+
"to": "0x2dFc8B6e13fF7F04e37Ef97006084805D65a6F19",
|
|
684
690
|
"data": "0x...", // ABI-encoded goSwitch() calldata with feeOnOutput = true
|
|
685
691
|
"value": "0"
|
|
686
692
|
}
|
|
@@ -830,7 +836,7 @@ Errors are returned as JSON with an `error` field:
|
|
|
830
836
|
| `"Amount must be greater than 0"` | `amount` is zero or negative |
|
|
831
837
|
| `"Amount exceeds maximum allowed value"` | `amount` exceeds 10²⁷ (1 billion tokens @ 18 decimals) |
|
|
832
838
|
| `"Slippage must be a number between 0 and 5000 (basis points)"` | `slippage` out of range |
|
|
833
|
-
| `"Fee must be a number between
|
|
839
|
+
| `"Fee must be a number between 10 and 100 (basis points). Minimum fee is 0.10%."` | `fee` out of range or below minimum |
|
|
834
840
|
| `"receiver must be a valid Ethereum address (0x + 40 hex chars)"` | Malformed receiver address |
|
|
835
841
|
| `"partnerAddress must be a valid Ethereum address (0x + 40 hex chars)"` | Malformed partner address |
|
|
836
842
|
| `"Failed to find route"` | No viable swap path exists, or route computation timed out (30s limit) |
|
|
@@ -860,7 +866,7 @@ If the swap transaction reverts on-chain, the SwitchRouter contract returns one
|
|
|
860
866
|
|
|
861
867
|
Switch supports a **50/50 fee-sharing** model for integration partners:
|
|
862
868
|
|
|
863
|
-
1. Set a `fee` (e.g. `
|
|
869
|
+
1. Set a `fee` (e.g. `10` = 0.10 %, the current minimum) and your `partnerAddress` when calling the API.
|
|
864
870
|
2. The SwitchRouter contract automatically splits collected fees **during the swap**:
|
|
865
871
|
- **50 %** sent to the protocol
|
|
866
872
|
- **50 %** sent directly to your `partnerAddress`
|
|
@@ -963,20 +969,34 @@ Robinhood constants are available from
|
|
|
963
969
|
| Name | Value |
|
|
964
970
|
|---|---|
|
|
965
971
|
| **Chain** | PulseChain (Chain ID `369`); Robinhood Chain uses ID `4663` and network-specific exports |
|
|
966
|
-
| **SwitchRouter** | `
|
|
967
|
-
| **
|
|
968
|
-
| **SwitchLimitOrder** (
|
|
969
|
-
| **
|
|
970
|
-
| **
|
|
972
|
+
| **SwitchRouter** (current) | `0x2dFc8B6e13fF7F04e37Ef97006084805D65a6F19` |
|
|
973
|
+
| **SwitchRouter** (legacy) | `0x0305fcb5dA680EA6fd1B01A96C1949175B99d406` |
|
|
974
|
+
| **SwitchLimitOrder** (V3 — current protected) | `0x2afBf0aB8d958a0227742F7a8BdA00c96372E4D7` |
|
|
975
|
+
| **SwitchLimitOrder** (V2 — legacy) | `0x8e3881bdF81Fc0211383B2e576076B654F7aFD86` |
|
|
976
|
+
| **SwitchLimitOrder** (V1 — legacy) | `0x0e884072a891b406C0D814907A1E2310fE5F5Deb` |
|
|
977
|
+
| **SwitchPLSFlow** (V3 — current protected) | `0x0362177FF2ad25a33a879c881a5055575C63a4cE` |
|
|
978
|
+
| **SwitchPLSFlow** (V2 — legacy) | `0xCf5606bdC750d8626Cec32CA2E1BB207968db1D5` |
|
|
979
|
+
| **SwitchPLSFlow** (V1 — legacy) | `0x88c9e2C83b6B7c707602e548481e58E920694E64` |
|
|
980
|
+
| **Direct-fill quoter** | `0x23A95b0f69c993CFe6180a266A93F7560102e929` |
|
|
981
|
+
| **Limit-order adapter** | Index `17`; `0x7B9761484301a8FE4a2BA47194F7646eEF8e1cDd` |
|
|
982
|
+
| **LimitOrderAdmin** | `0x9C8B9012AfC0489dE612F7039665212EB88be127` |
|
|
983
|
+
| **OperatorAccessRegistry** | `0x7dA1AB04A712479569cCaD783Ca6114b763e36Ad` |
|
|
971
984
|
| **Native PLS sentinel** | `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` |
|
|
972
985
|
| **WPLS** | `0xA1077a294dDE1B09bB078844df40758a5D0f9a27` |
|
|
973
986
|
| **Finvesta V3 adapter** | Index `20`; `0x012c44d0C465819eF3CeAC208e0c1B272087a8b4` (not transfer-tax safe) |
|
|
974
987
|
| **Finvesta V3 factory** | `0x7f5c7C5144b4B4c6e954A5b2D75C318C5467EFDc` |
|
|
975
988
|
| **Finvesta fee tiers** | `100`, `500`, `2500`, `10000` |
|
|
989
|
+
| **Trench V2 adapter** | Index `21`; `0xAf48bb0936D9fA522650236917321D89978A8591` (direct-pair, transfer-tax safe) |
|
|
990
|
+
| **Trench V2 factory** | `0xA024e4574406BEf89e624c75758c700B5bED27C7` |
|
|
991
|
+
| **Trench V3 adapter** | Index `22`; `0x01957eC5FCC079f1bB388b9f261278daC42cf2E9` (not transfer-tax safe) |
|
|
992
|
+
| **Trench V3 factory** | `0xCAeF0a906F3323595A8faA14DF7eDee6F59220af` |
|
|
993
|
+
| **Trench V3 fee tiers** | `100`, `500`, `2500`, `3000`, `10000` |
|
|
976
994
|
| **Fee denominator** | `10000` (basis points) |
|
|
977
995
|
| **Max slippage** | `5000` bps (50 %) |
|
|
978
996
|
| **Max fee** | `100` bps (1 %) |
|
|
979
|
-
| **
|
|
997
|
+
| **Regular swap fee** | `10` bps (0.10 %) — enforced on-chain by `MIN_FEE` |
|
|
998
|
+
| **Limit-order fee** | `30` bps (0.30 %); the LimitOrder is Router-fee-exempt |
|
|
999
|
+
| **Maximum operator excess** | `500` bps (5 %) of the protected contract's cap base |
|
|
980
1000
|
| **Default slippage** | `50` bps (0.50 %) |
|
|
981
1001
|
| **Swap API base** | `https://quote.switch.win` |
|
|
982
1002
|
| **Limit Order API base** | `https://quote.switch.win` |
|
package/ROBINHOOD.md
CHANGED
|
@@ -11,7 +11,7 @@ Production integration reference for Switch swaps on Robinhood Chain mainnet.
|
|
|
11
11
|
| Explorer | `https://robinhoodchain.blockscout.com` |
|
|
12
12
|
| Quote API | `https://quote.switch.win/swap/quote` |
|
|
13
13
|
| Tax API | `https://quote.switch.win/swap/checkTax` |
|
|
14
|
-
| Supported liquidity |
|
|
14
|
+
| Supported liquidity | 21 adapters: Uniswap V2/V3/V4, Switch limit orders, SwapHood, Up33, Sheriff, Aeon, Catnip, PancakeSwap V2/V3, RobinSwap V2/V3, SushiSwap, GIGA, Flap, and Ramses |
|
|
15
15
|
| Limit orders | Available: EIP-712 ERC-20 orders plus native ETH flow |
|
|
16
16
|
|
|
17
17
|
## Contents
|
|
@@ -104,13 +104,14 @@ await window.ethereum.request({
|
|
|
104
104
|
|
|
105
105
|
| Contract | Address |
|
|
106
106
|
|---|---|
|
|
107
|
-
| SwitchRouter | `
|
|
107
|
+
| SwitchRouter | `0x8b2bBdF41C1486b3482bD0e9603d72f012EE8599` |
|
|
108
108
|
| Uniswap V2 adapter | `0x7a14d7A8509a66209D4332843b983b29bF5604A4` |
|
|
109
109
|
| Uniswap V3 adapter | `0xbcA08f296d9Ba0dc19Aa0E05D355365cE29A3205` |
|
|
110
110
|
| Uniswap V4 adapter | `0xB9885d3C55e79499bf887F2fBe445e01A8cFFf1c` |
|
|
111
|
-
| SwitchLimitOrder | `
|
|
112
|
-
| Native ETH flow | `
|
|
113
|
-
|
|
|
111
|
+
| SwitchLimitOrder | `0x1E05115387f314398bbb1A808B25308E71150396` |
|
|
112
|
+
| Native ETH flow | `0x8170a3B0e2FD2e4333E0Ca9c9414B2D3dd6aF689` |
|
|
113
|
+
| Direct-fill quoter | `0x77b246C127c3c501Ec2836A2B53B555208b30B44` |
|
|
114
|
+
| Switch Limit Order adapter (index 3) | `0xb13CC4C37e1C609617C51B5dCDf8e4Ae5721Faa4` |
|
|
114
115
|
| SwapHood V2 adapter (index 4) | `0x6D8746f02e52944c13824fA691c6f4186E463354` |
|
|
115
116
|
| SwapHood V3 adapter (index 5) | `0x9645dE0AcB48F0AAefdBEb423F0558457907DE98` |
|
|
116
117
|
| Up33 CL adapter (index 6) | `0x388179D2FB0ABcE9b03068916aF8a3c4dfD023c8` |
|
|
@@ -120,13 +121,14 @@ await window.ethereum.request({
|
|
|
120
121
|
| Catnip V2 adapter (index 10) | `0x5b2Ca358d56490Dc86224D502522314De7707237` |
|
|
121
122
|
| PancakeSwap V2 adapter (index 11) | `0x3B6e71A59553143937Fef74a7B50AFD24528786E` |
|
|
122
123
|
| PancakeSwap V3 adapter (index 12) | `0xD2Adac87bab4f0f99CF2a21c552c88d1C9825cCC` |
|
|
123
|
-
| RobinSwap
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
| GIGA
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
| Ramses
|
|
124
|
+
| RobinSwap V2 adapter (index 13) | `0xF694145F104c3C24f723301e160D2Ccf0Db31FE6` |
|
|
125
|
+
| RobinSwap V3 adapter (index 14) | `0x798f77D63b46b0E019de206E111e5ea5CC16BEc8` |
|
|
126
|
+
| SushiSwap V3 adapter (index 15) | `0xca3EA0Fd6E31f94c81B6586836790adE638313ED` |
|
|
127
|
+
| GIGA V2 adapter (index 16) | `0xa379c7D17F7fEe735773879D4069886B117AB54a` |
|
|
128
|
+
| GIGA V3 adapter (index 17) | `0xcAa612CDe3d3FbE97Be97eB5f79BC91597432d55` |
|
|
129
|
+
| Flap Portal adapter (index 18) | `0x6af2A4475C44d5833575150Bf7C3D3FE6Bf4F344` |
|
|
130
|
+
| Ramses V3 adapter (index 19) | `0xdBf182774C60932c6fe1Bf3FFaB8Ca28CCb0dC17` |
|
|
131
|
+
| Ramses V2 adapter (index 20) | `0x5fe3b873c222e76f7630b40052f07ee06196E6d3` |
|
|
130
132
|
|
|
131
133
|
The PancakeSwap V3 adapter was created in
|
|
132
134
|
[deployment transaction `0xa82a...cfa8`](https://robinhoodchain.blockscout.com/tx/0xa82a53e8e32e7a26be720d62e157c820e8c25ccbb3826e604435480606e0cfa8)
|
|
@@ -159,6 +161,11 @@ Use `ROBINHOOD_TOKENS.WETH.address` for the wrapped ERC-20:
|
|
|
159
161
|
Native ETH does not require approval. WETH and every other ERC-20 input token
|
|
160
162
|
must be approved for `ROBINHOOD_SWITCH_CONTRACTS.router`.
|
|
161
163
|
|
|
164
|
+
The current Router charges 10 bps (0.10%) for regular swaps. The protected
|
|
165
|
+
LimitOrder charges 30 bps (0.30%) and is Router-fee-exempt, so the fees do not
|
|
166
|
+
stack. It also caps operator excess at 5% and checks direct fills against its
|
|
167
|
+
Router-bound market-price quoter.
|
|
168
|
+
|
|
162
169
|
### Limit orders
|
|
163
170
|
|
|
164
171
|
Robinhood ERC-20 limit orders use the same EIP-712 `LimitOrder` structure as
|
|
@@ -171,7 +178,7 @@ import {
|
|
|
171
178
|
} from "@switch-win/sdk";
|
|
172
179
|
|
|
173
180
|
// { name: "SwitchLimitOrder", version: "2", chainId: 4663,
|
|
174
|
-
// verifyingContract: "
|
|
181
|
+
// verifyingContract: "0x1E05...0396" }
|
|
175
182
|
await signer.signTypedData(
|
|
176
183
|
ROBINHOOD_LIMIT_ORDER_EIP712_DOMAIN,
|
|
177
184
|
LIMIT_ORDER_EIP712_TYPES,
|
|
@@ -201,7 +208,9 @@ const approvalTarget = getLimitOrderApprovalTarget(
|
|
|
201
208
|
|
|
202
209
|
Include `limitOrderContract: config.limitOrderContract` with the submitted
|
|
203
210
|
signed order. Every returned order also carries its own deployment address;
|
|
204
|
-
|
|
211
|
+
makers must cancel against that per-order address. Public operators should
|
|
212
|
+
accept only the current `config.limitOrderContract` and current
|
|
213
|
+
`config.plsFlowContract`; legacy arrays are for cancellation and indexing.
|
|
205
214
|
|
|
206
215
|
Native ETH input orders are created on-chain through
|
|
207
216
|
`ROBINHOOD_SWITCH_CONTRACTS.nativeEthFlow` and are indexed from its events; do
|
|
@@ -262,8 +271,8 @@ The canonical Robinhood V4 infrastructure is available through
|
|
|
262
271
|
| Permit2 | `0x000000000022D473030F116dDEE9F6B43aC78BA3` |
|
|
263
272
|
|
|
264
273
|
If either side is detected as a transfer-tax token, the complete route is
|
|
265
|
-
restricted to tax-safe adapters `0`, `4`, `7`, `10`, `11`, `
|
|
266
|
-
`
|
|
274
|
+
restricted to tax-safe adapters `0`, `4`, `7`, `10`, `11`, `13`, `16`, `18`,
|
|
275
|
+
and `20`. Indices `13`, `16`, and `20` use direct-pair V2 execution. Flap at index `18`
|
|
267
276
|
must execute through its Portal, whose quote already includes Flap token taxes
|
|
268
277
|
in both directions; clients must not apply those taxes a second time.
|
|
269
278
|
|
|
@@ -499,13 +508,14 @@ Robinhood currently returns:
|
|
|
499
508
|
| `10` | Catnip V2 |
|
|
500
509
|
| `11` | PancakeSwap V2 |
|
|
501
510
|
| `12` | PancakeSwap V3 |
|
|
502
|
-
| `13` | RobinSwap
|
|
503
|
-
| `14` |
|
|
504
|
-
| `15` |
|
|
505
|
-
| `16` | GIGA
|
|
506
|
-
| `17` |
|
|
507
|
-
| `18` |
|
|
508
|
-
| `19` | Ramses
|
|
511
|
+
| `13` | RobinSwap V2 |
|
|
512
|
+
| `14` | RobinSwap V3 |
|
|
513
|
+
| `15` | SushiSwap V3 |
|
|
514
|
+
| `16` | GIGA V2 |
|
|
515
|
+
| `17` | GIGA V3 |
|
|
516
|
+
| `18` | Flap |
|
|
517
|
+
| `19` | Ramses V3 |
|
|
518
|
+
| `20` | Ramses V2 |
|
|
509
519
|
|
|
510
520
|
Treat the endpoint response, not this document, as the source of truth for
|
|
511
521
|
which adapters are currently selectable.
|
|
@@ -513,7 +523,7 @@ which adapters are currently selectable.
|
|
|
513
523
|
Do not permanently hard-code the available adapter list in an integration.
|
|
514
524
|
Fetch it when presenting routing-source controls. If a quote involves a tax
|
|
515
525
|
token, the backend restricts routing to tax-safe adapters `0`, `4`, `7`, `10`,
|
|
516
|
-
`11`, `
|
|
526
|
+
`11`, `13`, `16`, `18`, and `20`; an explicit filter that excludes all of them is
|
|
517
527
|
rejected.
|
|
518
528
|
|
|
519
529
|
### Check token tax
|
|
@@ -655,7 +665,7 @@ Always identify tokens by address and obtain a fresh quote and tax check.
|
|
|
655
665
|
|
|
656
666
|
### Routing configuration
|
|
657
667
|
|
|
658
|
-
The production router currently exposes
|
|
668
|
+
The production router currently exposes 21 ordered adapters:
|
|
659
669
|
|
|
660
670
|
| Index | Venue | Routing family |
|
|
661
671
|
|---:|---|---|
|
|
@@ -672,13 +682,14 @@ The production router currently exposes twenty ordered adapters:
|
|
|
672
682
|
| `10` | Catnip | Direct-pair V2, fixed 30 bps |
|
|
673
683
|
| `11` | PancakeSwap V2 | Direct-pair V2, fixed 25 bps |
|
|
674
684
|
| `12` | PancakeSwap V3 | Factory-enabled tiers `100`, `500`, `2500`, `10000` |
|
|
675
|
-
| `13` | RobinSwap |
|
|
676
|
-
| `14` |
|
|
677
|
-
| `15` |
|
|
678
|
-
| `16` | GIGA
|
|
679
|
-
| `17` |
|
|
680
|
-
| `18` |
|
|
681
|
-
| `19` | Ramses
|
|
685
|
+
| `13` | RobinSwap V2 | Direct-pair V2, fixed 25 bps |
|
|
686
|
+
| `14` | RobinSwap V3 | V3 tiers `100`, `500`, `2500`, `3000`, `10000` |
|
|
687
|
+
| `15` | SushiSwap | V3 tiers `500`, `3000`, `10000` |
|
|
688
|
+
| `16` | GIGA V2 | Direct-pair V2 using the pair's live quote and pair-owned fee |
|
|
689
|
+
| `17` | GIGA V3 | V3 tiers `100`, `500`, `1000`, `2000`, `3000`, `10000` |
|
|
690
|
+
| `18` | Flap | Portal-executed bonding curve; Portal quote includes token tax |
|
|
691
|
+
| `19` | Ramses V3 | Tick spacings `1`, `5`, `10`, `50`, `100`, `200`, stored in the route `fee` field |
|
|
692
|
+
| `20` | Ramses V2 | Direct-pair, pair-owned variable-fee V2 |
|
|
682
693
|
|
|
683
694
|
V4 pools are discovered by complete `PoolKey`, not by applying a V3 fee-tier
|
|
684
695
|
list. Native-ETH V4 currencies are normalized through the WETH/native alias
|
|
@@ -691,7 +702,7 @@ JUGGERNAUT, MARIAN, and WALLET. The expanded set was selected from the
|
|
|
691
702
|
it is taxed; INDEX remains an endpoint token but is excluded because its
|
|
692
703
|
dominant liquidity depends on V4 hooks that are not yet supported. If either side is
|
|
693
704
|
detected as a transfer-tax token, the backend restricts the entire route to
|
|
694
|
-
tax-safe adapters `0`, `4`, `7`, `10`, `11`, `
|
|
705
|
+
tax-safe adapters `0`, `4`, `7`, `10`, `11`, `13`, `16`, `18`, and `20`;
|
|
695
706
|
concentrated-liquidity and limit-order adapters are excluded. Flap is the one
|
|
696
707
|
non-direct-pair member: only its Portal can execute the curve swap, and the
|
|
697
708
|
Portal quote already includes the Flap token tax.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"type":"constructor","inputs":[{"name":"_switchRouter","type":"address","internalType":"address"},{"name":"_wnative","type":"address","internalType":"address"},{"name":"_fee","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"FEE_DENOMINATOR","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"LIMIT_ORDER_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MAINTAINER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MAX_FEE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"OPERATOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PARTNER_FEE_SHARE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"SWITCH_ROUTER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"WNATIVE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"addMaintainer","inputs":[{"name":"addedMaintainer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addOperator","inputs":[{"name":"_operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"adminInvalidateNonce","inputs":[{"name":"_maker","type":"address","internalType":"address"},{"name":"_nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"adminInvalidateNonces","inputs":[{"name":"_maker","type":"address","internalType":"address"},{"name":"_nonces","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"canFillOrder","inputs":[{"name":"order","type":"tuple","internalType":"struct SwitchLimitOrder.LimitOrder","components":[{"name":"maker","type":"address","internalType":"address"},{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"minAmountOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"feeOnOutput","type":"bool","internalType":"bool"},{"name":"recipient","type":"address","internalType":"address"},{"name":"unwrapOutput","type":"bool","internalType":"bool"},{"name":"partnerAddress","type":"address","internalType":"address"}]},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"directFillOrder","inputs":[{"name":"order","type":"tuple","internalType":"struct SwitchLimitOrder.LimitOrder","components":[{"name":"maker","type":"address","internalType":"address"},{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"minAmountOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"feeOnOutput","type":"bool","internalType":"bool"},{"name":"recipient","type":"address","internalType":"address"},{"name":"unwrapOutput","type":"bool","internalType":"bool"},{"name":"partnerAddress","type":"address","internalType":"address"}]},{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"outputAmount","type":"uint256","internalType":"uint256"},{"name":"directToMaker","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"domainSeparator","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"eip712Domain","inputs":[],"outputs":[{"name":"fields","type":"bytes1","internalType":"bytes1"},{"name":"name","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"verifyingContract","type":"address","internalType":"address"},{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"extensions","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"fillOrder","inputs":[{"name":"order","type":"tuple","internalType":"struct SwitchLimitOrder.LimitOrder","components":[{"name":"maker","type":"address","internalType":"address"},{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"minAmountOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"feeOnOutput","type":"bool","internalType":"bool"},{"name":"recipient","type":"address","internalType":"address"},{"name":"unwrapOutput","type":"bool","internalType":"bool"},{"name":"partnerAddress","type":"address","internalType":"address"}]},{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"routes","type":"tuple[]","internalType":"struct RouteAllocation[]","components":[{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"hops","type":"tuple[]","internalType":"struct HopAllocation[]","components":[{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"legs","type":"tuple[]","internalType":"struct HopAdapterAllocation[]","components":[{"name":"adapter","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"data","type":"bytes","internalType":"bytes"}]}]}]},{"name":"excessOnInput","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getFee","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"invalidateNonce","inputs":[{"name":"_nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"invalidateNonces","inputs":[{"name":"_nonces","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isNonceUsed","inputs":[{"name":"maker","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"noncesUsed","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"operatorGateEnabled","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"placeOrder","inputs":[{"name":"order","type":"tuple","internalType":"struct SwitchLimitOrder.LimitOrder","components":[{"name":"maker","type":"address","internalType":"address"},{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"minAmountOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"feeOnOutput","type":"bool","internalType":"bool"},{"name":"recipient","type":"address","internalType":"address"},{"name":"unwrapOutput","type":"bool","internalType":"bool"},{"name":"partnerAddress","type":"address","internalType":"address"}]},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"plsFlowContract","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"recoverNative","inputs":[{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverTokens","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeMaintainer","inputs":[{"name":"removedMaintainer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeOperator","inputs":[{"name":"_operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFee","inputs":[{"name":"_fee","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setOperatorGate","inputs":[{"name":"_enabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPLSFlowContract","inputs":[{"name":"_plsFlow","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"EIP712DomainChanged","inputs":[],"anonymous":false},{"type":"event","name":"FeeUpdated","inputs":[{"name":"newFee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"NonceCancelled","inputs":[{"name":"maker","type":"address","indexed":true,"internalType":"address"},{"name":"nonce","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OperatorGateToggled","inputs":[{"name":"enabled","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"OrderFilled","inputs":[{"name":"maker","type":"address","indexed":true,"internalType":"address"},{"name":"filler","type":"address","indexed":true,"internalType":"address"},{"name":"nonce","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tokenIn","type":"address","indexed":false,"internalType":"address"},{"name":"tokenOut","type":"address","indexed":false,"internalType":"address"},{"name":"amountIn","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"makerAmountOut","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"fillerProfit","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"excessOnInput","type":"bool","indexed":false,"internalType":"bool"},{"name":"partnerAddress","type":"address","indexed":false,"internalType":"address"},{"name":"directFill","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"OrderPlaced","inputs":[{"name":"maker","type":"address","indexed":true,"internalType":"address"},{"name":"nonce","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tokenIn","type":"address","indexed":false,"internalType":"address"},{"name":"tokenOut","type":"address","indexed":false,"internalType":"address"},{"name":"amountIn","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"minAmountOut","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"deadline","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"feeOnOutput","type":"bool","indexed":false,"internalType":"bool"},{"name":"recipient","type":"address","indexed":false,"internalType":"address"},{"name":"unwrapOutput","type":"bool","indexed":false,"internalType":"bool"},{"name":"partnerAddress","type":"address","indexed":false,"internalType":"address"},{"name":"signature","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"PLSFlowContractUpdated","inputs":[{"name":"newPLSFlowContract","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"ExcessiveFee","inputs":[]},{"type":"error","name":"InsufficientOutput","inputs":[]},{"type":"error","name":"InvalidAmount","inputs":[]},{"type":"error","name":"InvalidShortString","inputs":[]},{"type":"error","name":"InvalidSignature","inputs":[]},{"type":"error","name":"InvalidTokens","inputs":[]},{"type":"error","name":"NonceAlreadyUsed","inputs":[]},{"type":"error","name":"OperatorOnly","inputs":[]},{"type":"error","name":"OrderExpired","inputs":[]},{"type":"error","name":"RouteInputExceedsMax","inputs":[]},{"type":"error","name":"StringTooLong","inputs":[{"name":"str","type":"string","internalType":"string"}]},{"type":"error","name":"TransferFailed","inputs":[]}]
|
|
1
|
+
[{"type":"constructor","inputs":[{"name":"_switchRouter","type":"address","internalType":"address"},{"name":"_wnative","type":"address","internalType":"address"},{"name":"_fee","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"FEE_DENOMINATOR","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"LIMIT_ORDER_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MAINTAINER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MAX_FEE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_OPERATOR_EXCESS_BPS","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"OPERATOR_MANAGER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"OPERATOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PARTNER_FEE_SHARE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"SWITCH_ROUTER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"WNATIVE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"addMaintainer","inputs":[{"name":"addedMaintainer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addOperator","inputs":[{"name":"_operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"adminInvalidateNonce","inputs":[{"name":"_maker","type":"address","internalType":"address"},{"name":"_nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"adminInvalidateNonces","inputs":[{"name":"_maker","type":"address","internalType":"address"},{"name":"_nonces","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"canFillOrder","inputs":[{"name":"order","type":"tuple","internalType":"struct SwitchLimitOrder.LimitOrder","components":[{"name":"maker","type":"address","internalType":"address"},{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"minAmountOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"feeOnOutput","type":"bool","internalType":"bool"},{"name":"recipient","type":"address","internalType":"address"},{"name":"unwrapOutput","type":"bool","internalType":"bool"},{"name":"partnerAddress","type":"address","internalType":"address"}]},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"canManageOperators","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"directFillOrder","inputs":[{"name":"order","type":"tuple","internalType":"struct SwitchLimitOrder.LimitOrder","components":[{"name":"maker","type":"address","internalType":"address"},{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"minAmountOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"feeOnOutput","type":"bool","internalType":"bool"},{"name":"recipient","type":"address","internalType":"address"},{"name":"unwrapOutput","type":"bool","internalType":"bool"},{"name":"partnerAddress","type":"address","internalType":"address"}]},{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"outputAmount","type":"uint256","internalType":"uint256"},{"name":"directToMaker","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"directFillQuoter","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"domainSeparator","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"eip712Domain","inputs":[],"outputs":[{"name":"fields","type":"bytes1","internalType":"bytes1"},{"name":"name","type":"string","internalType":"string"},{"name":"version","type":"string","internalType":"string"},{"name":"chainId","type":"uint256","internalType":"uint256"},{"name":"verifyingContract","type":"address","internalType":"address"},{"name":"salt","type":"bytes32","internalType":"bytes32"},{"name":"extensions","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"fillOrder","inputs":[{"name":"order","type":"tuple","internalType":"struct SwitchLimitOrder.LimitOrder","components":[{"name":"maker","type":"address","internalType":"address"},{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"minAmountOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"feeOnOutput","type":"bool","internalType":"bool"},{"name":"recipient","type":"address","internalType":"address"},{"name":"unwrapOutput","type":"bool","internalType":"bool"},{"name":"partnerAddress","type":"address","internalType":"address"}]},{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"routes","type":"tuple[]","internalType":"struct RouteAllocation[]","components":[{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"hops","type":"tuple[]","internalType":"struct HopAllocation[]","components":[{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"legs","type":"tuple[]","internalType":"struct HopAdapterAllocation[]","components":[{"name":"adapter","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"data","type":"bytes","internalType":"bytes"}]}]}]},{"name":"excessOnInput","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getFee","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"invalidateNonce","inputs":[{"name":"_nonce","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"invalidateNonces","inputs":[{"name":"_nonces","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isNonceUsed","inputs":[{"name":"maker","type":"address","internalType":"address"},{"name":"nonce","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"noncesUsed","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"operatorGateEnabled","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"placeOrder","inputs":[{"name":"order","type":"tuple","internalType":"struct SwitchLimitOrder.LimitOrder","components":[{"name":"maker","type":"address","internalType":"address"},{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"minAmountOut","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"nonce","type":"uint256","internalType":"uint256"},{"name":"feeOnOutput","type":"bool","internalType":"bool"},{"name":"recipient","type":"address","internalType":"address"},{"name":"unwrapOutput","type":"bool","internalType":"bool"},{"name":"partnerAddress","type":"address","internalType":"address"}]},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"plsFlowContract","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"recoverNative","inputs":[{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverTokens","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeMaintainer","inputs":[{"name":"removedMaintainer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeOperator","inputs":[{"name":"_operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setDirectFillQuoter","inputs":[{"name":"_quoter","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFee","inputs":[{"name":"_fee","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setOperatorGate","inputs":[{"name":"_enabled","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPLSFlowContract","inputs":[{"name":"_plsFlow","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DirectFillQuoterUpdated","inputs":[{"name":"newDirectFillQuoter","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EIP712DomainChanged","inputs":[],"anonymous":false},{"type":"event","name":"FeeUpdated","inputs":[{"name":"newFee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"NonceCancelled","inputs":[{"name":"maker","type":"address","indexed":true,"internalType":"address"},{"name":"nonce","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OperatorGateToggled","inputs":[{"name":"enabled","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"OrderFilled","inputs":[{"name":"maker","type":"address","indexed":true,"internalType":"address"},{"name":"filler","type":"address","indexed":true,"internalType":"address"},{"name":"nonce","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tokenIn","type":"address","indexed":false,"internalType":"address"},{"name":"tokenOut","type":"address","indexed":false,"internalType":"address"},{"name":"amountIn","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"makerAmountOut","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"fillerProfit","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"excessOnInput","type":"bool","indexed":false,"internalType":"bool"},{"name":"partnerAddress","type":"address","indexed":false,"internalType":"address"},{"name":"directFill","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"OrderPlaced","inputs":[{"name":"maker","type":"address","indexed":true,"internalType":"address"},{"name":"nonce","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tokenIn","type":"address","indexed":false,"internalType":"address"},{"name":"tokenOut","type":"address","indexed":false,"internalType":"address"},{"name":"amountIn","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"minAmountOut","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"deadline","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"feeOnOutput","type":"bool","indexed":false,"internalType":"bool"},{"name":"recipient","type":"address","indexed":false,"internalType":"address"},{"name":"unwrapOutput","type":"bool","indexed":false,"internalType":"bool"},{"name":"partnerAddress","type":"address","indexed":false,"internalType":"address"},{"name":"signature","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"PLSFlowContractUpdated","inputs":[{"name":"newPLSFlowContract","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"DirectFillPriceTooLow","inputs":[]},{"type":"error","name":"DirectFillQuoteUnavailable","inputs":[]},{"type":"error","name":"ExcessiveFee","inputs":[]},{"type":"error","name":"InsufficientOutput","inputs":[]},{"type":"error","name":"InvalidAmount","inputs":[]},{"type":"error","name":"InvalidDirectFillQuoter","inputs":[]},{"type":"error","name":"InvalidShortString","inputs":[]},{"type":"error","name":"InvalidSignature","inputs":[]},{"type":"error","name":"InvalidTokens","inputs":[]},{"type":"error","name":"NativeFlowInputNotFullyConsumed","inputs":[]},{"type":"error","name":"NonceAlreadyUsed","inputs":[]},{"type":"error","name":"OperatorManagerOnly","inputs":[]},{"type":"error","name":"OperatorOnly","inputs":[]},{"type":"error","name":"OrderExpired","inputs":[]},{"type":"error","name":"RouteInputExceedsMax","inputs":[]},{"type":"error","name":"RouteTokenInMismatch","inputs":[]},{"type":"error","name":"RouteTokenOutMismatch","inputs":[]},{"type":"error","name":"StringTooLong","inputs":[{"name":"str","type":"string","internalType":"string"}]},{"type":"error","name":"TransferFailed","inputs":[]}]
|
package/abi/SwitchRouterABI.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"type":"constructor","inputs":[{"name":"_adapters","type":"address[]","internalType":"address[]"},{"name":"_feeClaimer","type":"address","internalType":"address"},{"name":"_wrapped_native","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"ADAPTERS","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"APPROVED_ADAPTERS","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"FEE_CLAIMER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"FEE_DENOMINATOR","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"FEE_EXEMPT","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"LIMIT_ORDER_CONTRACT","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MAINTAINER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MAX_FEE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MIN_FEE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MIN_FEE_EXEMPT","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"NATIVE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"PARTNER_FEE_SHARE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"WNATIVE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"adaptersCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"addMaintainer","inputs":[{"name":"addedMaintainer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"goSwitch","inputs":[{"name":"_routes","type":"tuple[]","internalType":"struct RouteAllocation[]","components":[{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"hops","type":"tuple[]","internalType":"struct HopAllocation[]","components":[{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"legs","type":"tuple[]","internalType":"struct HopAdapterAllocation[]","components":[{"name":"adapter","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"data","type":"bytes","internalType":"bytes"}]}]}]},{"name":"_to","type":"address","internalType":"address"},{"name":"_minTotalAmountOut","type":"uint256","internalType":"uint256"},{"name":"_fee","type":"uint256","internalType":"uint256"},{"name":"_feeOnOutput","type":"bool","internalType":"bool"},{"name":"_unwrapOutput","type":"bool","internalType":"bool"},{"name":"_partnerAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"goSwitchFrom","inputs":[{"name":"_payer","type":"address","internalType":"address"},{"name":"_routes","type":"tuple[]","internalType":"struct RouteAllocation[]","components":[{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"hops","type":"tuple[]","internalType":"struct HopAllocation[]","components":[{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"legs","type":"tuple[]","internalType":"struct HopAdapterAllocation[]","components":[{"name":"adapter","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"fee","type":"uint24","internalType":"uint24"}]}]}]},{"name":"_to","type":"address","internalType":"address"},{"name":"_minTotalAmountOut","type":"uint256","internalType":"uint256"},{"name":"_unwrapOutput","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pullTokens","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC20","inputs":[{"name":"_tokenAddress","type":"address","internalType":"address"},{"name":"_tokenAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverNative","inputs":[{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeMaintainer","inputs":[{"name":"removedMaintainer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setAdapters","inputs":[{"name":"_adapters","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFeeClaimer","inputs":[{"name":"_claimer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFeeExempt","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"exempt","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setLimitOrderContract","inputs":[{"name":"_limitOrder","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMinFee","inputs":[{"name":"_fee","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMinFeeExempt","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"exempt","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Switched","inputs":[{"name":"_tokenIn","type":"address","indexed":true,"internalType":"address"},{"name":"_tokenOut","type":"address","indexed":true,"internalType":"address"},{"name":"_amountIn","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_amountOut","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_partnerAddress","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AdapterNotApproved","inputs":[{"name":"adapter","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyHop","inputs":[]},{"type":"error","name":"EmptySplit","inputs":[]},{"type":"error","name":"ExcessiveFee","inputs":[]},{"type":"error","name":"FeeNotSupported","inputs":[]},{"type":"error","name":"FinalAmountOutTooLow","inputs":[]},{"type":"error","name":"InsufficientFee","inputs":[]},{"type":"error","name":"MsgValueMismatch","inputs":[]},{"type":"error","name":"PathNeedsBeginWithWPLS","inputs":[]},{"type":"error","name":"PathNeedsEndWithWPLS","inputs":[]},{"type":"error","name":"SplitMixedTokenIn","inputs":[]},{"type":"error","name":"SplitMixedTokenOut","inputs":[]},{"type":"error","name":"ZeroInput","inputs":[]}]
|
|
1
|
+
[{"type":"constructor","inputs":[{"name":"_adapters","type":"address[]","internalType":"address[]"},{"name":"_feeClaimer","type":"address","internalType":"address"},{"name":"_wrapped_native","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"ADAPTERS","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"APPROVED_ADAPTERS","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"FEE_CLAIMER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"FEE_DENOMINATOR","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"FEE_EXEMPT","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"LIMIT_ORDER_CONTRACT","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"MAINTAINER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MAX_FEE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MIN_FEE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MIN_FEE_EXEMPT","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"NATIVE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"PARTNER_FEE_SHARE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"WNATIVE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"adaptersCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"addMaintainer","inputs":[{"name":"addedMaintainer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"goSwitch","inputs":[{"name":"_routes","type":"tuple[]","internalType":"struct RouteAllocation[]","components":[{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"hops","type":"tuple[]","internalType":"struct HopAllocation[]","components":[{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"legs","type":"tuple[]","internalType":"struct HopAdapterAllocation[]","components":[{"name":"adapter","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"data","type":"bytes","internalType":"bytes"}]}]}]},{"name":"_to","type":"address","internalType":"address"},{"name":"_minTotalAmountOut","type":"uint256","internalType":"uint256"},{"name":"_fee","type":"uint256","internalType":"uint256"},{"name":"_feeOnOutput","type":"bool","internalType":"bool"},{"name":"_unwrapOutput","type":"bool","internalType":"bool"},{"name":"_partnerAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"goSwitchFrom","inputs":[{"name":"_payer","type":"address","internalType":"address"},{"name":"_routes","type":"tuple[]","internalType":"struct RouteAllocation[]","components":[{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"hops","type":"tuple[]","internalType":"struct HopAllocation[]","components":[{"name":"tokenIn","type":"address","internalType":"address"},{"name":"tokenOut","type":"address","internalType":"address"},{"name":"legs","type":"tuple[]","internalType":"struct HopAdapterAllocation[]","components":[{"name":"adapter","type":"address","internalType":"address"},{"name":"amountIn","type":"uint256","internalType":"uint256"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"data","type":"bytes","internalType":"bytes"}]}]}]},{"name":"_to","type":"address","internalType":"address"},{"name":"_minTotalAmountOut","type":"uint256","internalType":"uint256"},{"name":"_unwrapOutput","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pullTokens","inputs":[{"name":"_token","type":"address","internalType":"address"},{"name":"_from","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC20","inputs":[{"name":"_tokenAddress","type":"address","internalType":"address"},{"name":"_tokenAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverNative","inputs":[{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeMaintainer","inputs":[{"name":"removedMaintainer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setAdapters","inputs":[{"name":"_adapters","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFeeClaimer","inputs":[{"name":"_claimer","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFeeExempt","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"exempt","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setLimitOrderContract","inputs":[{"name":"_limitOrder","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMinFee","inputs":[{"name":"_fee","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMinFeeExempt","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"exempt","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Switched","inputs":[{"name":"_tokenIn","type":"address","indexed":true,"internalType":"address"},{"name":"_tokenOut","type":"address","indexed":true,"internalType":"address"},{"name":"_amountIn","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_amountOut","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"_partnerAddress","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AdapterNotApproved","inputs":[{"name":"adapter","type":"address","internalType":"address"}]},{"type":"error","name":"EmptyHop","inputs":[]},{"type":"error","name":"EmptySplit","inputs":[]},{"type":"error","name":"ExcessiveFee","inputs":[]},{"type":"error","name":"FeeNotSupported","inputs":[]},{"type":"error","name":"FinalAmountOutTooLow","inputs":[]},{"type":"error","name":"InsufficientFee","inputs":[]},{"type":"error","name":"MsgValueMismatch","inputs":[]},{"type":"error","name":"PathNeedsBeginWithWPLS","inputs":[]},{"type":"error","name":"PathNeedsEndWithWPLS","inputs":[]},{"type":"error","name":"SplitMixedTokenIn","inputs":[]},{"type":"error","name":"SplitMixedTokenOut","inputs":[]},{"type":"error","name":"ZeroInput","inputs":[]}]
|
package/package.json
CHANGED
package/src/constants.ts
CHANGED
|
@@ -37,10 +37,14 @@ export const CHAIN_ID = 369;
|
|
|
37
37
|
*
|
|
38
38
|
* **Important:** Do NOT hardcode this address as the `to` field when sending
|
|
39
39
|
* swap transactions. Always use `tx.to` from the quote response — the router
|
|
40
|
-
* contract may be redeployed. This constant is
|
|
41
|
-
*
|
|
42
|
-
*/
|
|
43
|
-
export const SWITCH_ROUTER = "
|
|
40
|
+
* contract may be redeployed. This constant is the current approval target;
|
|
41
|
+
* a router migration requires a fresh ERC-20 allowance for the new spender.
|
|
42
|
+
*/
|
|
43
|
+
export const SWITCH_ROUTER = "0x2dFc8B6e13fF7F04e37Ef97006084805D65a6F19";
|
|
44
|
+
|
|
45
|
+
/** Previous PulseChain Router retained for historical transactions and trusted legacy drain tooling. */
|
|
46
|
+
export const LEGACY_SWITCH_ROUTER =
|
|
47
|
+
"0x0305fcb5dA680EA6fd1B01A96C1949175B99d406";
|
|
44
48
|
|
|
45
49
|
/**
|
|
46
50
|
* Native PLS sentinel address.
|
|
@@ -64,17 +68,46 @@ export const FINVESTA_V3_FACTORY =
|
|
|
64
68
|
|
|
65
69
|
/** Factory-enabled Finvesta fee tiers, in hundredths of one basis point. */
|
|
66
70
|
export const FINVESTA_V3_FEE_TIERS = [100, 500, 2500, 10000] as const;
|
|
71
|
+
|
|
72
|
+
/** Trench V2's production direct-pair adapter index in SwitchRouter. */
|
|
73
|
+
export const TRENCH_V2_ADAPTER_INDEX = 21;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Verified Trench V2 direct-pair adapter.
|
|
77
|
+
* Eligible for transfer-tax-sensitive hops because input is sent directly to
|
|
78
|
+
* the pair and execution measures the amount actually received.
|
|
79
|
+
*/
|
|
80
|
+
export const TRENCH_V2_ADAPTER =
|
|
81
|
+
"0xAf48bb0936D9fA522650236917321D89978A8591";
|
|
82
|
+
|
|
83
|
+
/** Trench V2 factory queried for pairs and pair-specific fees. */
|
|
84
|
+
export const TRENCH_V2_FACTORY =
|
|
85
|
+
"0xA024e4574406BEf89e624c75758c700B5bED27C7";
|
|
86
|
+
|
|
87
|
+
/** Trench V3's production self-quoter adapter index in SwitchRouter. */
|
|
88
|
+
export const TRENCH_V3_ADAPTER_INDEX = 22;
|
|
89
|
+
|
|
90
|
+
/** Verified Trench V3 adapter. Not safe for transfer-tax-sensitive hops. */
|
|
91
|
+
export const TRENCH_V3_ADAPTER =
|
|
92
|
+
"0x01957eC5FCC079f1bB388b9f261278daC42cf2E9";
|
|
93
|
+
|
|
94
|
+
/** Trench V3 factory queried by the adapter. */
|
|
95
|
+
export const TRENCH_V3_FACTORY =
|
|
96
|
+
"0xCAeF0a906F3323595A8faA14DF7eDee6F59220af";
|
|
97
|
+
|
|
98
|
+
/** Factory-enabled Trench V3 fee tiers, in hundredths of one basis point. */
|
|
99
|
+
export const TRENCH_V3_FEE_TIERS = [100, 500, 2500, 3000, 10000] as const;
|
|
67
100
|
|
|
68
101
|
// ── Limit Order contract ────────────────────────────────────────────────
|
|
69
102
|
|
|
70
103
|
/**
|
|
71
104
|
* SwitchLimitOrder contract address on PulseChain.
|
|
72
105
|
*
|
|
73
|
-
* This is the current production limit order contract.
|
|
74
|
-
* For integrators, treat this as user-facing
|
|
75
|
-
* The EIP-712 domain `verifyingContract` MUST match this address.
|
|
76
|
-
*/
|
|
77
|
-
export const SWITCH_LIMIT_ORDER = "
|
|
106
|
+
* This is the current protected production limit order contract.
|
|
107
|
+
* For integrators, treat this as user-facing V3.
|
|
108
|
+
* The EIP-712 domain `verifyingContract` MUST match this address.
|
|
109
|
+
*/
|
|
110
|
+
export const SWITCH_LIMIT_ORDER = "0x2afBf0aB8d958a0227742F7a8BdA00c96372E4D7";
|
|
78
111
|
|
|
79
112
|
/**
|
|
80
113
|
* Previous production SwitchLimitOrder contract on PulseChain.
|
|
@@ -84,11 +117,15 @@ export const SWITCH_LIMIT_ORDER = "0x8e3881bdF81Fc0211383B2e576076B654F7aFD86";
|
|
|
84
117
|
export const SWITCH_LIMIT_ORDER_V1 = "0x0e884072a891b406c0d814907a1e2310fe5f5deb";
|
|
85
118
|
|
|
86
119
|
/**
|
|
87
|
-
*
|
|
120
|
+
* Second production SwitchLimitOrder deployment, retained for legacy orders.
|
|
88
121
|
*
|
|
89
122
|
* Use this if you want explicit user-facing version naming in integrations.
|
|
90
123
|
*/
|
|
91
|
-
export const SWITCH_LIMIT_ORDER_V2 =
|
|
124
|
+
export const SWITCH_LIMIT_ORDER_V2 =
|
|
125
|
+
"0x8e3881bdF81Fc0211383B2e576076B654F7aFD86";
|
|
126
|
+
|
|
127
|
+
/** Current protected production SwitchLimitOrder contract alias. */
|
|
128
|
+
export const SWITCH_LIMIT_ORDER_V3 = SWITCH_LIMIT_ORDER;
|
|
92
129
|
|
|
93
130
|
/**
|
|
94
131
|
* SwitchPLSFlow contract address on PulseChain.
|
|
@@ -97,10 +134,10 @@ export const SWITCH_LIMIT_ORDER_V2 = SWITCH_LIMIT_ORDER;
|
|
|
97
134
|
* which wraps to WPLS and creates the limit order on their behalf.
|
|
98
135
|
* No EIP-712 signing required — single transaction.
|
|
99
136
|
*
|
|
100
|
-
* This is the current production PLSFlow contract.
|
|
101
|
-
* For integrators, treat this as user-facing
|
|
102
|
-
*/
|
|
103
|
-
export const SWITCH_PLS_FLOW = "
|
|
137
|
+
* This is the current protected production PLSFlow contract.
|
|
138
|
+
* For integrators, treat this as user-facing V3.
|
|
139
|
+
*/
|
|
140
|
+
export const SWITCH_PLS_FLOW = "0x0362177FF2ad25a33a879c881a5055575C63a4cE";
|
|
104
141
|
|
|
105
142
|
/**
|
|
106
143
|
* Previous production SwitchPLSFlow contract on PulseChain.
|
|
@@ -110,11 +147,31 @@ export const SWITCH_PLS_FLOW = "0xCf5606bdC750d8626Cec32CA2E1BB207968db1D5";
|
|
|
110
147
|
export const SWITCH_PLS_FLOW_V1 = "0x88c9e2C83b6B7c707602e548481e58E920694E64";
|
|
111
148
|
|
|
112
149
|
/**
|
|
113
|
-
*
|
|
150
|
+
* Second production SwitchPLSFlow deployment, retained for legacy orders.
|
|
114
151
|
*
|
|
115
152
|
* Use this if you want explicit user-facing version naming in integrations.
|
|
116
153
|
*/
|
|
117
|
-
export const SWITCH_PLS_FLOW_V2 =
|
|
154
|
+
export const SWITCH_PLS_FLOW_V2 =
|
|
155
|
+
"0xCf5606bdC750d8626Cec32CA2E1BB207968db1D5";
|
|
156
|
+
|
|
157
|
+
/** Current protected production SwitchPLSFlow contract alias. */
|
|
158
|
+
export const SWITCH_PLS_FLOW_V3 = SWITCH_PLS_FLOW;
|
|
159
|
+
|
|
160
|
+
/** Direct-fill market-price guard bound to the current PulseChain Router. */
|
|
161
|
+
export const SWITCH_DIRECT_FILL_QUOTER =
|
|
162
|
+
"0x23A95b0f69c993CFe6180a266A93F7560102e929";
|
|
163
|
+
|
|
164
|
+
/** Router adapter for current protected limit-order liquidity (adapter index 17). */
|
|
165
|
+
export const SWITCH_LIMIT_ORDER_ADAPTER =
|
|
166
|
+
"0x7B9761484301a8FE4a2BA47194F7646eEF8e1cDd";
|
|
167
|
+
|
|
168
|
+
/** Narrow PulseChain bridge used to add and remove limit-order operators. */
|
|
169
|
+
export const LIMIT_ORDER_ADMIN =
|
|
170
|
+
"0x9C8B9012AfC0489dE612F7039665212EB88be127";
|
|
171
|
+
|
|
172
|
+
/** PulseChain paid operator-seat and adapter-access registry. */
|
|
173
|
+
export const OPERATOR_ACCESS_REGISTRY =
|
|
174
|
+
"0x7dA1AB04A712479569cCaD783Ca6114b763e36Ad";
|
|
118
175
|
|
|
119
176
|
// ── Limit Order API endpoints ───────────────────────────────────────────────
|
|
120
177
|
|
|
@@ -135,8 +192,17 @@ export const LIMIT_ORDER_STATS_ENDPOINT = `${LIMIT_ORDERS_ENDPOINT}/stats`;
|
|
|
135
192
|
/** Fee denominator — all fees are in basis points (1 bps = 0.01%) */
|
|
136
193
|
export const FEE_DENOMINATOR = 10_000;
|
|
137
194
|
|
|
138
|
-
/** Maximum allowed fee (basis points). 100 bps = 1% */
|
|
139
|
-
export const MAX_FEE_BPS = 100;
|
|
195
|
+
/** Maximum allowed fee (basis points). 100 bps = 1% */
|
|
196
|
+
export const MAX_FEE_BPS = 100;
|
|
197
|
+
|
|
198
|
+
/** Current regular-swap protocol fee on PulseChain and Robinhood Chain. */
|
|
199
|
+
export const DEFAULT_SWAP_FEE_BPS = 10;
|
|
200
|
+
|
|
201
|
+
/** Current limit-order protocol fee on both supported networks. */
|
|
202
|
+
export const LIMIT_ORDER_FEE_BPS = 30;
|
|
203
|
+
|
|
204
|
+
/** Maximum operator excess retained by protected limit-order contracts. */
|
|
205
|
+
export const MAX_OPERATOR_EXCESS_BPS = 500;
|
|
140
206
|
|
|
141
207
|
/** Maximum allowed slippage (basis points). 5000 bps = 50% */
|
|
142
208
|
export const MAX_SLIPPAGE_BPS = 5_000;
|
|
@@ -284,8 +350,14 @@ export const LIMIT_ORDER_EIP712_TYPES = {
|
|
|
284
350
|
*
|
|
285
351
|
* The full ABI is available at `@switch-win/sdk/abi/limit-order`.
|
|
286
352
|
*/
|
|
287
|
-
export const LIMIT_ORDER_ABI = [
|
|
288
|
-
"function
|
|
353
|
+
export const LIMIT_ORDER_ABI = [
|
|
354
|
+
"function SWITCH_ROUTER() view returns (address)",
|
|
355
|
+
"function MAX_OPERATOR_EXCESS_BPS() view returns (uint256)",
|
|
356
|
+
"function getFee() view returns (uint256)",
|
|
357
|
+
"function operatorGateEnabled() view returns (bool)",
|
|
358
|
+
"function directFillQuoter() view returns (address)",
|
|
359
|
+
"function plsFlowContract() view returns (address)",
|
|
360
|
+
"function invalidateNonce(uint256 _nonce) external",
|
|
289
361
|
"function invalidateNonces(uint256[] calldata _nonces) external",
|
|
290
362
|
"function isNonceUsed(address maker, uint256 nonce) view returns (bool)",
|
|
291
363
|
"function canFillOrder(tuple(address maker, address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, uint256 deadline, uint256 nonce, bool feeOnOutput, address recipient, bool unwrapOutput, address partnerAddress) order, bytes signature) view returns (bool)",
|
|
@@ -294,7 +366,7 @@ export const LIMIT_ORDER_ABI = [
|
|
|
294
366
|
/**
|
|
295
367
|
* SwitchLimitOrder custom error signatures for decoding reverts.
|
|
296
368
|
*/
|
|
297
|
-
export const LIMIT_ORDER_ERRORS = [
|
|
369
|
+
export const LIMIT_ORDER_ERRORS = [
|
|
298
370
|
"error InvalidSignature()",
|
|
299
371
|
"error NonceAlreadyUsed()",
|
|
300
372
|
"error OrderExpired()",
|
|
@@ -304,8 +376,15 @@ export const LIMIT_ORDER_ERRORS = [
|
|
|
304
376
|
"error RouteInputExceedsMax()",
|
|
305
377
|
"error InvalidTokens()",
|
|
306
378
|
"error TransferFailed()",
|
|
307
|
-
"error OperatorOnly()",
|
|
308
|
-
|
|
379
|
+
"error OperatorOnly()",
|
|
380
|
+
"error NativeFlowInputNotFullyConsumed()",
|
|
381
|
+
"error RouteTokenInMismatch()",
|
|
382
|
+
"error RouteTokenOutMismatch()",
|
|
383
|
+
"error InvalidDirectFillQuoter()",
|
|
384
|
+
"error DirectFillQuoteUnavailable()",
|
|
385
|
+
"error DirectFillPriceTooLow()",
|
|
386
|
+
"error OperatorManagerOnly()",
|
|
387
|
+
] as const;
|
|
309
388
|
|
|
310
389
|
/**
|
|
311
390
|
* 4-byte error selectors for SwitchLimitOrder reverts.
|
|
@@ -326,8 +405,15 @@ export const LIMIT_ORDER_ERROR_SELECTORS: Record<string, string> = {
|
|
|
326
405
|
"0xb6972a87": "RouteInputExceedsMax",
|
|
327
406
|
"0x672215de": "InvalidTokens",
|
|
328
407
|
"0x90b8ec18": "TransferFailed",
|
|
329
|
-
"0xae5e3e00": "OperatorOnly",
|
|
330
|
-
|
|
408
|
+
"0xae5e3e00": "OperatorOnly",
|
|
409
|
+
"0x42e89a78": "NativeFlowInputNotFullyConsumed",
|
|
410
|
+
"0x54346455": "RouteTokenInMismatch",
|
|
411
|
+
"0xa587e83b": "RouteTokenOutMismatch",
|
|
412
|
+
"0xdcd56106": "InvalidDirectFillQuoter",
|
|
413
|
+
"0x0e4c7aa9": "DirectFillQuoteUnavailable",
|
|
414
|
+
"0xca8ecf0e": "DirectFillPriceTooLow",
|
|
415
|
+
"0xb68f3df5": "OperatorManagerOnly",
|
|
416
|
+
};
|
|
331
417
|
|
|
332
418
|
/**
|
|
333
419
|
* Minimal ABI for the SwitchPLSFlow contract.
|
|
@@ -336,25 +422,57 @@ export const LIMIT_ORDER_ERROR_SELECTORS: Record<string, string> = {
|
|
|
336
422
|
* The contract wraps PLS to WPLS and places the limit order on behalf
|
|
337
423
|
* of the sender.
|
|
338
424
|
*/
|
|
339
|
-
export const PLS_FLOW_ABI = [
|
|
340
|
-
"function createOrder(address tokenOut, uint256 minAmountOut, uint256 deadline, bool feeOnOutput, bool unwrapOutput, address partnerAddress) payable returns (uint256 nonce)",
|
|
341
|
-
"function cancelOrder(uint256 nonce) external",
|
|
342
|
-
"function
|
|
343
|
-
"
|
|
344
|
-
|
|
425
|
+
export const PLS_FLOW_ABI = [
|
|
426
|
+
"function createOrder(address tokenOut, uint256 minAmountOut, uint256 deadline, bool feeOnOutput, bool unwrapOutput, address partnerAddress) payable returns (uint256 nonce)",
|
|
427
|
+
"function cancelOrder(uint256 nonce) external",
|
|
428
|
+
"function getOrder(uint256 nonce) view returns (tuple(address originalMaker, address tokenOut, uint256 amountIn, uint256 minAmountOut, uint256 deadline, uint256 createdAt, bool feeOnOutput, bool unwrapOutput, bool active, address recipient, address partnerAddress))",
|
|
429
|
+
"function globalNonceCounter() view returns (uint256)",
|
|
430
|
+
"function getGlobalNonce() view returns (uint256)",
|
|
431
|
+
"function orderCreationEnabled() view returns (bool)",
|
|
432
|
+
"function isOrderActive(uint256 nonce) view returns (bool)",
|
|
433
|
+
"function totalLockedWPLS() view returns (uint256)",
|
|
434
|
+
"function SWITCH_LIMIT_ORDER() view returns (address)",
|
|
435
|
+
"function SWITCH_ROUTER() view returns (address)",
|
|
436
|
+
"function WNATIVE() view returns (address)",
|
|
437
|
+
"event PLSOrderCreated(address indexed originalMaker, uint256 indexed nonce, address tokenOut, uint256 amountIn, uint256 minAmountOut, uint256 deadline, address recipient)",
|
|
438
|
+
"event PLSOrderCancelled(address indexed originalMaker, uint256 indexed nonce, uint256 refundAmount)",
|
|
439
|
+
"event PLSOrderFilled(address indexed originalMaker, uint256 indexed nonce, uint256 amountIn)",
|
|
440
|
+
"event PLSOrderInputExcessRefunded(address indexed originalMaker, uint256 indexed nonce, uint256 amount)",
|
|
441
|
+
"event OrderCreationEnabledUpdated(bool enabled)",
|
|
442
|
+
] as const;
|
|
345
443
|
|
|
346
444
|
/**
|
|
347
445
|
* SwitchPLSFlow custom error signatures for decoding reverts.
|
|
348
446
|
*/
|
|
349
|
-
export const PLS_FLOW_ERRORS = [
|
|
350
|
-
"error
|
|
351
|
-
"error
|
|
352
|
-
|
|
447
|
+
export const PLS_FLOW_ERRORS = [
|
|
448
|
+
"error ZeroAmount()",
|
|
449
|
+
"error InvalidToken()",
|
|
450
|
+
"error OrderNotActive()",
|
|
451
|
+
"error NotOrderOwner()",
|
|
452
|
+
"error TransferFailed()",
|
|
453
|
+
"error OrderAlreadyFilled()",
|
|
454
|
+
"error AccountingMismatch()",
|
|
455
|
+
"error OrderNotEligibleForAdminCancel()",
|
|
456
|
+
"error OnlyLimitOrder()",
|
|
457
|
+
"error OrderNotFilled()",
|
|
458
|
+
"error InvalidDeadline()",
|
|
459
|
+
"error OrderCreationDisabled()",
|
|
460
|
+
] as const;
|
|
353
461
|
|
|
354
462
|
/**
|
|
355
463
|
* 4-byte error selectors for SwitchPLSFlow reverts.
|
|
356
464
|
*/
|
|
357
|
-
export const PLS_FLOW_ERROR_SELECTORS: Record<string, string> = {
|
|
358
|
-
"
|
|
359
|
-
"
|
|
360
|
-
|
|
465
|
+
export const PLS_FLOW_ERROR_SELECTORS: Record<string, string> = {
|
|
466
|
+
"0x1f2a2005": "ZeroAmount",
|
|
467
|
+
"0xc1ab6dc1": "InvalidToken",
|
|
468
|
+
"0x1d4ecc5b": "OrderNotActive",
|
|
469
|
+
"0xf6412b5a": "NotOrderOwner",
|
|
470
|
+
"0x90b8ec18": "TransferFailed",
|
|
471
|
+
"0xee3b3d4b": "OrderAlreadyFilled",
|
|
472
|
+
"0xc5ec2f3b": "AccountingMismatch",
|
|
473
|
+
"0x40db5c93": "OrderNotEligibleForAdminCancel",
|
|
474
|
+
"0x08ff2059": "OnlyLimitOrder",
|
|
475
|
+
"0x789bae35": "OrderNotFilled",
|
|
476
|
+
"0x769d11e4": "InvalidDeadline",
|
|
477
|
+
"0x86ec3378": "OrderCreationDisabled",
|
|
478
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -58,16 +58,27 @@ export {
|
|
|
58
58
|
QUOTE_ENDPOINT,
|
|
59
59
|
ADAPTERS_ENDPOINT,
|
|
60
60
|
CHECK_TAX_ENDPOINT,
|
|
61
|
-
CHAIN_ID,
|
|
61
|
+
CHAIN_ID,
|
|
62
62
|
SWITCH_ROUTER,
|
|
63
|
+
LEGACY_SWITCH_ROUTER,
|
|
63
64
|
NATIVE_PLS,
|
|
64
65
|
WPLS,
|
|
65
66
|
FINVESTA_V3_ADAPTER_INDEX,
|
|
66
67
|
FINVESTA_V3_ADAPTER,
|
|
67
68
|
FINVESTA_V3_FACTORY,
|
|
68
69
|
FINVESTA_V3_FEE_TIERS,
|
|
70
|
+
TRENCH_V2_ADAPTER_INDEX,
|
|
71
|
+
TRENCH_V2_ADAPTER,
|
|
72
|
+
TRENCH_V2_FACTORY,
|
|
73
|
+
TRENCH_V3_ADAPTER_INDEX,
|
|
74
|
+
TRENCH_V3_ADAPTER,
|
|
75
|
+
TRENCH_V3_FACTORY,
|
|
76
|
+
TRENCH_V3_FEE_TIERS,
|
|
69
77
|
FEE_DENOMINATOR,
|
|
70
|
-
MAX_FEE_BPS,
|
|
78
|
+
MAX_FEE_BPS,
|
|
79
|
+
DEFAULT_SWAP_FEE_BPS,
|
|
80
|
+
LIMIT_ORDER_FEE_BPS,
|
|
81
|
+
MAX_OPERATOR_EXCESS_BPS,
|
|
71
82
|
MAX_SLIPPAGE_BPS,
|
|
72
83
|
DEFAULT_SLIPPAGE_BPS,
|
|
73
84
|
BLUE_CHIPS,
|
|
@@ -81,8 +92,16 @@ export {
|
|
|
81
92
|
export {
|
|
82
93
|
SWITCH_LIMIT_ORDER,
|
|
83
94
|
SWITCH_LIMIT_ORDER_V1,
|
|
84
|
-
SWITCH_LIMIT_ORDER_V2,
|
|
85
|
-
|
|
95
|
+
SWITCH_LIMIT_ORDER_V2,
|
|
96
|
+
SWITCH_LIMIT_ORDER_V3,
|
|
97
|
+
SWITCH_PLS_FLOW,
|
|
98
|
+
SWITCH_PLS_FLOW_V1,
|
|
99
|
+
SWITCH_PLS_FLOW_V2,
|
|
100
|
+
SWITCH_PLS_FLOW_V3,
|
|
101
|
+
SWITCH_DIRECT_FILL_QUOTER,
|
|
102
|
+
SWITCH_LIMIT_ORDER_ADAPTER,
|
|
103
|
+
LIMIT_ORDER_ADMIN,
|
|
104
|
+
OPERATOR_ACCESS_REGISTRY,
|
|
86
105
|
LIMIT_ORDER_API_BASE,
|
|
87
106
|
LIMIT_ORDERS_ENDPOINT,
|
|
88
107
|
LIMIT_ORDER_PAIRS_ENDPOINT,
|
|
@@ -23,14 +23,20 @@ export const ROBINHOOD_NATIVE_ETH =
|
|
|
23
23
|
/** Switch contracts deployed on Robinhood Chain. */
|
|
24
24
|
export const ROBINHOOD_SWITCH_CONTRACTS = {
|
|
25
25
|
/** ERC-20 approval target. Use quote.tx.to when submitting a swap. */
|
|
26
|
-
router: "
|
|
26
|
+
router: "0x8b2bBdF41C1486b3482bD0e9603d72f012EE8599",
|
|
27
|
+
legacyRouter: "0x8730C3e2cF2c8CDa8E6166837A1Ed26f46aa9E59",
|
|
28
|
+
/** Legacy view remains bound to the legacy Router; prefer hosted API quotes. */
|
|
27
29
|
routerView: "0xFF6b56d3F444eB5b7FA1db047F57140C84810376",
|
|
28
|
-
limitOrder: "
|
|
29
|
-
|
|
30
|
+
limitOrder: "0x1E05115387f314398bbb1A808B25308E71150396",
|
|
31
|
+
legacyLimitOrder: "0x752c50DDd3B426cAE3D7A995F313Ac74ac6B0230",
|
|
32
|
+
nativeEthFlow: "0x8170a3B0e2FD2e4333E0Ca9c9414B2D3dd6aF689",
|
|
33
|
+
legacyNativeEthFlow: "0x029FfC6aF9112eA078f1D6f4a98826DDB2136cf6",
|
|
34
|
+
directFillQuoter: "0x77b246C127c3c501Ec2836A2B53B555208b30B44",
|
|
30
35
|
uniswapV2Adapter: "0x7a14d7A8509a66209D4332843b983b29bF5604A4",
|
|
31
36
|
uniswapV3Adapter: "0xbcA08f296d9Ba0dc19Aa0E05D355365cE29A3205",
|
|
32
37
|
uniswapV4Adapter: "0xB9885d3C55e79499bf887F2fBe445e01A8cFFf1c",
|
|
33
|
-
limitOrderAdapter: "
|
|
38
|
+
limitOrderAdapter: "0xb13CC4C37e1C609617C51B5dCDf8e4Ae5721Faa4",
|
|
39
|
+
legacyLimitOrderAdapter: "0x412F625072c10e58C619D1e0b3C95cd3d5689871",
|
|
34
40
|
swapHoodV2Adapter: "0x6D8746f02e52944c13824fA691c6f4186E463354",
|
|
35
41
|
swapHoodV3Adapter: "0x9645dE0AcB48F0AAefdBEb423F0558457907DE98",
|
|
36
42
|
up33Adapter: "0x388179D2FB0ABcE9b03068916aF8a3c4dfD023c8",
|
|
@@ -60,7 +66,7 @@ export interface RobinhoodAdapter {
|
|
|
60
66
|
}
|
|
61
67
|
|
|
62
68
|
/**
|
|
63
|
-
* Snapshot of the ordered production adapter registry verified on 2026-08-
|
|
69
|
+
* Snapshot of the ordered production adapter registry verified on 2026-08-25.
|
|
64
70
|
*
|
|
65
71
|
* Adapter registration can change. Fetch
|
|
66
72
|
* `GET /swap/adapters?network=robinhood` when runtime freshness matters.
|