@t2000/sdk 0.21.16 → 0.22.1
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/README.md +37 -9
- package/dist/adapters/index.cjs +1 -1
- package/dist/adapters/index.cjs.map +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/browser.cjs +44 -22
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +1 -1
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +38 -23
- package/dist/browser.js.map +1 -1
- package/dist/index.cjs +63 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +60 -58
- package/dist/index.js.map +1 -1
- package/dist/{token-registry-CVba8FI2.d.ts → token-registry-BBAPkvGS.d.ts} +24 -10
- package/dist/{token-registry-DIl3H4Jh.d.cts → token-registry-abuw6uo0.d.cts} +24 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -89,7 +89,7 @@ const agent = T2000.fromPrivateKey('suiprivkey1q...');
|
|
|
89
89
|
| `agent.address()` | Wallet Sui address | `string` |
|
|
90
90
|
| `agent.balance()` | Available USDC + savings + gas reserve | `BalanceResponse` |
|
|
91
91
|
| `agent.send({ to, amount, asset? })` | Transfer USDC to any Sui address | `SendResult` |
|
|
92
|
-
| `agent.save({ amount,
|
|
92
|
+
| `agent.save({ amount, protocol? })` | Deposit **USDC** to savings (earn APY). Auto-selects best rate or specify `protocol`. `amount` can be `'all'`. | `SaveResult` |
|
|
93
93
|
| `agent.withdraw({ amount, asset? })` | Withdraw from savings. `amount` can be `'all'`. Optional `asset` for multi-asset withdrawals (default: USDC). | `WithdrawResult` |
|
|
94
94
|
| `agent.borrow({ amount })` | Borrow USDC against collateral | `BorrowResult` |
|
|
95
95
|
| `agent.repay({ amount })` | Repay outstanding debt in USDC. `amount` can be `'all'`. | `RepayResult` |
|
|
@@ -258,12 +258,40 @@ Options like `pin`, `keyPath`, and `rpcUrl` are passed directly to `T2000.create
|
|
|
258
258
|
|
|
259
259
|
## Supported Assets
|
|
260
260
|
|
|
261
|
-
|
|
261
|
+
Token metadata and **tiers** live in `token-registry.ts` (`COIN_REGISTRY`). **17 tokens** total:
|
|
262
262
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
263
|
+
- **Tier 1:** USDC — save, borrow, send, swap.
|
|
264
|
+
- **Tier 2 (13):** SUI, wBTC, ETH, GOLD, DEEP, WAL, NS, IKA, CETUS, NAVX, vSUI, LOFI, MANIFEST — send and swap only (not for new save/borrow deposits).
|
|
265
|
+
- **Legacy (no tier):** USDT, USDe, USDSUI — display and withdraw of existing positions; still send/swap where applicable.
|
|
266
|
+
|
|
267
|
+
Eight tokens were removed from the registry (haSUI, afSUI, FDUSD, AUSD, BUCK, BLUB, SCA, TURBOS). **`STABLE_ASSETS`** is `['USDC']` only.
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
import {
|
|
271
|
+
COIN_REGISTRY,
|
|
272
|
+
TOKEN_MAP,
|
|
273
|
+
isTier1,
|
|
274
|
+
isTier2,
|
|
275
|
+
isSupported,
|
|
276
|
+
getTier,
|
|
277
|
+
getDecimalsForCoinType,
|
|
278
|
+
resolveSymbol,
|
|
279
|
+
resolveTokenType,
|
|
280
|
+
SUI_TYPE,
|
|
281
|
+
USDC_TYPE,
|
|
282
|
+
USDT_TYPE,
|
|
283
|
+
IKA_TYPE,
|
|
284
|
+
LOFI_TYPE,
|
|
285
|
+
MANIFEST_TYPE,
|
|
286
|
+
} from '@t2000/sdk';
|
|
287
|
+
|
|
288
|
+
isTier1(USDC_TYPE); // true
|
|
289
|
+
isTier2(SUI_TYPE); // true
|
|
290
|
+
isSupported(USDT_TYPE); // false (legacy — no tier)
|
|
291
|
+
getTier(SUI_TYPE); // 2
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Swap uses Cetus Aggregator V3 (with a **0.1% t2000 overlay fee** on executed swaps). Use `COIN_REGISTRY`, `getDecimalsForCoinType()`, `resolveSymbol()`, and `resolveTokenType()` for token data.
|
|
267
295
|
|
|
268
296
|
## Error Handling
|
|
269
297
|
|
|
@@ -280,7 +308,7 @@ try {
|
|
|
280
308
|
}
|
|
281
309
|
```
|
|
282
310
|
|
|
283
|
-
Common error codes: `INSUFFICIENT_BALANCE` · `INVALID_ADDRESS` · `INVALID_AMOUNT` · `HEALTH_FACTOR_TOO_LOW` · `NO_COLLATERAL` · `WALLET_NOT_FOUND` · `WALLET_LOCKED` · `WALLET_EXISTS` · `SIMULATION_FAILED` · `TRANSACTION_FAILED` · `PROTOCOL_PAUSED` · `INSUFFICIENT_GAS` · `WITHDRAW_WOULD_LIQUIDATE` · `AUTO_TOPUP_FAILED` · `GAS_STATION_UNAVAILABLE` · `SWAP_NO_ROUTE` · `SWAP_FAILED`
|
|
311
|
+
Common error codes: `INSUFFICIENT_BALANCE` · `INVALID_ADDRESS` · `INVALID_AMOUNT` · `INVALID_ASSET` · `HEALTH_FACTOR_TOO_LOW` · `NO_COLLATERAL` · `WALLET_NOT_FOUND` · `WALLET_LOCKED` · `WALLET_EXISTS` · `SIMULATION_FAILED` · `TRANSACTION_FAILED` · `PROTOCOL_PAUSED` · `INSUFFICIENT_GAS` · `WITHDRAW_WOULD_LIQUIDATE` · `AUTO_TOPUP_FAILED` · `GAS_STATION_UNAVAILABLE` · `SWAP_NO_ROUTE` · `SWAP_FAILED`
|
|
284
312
|
|
|
285
313
|
## Protocol Integration
|
|
286
314
|
|
|
@@ -289,7 +317,7 @@ t2000 uses an MCP-first integration model: NAVI MCP for reads, thin transaction
|
|
|
289
317
|
| Protocol | Integration | Used for |
|
|
290
318
|
|----------|------------|----------|
|
|
291
319
|
| NAVI | MCP (reads) + thin tx builders (writes) | Lending positions, deposits, withdrawals, borrows, rewards |
|
|
292
|
-
| Cetus Aggregator V3 | `@cetusprotocol/aggregator-sdk` (isolated) | Multi-DEX swap routing —
|
|
320
|
+
| Cetus Aggregator V3 | `@cetusprotocol/aggregator-sdk` (isolated) | Multi-DEX swap routing — overlay fee on swaps (`cetus-swap.ts`) |
|
|
293
321
|
| VOLO | Thin tx builders (direct Move calls) | Stake SUI → vSUI, unstake vSUI → SUI |
|
|
294
322
|
|
|
295
323
|
## Testing
|
|
@@ -311,7 +339,7 @@ SMOKE=1 pnpm --filter @t2000/sdk test -- src/__smoke__
|
|
|
311
339
|
| Withdraw | Free | |
|
|
312
340
|
| Repay | Free | |
|
|
313
341
|
| Send | Free | |
|
|
314
|
-
| Swap |
|
|
342
|
+
| Swap | 0.10% | t2000 overlay on swap amount; Cetus Aggregator network fees still apply |
|
|
315
343
|
| Stake (vSUI) | Free | VOLO protocol fees only |
|
|
316
344
|
| Unstake (vSUI) | Free | |
|
|
317
345
|
| Pay (MPP) | Free | Agent pays the API price, no t2000 surcharge |
|
package/dist/adapters/index.cjs
CHANGED
|
@@ -62,7 +62,7 @@ var SUPPORTED_ASSETS = {
|
|
|
62
62
|
displayName: "XAUM"
|
|
63
63
|
}
|
|
64
64
|
};
|
|
65
|
-
var STABLE_ASSETS = ["USDC"
|
|
65
|
+
var STABLE_ASSETS = ["USDC"];
|
|
66
66
|
var ALL_NAVI_ASSETS = Object.keys(SUPPORTED_ASSETS);
|
|
67
67
|
var T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? "0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3";
|
|
68
68
|
var T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? "0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/constants.ts","../../src/errors.ts","../../src/adapters/registry.ts","../../src/utils/format.ts","../../src/protocols/protocolFee.ts","../../src/protocols/navi.ts","../../src/adapters/descriptors.ts","../../src/adapters/navi.ts"],"names":["naviGetPools","updateOraclePriceBeforeUserOperationPTB","getLendingPositions","naviGetHealthFactor","Transaction","depositCoinPTB","withdrawCoinPTB","repayCoinPTB","borrowCoinPTB","getUserAvailableLendingRewards","summaryLendingRewards","claimLendingRewardsPTB"],"mappings":";;;;;;AAgBO,IAAM,YAAA,GAAe,GAAA;AACrB,IAAM,cAAA,GAAiB,EAAA;AAIvB,IAAM,gBAAA,GAAmB;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,gFAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,gFAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,wFAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,oFAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,KAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,8EAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,KAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,8EAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,KAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,gFAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,gFAAA;AAAA,IACN,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa;AAAA;AAEjB,CAAA;AAIO,IAAM,aAAA,GAAwC,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AAC/E,IAAM,eAAA,GAA6C,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA;AAE/E,IAAM,gBAAA,GAAmB,OAAA,CAAQ,GAAA,CAAI,gBAAA,IAAoB,oEAAA;AACzD,IAAM,eAAA,GAAkB,OAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,oEAAA;AAEvD,IAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,iBAAA,IAAqB,oEAAA;AAOtC,OAAA,CAAQ,GAAA,CAAI,aAAA,IAAiB;;;AChDlD,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA,EAC3B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EAET,WAAA,CAAY,IAAA,EAAsB,OAAA,EAAiB,IAAA,EAAuB,YAAY,KAAA,EAAO;AAC3F,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,MAAA,GAAS;AACP,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,IAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,GAAI,IAAA,CAAK,IAAA,IAAQ,EAAE,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MACnC,WAAW,IAAA,CAAK;AAAA,KAClB;AAAA,EACF;AACF,CAAA;;;AC1DO,IAAM,mBAAN,MAAuB;AAAA,EACpB,OAAA,uBAA2C,GAAA,EAAI;AAAA,EAEvD,gBAAgB,OAAA,EAA+B;AAC7C,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,aAAa,KAAA,EAAyE;AAC1F,IAAA,MAAM,aAAqE,EAAC;AAE5E,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,MAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,MAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AACzC,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,UAAA,CAAW,qBAAA,EAAuB,CAAA,mCAAA,EAAsC,KAAK,CAAA,CAAE,CAAA;AAAA,IAC3F;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,OAAA,GAAU,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AACzD,IAAA,OAAO,WAAW,CAAC,CAAA;AAAA,EACrB;AAAA,EAEA,MAAM,cAAA,CAAe,KAAA,EAAe,IAAA,EAAuG;AACzI,IAAA,MAAM,aAAqE,EAAC;AAE5E,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,MAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,MAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC9C,MAAA,IAAI,IAAA,EAAM,sBAAA,IAA0B,CAAC,OAAA,CAAQ,uBAAA,EAAyB;AACtE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AACzC,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,UAAA,CAAW,qBAAA,EAAuB,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAE,CAAA;AAAA,IAC9F;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,SAAA,GAAY,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA;AAC7D,IAAA,OAAO,WAAW,CAAC,CAAA;AAAA,EACrB;AAAA,EAEA,MAAM,wBAAA,GAAoG;AACxG,IAAA,MAAM,aAAoF,EAAC;AAE3F,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,QAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,QAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5C,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AACzC,UAAA,UAAA,CAAW,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,CAAA;AAAA,QAC1C,CAAA,CAAA,MAAQ;AAAA,QAAa;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,UAAA,CAAW,qBAAA,EAAuB,6CAA6C,CAAA;AAAA,IAC3F;AAEA,IAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,OAAA,GAAU,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AACzD,IAAA,OAAO,WAAW,CAAC,CAAA;AAAA,EACrB;AAAA,EAEA,MAAM,oBAAA,GAAqH;AACzH,IAAA,MAAM,UAA+F,EAAC;AACtG,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,MAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,QAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAC1C,UAAA,IAAI,KAAA,CAAM,OAAA,GAAU,CAAA,IAAK,KAAA,CAAM,YAAY,CAAA,EAAG;AAC5C,YAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,CAAQ,IAAA,EAAM,YAAY,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,UAC/E;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAAa;AAAA,MACvB;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,KAAA,EAA8F;AAC3G,IAAA,MAAM,UAAgF,EAAC;AACvF,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,MAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAC1C,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,CAAQ,MAAM,UAAA,EAAY,OAAA,CAAQ,EAAA,EAAI,KAAA,EAAO,CAAA;AAAA,MACxE,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,OAAA,EAAwG;AACzH,IAAA,MAAM,UAAwF,EAAC;AAC/F,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,EAAG;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AACpD,QAAA,IAAI,UAAU,QAAA,CAAS,MAAA,GAAS,KAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AACjE,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,CAAQ,MAAM,UAAA,EAAY,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,CAAA;AAAA,QAC5E;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,MACpF;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,CAAA,yBAAA,EAA4B,OAAO,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,GAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACtI;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,WAAW,EAAA,EAAwC;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAAA,EAC5B;AAAA,EAEA,WAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAClC;AACF;;;AC1HO,SAAS,WAAA,CAAY,QAAgB,QAAA,EAA0B;AACpE,EAAA,OAAO,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,EAAA,IAAM,QAAQ,CAAC,CAAA;AACnD;AA4CA,IAAM,YAAA,uBAAwC,GAAA,EAAI;AAClD,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC1D,EAAA,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,WAAA,EAAY,EAAG,GAAG,CAAA;AACvC,EAAA,IAAI,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA,CAAY,aAAY,KAAM,GAAA,CAAI,aAAY,EAAG;AAC5E,IAAA,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,WAAA,CAAY,WAAA,IAAe,GAAG,CAAA;AAAA,EACtD;AACF;AAOO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,CAAA,IAAK,KAAA;AAClD;;;ACzDA,IAAM,SAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,YAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,QAAA,GAAyC;AAAA,EAC7C,IAAA,EAAM,CAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAoBO,SAAS,iBAAA,CACd,EAAA,EACA,WAAA,EACA,SAAA,EACM;AACN,EAAA,MAAM,GAAA,GAAM,UAAU,SAAS,CAAA;AAC/B,EAAA,IAAI,OAAO,EAAA,EAAI;AAEf,EAAA,EAAA,CAAG,QAAA,CAAS;AAAA,IACV,MAAA,EAAQ,GAAG,gBAAgB,CAAA,uBAAA,CAAA;AAAA,IAC3B,aAAA,EAAe,CAAC,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1C,SAAA,EAAW;AAAA,MACT,EAAA,CAAG,OAAO,iBAAiB,CAAA;AAAA,MAC3B,EAAA,CAAG,OAAO,eAAe,CAAA;AAAA,MACzB,WAAA;AAAA,MACA,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,SAAS,CAAC;AAAA;AAChC,GACD,CAAA;AACH;;;ACtCA,IAAM,iBAAA,GAAoB,GAAA;AAK1B,SAAS,WAAW,MAAA,EAAkG;AAKpH,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,QAAQ,SAAA,EAAW,CAAA,EAAG,cAAc,IAAA,EAAK;AACjE;AAQA,eAAe,aAAA,CACb,EAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,IAAI,SAAS,UAAA,EAAY;AACzB,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AACzB,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AACzB,EAAA,OAAA,CAAQ,IAAA,GAAO,IAAI,IAAA,KAAoB;AACrC,IAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,IAAY,KAAK,CAAC,CAAA,CAAE,QAAA,CAAS,kBAAkB,CAAA,EAAG;AACzE,IAAA,QAAA,CAAS,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,EAC9B,CAAA;AACA,EAAA,OAAA,CAAQ,IAAA,GAAO,IAAI,IAAA,KAAoB;AACrC,IAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,IAAY,KAAK,CAAC,CAAA,CAAE,QAAA,CAAS,YAAY,CAAA,EAAG;AACnE,IAAA,QAAA,CAAS,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,EAC9B,CAAA;AACA,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAMA,gBAAA,CAAa,UAAA,CAAW,MAAM,CAAC,CAAA;AAEnD,IAAA,MAAM,UAAA,GAAkB;AAAA,MACtB,GAAG,WAAW,MAAM,CAAA;AAAA,MACpB,MAAA,EAAQ,KAAA;AAAA;AAAA;AAAA,MAGR,oBAAA,EAAsB,CAAC,OAAA,EAAS;AAAA,KAClC;AACA,IAAA,MAAMC,+CAAA,CAAwC,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,UAAU,CAAA;AAAA,EAC9E,CAAA,CAAA,MAAQ;AAAA,EAGR,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AACf,IAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AAAA,EACjB;AACF;AAEA,IAAM,eAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS,MAAA;AAAA,EACT,OAAA,EAAS,MAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,MAAA,EAAQ,KAAA;AAAA,EACR,IAAA,EAAM,KAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,iBAAA,CAAkB,WAAmB,QAAA,EAA0B;AACtE,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC1D,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,WAAA,EAAY;AACxE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,WAAA,EAAY;AAC3E,IAAA,IAAI,UAAA,KAAe,cAAc,OAAO,GAAA;AAAA,EAC1C;AACA,EAAA,OAAO,eAAA,CAAgB,SAAS,CAAA,IAAK,SAAA;AACvC;AAEA,SAAS,iBAAiB,KAAA,EAAwE;AAChG,EAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,IAAA,MAAM,IAAA,GAAO,iBAAiB,KAAuB,CAAA;AACrD,IAAA,OAAO,EAAE,MAAM,IAAA,CAAK,IAAA,EAAM,UAAU,IAAA,CAAK,QAAA,EAAU,WAAA,EAAa,IAAA,CAAK,WAAA,EAAY;AAAA,EACnF;AACA,EAAA,MAAM,IAAI,UAAA,CAAW,qBAAA,EAAuB,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AACvE;AAGA,eAAe,UAAA,CACb,MAAA,EACA,KAAA,EACA,QAAA,EAC2D;AAC3D,EAAA,MAAM,MAAwD,EAAC;AAC/D,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,QAAA,CAAS,EAAE,OAAO,QAAA,EAAU,MAAA,EAAQ,MAAA,IAAU,MAAA,EAAW,CAAA;AACnF,IAAA,GAAA,CAAI,IAAA,CAAK,GAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,MAAO,EAAE,YAAA,EAAc,EAAE,YAAA,EAAc,OAAA,EAAS,CAAA,CAAE,OAAA,GAAU,CAAC,CAAA;AACxF,IAAA,MAAA,GAAS,IAAA,CAAK,UAAA;AACd,IAAA,OAAA,GAAU,IAAA,CAAK,WAAA;AAAA,EACjB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAA,CACP,IACA,KAAA,EAC2B;AAC3B,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,QAAS,IAAI,UAAA,CAAW,wBAAwB,mBAAmB,CAAA;AACxF,EAAA,MAAM,UAAU,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,CAAC,EAAE,YAAY,CAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,EAAA,CAAG,UAAA,CAAW,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAA,CAAG,MAAA,CAAO,CAAA,CAAE,YAAY,CAAC,CAAC,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,OAAA;AACT;AAMA,eAAsB,YAAA,CACpB,QACA,OAAA,EAC0B;AAE1B,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,MAAMC,2BAAA,CAAoB,OAAA,EAAS;AAAA,MACvD,GAAG,WAAW,MAAM,CAAA;AAAA,MACpB,OAAA,EAAS,CAAC,MAAM;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,YAA6B,EAAC;AAEpC,IAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,qBAAqB,CAAA,IACjC,GAAA,CAAI,2BAA2B,CAAA,IAC/B,GAAA,CAAI,qBAAqB,CAAA,IACzB,GAAA,CAAI,2BAA2B,CAAA;AACpC,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAC3C,MAAA,MAAM,SAAS,iBAAA,CAAkB,IAAA,CAAK,MAAM,MAAA,EAAQ,IAAA,CAAK,MAAM,QAAQ,CAAA;AACvE,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACrC,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AAC1C,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,MAAA,MAAM,GAAA,GAAA,CAAO,QAAA,GACT,UAAA,CAAW,IAAA,CAAK,sBAAA,EAAwB,GAAA,IAAO,GAAG,CAAA,GAClD,UAAA,CAAW,IAAA,CAAK,sBAAA,EAAwB,GAAA,IAAO,GAAG,CAAA,IAAK,GAAA;AAE3D,MAAA,IAAI,SAAA,GAAY,IAAA,IAAQ,MAAA,GAAS,KAAA,EAAO;AACtC,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,QAAA,EAAU,MAAA;AAAA,UACV,KAAA,EAAO,MAAA;AAAA,UACP,IAAA,EAAM,WAAW,QAAA,GAAW,MAAA;AAAA,UAC5B,MAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,SAAA,EAAU;AAAA,EACrB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AAC7E,IAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAE,CAAA;AAAA,EACjF;AACF;AAEA,eAAsB,SAAS,MAAA,EAAgD;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAMF,gBAAA,CAAa,UAAA,CAAW,MAAM,CAAC,CAAA;AACnD,IAAA,MAAM,SAAsB,EAAC;AAE7B,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAsC,CAAA,CAAE,IAAA;AAC5E,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAY;AACnC,QAAA,MAAM,UAAA,GAAA,CAAc,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,YAAY,EAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,EAAE,WAAA,EAAY;AACnG,QAAA,MAAM,YAAA,GAAe,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,WAAA,EAAY;AAC5E,QAAA,OAAO,UAAA,KAAe,YAAA;AAAA,MACxB,CAAC,CAAA;AACD,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,UAAU,UAAA,CAAW,IAAA,CAAK,sBAAA,EAAwB,GAAA,IAAO,GAAG,CAAA,GAAI,GAAA;AACtE,MAAA,MAAM,YAAY,UAAA,CAAW,IAAA,CAAK,sBAAA,EAAwB,GAAA,IAAO,GAAG,CAAA,GAAI,GAAA;AAExE,MAAA,IAAI,OAAA,IAAW,CAAA,IAAK,OAAA,GAAU,CAAA,EAAK;AACjC,QAAA,MAAA,CAAO,KAAK,CAAA,GAAI,EAAE,OAAA,EAAS,SAAA,EAAW,aAAa,CAAA,IAAK,SAAA,GAAY,CAAA,GAAM,SAAA,GAAY,CAAA,EAAE;AAAA,MAC1F;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,IAAA,EAAM,MAAA,CAAO,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,IAAA,EAAK;AACjE,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,EAAM,EAAE,SAAS,IAAA,EAAM,SAAA,EAAW,MAAK,EAAE;AAAA,EACpD;AACF;AAEA,eAAsB,eAAA,CACpB,QACA,OAAA,EAC6B;AAE7B,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACpD,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,KAAA,MAAW,GAAA,IAAO,UAAU,SAAA,EAAW;AACrC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,MAAA;AACjC,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ,QAAA,IAAY,GAAA;AAAA,SAAA,IAC5B,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU,QAAA,IAAY,GAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,KAAK,MAAMG,uBAAA,CAAoB,OAAA,EAAS,UAAA,CAAW,MAAM,CAAC,CAAA;AAChE,IAAA,YAAA,GAAe,EAAA,GAAK,MAAM,QAAA,GAAW,EAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,YAAA,GAAe,QAAA,GAAW,CAAA,GAAK,QAAA,GAAW,IAAA,GAAQ,QAAA,GAAW,QAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,MAAM,QAAQ,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AACF;AAEA,eAAsB,YACpB,MAAA,EACA,OAAA,EACA,MAAA,EACA,OAAA,GAAoD,EAAC,EAC/B;AACtB,EAAA,IAAI,CAAC,UAAU,MAAA,IAAU,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AACtD,IAAA,MAAM,IAAI,UAAA,CAAW,gBAAA,EAAkB,uCAAuC,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AAExC,EAAA,MAAM,QAAQ,MAAM,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,UAAU,IAAI,CAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,WAAW,sBAAA,EAAwB,CAAA,GAAA,EAAM,SAAA,CAAU,WAAW,CAAA,YAAA,CAAc,CAAA;AAE9G,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,MAAA,CAAO,CAAA,CAAE,OAAO,CAAA,EAAG,EAAE,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,IAAIC,wBAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,EAAA,EAAI,KAAK,CAAA;AAEpC,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,iBAAA,CAAkB,EAAA,EAAI,SAAS,MAAM,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,WAAA,CAAY,MAAA,EAAQ,SAAA,CAAU,QAAQ,CAAC,CAAA,EAAG,MAAA,CAAO,YAAY,CAAC,CAAA;AAEhG,EAAA,IAAI;AACF,IAAA,MAAMC,sBAAA,CAAe,EAAA,EAAI,SAAA,CAAU,IAAA,EAAM,OAAA,EAAkB;AAAA,MACzD,GAAG,WAAW,MAAM,CAAA;AAAA,MACpB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAE,CAAA;AAAA,EAC5E;AAEA,EAAA,OAAO,EAAA;AACT;AAEA,eAAsB,gBACpB,MAAA,EACA,OAAA,EACA,MAAA,EACA,OAAA,GAAmD,EAAC,EACG;AACvD,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AAExC,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,UAAU,SAAA,CAAU,IAAA;AAAA,IACjC,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,EAAE,KAAA,KAAU;AAAA,GAC1C;AACA,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,IAAU,CAAA;AAEpC,EAAA,MAAM,UAAA,GAAa,GAAA,GAAO,EAAA,IAAM,SAAA,CAAU,QAAA;AAC1C,EAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,UAAU,CAAC,CAAA;AAC5E,EAAA,IAAI,eAAA,IAAmB,GAAG,MAAM,IAAI,WAAW,eAAA,EAAiB,CAAA,wBAAA,EAA2B,SAAA,CAAU,WAAW,CAAA,QAAA,CAAU,CAAA;AAE1H,EAAA,MAAM,YAAY,MAAA,CAAO,WAAA,CAAY,eAAA,EAAiB,SAAA,CAAU,QAAQ,CAAC,CAAA;AACzE,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,MAAM,IAAI,UAAA,CAAW,gBAAA,EAAkB,yDAAoD,CAAA;AAAA,EAC7F;AAEA,EAAA,MAAM,EAAA,GAAK,IAAID,wBAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,EAAA,MAAM,aAAA,CAAc,IAAI,MAAA,EAAQ,OAAA,EAAS,EAAE,cAAA,EAAgB,OAAA,CAAQ,WAAW,CAAA;AAE9E,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAME,uBAAA,CAAgB,EAAA,EAAI,UAAU,IAAA,EAAM,SAAA,EAAW,UAAA,CAAW,MAAM,CAAC,CAAA;AACpF,IAAA,EAAA,CAAG,eAAA,CAAgB,CAAC,IAAiC,CAAA,EAAG,OAAO,CAAA;AAAA,EACjE,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAE,CAAA;AAAA,EAC7E;AAEA,EAAA,OAAO,EAAE,IAAI,eAAA,EAAgB;AAC/B;AAEA,eAAsB,gBACpB,EAAA,EACA,MAAA,EACA,SACA,MAAA,EACA,OAAA,GAAmD,EAAC,EACmB;AACvE,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AACvC,EAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AAExC,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,UAAU,SAAA,CAAU,IAAA;AAAA,IACjC,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,EAAE,KAAA,KAAU;AAAA,GAC1C;AACA,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,IAAU,CAAA;AAEpC,EAAA,MAAM,UAAA,GAAa,GAAA,GAAO,EAAA,IAAM,SAAA,CAAU,QAAA;AAC1C,EAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,UAAU,CAAC,CAAA;AAC5E,EAAA,IAAI,eAAA,IAAmB,GAAG,MAAM,IAAI,WAAW,eAAA,EAAiB,CAAA,wBAAA,EAA2B,SAAA,CAAU,WAAW,CAAA,QAAA,CAAU,CAAA;AAE1H,EAAA,MAAM,YAAY,MAAA,CAAO,WAAA,CAAY,eAAA,EAAiB,SAAA,CAAU,QAAQ,CAAC,CAAA;AACzE,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,MAAM,CAAC,IAAI,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS;AAAA,MACzB,MAAA,EAAQ,iBAAA;AAAA,MACR,aAAA,EAAe,CAAC,SAAA,CAAU,IAAI;AAAA,KAC/B,CAAA;AACD,IAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,CAAA,EAAE;AAAA,EACpC;AAEA,EAAA,MAAM,cAAc,EAAA,EAAI,MAAA,EAAQ,SAAS,EAAE,cAAA,EAAgB,WAAW,CAAA;AAEtE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAMA,uBAAA,CAAgB,EAAA,EAAI,UAAU,IAAA,EAAM,SAAA,EAAW,UAAA,CAAW,MAAM,CAAC,CAAA;AACpF,IAAA,OAAO,EAAE,MAAyC,eAAA,EAAgB;AAAA,EACpE,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAE,CAAA;AAAA,EAC7E;AACF;AAEA,eAAsB,YACpB,EAAA,EACA,OAAA,EACA,UACA,IAAA,EACA,OAAA,GAAoD,EAAC,EACtC;AACf,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AAExC,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,iBAAA,CAAkB,EAAA,EAAI,MAAM,MAAM,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI;AACF,IAAA,MAAMD,sBAAA,CAAe,IAAI,SAAA,CAAU,IAAA,EAAM,MAAe,EAAE,GAAA,EAAK,QAAQ,CAAA;AAAA,EACzE,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAE,CAAA;AAAA,EAC5E;AACF;AAEA,eAAsB,aACpB,EAAA,EACA,MAAA,EACA,SACA,IAAA,EACA,OAAA,GAAmD,EAAC,EACrC;AACf,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AACvC,EAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AAExC,EAAA,MAAM,cAAc,EAAA,EAAI,MAAA,EAAQ,SAAS,EAAE,cAAA,EAAgB,WAAW,CAAA;AAEtE,EAAA,IAAI;AACF,IAAA,MAAME,oBAAA,CAAa,IAAI,SAAA,CAAU,IAAA,EAAM,MAAe,EAAE,GAAA,EAAK,QAAQ,CAAA;AAAA,EACvE,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAE,CAAA;AAAA,EAC1E;AACF;AAEA,eAAsB,cACpB,MAAA,EACA,OAAA,EACA,MAAA,EACA,OAAA,GAAyE,EAAC,EACpD;AACtB,EAAA,IAAI,CAAC,UAAU,MAAA,IAAU,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AACtD,IAAA,MAAM,IAAI,UAAA,CAAW,gBAAA,EAAkB,yCAAyC,CAAA;AAAA,EAClF;AACA,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AACxC,EAAA,MAAM,YAAY,MAAA,CAAO,WAAA,CAAY,MAAA,EAAQ,SAAA,CAAU,QAAQ,CAAC,CAAA;AAEhE,EAAA,MAAM,EAAA,GAAK,IAAIH,wBAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,EAAA,MAAM,aAAA,CAAc,IAAI,MAAA,EAAQ,OAAA,EAAS,EAAE,cAAA,EAAgB,OAAA,CAAQ,WAAW,CAAA;AAE9E,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAMI,qBAAA,CAAc,EAAA,EAAI,UAAU,IAAA,EAAM,SAAA,EAAW,UAAA,CAAW,MAAM,CAAC,CAAA;AAE1F,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,iBAAA,CAAkB,EAAA,EAAI,cAA2C,QAAQ,CAAA;AAAA,IAC3E;AAEA,IAAA,EAAA,CAAG,eAAA,CAAgB,CAAC,YAAyC,CAAA,EAAG,OAAO,CAAA;AAAA,EACzE,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,EAAA;AACT;AAEA,eAAsB,aACpB,MAAA,EACA,OAAA,EACA,MAAA,EACA,OAAA,GAAyE,EAAC,EACpD;AACtB,EAAA,IAAI,CAAC,UAAU,MAAA,IAAU,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AACtD,IAAA,MAAM,IAAI,UAAA,CAAW,gBAAA,EAAkB,wCAAwC,CAAA;AAAA,EACjF;AACA,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,iBAAiB,KAAK,CAAA;AAExC,EAAA,MAAM,QAAQ,MAAM,UAAA,CAAW,MAAA,EAAQ,OAAA,EAAS,UAAU,IAAI,CAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,WAAW,sBAAA,EAAwB,CAAA,GAAA,EAAM,SAAA,CAAU,WAAW,CAAA,8DAAA,CAAgE,CAAA;AAEhK,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,MAAA,CAAO,CAAA,CAAE,OAAO,CAAA,EAAG,EAAE,CAAA;AACzE,EAAA,MAAM,eAAe,MAAA,CAAO,WAAA,CAAY,MAAA,EAAQ,SAAA,CAAU,QAAQ,CAAC,CAAA;AAEnE,EAAA,IAAI,OAAO,YAAY,CAAA,GAAI,gBAAgB,MAAA,CAAO,YAAY,IAAI,GAAA,EAAM;AACtE,IAAA,MAAM,IAAI,WAAW,sBAAA,EAAwB,CAAA,WAAA,EAAc,UAAU,WAAW,CAAA,iBAAA,EAAoB,OAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,eAAA,EAAA,CAAmB,MAAA,CAAO,YAAY,CAAA,GAAI,EAAA,IAAM,UAAU,QAAA,EAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,+BAAA,CAAiC,CAAA;AAAA,EACtO;AAEA,EAAA,MAAM,EAAA,GAAK,IAAIJ,wBAAA,EAAY;AAC3B,EAAA,EAAA,CAAG,UAAU,OAAO,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,EAAA,EAAI,KAAK,CAAA;AAEpC,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,YAAY,CAAC,CAAA;AAC7D,EAAA,MAAM,CAAC,SAAS,CAAA,GAAI,EAAA,CAAG,WAAW,OAAA,EAAS,CAAC,SAAS,CAAC,CAAA;AAEtD,EAAA,MAAM,aAAA,CAAc,EAAA,EAAI,MAAA,EAAQ,OAAA,EAAS;AAAA,IACvC,gBAAgB,OAAA,CAAQ,SAAA;AAAA,IACxB,YAAY,OAAA,CAAQ;AAAA,GACrB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAMG,oBAAA,CAAa,EAAA,EAAI,SAAA,CAAU,IAAA,EAAM,SAAA,EAAoB;AAAA,MACzD,GAAG,WAAW,MAAM,CAAA;AAAA,MACpB,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,MAAM,IAAI,UAAA,CAAW,sBAAA,EAAwB,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAE,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,EAAA;AACT;AAEA,eAAsB,iBAAA,CACpB,QACA,OAAA,EAC4B;AAC5B,EAAA,MAAM,EAAA,GAAK,MAAM,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAChD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,oBAAA,GAAuB,CAAA,GAAI,GAAG,oBAAA,GAAuB,IAAA;AAEpE,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,EAAA,CAAG,aAAa,CAAA,EAAG;AACrB,IAAA,SAAA,GAAY,EAAA,CAAG,QAAA;AAAA,EACjB,CAAA,MAAO;AACL,IAAA,SAAA,GAAY,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,CAAG,WAAY,EAAA,CAAG,QAAA,GAAW,oBAAoB,GAAI,CAAA;AAAA,EAC/E;AAEA,EAAA,MAAM,eAAA,GAAkB,GAAG,QAAA,GAAW,SAAA;AACtC,EAAA,MAAM,UAAU,EAAA,CAAG,QAAA,GAAW,IAAK,eAAA,GAAkB,GAAA,GAAO,GAAG,QAAA,GAAW,QAAA;AAE1E,EAAA,OAAO,EAAE,SAAA,EAAW,iBAAA,EAAmB,OAAA,EAAS,SAAA,EAAW,GAAG,YAAA,EAAa;AAC7E;AAEA,eAAsB,eAAA,CACpB,QACA,OAAA,EAC0B;AAC1B,EAAA,MAAM,EAAA,GAAK,MAAM,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAChD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,oBAAA,GAAuB,CAAA,GAAI,GAAG,oBAAA,GAAuB,IAAA;AAEpE,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,QAAA,GAAW,GAAA,GAAM,iBAAA,GAAoB,EAAA,CAAG,QAAQ,CAAA;AAEjF,EAAA,OAAO,EAAE,SAAA,EAAW,iBAAA,EAAmB,iBAAA,EAAmB,SAAA,EAAW,GAAG,YAAA,EAAa;AACvF;AAMA,eAAsB,iBAAA,CACpB,QACA,OAAA,EAC0B;AAC1B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAME,sCAAA,CAA+B,OAAA,EAAS;AAAA,MAC5D,GAAG,WAAW,MAAM,CAAA;AAAA,MACpB,OAAA,EAAS,CAAC,MAAM;AAAA,KACjB,CAAA;AAED,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,SAAU,EAAC;AAE9C,IAAA,MAAM,OAAA,GAAUC,8BAAsB,OAAO,CAAA;AAC7C,IAAA,MAAM,SAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,KAAA,MAAW,EAAA,IAAM,EAAE,OAAA,EAAS;AAC1B,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,EAAA,CAAG,SAAS,CAAA;AACrC,QAAA,IAAI,aAAa,CAAA,EAAG;AACpB,QAAA,MAAM,SAAS,EAAA,CAAG,QAAA,CAAS,MAAM,IAAI,CAAA,CAAE,KAAI,IAAK,SAAA;AAChD,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,QAAA,EAAU,MAAA;AAAA,UACV,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,OAAO,CAAA;AAAA,UACvB,UAAU,EAAA,CAAG,QAAA;AAAA,UACb,MAAA;AAAA,UACA,MAAA,EAAQ,SAAA;AAAA,UACR,iBAAA,EAAmB;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,eAAsB,mBAAA,CACpB,EAAA,EACA,MAAA,EACA,OAAA,EAC0B;AAC1B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMD,sCAAA,CAA+B,OAAA,EAAS;AAAA,MAC5D,GAAG,WAAW,MAAM,CAAA;AAAA,MACpB,OAAA,EAAS,CAAC,MAAM;AAAA,KACjB,CAAA;AAED,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,SAAU,EAAC;AAE9C,IAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAAA,MACxB,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,mBAAmB,CAAA,GAAI;AAAA,KACzC;AACA,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEpC,IAAA,MAAM,OAAA,GAAU,MAAME,8BAAA,CAAuB,EAAA,EAAI,SAAA,EAAW;AAAA,MAC1D,GAAA,EAAK,MAAA;AAAA,MACL,iBAAA,EAAmB,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,OAAA;AAAQ,KAC1D,CAAA;AAED,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACzB,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,EAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MACV,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,CAAA;AAAA,MACR,iBAAA,EAAmB;AAAA,KACrB,CAAE,CAAA;AAAA,EACJ,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;AC7mBO,IAAM,cAAA,GAAqC;AAAA,EAChD,EAAA,EAAI,MAAA;AAAA,EACJ,IAAA,EAAM,eAAA;AAAA,EACN,UAAU,EAAC;AAAA,EACX,gBAAA,EAAkB,IAAA;AAAA,EAClB,SAAA,EAAW;AAAA,IACT,6BAAA,EAA+B,MAAA;AAAA,IAC/B,uBAAA,EAAyB,MAAA;AAAA,IACzB,2BAAA,EAA6B,UAAA;AAAA,IAC7B,8BAAA,EAAgC,UAAA;AAAA,IAChC,yBAAA,EAA2B,QAAA;AAAA,IAC3B,4BAAA,EAA8B,QAAA;AAAA,IAC9B,2BAAA,EAA6B,OAAA;AAAA,IAC7B,qBAAA,EAAuB;AAAA;AAE3B;AAEO,IAAM,cAAA,GAAuC;AAAA,EAClD;AACF;;;ACLO,IAAM,cAAN,MAA4C;AAAA,EACxC,EAAA,GAAK,MAAA;AAAA,EACL,IAAA,GAAO,eAAA;AAAA,EACP,OAAA,GAAU,OAAA;AAAA,EACV,YAAA,GAA6C,CAAC,MAAA,EAAQ,UAAA,EAAY,UAAU,OAAO,CAAA;AAAA,EACnF,eAAA,GAAqC,CAAC,GAAG,eAAe,CAAA;AAAA,EACxD,uBAAA,GAA0B,IAAA;AAAA,EAE3B,MAAA;AAAA,EAER,MAAM,KAAK,MAAA,EAAyC;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,SAAS,MAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,SAAS,KAAA,EAAsC;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAmB,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AACrD,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,MAAM,CAAA,GAAI,MAAM,UAAgC,CAAA;AAChD,IAAA,IAAI,CAAC,GAAG,MAAM,IAAI,WAAW,qBAAA,EAAuB,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAE,CAAA;AACpF,IAAA,OAAO,EAAE,OAAO,UAAA,EAAY,OAAA,EAAS,EAAE,OAAA,EAAS,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,EACzE;AAAA,EAEA,MAAM,aAAa,OAAA,EAA4C;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAmB,YAAA,CAAa,IAAA,CAAK,QAAQ,OAAO,CAAA;AACnE,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAA,CAAO,SAAA,CACd,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,MAAM,CAAA,CAC7B,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,SAAA,EAAW,EAAE,SAAA,EAAW,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI,CAAE,CAAA;AAAA,MACtF,OAAA,EAAS,MAAA,CAAO,SAAA,CACb,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,QAAQ,CAAA,CAC/B,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,SAAA,EAAW,EAAE,SAAA,EAAW,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI,CAAE;AAAA,KACxF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAAA,EAAsC;AACpD,IAAA,OAAoB,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,WAAA,CACJ,OAAA,EACA,MAAA,EACA,OACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,MAAmB,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,CAAA;AACzG,IAAA,OAAO,EAAE,EAAA,EAAG;AAAA,EACd;AAAA,EAEA,MAAM,eAAA,CACJ,OAAA,EACA,MAAA,EACA,OACA,OAAA,EACwD;AACxD,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAmB,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,WAAW,CAAA;AACpI,IAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,eAAA,EAAiB,OAAO,eAAA,EAAgB;AAAA,EAClE;AAAA,EAEA,MAAM,aAAA,CACJ,OAAA,EACA,MAAA,EACA,OACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,MAAmB,aAAA,CAAc,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,CAAA;AAC3G,IAAA,OAAO,EAAE,EAAA,EAAG;AAAA,EACd;AAAA,EAEA,MAAM,YAAA,CACJ,OAAA,EACA,MAAA,EACA,OACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,MAAM,KAAK,MAAmB,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,SAAS,MAAA,EAAQ;AAAA,MACvE,KAAA,EAAO,UAAA;AAAA,MACP,WAAW,OAAA,EAAS,SAAA;AAAA,MACpB,YAAY,OAAA,EAAS;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,EAAE,EAAA,EAAG;AAAA,EACd;AAAA,EAEA,MAAM,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB;AACjD,IAAA,OAAoB,iBAAA,CAAkB,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,SAAA,CAAU,OAAA,EAAiB,MAAA,EAAgB;AAC/C,IAAA,OAAoB,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,eAAA,CACJ,EAAA,EACA,OAAA,EACA,QACA,KAAA,EACuE;AACvE,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,OAAoB,eAAA,CAAgB,IAAI,IAAA,CAAK,MAAA,EAAQ,SAAS,MAAA,EAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,EAC7F;AAAA,EAEA,MAAM,WAAA,CACJ,EAAA,EACA,OAAA,EACA,IAAA,EACA,OACA,OAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,OAAoB,WAAA,CAAY,EAAA,EAAI,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,EACnG;AAAA,EAEA,MAAM,YAAA,CACJ,EAAA,EACA,OAAA,EACA,MACA,KAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,OAAoB,YAAA,CAAa,IAAI,IAAA,CAAK,MAAA,EAAQ,SAAS,IAAA,EAAM,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,EACxF;AAAA,EAEA,MAAM,kBAAkB,OAAA,EAA2C;AACjE,IAAA,OAAoB,iBAAA,CAAkB,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,mBAAA,CAAoB,EAAA,EAAiB,OAAA,EAA2C;AACpF,IAAA,OAAoB,mBAAA,CAAoB,EAAA,EAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClE;AACF","file":"index.cjs","sourcesContent":["export const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC' | 'USDT' | 'USDe' | 'USDsui';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC', 'USDT', 'USDe', 'USDsui'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a';\nexport const T2000_ADMIN_CAP_ID = '0x863d1b02cba1b93d0fe9b87eb92d58b60c1e85c001022cb2a760e07bade47e65';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'USDC_SPONSOR_FAILED'\n | 'USDC_SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail regardless of gas method, so retrying is pointless.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","import type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n} from './types.js';\nimport { STABLE_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n async bestSaveRate(asset: string): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip adapters that fail to fetch rates\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports saving ${asset}`);\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async bestBorrowRate(asset: string, opts?: { requireSameAssetBorrow?: boolean }): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('borrow')) continue;\n if (opts?.requireSameAssetBorrow && !adapter.supportsSameAssetBorrow) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports borrowing ${asset}`);\n }\n\n candidates.sort((a, b) => a.rate.borrowApy - b.rate.borrowApy);\n return candidates[0];\n }\n\n async bestSaveRateAcrossAssets(): Promise<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> = [];\n\n for (const asset of STABLE_ASSETS) {\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate, asset });\n } catch { /* skip */ }\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'No lending adapter found for any stablecoin');\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async allRatesAcrossAssets(): Promise<Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }> = [];\n const seen = new Set<string>();\n for (const asset of STABLE_ASSETS) {\n if (seen.has(asset)) continue;\n seen.add(asset);\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n if (rates.saveApy > 0 || rates.borrowApy > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, asset, rates });\n }\n } catch { /* skip */ }\n }\n }\n return results;\n }\n\n async allRates(asset: string): Promise<Array<{ protocol: string; protocolId: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; rates: LendingRates }> = [];\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n results.push({ protocol: adapter.name, protocolId: adapter.id, rates });\n } catch {\n // skip\n }\n }\n return results;\n }\n\n async allPositions(address: string): Promise<Array<{ protocol: string; protocolId: string; positions: AdapterPositions }>> {\n const results: Array<{ protocol: string; protocolId: string; positions: AdapterPositions }> = [];\n const errors: string[] = [];\n for (const adapter of this.lending.values()) {\n try {\n const positions = await adapter.getPositions(address);\n if (positions.supplies.length > 0 || positions.borrows.length > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, positions });\n }\n } catch (err) {\n errors.push(`${adapter.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n if (results.length === 0 && errors.length > 0) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol queries failed (${errors.length}/${this.lending.size}): ${errors.join('; ')}`);\n }\n return results;\n }\n\n getLending(id: string): LendingAdapter | undefined {\n return this.lending.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS, SUPPORTED_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function stableToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function rawToStable(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function getDecimals(asset: SupportedAsset): number {\n return SUPPORTED_ASSETS[asset].decimals;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n\nexport function formatAssetAmount(amount: number, asset: string): string {\n if (asset === 'BTC') return amount.toFixed(8);\n if (asset === 'GOLD') return amount.toFixed(6);\n if (asset === 'ETH') return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nconst ASSET_LOOKUP: Map<string, string> = new Map();\nfor (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n ASSET_LOOKUP.set(key.toUpperCase(), key);\n if (info.displayName && info.displayName.toUpperCase() !== key.toUpperCase()) {\n ASSET_LOOKUP.set(info.displayName.toUpperCase(), key);\n }\n}\n\n/**\n * Case-insensitive lookup against SUPPORTED_ASSETS keys AND display names.\n * 'usde' → 'USDe', 'suiusde' → 'USDe', 'suiusdt' → 'USDT', 'usdsui' → 'USDsui'.\n * Returns the original input if not found so downstream validation can reject it.\n */\nexport function normalizeAsset(input: string): string {\n return ASSET_LOOKUP.get(input.toUpperCase()) ?? input;\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_PACKAGE_ID,\n T2000_TREASURY_ID,\n T2000_CONFIG_ID,\n API_BASE_URL,\n} from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'borrow';\n\nexport interface ProtocolFeeInfo {\n amount: number;\n asset: string;\n rate: number;\n rawAmount: bigint;\n}\n\nconst FEE_RATES: Record<FeeOperation, bigint> = {\n save: SAVE_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\n borrow: 2,\n};\n\nexport function calculateFee(operation: FeeOperation, amount: number): ProtocolFeeInfo {\n const bps = FEE_RATES[operation];\n const feeAmount = amount * Number(bps) / Number(BPS_DENOMINATOR);\n const rawAmount = usdcToRaw(feeAmount);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Add on-chain fee collection to an existing PTB via t2000::treasury::collect_fee().\n * The Move function splits the fee from the payment coin and stores it in the\n * Treasury's internal Balance<T>. Atomic — reverts with the operation if it fails.\n */\nexport function addCollectFeeToTx(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n operation: FeeOperation,\n): void {\n const bps = FEE_RATES[operation];\n if (bps <= 0n) return;\n\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::treasury::collect_fee`,\n typeArguments: [SUPPORTED_ASSETS.USDC.type],\n arguments: [\n tx.object(T2000_TREASURY_ID),\n tx.object(T2000_CONFIG_ID),\n paymentCoin,\n tx.pure.u8(OP_CODES[operation]),\n ],\n });\n}\n\nexport async function reportFee(\n agentAddress: string,\n operation: string,\n feeAmount: number,\n feeRate: number,\n txDigest: string,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/fees`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agentAddress,\n operation,\n feeAmount: feeAmount.toString(),\n feeRate: feeRate.toString(),\n txDigest,\n }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n getLendingPositions,\n getPools as naviGetPools,\n getHealthFactor as naviGetHealthFactor,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getUserAvailableLendingRewards,\n claimLendingRewardsPTB,\n summaryLendingRewards,\n updateOraclePriceBeforeUserOperationPTB,\n type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, ALL_NAVI_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { stableToRaw } from '../utils/format.js';\nimport { addCollectFeeToTx } from './protocolFee.js';\nimport type { PendingReward } from '../adapters/types.js';\nimport type {\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst MIN_HEALTH_FACTOR = 1.5;\n\n// NAVI SDK expects SuiClient (v1 name), our code uses SuiJsonRpcClient (v2 name).\n// They're the same runtime class, so the cast is safe.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction sdkOptions(client: SuiJsonRpcClient): { env: 'prod'; client: any; cacheTime: number; disableCache: boolean } {\n // Fully disable NAVI SDK's built-in caching. cacheTime: 0 bypasses the\n // top-level withCache check, but internal SDK calls override it via\n // spread order ({ ...opts, cacheTime: w }). disableCache: true is the\n // only flag the SDK never overrides — it short-circuits the cache check.\n return { env: 'prod', client, cacheTime: 0, disableCache: true };\n}\n\n/**\n * Refresh Pyth oracle prices in the PTB before price-dependent NAVI operations.\n * NAVI's on-chain contract requires fresh oracle prices (within 15s) for\n * withdraw, borrow, and repay. Unlike Suilend (which auto-refreshes), NAVI's\n * PTB builders don't update prices — the caller must do it via this SDK helper.\n */\nasync function refreshOracle(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options?: { skipPythUpdate?: boolean; skipOracle?: boolean },\n): Promise<void> {\n if (options?.skipOracle) return;\n const origInfo = console.info;\n const origWarn = console.warn;\n console.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('stale price feed')) return;\n origInfo.apply(console, args);\n };\n console.warn = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('price feed')) return;\n origWarn.apply(console, args);\n };\n try {\n const pools = await naviGetPools(sdkOptions(client));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oracleOpts: any = {\n ...sdkOptions(client),\n throws: false,\n // Pyth update uses tx.splitCoins(tx.gas, ...) which is incompatible\n // with sponsored transactions where tx.gas belongs to the sponsor.\n updatePythPriceFeeds: !options?.skipPythUpdate,\n };\n await updateOraclePriceBeforeUserOperationPTB(tx, address, pools, oracleOpts);\n } catch {\n // Best-effort: if oracle refresh fails (network issue), the operation\n // may still succeed if on-chain prices are fresh enough.\n } finally {\n console.info = origInfo;\n console.warn = origWarn;\n }\n}\n\nconst NAVI_SYMBOL_MAP: Record<string, string> = {\n nUSDC: 'USDC',\n suiUSDT: 'USDT',\n suiUSDe: 'USDe',\n XAUM: 'GOLD',\n WBTC: 'BTC',\n suiETH: 'ETH',\n WETH: 'ETH',\n SUI: 'SUI',\n USDC: 'USDC',\n USDT: 'USDT',\n USDe: 'USDe',\n USDsui: 'USDsui',\n WAL: 'WAL',\n NAVX: 'NAVX',\n ETH: 'ETH',\n GOLD: 'GOLD',\n};\n\nfunction resolveNaviSymbol(sdkSymbol: string, coinType: string): string {\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n const poolSuffix = coinType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = info.type.split('::').slice(1).join('::').toLowerCase();\n if (poolSuffix === targetSuffix) return key;\n }\n return NAVI_SYMBOL_MAP[sdkSymbol] ?? sdkSymbol;\n}\n\nfunction resolveAssetInfo(asset: string): { type: string; decimals: number; displayName: string } {\n if (asset in SUPPORTED_ASSETS) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n return { type: info.type, decimals: info.decimals, displayName: info.displayName };\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown asset: ${asset}`);\n}\n\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PositionsResult> {\n\n try {\n const naviPositions = await getLendingPositions(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n const positions: PositionEntry[] = [];\n\n for (const pos of naviPositions) {\n const data = pos['navi-lending-supply']\n ?? pos['navi-lending-emode-supply']\n ?? pos['navi-lending-borrow']\n ?? pos['navi-lending-emode-borrow'];\n if (!data) continue;\n\n const isBorrow = pos.type.includes('borrow');\n const symbol = resolveNaviSymbol(data.token.symbol, data.token.coinType);\n const amount = parseFloat(data.amount);\n const amountUsd = parseFloat(data.valueUSD);\n const pool = data.pool;\n\n const apy = (isBorrow\n ? parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0')\n : parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0')) / 100;\n\n if (amountUsd > 0.01 || amount > 1e-10) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: isBorrow ? 'borrow' : 'save',\n amount,\n amountUsd,\n apy,\n });\n }\n }\n\n return { positions };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('not found') || msg.includes('404')) return { positions: [] };\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI getPositions failed: ${msg}`);\n }\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await naviGetPools(sdkOptions(client));\n const result: RatesResult = {};\n\n for (const asset of ALL_NAVI_ASSETS) {\n const targetType = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS].type;\n const pool = pools.find((p: Pool) => {\n const poolSuffix = (p.suiCoinType || p.coinType || '').split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = targetType.split('::').slice(1).join('::').toLowerCase();\n return poolSuffix === targetSuffix;\n });\n if (!pool) continue;\n\n const saveApy = parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0') / 100;\n const borrowApy = parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0') / 100;\n\n if (saveApy >= 0 && saveApy < 2.0) {\n result[asset] = { saveApy, borrowApy: borrowApy >= 0 && borrowApy < 2.0 ? borrowApy : 0 };\n }\n }\n\n if (!result.USDC) result.USDC = { saveApy: 0.04, borrowApy: 0.06 };\n return result;\n } catch {\n return { USDC: { saveApy: 0.04, borrowApy: 0.06 } };\n }\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<HealthFactorResult> {\n\n const posResult = await getPositions(client, address);\n let supplied = 0;\n let borrowed = 0;\n\n for (const pos of posResult.positions) {\n const usd = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') supplied += usd;\n else if (pos.type === 'borrow') borrowed += usd;\n }\n\n let healthFactor: number;\n try {\n const hf = await naviGetHealthFactor(address, sdkOptions(client));\n healthFactor = hf > 1e5 ? Infinity : hf;\n } catch {\n healthFactor = borrowed > 0 ? (supplied * 0.75) / borrowed : Infinity;\n }\n\n const ltv = 0.75;\n const maxBorrow = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow,\n liquidationThreshold: ltv,\n };\n}\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coinObj, 'save');\n }\n\n const rawAmount = Math.min(Number(stableToRaw(amount, assetInfo.decimals)), Number(totalBalance));\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coinObj as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdrawal amount rounds to zero — balance is dust');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n tx.transferObjects([coin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n\n return { tx, effectiveAmount };\n}\n\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const sponsored = options.sponsored ?? true;\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n await refreshOracle(tx, client, address, { skipPythUpdate: sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n}\n\nexport async function addSaveToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; collectFee?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coin, 'save');\n }\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n}\n\nexport async function addRepayToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const sponsored = options.sponsored ?? true;\n const assetInfo = resolveAssetInfo(asset);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: sponsored });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string; sponsored?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, borrowedCoin as TransactionObjectArgument, 'borrow');\n }\n\n tx.transferObjects([borrowedCoin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean; skipOracle?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins to repay with. Withdraw some savings first to get cash.`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n const rawRequested = Number(stableToRaw(amount, assetInfo.decimals));\n\n if (Number(totalBalance) < rawRequested && Number(totalBalance) < 1000) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Not enough ${assetInfo.displayName} to repay (need $${amount.toFixed(2)}, wallet has ~$${(Number(totalBalance) / 10 ** assetInfo.decimals).toFixed(4)}). Withdraw some savings first.`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n const rawAmount = Math.min(rawRequested, Number(totalBalance));\n const [repayCoin] = tx.splitCoins(coinObj, [rawAmount]);\n\n await refreshOracle(tx, client, address, {\n skipPythUpdate: options.sponsored,\n skipOracle: options.skipOracle,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, repayCoin as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Rewards\n// ---------------------------------------------------------------------------\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const summary = summaryLendingRewards(rewards);\n const result: PendingReward[] = [];\n\n for (const s of summary) {\n for (const rw of s.rewards) {\n const available = Number(rw.available);\n if (available <= 0) continue;\n const symbol = rw.coinType.split('::').pop() ?? 'UNKNOWN';\n result.push({\n protocol: 'navi',\n asset: String(s.assetId),\n coinType: rw.coinType,\n symbol,\n amount: available,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return result;\n } catch {\n return [];\n }\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const claimable = rewards.filter(\n (r) => Number(r.userClaimableReward) > 0,\n );\n if (claimable.length === 0) return [];\n\n const claimed = await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n customCoinReceive: { type: 'transfer', transfer: address },\n });\n\n return claimed.map((c) => ({\n protocol: 'navi',\n asset: '',\n coinType: '',\n symbol: 'REWARD',\n amount: 0,\n estimatedValueUsd: 0,\n }));\n } catch {\n return [];\n }\n}\n","import type { ProtocolDescriptor } from './types.js';\n\nexport type { ProtocolDescriptor } from './types.js';\n\nexport const naviDescriptor: ProtocolDescriptor = {\n id: 'navi',\n name: 'NAVI Protocol',\n packages: [],\n dynamicPackageId: true,\n actionMap: {\n 'incentive_v3::entry_deposit': 'save',\n 'incentive_v3::deposit': 'save',\n 'incentive_v3::withdraw_v2': 'withdraw',\n 'incentive_v3::entry_withdraw': 'withdraw',\n 'incentive_v3::borrow_v2': 'borrow',\n 'incentive_v3::entry_borrow': 'borrow',\n 'incentive_v3::entry_repay': 'repay',\n 'incentive_v3::repay': 'repay',\n },\n};\n\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n];\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n PendingReward,\n} from './types.js';\nimport { ALL_NAVI_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { normalizeAsset } from '../utils/format.js';\nimport * as naviProtocol from '../protocols/navi.js';\n\nexport { naviDescriptor as descriptor } from './descriptors.js';\n\nexport class NaviAdapter implements LendingAdapter {\n readonly id = 'navi';\n readonly name = 'NAVI Protocol';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw', 'borrow', 'repay'];\n readonly supportedAssets: readonly string[] = [...ALL_NAVI_ASSETS];\n readonly supportsSameAssetBorrow = true;\n\n private client!: SuiJsonRpcClient;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n async getRates(asset: string): Promise<LendingRates> {\n const rates = await naviProtocol.getRates(this.client);\n const normalized = normalizeAsset(asset);\n const r = rates[normalized as keyof typeof rates];\n if (!r) throw new T2000Error('ASSET_NOT_SUPPORTED', `NAVI does not support ${asset}`);\n return { asset: normalized, saveApy: r.saveApy, borrowApy: r.borrowApy };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const result = await naviProtocol.getPositions(this.client, address);\n return {\n supplies: result.positions\n .filter(p => p.type === 'save')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n return naviProtocol.getHealthFactor(this.client, address);\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean },\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, { asset: normalized, sponsored: options?.sponsored });\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean; skipOracle?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, {\n asset: normalized,\n sponsored: options?.sponsored,\n skipOracle: options?.skipOracle,\n });\n return { tx };\n }\n\n async maxWithdraw(address: string, _asset: string) {\n return naviProtocol.maxWithdrawAmount(this.client, address);\n }\n\n async maxBorrow(address: string, _asset: string) {\n return naviProtocol.maxBorrowAmount(this.client, address);\n }\n\n async addWithdrawToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n ): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addWithdrawToTx(tx, this.client, address, amount, { asset: normalized });\n }\n\n async addSaveToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addSaveToTx(tx, this.client, address, coin, { ...options, asset: normalized });\n }\n\n async addRepayToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addRepayToTx(tx, this.client, address, coin, { asset: normalized });\n }\n\n async getPendingRewards(address: string): Promise<PendingReward[]> {\n return naviProtocol.getPendingRewards(this.client, address);\n }\n\n async addClaimRewardsToTx(tx: Transaction, address: string): Promise<PendingReward[]> {\n return naviProtocol.addClaimRewardsToTx(tx, this.client, address);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/constants.ts","../../src/errors.ts","../../src/adapters/registry.ts","../../src/utils/format.ts","../../src/protocols/protocolFee.ts","../../src/protocols/navi.ts","../../src/adapters/descriptors.ts","../../src/adapters/navi.ts"],"names":["naviGetPools","updateOraclePriceBeforeUserOperationPTB","getLendingPositions","naviGetHealthFactor","Transaction","depositCoinPTB","withdrawCoinPTB","repayCoinPTB","borrowCoinPTB","getUserAvailableLendingRewards","summaryLendingRewards","claimLendingRewardsPTB"],"mappings":"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","file":"index.cjs","sourcesContent":["export const MIST_PER_SUI = 1_000_000_000n;\nexport const SUI_DECIMALS = 9;\nexport const USDC_DECIMALS = 6;\n\nexport const BPS_DENOMINATOR = 10_000n;\nexport const PRECISION = 1_000_000_000_000_000_000n;\n\nexport const MIN_DEPOSIT = 1_000_000n; // 1 USDC (6 decimals)\nexport const GAS_RESERVE_USDC = 1_000_000n; // $1 USDC reserved for gas\nexport const AUTO_TOPUP_THRESHOLD = 50_000_000n; // 0.05 SUI — minimum to attempt self-funded TX\nexport const GAS_RESERVE_TARGET = 150_000_000n; // 0.15 SUI — proactive top-up target (covers complex TXs)\nexport const AUTO_TOPUP_AMOUNT = 1_000_000n; // $1 USDC worth of SUI\nexport const AUTO_TOPUP_MIN_USDC = 2_000_000n; // $2 USDC minimum to trigger auto-topup\nexport const BOOTSTRAP_LIMIT = 10;\nexport const GAS_FEE_CEILING_USD = 0.05;\n\nexport const SAVE_FEE_BPS = 10n; // 0.1%\nexport const BORROW_FEE_BPS = 5n; // 0.05%\n\nexport const CLOCK_ID = '0x6';\n\nexport const SUPPORTED_ASSETS = {\n USDC: {\n type: '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC',\n decimals: 6,\n symbol: 'USDC',\n displayName: 'USDC',\n },\n USDT: {\n type: '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT',\n decimals: 6,\n symbol: 'USDT',\n displayName: 'suiUSDT',\n },\n USDe: {\n type: '0x41d587e5336f1c86cad50d38a7136db99333bb9bda91cea4ba69115defeb1402::sui_usde::SUI_USDE',\n decimals: 6,\n symbol: 'USDe',\n displayName: 'suiUSDe',\n },\n USDsui: {\n type: '0x44f838219cf67b058f3b37907b655f226153c18e33dfcd0da559a844fea9b1c1::usdsui::USDSUI',\n decimals: 6,\n symbol: 'USDsui',\n displayName: 'USDsui',\n },\n SUI: {\n type: '0x2::sui::SUI',\n decimals: 9,\n symbol: 'SUI',\n displayName: 'SUI',\n },\n WAL: {\n type: '0x356a26eb9e012a68958082340d4c4116e7f55615cf27affcff209cf0ae544f59::wal::WAL',\n decimals: 9,\n symbol: 'WAL',\n displayName: 'WAL',\n },\n ETH: {\n type: '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH',\n decimals: 8,\n symbol: 'ETH',\n displayName: 'suiETH',\n },\n NAVX: {\n type: '0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX',\n decimals: 9,\n symbol: 'NAVX',\n displayName: 'NAVX',\n },\n GOLD: {\n type: '0x9d297676e7a4b771ab023291377b2adfaa4938fb9080b8d12430e4b108b836a9::xaum::XAUM',\n decimals: 6,\n symbol: 'GOLD',\n displayName: 'XAUM',\n },\n} as const;\n\nexport type SupportedAsset = keyof typeof SUPPORTED_ASSETS;\nexport type StableAsset = 'USDC';\nexport const STABLE_ASSETS: readonly StableAsset[] = ['USDC'] as const;\nexport const ALL_NAVI_ASSETS: readonly SupportedAsset[] = Object.keys(SUPPORTED_ASSETS) as SupportedAsset[];\n\nexport const T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? '0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3';\nexport const T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? '0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a';\nexport const T2000_ADMIN_CAP_ID = '0x863d1b02cba1b93d0fe9b87eb92d58b60c1e85c001022cb2a760e07bade47e65';\nexport const T2000_TREASURY_ID = process.env.T2000_TREASURY_ID ?? '0x3bb501b8300125dca59019247941a42af6b292a150ce3cfcce9449456be2ec91';\n\nexport const DEFAULT_NETWORK = 'mainnet' as const;\nexport const DEFAULT_RPC_URL = 'https://fullnode.mainnet.sui.io:443';\nexport const DEFAULT_KEY_PATH = '~/.t2000/wallet.key';\nexport const DEFAULT_CONFIG_PATH = '~/.t2000/config.json';\n\nexport const API_BASE_URL = process.env.T2000_API_URL ?? 'https://api.t2000.ai';\n\n// Cetus USDC/SUI pool — read-only for SUI price oracle (no SDK dependency)\nexport const CETUS_USDC_SUI_POOL = '0x51e883ba7c0b566a26cbc8a94cd33eb0abd418a77cc1e60ad22fd9b1f29cd2ab';\n\nexport const GAS_RESERVE_MIN = 0.05; // minimum SUI to keep for gas\n","export type T2000ErrorCode =\n | 'INSUFFICIENT_BALANCE'\n | 'INSUFFICIENT_GAS'\n | 'INVALID_ADDRESS'\n | 'INVALID_AMOUNT'\n | 'WALLET_NOT_FOUND'\n | 'WALLET_LOCKED'\n | 'WALLET_EXISTS'\n | 'SPONSOR_FAILED'\n | 'SPONSOR_RATE_LIMITED'\n | 'USDC_SPONSOR_FAILED'\n | 'USDC_SPONSOR_RATE_LIMITED'\n | 'GAS_STATION_UNAVAILABLE'\n | 'GAS_FEE_EXCEEDED'\n | 'SIMULATION_FAILED'\n | 'TRANSACTION_FAILED'\n | 'ASSET_NOT_SUPPORTED'\n | 'INVALID_ASSET'\n | 'HEALTH_FACTOR_TOO_LOW'\n | 'WITHDRAW_WOULD_LIQUIDATE'\n | 'WITHDRAW_FAILED'\n | 'NO_COLLATERAL'\n | 'PROTOCOL_PAUSED'\n | 'PROTOCOL_UNAVAILABLE'\n | 'RPC_ERROR'\n | 'RPC_UNREACHABLE'\n | 'SPONSOR_UNAVAILABLE'\n | 'AUTO_TOPUP_FAILED'\n | 'PRICE_EXCEEDS_LIMIT'\n | 'UNSUPPORTED_NETWORK'\n | 'PAYMENT_EXPIRED'\n | 'DUPLICATE_PAYMENT'\n | 'FACILITATOR_REJECTION'\n | 'CONTACT_NOT_FOUND'\n | 'INVALID_CONTACT_NAME'\n | 'FACILITATOR_TIMEOUT'\n | 'SAFEGUARD_BLOCKED'\n | 'SWAP_NO_ROUTE'\n | 'SWAP_FAILED'\n | 'UNKNOWN';\n\nexport interface T2000ErrorData {\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class T2000Error extends Error {\n readonly code: T2000ErrorCode;\n readonly data?: T2000ErrorData;\n readonly retryable: boolean;\n\n constructor(code: T2000ErrorCode, message: string, data?: T2000ErrorData, retryable = false) {\n super(message);\n this.name = 'T2000Error';\n this.code = code;\n this.data = data;\n this.retryable = retryable;\n }\n\n toJSON() {\n return {\n error: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n retryable: this.retryable,\n };\n }\n}\n\nexport function mapWalletError(error: unknown): T2000Error {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes('rejected') || msg.includes('cancelled')) {\n return new T2000Error('TRANSACTION_FAILED', 'Transaction cancelled');\n }\n if (msg.includes('Insufficient') || msg.includes('insufficient')) {\n return new T2000Error('INSUFFICIENT_BALANCE', 'Insufficient balance');\n }\n\n return new T2000Error('UNKNOWN', msg, undefined, true);\n}\n\nexport function mapMoveAbortCode(code: number): string {\n const abortMessages: Record<number, string> = {\n 1: 'Protocol is temporarily paused',\n 2: 'Amount must be greater than zero',\n 3: 'Invalid operation type',\n 4: 'Fee rate exceeds maximum',\n 5: 'Insufficient treasury balance',\n 6: 'Not authorized',\n 7: 'Package version mismatch — upgrade required',\n 8: 'Timelock is active — wait for expiry',\n 9: 'No pending change to execute',\n 10: 'Already at current version',\n // NAVI Protocol abort codes\n 1502: 'Oracle price is stale — try again in a moment',\n 1503: 'Withdrawal amount is invalid (zero or dust) — try a specific amount instead of \"all\"',\n 1600: 'Health factor too low — withdrawal would risk liquidation',\n 1605: 'Asset borrowing is disabled or at capacity on this protocol',\n // NAVI utils abort codes\n 46000: 'Insufficient balance to repay — withdraw some savings first to get cash',\n };\n return abortMessages[code] ?? `Move abort code: ${code}`;\n}\n\n/**\n * Check if an error message contains a MoveAbort — these are on-chain\n * failures that will fail regardless of gas method, so retrying is pointless.\n */\nexport function isMoveAbort(msg: string): boolean {\n return msg.includes('MoveAbort') || msg.includes('MovePrimitiveRuntimeError');\n}\n\nexport function parseMoveAbortMessage(msg: string): string {\n const abortMatch = msg.match(/abort code:\\s*(\\d+)/i) ?? msg.match(/MoveAbort[^,]*,\\s*(\\d+)/);\n if (abortMatch) {\n const code = parseInt(abortMatch[1], 10);\n\n const moduleMatch = msg.match(/Identifier\\(\"([^\"]+)\"\\)/) ?? msg.match(/in '([^']+)'/);\n const fnMatch = msg.match(/function_name:\\s*Some\\(\"([^\"]+)\"\\)/);\n const context = `${moduleMatch?.[1] ?? ''}${fnMatch ? `::${fnMatch[1]}` : ''}`.toLowerCase();\n const suffix = moduleMatch\n ? ` [${moduleMatch[1]}${fnMatch ? `::${fnMatch[1]}` : ''}]`\n : '';\n\n if (context.includes('slippage')) {\n return `Slippage too high — price moved during execution${suffix}`;\n }\n if (context.includes('balance::split') || context.includes('balance::ENotEnough')) {\n return `Insufficient on-chain balance${suffix}`;\n }\n\n const mapped = mapMoveAbortCode(code);\n return `${mapped}${suffix}`;\n }\n return msg;\n}\n","import type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n} from './types.js';\nimport { STABLE_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\n\nexport class ProtocolRegistry {\n private lending: Map<string, LendingAdapter> = new Map();\n\n registerLending(adapter: LendingAdapter): void {\n this.lending.set(adapter.id, adapter);\n }\n\n async bestSaveRate(asset: string): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip adapters that fail to fetch rates\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports saving ${asset}`);\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async bestBorrowRate(asset: string, opts?: { requireSameAssetBorrow?: boolean }): Promise<{ adapter: LendingAdapter; rate: LendingRates }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates }> = [];\n\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('borrow')) continue;\n if (opts?.requireSameAssetBorrow && !adapter.supportsSameAssetBorrow) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate });\n } catch {\n // skip\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', `No lending adapter supports borrowing ${asset}`);\n }\n\n candidates.sort((a, b) => a.rate.borrowApy - b.rate.borrowApy);\n return candidates[0];\n }\n\n async bestSaveRateAcrossAssets(): Promise<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> {\n const candidates: Array<{ adapter: LendingAdapter; rate: LendingRates; asset: string }> = [];\n\n for (const asset of STABLE_ASSETS) {\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n if (!adapter.capabilities.includes('save')) continue;\n try {\n const rate = await adapter.getRates(asset);\n candidates.push({ adapter, rate, asset });\n } catch { /* skip */ }\n }\n }\n\n if (candidates.length === 0) {\n throw new T2000Error('ASSET_NOT_SUPPORTED', 'No lending adapter found for any stablecoin');\n }\n\n candidates.sort((a, b) => b.rate.saveApy - a.rate.saveApy);\n return candidates[0];\n }\n\n async allRatesAcrossAssets(): Promise<Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; asset: string; rates: LendingRates }> = [];\n const seen = new Set<string>();\n for (const asset of STABLE_ASSETS) {\n if (seen.has(asset)) continue;\n seen.add(asset);\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n if (rates.saveApy > 0 || rates.borrowApy > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, asset, rates });\n }\n } catch { /* skip */ }\n }\n }\n return results;\n }\n\n async allRates(asset: string): Promise<Array<{ protocol: string; protocolId: string; rates: LendingRates }>> {\n const results: Array<{ protocol: string; protocolId: string; rates: LendingRates }> = [];\n for (const adapter of this.lending.values()) {\n if (!adapter.supportedAssets.includes(asset)) continue;\n try {\n const rates = await adapter.getRates(asset);\n results.push({ protocol: adapter.name, protocolId: adapter.id, rates });\n } catch {\n // skip\n }\n }\n return results;\n }\n\n async allPositions(address: string): Promise<Array<{ protocol: string; protocolId: string; positions: AdapterPositions }>> {\n const results: Array<{ protocol: string; protocolId: string; positions: AdapterPositions }> = [];\n const errors: string[] = [];\n for (const adapter of this.lending.values()) {\n try {\n const positions = await adapter.getPositions(address);\n if (positions.supplies.length > 0 || positions.borrows.length > 0) {\n results.push({ protocol: adapter.name, protocolId: adapter.id, positions });\n }\n } catch (err) {\n errors.push(`${adapter.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n if (results.length === 0 && errors.length > 0) {\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `Protocol queries failed (${errors.length}/${this.lending.size}): ${errors.join('; ')}`);\n }\n return results;\n }\n\n getLending(id: string): LendingAdapter | undefined {\n return this.lending.get(id);\n }\n\n listLending(): LendingAdapter[] {\n return [...this.lending.values()];\n }\n}\n","import { MIST_PER_SUI, BPS_DENOMINATOR, USDC_DECIMALS, SUI_DECIMALS, SUPPORTED_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\n\nexport function mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nexport function suiToMist(sui: number): bigint {\n return BigInt(Math.round(sui * Number(MIST_PER_SUI)));\n}\n\nexport function usdcToRaw(amount: number): bigint {\n return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));\n}\n\nexport function rawToUsdc(raw: bigint): number {\n return Number(raw) / 10 ** USDC_DECIMALS;\n}\n\nexport function stableToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function rawToStable(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function getDecimals(asset: SupportedAsset): number {\n return SUPPORTED_ASSETS[asset].decimals;\n}\n\nexport function rawToDisplay(raw: bigint, decimals: number): number {\n return Number(raw) / 10 ** decimals;\n}\n\nexport function displayToRaw(amount: number, decimals: number): bigint {\n return BigInt(Math.round(amount * 10 ** decimals));\n}\n\nexport function bpsToPercent(bps: bigint): number {\n return Number(bps) / Number(BPS_DENOMINATOR) * 100;\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function formatSui(amount: number): string {\n if (amount < 0.001) return `${amount.toFixed(6)} SUI`;\n return `${amount.toFixed(3)} SUI`;\n}\n\nexport function formatLargeNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toFixed(2);\n}\n\nexport function formatAssetAmount(amount: number, asset: string): string {\n if (asset === 'BTC') return amount.toFixed(8);\n if (asset === 'GOLD') return amount.toFixed(6);\n if (asset === 'ETH') return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nconst ASSET_LOOKUP: Map<string, string> = new Map();\nfor (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n ASSET_LOOKUP.set(key.toUpperCase(), key);\n if (info.displayName && info.displayName.toUpperCase() !== key.toUpperCase()) {\n ASSET_LOOKUP.set(info.displayName.toUpperCase(), key);\n }\n}\n\n/**\n * Case-insensitive lookup against SUPPORTED_ASSETS keys AND display names.\n * 'usde' → 'USDe', 'suiusde' → 'USDe', 'suiusdt' → 'USDT', 'usdsui' → 'USDsui'.\n * Returns the original input if not found so downstream validation can reject it.\n */\nexport function normalizeAsset(input: string): string {\n return ASSET_LOOKUP.get(input.toUpperCase()) ?? input;\n}\n","import { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport {\n SAVE_FEE_BPS,\n BORROW_FEE_BPS,\n BPS_DENOMINATOR,\n SUPPORTED_ASSETS,\n T2000_PACKAGE_ID,\n T2000_TREASURY_ID,\n T2000_CONFIG_ID,\n API_BASE_URL,\n} from '../constants.js';\nimport { usdcToRaw } from '../utils/format.js';\n\nexport type FeeOperation = 'save' | 'borrow';\n\nexport interface ProtocolFeeInfo {\n amount: number;\n asset: string;\n rate: number;\n rawAmount: bigint;\n}\n\nconst FEE_RATES: Record<FeeOperation, bigint> = {\n save: SAVE_FEE_BPS,\n borrow: BORROW_FEE_BPS,\n};\n\nconst OP_CODES: Record<FeeOperation, number> = {\n save: 0,\n borrow: 2,\n};\n\nexport function calculateFee(operation: FeeOperation, amount: number): ProtocolFeeInfo {\n const bps = FEE_RATES[operation];\n const feeAmount = amount * Number(bps) / Number(BPS_DENOMINATOR);\n const rawAmount = usdcToRaw(feeAmount);\n\n return {\n amount: feeAmount,\n asset: 'USDC',\n rate: Number(bps) / Number(BPS_DENOMINATOR),\n rawAmount,\n };\n}\n\n/**\n * Add on-chain fee collection to an existing PTB via t2000::treasury::collect_fee().\n * The Move function splits the fee from the payment coin and stores it in the\n * Treasury's internal Balance<T>. Atomic — reverts with the operation if it fails.\n */\nexport function addCollectFeeToTx(\n tx: Transaction,\n paymentCoin: TransactionObjectArgument,\n operation: FeeOperation,\n): void {\n const bps = FEE_RATES[operation];\n if (bps <= 0n) return;\n\n tx.moveCall({\n target: `${T2000_PACKAGE_ID}::treasury::collect_fee`,\n typeArguments: [SUPPORTED_ASSETS.USDC.type],\n arguments: [\n tx.object(T2000_TREASURY_ID),\n tx.object(T2000_CONFIG_ID),\n paymentCoin,\n tx.pure.u8(OP_CODES[operation]),\n ],\n });\n}\n\nexport async function reportFee(\n agentAddress: string,\n operation: string,\n feeAmount: number,\n feeRate: number,\n txDigest: string,\n): Promise<void> {\n try {\n await fetch(`${API_BASE_URL}/api/fees`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n agentAddress,\n operation,\n feeAmount: feeAmount.toString(),\n feeRate: feeRate.toString(),\n txDigest,\n }),\n });\n } catch {\n // Non-critical — best-effort reporting\n }\n}\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport { Transaction, type TransactionObjectArgument } from '@mysten/sui/transactions';\nimport {\n getLendingPositions,\n getPools as naviGetPools,\n getHealthFactor as naviGetHealthFactor,\n depositCoinPTB,\n withdrawCoinPTB,\n borrowCoinPTB,\n repayCoinPTB,\n getUserAvailableLendingRewards,\n claimLendingRewardsPTB,\n summaryLendingRewards,\n updateOraclePriceBeforeUserOperationPTB,\n type Pool,\n} from '@naviprotocol/lending';\nimport { SUPPORTED_ASSETS, ALL_NAVI_ASSETS } from '../constants.js';\nimport type { SupportedAsset } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { stableToRaw } from '../utils/format.js';\nimport { addCollectFeeToTx } from './protocolFee.js';\nimport type { PendingReward } from '../adapters/types.js';\nimport type {\n RatesResult,\n PositionsResult,\n PositionEntry,\n HealthFactorResult,\n MaxWithdrawResult,\n MaxBorrowResult,\n} from '../types.js';\n\nconst MIN_HEALTH_FACTOR = 1.5;\n\n// NAVI SDK expects SuiClient (v1 name), our code uses SuiJsonRpcClient (v2 name).\n// They're the same runtime class, so the cast is safe.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction sdkOptions(client: SuiJsonRpcClient): { env: 'prod'; client: any; cacheTime: number; disableCache: boolean } {\n // Fully disable NAVI SDK's built-in caching. cacheTime: 0 bypasses the\n // top-level withCache check, but internal SDK calls override it via\n // spread order ({ ...opts, cacheTime: w }). disableCache: true is the\n // only flag the SDK never overrides — it short-circuits the cache check.\n return { env: 'prod', client, cacheTime: 0, disableCache: true };\n}\n\n/**\n * Refresh Pyth oracle prices in the PTB before price-dependent NAVI operations.\n * NAVI's on-chain contract requires fresh oracle prices (within 15s) for\n * withdraw, borrow, and repay. Unlike Suilend (which auto-refreshes), NAVI's\n * PTB builders don't update prices — the caller must do it via this SDK helper.\n */\nasync function refreshOracle(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n options?: { skipPythUpdate?: boolean; skipOracle?: boolean },\n): Promise<void> {\n if (options?.skipOracle) return;\n const origInfo = console.info;\n const origWarn = console.warn;\n console.info = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('stale price feed')) return;\n origInfo.apply(console, args);\n };\n console.warn = (...args: unknown[]) => {\n if (typeof args[0] === 'string' && args[0].includes('price feed')) return;\n origWarn.apply(console, args);\n };\n try {\n const pools = await naviGetPools(sdkOptions(client));\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const oracleOpts: any = {\n ...sdkOptions(client),\n throws: false,\n // Pyth update uses tx.splitCoins(tx.gas, ...) which is incompatible\n // with sponsored transactions where tx.gas belongs to the sponsor.\n updatePythPriceFeeds: !options?.skipPythUpdate,\n };\n await updateOraclePriceBeforeUserOperationPTB(tx, address, pools, oracleOpts);\n } catch {\n // Best-effort: if oracle refresh fails (network issue), the operation\n // may still succeed if on-chain prices are fresh enough.\n } finally {\n console.info = origInfo;\n console.warn = origWarn;\n }\n}\n\nconst NAVI_SYMBOL_MAP: Record<string, string> = {\n nUSDC: 'USDC',\n suiUSDT: 'USDT',\n suiUSDe: 'USDe',\n XAUM: 'GOLD',\n WBTC: 'BTC',\n suiETH: 'ETH',\n WETH: 'ETH',\n SUI: 'SUI',\n USDC: 'USDC',\n USDT: 'USDT',\n USDe: 'USDe',\n USDsui: 'USDsui',\n WAL: 'WAL',\n NAVX: 'NAVX',\n ETH: 'ETH',\n GOLD: 'GOLD',\n};\n\nfunction resolveNaviSymbol(sdkSymbol: string, coinType: string): string {\n for (const [key, info] of Object.entries(SUPPORTED_ASSETS)) {\n const poolSuffix = coinType.split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = info.type.split('::').slice(1).join('::').toLowerCase();\n if (poolSuffix === targetSuffix) return key;\n }\n return NAVI_SYMBOL_MAP[sdkSymbol] ?? sdkSymbol;\n}\n\nfunction resolveAssetInfo(asset: string): { type: string; decimals: number; displayName: string } {\n if (asset in SUPPORTED_ASSETS) {\n const info = SUPPORTED_ASSETS[asset as SupportedAsset];\n return { type: info.type, decimals: info.decimals, displayName: info.displayName };\n }\n throw new T2000Error('ASSET_NOT_SUPPORTED', `Unknown asset: ${asset}`);\n}\n\n\nasync function fetchCoins(\n client: SuiJsonRpcClient,\n owner: string,\n coinType: string,\n): Promise<Array<{ coinObjectId: string; balance: string }>> {\n const all: Array<{ coinObjectId: string; balance: string }> = [];\n let cursor: string | null | undefined;\n let hasNext = true;\n while (hasNext) {\n const page = await client.getCoins({ owner, coinType, cursor: cursor ?? undefined });\n all.push(...page.data.map((c) => ({ coinObjectId: c.coinObjectId, balance: c.balance })));\n cursor = page.nextCursor;\n hasNext = page.hasNextPage;\n }\n return all;\n}\n\nfunction mergeCoins(\n tx: Transaction,\n coins: Array<{ coinObjectId: string; balance: string }>,\n): TransactionObjectArgument {\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', 'No coins to merge');\n const primary = tx.object(coins[0].coinObjectId);\n if (coins.length > 1) {\n tx.mergeCoins(primary, coins.slice(1).map((c) => tx.object(c.coinObjectId)));\n }\n return primary;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function getPositions(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PositionsResult> {\n\n try {\n const naviPositions = await getLendingPositions(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n const positions: PositionEntry[] = [];\n\n for (const pos of naviPositions) {\n const data = pos['navi-lending-supply']\n ?? pos['navi-lending-emode-supply']\n ?? pos['navi-lending-borrow']\n ?? pos['navi-lending-emode-borrow'];\n if (!data) continue;\n\n const isBorrow = pos.type.includes('borrow');\n const symbol = resolveNaviSymbol(data.token.symbol, data.token.coinType);\n const amount = parseFloat(data.amount);\n const amountUsd = parseFloat(data.valueUSD);\n const pool = data.pool;\n\n const apy = (isBorrow\n ? parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0')\n : parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0')) / 100;\n\n if (amountUsd > 0.01 || amount > 1e-10) {\n positions.push({\n protocol: 'navi',\n asset: symbol,\n type: isBorrow ? 'borrow' : 'save',\n amount,\n amountUsd,\n apy,\n });\n }\n }\n\n return { positions };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('not found') || msg.includes('404')) return { positions: [] };\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI getPositions failed: ${msg}`);\n }\n}\n\nexport async function getRates(client: SuiJsonRpcClient): Promise<RatesResult> {\n try {\n const pools = await naviGetPools(sdkOptions(client));\n const result: RatesResult = {};\n\n for (const asset of ALL_NAVI_ASSETS) {\n const targetType = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS].type;\n const pool = pools.find((p: Pool) => {\n const poolSuffix = (p.suiCoinType || p.coinType || '').split('::').slice(1).join('::').toLowerCase();\n const targetSuffix = targetType.split('::').slice(1).join('::').toLowerCase();\n return poolSuffix === targetSuffix;\n });\n if (!pool) continue;\n\n const saveApy = parseFloat(pool.supplyIncentiveApyInfo?.apy ?? '0') / 100;\n const borrowApy = parseFloat(pool.borrowIncentiveApyInfo?.apy ?? '0') / 100;\n\n if (saveApy >= 0 && saveApy < 2.0) {\n result[asset] = { saveApy, borrowApy: borrowApy >= 0 && borrowApy < 2.0 ? borrowApy : 0 };\n }\n }\n\n if (!result.USDC) result.USDC = { saveApy: 0.04, borrowApy: 0.06 };\n return result;\n } catch {\n return { USDC: { saveApy: 0.04, borrowApy: 0.06 } };\n }\n}\n\nexport async function getHealthFactor(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<HealthFactorResult> {\n\n const posResult = await getPositions(client, address);\n let supplied = 0;\n let borrowed = 0;\n\n for (const pos of posResult.positions) {\n const usd = pos.amountUsd ?? pos.amount;\n if (pos.type === 'save') supplied += usd;\n else if (pos.type === 'borrow') borrowed += usd;\n }\n\n let healthFactor: number;\n try {\n const hf = await naviGetHealthFactor(address, sdkOptions(client));\n healthFactor = hf > 1e5 ? Infinity : hf;\n } catch {\n healthFactor = borrowed > 0 ? (supplied * 0.75) / borrowed : Infinity;\n }\n\n const ltv = 0.75;\n const maxBorrow = Math.max(0, supplied * ltv - borrowed);\n\n return {\n healthFactor,\n supplied,\n borrowed,\n maxBorrow,\n liquidationThreshold: ltv,\n };\n}\n\nexport async function buildSaveTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Save amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins found`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coinObj, 'save');\n }\n\n const rawAmount = Math.min(Number(stableToRaw(amount, assetInfo.decimals)), Number(totalBalance));\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coinObj as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildWithdrawTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ tx: Transaction; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n throw new T2000Error('INVALID_AMOUNT', 'Withdrawal amount rounds to zero — balance is dust');\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n tx.transferObjects([coin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n\n return { tx, effectiveAmount };\n}\n\nexport async function addWithdrawToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const asset = options.asset ?? 'USDC';\n const sponsored = options.sponsored ?? true;\n const assetInfo = resolveAssetInfo(asset);\n\n const posResult = await getPositions(client, address);\n const supply = posResult.positions.find(\n (p) => p.type === 'save' && p.asset === asset,\n );\n const deposited = supply?.amount ?? 0;\n\n const dustBuffer = 1000 / 10 ** assetInfo.decimals;\n const effectiveAmount = Math.min(amount, Math.max(0, deposited - dustBuffer));\n if (effectiveAmount <= 0) throw new T2000Error('NO_COLLATERAL', `Nothing to withdraw for ${assetInfo.displayName} on NAVI`);\n\n const rawAmount = Number(stableToRaw(effectiveAmount, assetInfo.decimals));\n if (rawAmount <= 0) {\n const [coin] = tx.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [assetInfo.type],\n });\n return { coin, effectiveAmount: 0 };\n }\n\n await refreshOracle(tx, client, address, { skipPythUpdate: sponsored });\n\n try {\n const coin = await withdrawCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n return { coin: coin as TransactionObjectArgument, effectiveAmount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI withdraw failed: ${msg}`);\n }\n}\n\nexport async function addSaveToTx(\n tx: Transaction,\n _client: SuiJsonRpcClient,\n _address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; collectFee?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, coin, 'save');\n }\n\n try {\n await depositCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI deposit failed: ${msg}`);\n }\n}\n\nexport async function addRepayToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n coin: TransactionObjectArgument,\n options: { asset?: string; sponsored?: boolean } = {},\n): Promise<void> {\n const asset = options.asset ?? 'USDC';\n const sponsored = options.sponsored ?? true;\n const assetInfo = resolveAssetInfo(asset);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: sponsored });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, coin as never, { env: 'prod' });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n}\n\nexport async function buildBorrowTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { collectFee?: boolean; asset?: string; sponsored?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Borrow amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n const rawAmount = Number(stableToRaw(amount, assetInfo.decimals));\n\n const tx = new Transaction();\n tx.setSender(address);\n\n await refreshOracle(tx, client, address, { skipPythUpdate: options.sponsored });\n\n try {\n const borrowedCoin = await borrowCoinPTB(tx, assetInfo.type, rawAmount, sdkOptions(client));\n\n if (options.collectFee) {\n addCollectFeeToTx(tx, borrowedCoin as TransactionObjectArgument, 'borrow');\n }\n\n tx.transferObjects([borrowedCoin as TransactionObjectArgument], address);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI borrow failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function buildRepayTx(\n client: SuiJsonRpcClient,\n address: string,\n amount: number,\n options: { asset?: string; sponsored?: boolean; skipOracle?: boolean } = {},\n): Promise<Transaction> {\n if (!amount || amount <= 0 || !Number.isFinite(amount)) {\n throw new T2000Error('INVALID_AMOUNT', 'Repay amount must be a positive number');\n }\n const asset = options.asset ?? 'USDC';\n const assetInfo = resolveAssetInfo(asset);\n\n const coins = await fetchCoins(client, address, assetInfo.type);\n if (coins.length === 0) throw new T2000Error('INSUFFICIENT_BALANCE', `No ${assetInfo.displayName} coins to repay with. Withdraw some savings first to get cash.`);\n\n const totalBalance = coins.reduce((sum, c) => sum + BigInt(c.balance), 0n);\n const rawRequested = Number(stableToRaw(amount, assetInfo.decimals));\n\n if (Number(totalBalance) < rawRequested && Number(totalBalance) < 1000) {\n throw new T2000Error('INSUFFICIENT_BALANCE', `Not enough ${assetInfo.displayName} to repay (need $${amount.toFixed(2)}, wallet has ~$${(Number(totalBalance) / 10 ** assetInfo.decimals).toFixed(4)}). Withdraw some savings first.`);\n }\n\n const tx = new Transaction();\n tx.setSender(address);\n\n const coinObj = mergeCoins(tx, coins);\n\n const rawAmount = Math.min(rawRequested, Number(totalBalance));\n const [repayCoin] = tx.splitCoins(coinObj, [rawAmount]);\n\n await refreshOracle(tx, client, address, {\n skipPythUpdate: options.sponsored,\n skipOracle: options.skipOracle,\n });\n\n try {\n await repayCoinPTB(tx, assetInfo.type, repayCoin as never, {\n ...sdkOptions(client),\n amount: rawAmount,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new T2000Error('PROTOCOL_UNAVAILABLE', `NAVI repay failed: ${msg}`);\n }\n\n return tx;\n}\n\nexport async function maxWithdrawAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxWithdrawResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n let maxAmount: number;\n if (hf.borrowed === 0) {\n maxAmount = hf.supplied;\n } else {\n maxAmount = Math.max(0, hf.supplied - (hf.borrowed * MIN_HEALTH_FACTOR / ltv));\n }\n\n const remainingSupply = hf.supplied - maxAmount;\n const hfAfter = hf.borrowed > 0 ? (remainingSupply * ltv) / hf.borrowed : Infinity;\n\n return { maxAmount, healthFactorAfter: hfAfter, currentHF: hf.healthFactor };\n}\n\nexport async function maxBorrowAmount(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<MaxBorrowResult> {\n const hf = await getHealthFactor(client, address);\n const ltv = hf.liquidationThreshold > 0 ? hf.liquidationThreshold : 0.75;\n\n const maxAmount = Math.max(0, hf.supplied * ltv / MIN_HEALTH_FACTOR - hf.borrowed);\n\n return { maxAmount, healthFactorAfter: MIN_HEALTH_FACTOR, currentHF: hf.healthFactor };\n}\n\n// ---------------------------------------------------------------------------\n// Rewards\n// ---------------------------------------------------------------------------\n\nexport async function getPendingRewards(\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const summary = summaryLendingRewards(rewards);\n const result: PendingReward[] = [];\n\n for (const s of summary) {\n for (const rw of s.rewards) {\n const available = Number(rw.available);\n if (available <= 0) continue;\n const symbol = rw.coinType.split('::').pop() ?? 'UNKNOWN';\n result.push({\n protocol: 'navi',\n asset: String(s.assetId),\n coinType: rw.coinType,\n symbol,\n amount: available,\n estimatedValueUsd: 0,\n });\n }\n }\n\n return result;\n } catch {\n return [];\n }\n}\n\nexport async function addClaimRewardsToTx(\n tx: Transaction,\n client: SuiJsonRpcClient,\n address: string,\n): Promise<PendingReward[]> {\n try {\n const rewards = await getUserAvailableLendingRewards(address, {\n ...sdkOptions(client),\n markets: ['main'],\n });\n\n if (!rewards || rewards.length === 0) return [];\n\n const claimable = rewards.filter(\n (r) => Number(r.userClaimableReward) > 0,\n );\n if (claimable.length === 0) return [];\n\n const claimed = await claimLendingRewardsPTB(tx, claimable, {\n env: 'prod',\n customCoinReceive: { type: 'transfer', transfer: address },\n });\n\n return claimed.map((c) => ({\n protocol: 'navi',\n asset: '',\n coinType: '',\n symbol: 'REWARD',\n amount: 0,\n estimatedValueUsd: 0,\n }));\n } catch {\n return [];\n }\n}\n","import type { ProtocolDescriptor } from './types.js';\n\nexport type { ProtocolDescriptor } from './types.js';\n\nexport const naviDescriptor: ProtocolDescriptor = {\n id: 'navi',\n name: 'NAVI Protocol',\n packages: [],\n dynamicPackageId: true,\n actionMap: {\n 'incentive_v3::entry_deposit': 'save',\n 'incentive_v3::deposit': 'save',\n 'incentive_v3::withdraw_v2': 'withdraw',\n 'incentive_v3::entry_withdraw': 'withdraw',\n 'incentive_v3::borrow_v2': 'borrow',\n 'incentive_v3::entry_borrow': 'borrow',\n 'incentive_v3::entry_repay': 'repay',\n 'incentive_v3::repay': 'repay',\n },\n};\n\nexport const allDescriptors: ProtocolDescriptor[] = [\n naviDescriptor,\n];\n","import type { SuiJsonRpcClient } from '@mysten/sui/jsonRpc';\nimport type { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';\nimport type {\n LendingAdapter,\n LendingRates,\n AdapterPositions,\n HealthInfo,\n AdapterTxResult,\n AdapterCapability,\n PendingReward,\n} from './types.js';\nimport { ALL_NAVI_ASSETS } from '../constants.js';\nimport { T2000Error } from '../errors.js';\nimport { normalizeAsset } from '../utils/format.js';\nimport * as naviProtocol from '../protocols/navi.js';\n\nexport { naviDescriptor as descriptor } from './descriptors.js';\n\nexport class NaviAdapter implements LendingAdapter {\n readonly id = 'navi';\n readonly name = 'NAVI Protocol';\n readonly version = '1.0.0';\n readonly capabilities: readonly AdapterCapability[] = ['save', 'withdraw', 'borrow', 'repay'];\n readonly supportedAssets: readonly string[] = [...ALL_NAVI_ASSETS];\n readonly supportsSameAssetBorrow = true;\n\n private client!: SuiJsonRpcClient;\n\n async init(client: SuiJsonRpcClient): Promise<void> {\n this.client = client;\n }\n\n initSync(client: SuiJsonRpcClient): void {\n this.client = client;\n }\n\n async getRates(asset: string): Promise<LendingRates> {\n const rates = await naviProtocol.getRates(this.client);\n const normalized = normalizeAsset(asset);\n const r = rates[normalized as keyof typeof rates];\n if (!r) throw new T2000Error('ASSET_NOT_SUPPORTED', `NAVI does not support ${asset}`);\n return { asset: normalized, saveApy: r.saveApy, borrowApy: r.borrowApy };\n }\n\n async getPositions(address: string): Promise<AdapterPositions> {\n const result = await naviProtocol.getPositions(this.client, address);\n return {\n supplies: result.positions\n .filter(p => p.type === 'save')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n borrows: result.positions\n .filter(p => p.type === 'borrow')\n .map(p => ({ asset: p.asset, amount: p.amount, amountUsd: p.amountUsd, apy: p.apy })),\n };\n }\n\n async getHealth(address: string): Promise<HealthInfo> {\n return naviProtocol.getHealthFactor(this.client, address);\n }\n\n async buildSaveTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildSaveTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildWithdrawTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean },\n ): Promise<AdapterTxResult & { effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n const result = await naviProtocol.buildWithdrawTx(this.client, address, amount, { asset: normalized, sponsored: options?.sponsored });\n return { tx: result.tx, effectiveAmount: result.effectiveAmount };\n }\n\n async buildBorrowTx(\n address: string,\n amount: number,\n asset: string,\n options?: { collectFee?: boolean; sponsored?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildBorrowTx(this.client, address, amount, { ...options, asset: normalized });\n return { tx };\n }\n\n async buildRepayTx(\n address: string,\n amount: number,\n asset: string,\n options?: { sponsored?: boolean; skipOracle?: boolean },\n ): Promise<AdapterTxResult> {\n const normalized = normalizeAsset(asset);\n const tx = await naviProtocol.buildRepayTx(this.client, address, amount, {\n asset: normalized,\n sponsored: options?.sponsored,\n skipOracle: options?.skipOracle,\n });\n return { tx };\n }\n\n async maxWithdraw(address: string, _asset: string) {\n return naviProtocol.maxWithdrawAmount(this.client, address);\n }\n\n async maxBorrow(address: string, _asset: string) {\n return naviProtocol.maxBorrowAmount(this.client, address);\n }\n\n async addWithdrawToTx(\n tx: Transaction,\n address: string,\n amount: number,\n asset: string,\n ): Promise<{ coin: TransactionObjectArgument; effectiveAmount: number }> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addWithdrawToTx(tx, this.client, address, amount, { asset: normalized });\n }\n\n async addSaveToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n options?: { collectFee?: boolean },\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addSaveToTx(tx, this.client, address, coin, { ...options, asset: normalized });\n }\n\n async addRepayToTx(\n tx: Transaction,\n address: string,\n coin: TransactionObjectArgument,\n asset: string,\n ): Promise<void> {\n const normalized = normalizeAsset(asset);\n return naviProtocol.addRepayToTx(tx, this.client, address, coin, { asset: normalized });\n }\n\n async getPendingRewards(address: string): Promise<PendingReward[]> {\n return naviProtocol.getPendingRewards(this.client, address);\n }\n\n async addClaimRewardsToTx(tx: Transaction, address: string): Promise<PendingReward[]> {\n return naviProtocol.addClaimRewardsToTx(tx, this.client, address);\n }\n}\n"]}
|
package/dist/adapters/index.js
CHANGED
|
@@ -60,7 +60,7 @@ var SUPPORTED_ASSETS = {
|
|
|
60
60
|
displayName: "XAUM"
|
|
61
61
|
}
|
|
62
62
|
};
|
|
63
|
-
var STABLE_ASSETS = ["USDC"
|
|
63
|
+
var STABLE_ASSETS = ["USDC"];
|
|
64
64
|
var ALL_NAVI_ASSETS = Object.keys(SUPPORTED_ASSETS);
|
|
65
65
|
var T2000_PACKAGE_ID = process.env.T2000_PACKAGE_ID ?? "0xab92e9f1fe549ad3d6a52924a73181b45791e76120b975138fac9ec9b75db9f3";
|
|
66
66
|
var T2000_CONFIG_ID = process.env.T2000_CONFIG_ID ?? "0x408add9aa9322f93cfd87523d8f603006eb8713894f4c460283c58a6888dae8a";
|