@hobba-io/core 0.1.0
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/LICENSE +15 -0
- package/README.md +87 -0
- package/dist/amountUtils.d.ts +15 -0
- package/dist/amountUtils.d.ts.map +1 -0
- package/dist/amountUtils.js +59 -0
- package/dist/amountUtils.js.map +1 -0
- package/dist/constants.d.ts +148 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +231 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +29 -0
- package/dist/errors.js.map +1 -0
- package/dist/executeAction.d.ts +36 -0
- package/dist/executeAction.d.ts.map +1 -0
- package/dist/executeAction.js +606 -0
- package/dist/executeAction.js.map +1 -0
- package/dist/executeDepositBorrow.d.ts +49 -0
- package/dist/executeDepositBorrow.d.ts.map +1 -0
- package/dist/executeDepositBorrow.js +444 -0
- package/dist/executeDepositBorrow.js.map +1 -0
- package/dist/idl/hobba.json +5072 -0
- package/dist/idl.d.ts +783 -0
- package/dist/idl.d.ts.map +1 -0
- package/dist/idl.js +7 -0
- package/dist/idl.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/juplend/accountResolvers.d.ts +106 -0
- package/dist/juplend/accountResolvers.d.ts.map +1 -0
- package/dist/juplend/accountResolvers.js +148 -0
- package/dist/juplend/accountResolvers.js.map +1 -0
- package/dist/juplend/operateRemaining.d.ts +11 -0
- package/dist/juplend/operateRemaining.d.ts.map +1 -0
- package/dist/juplend/operateRemaining.js +46 -0
- package/dist/juplend/operateRemaining.js.map +1 -0
- package/dist/juplend/positionInit.d.ts +34 -0
- package/dist/juplend/positionInit.d.ts.map +1 -0
- package/dist/juplend/positionInit.js +56 -0
- package/dist/juplend/positionInit.js.map +1 -0
- package/dist/juplend/positionParser.d.ts +8 -0
- package/dist/juplend/positionParser.d.ts.map +1 -0
- package/dist/juplend/positionParser.js +30 -0
- package/dist/juplend/positionParser.js.map +1 -0
- package/dist/juplend/sdkApi.d.ts +39 -0
- package/dist/juplend/sdkApi.d.ts.map +1 -0
- package/dist/juplend/sdkApi.js +68 -0
- package/dist/juplend/sdkApi.js.map +1 -0
- package/dist/juplend/tickMath.d.ts +19 -0
- package/dist/juplend/tickMath.d.ts.map +1 -0
- package/dist/juplend/tickMath.js +91 -0
- package/dist/juplend/tickMath.js.map +1 -0
- package/dist/juplend/tickUtils.d.ts +20 -0
- package/dist/juplend/tickUtils.d.ts.map +1 -0
- package/dist/juplend/tickUtils.js +115 -0
- package/dist/juplend/tickUtils.js.map +1 -0
- package/dist/juplend/vaultConfigParser.d.ts +25 -0
- package/dist/juplend/vaultConfigParser.d.ts.map +1 -0
- package/dist/juplend/vaultConfigParser.js +38 -0
- package/dist/juplend/vaultConfigParser.js.map +1 -0
- package/dist/kamino/accountResolvers.d.ts +110 -0
- package/dist/kamino/accountResolvers.d.ts.map +1 -0
- package/dist/kamino/accountResolvers.js +220 -0
- package/dist/kamino/accountResolvers.js.map +1 -0
- package/dist/kamino/obligationParser.d.ts +13 -0
- package/dist/kamino/obligationParser.d.ts.map +1 -0
- package/dist/kamino/obligationParser.js +92 -0
- package/dist/kamino/obligationParser.js.map +1 -0
- package/dist/kamino/refreshInstructions.d.ts +4 -0
- package/dist/kamino/refreshInstructions.d.ts.map +1 -0
- package/dist/kamino/refreshInstructions.js +32 -0
- package/dist/kamino/refreshInstructions.js.map +1 -0
- package/dist/limits.d.ts +87 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +174 -0
- package/dist/limits.js.map +1 -0
- package/dist/marketConfig.d.ts +35 -0
- package/dist/marketConfig.d.ts.map +1 -0
- package/dist/marketConfig.js +85 -0
- package/dist/marketConfig.js.map +1 -0
- package/dist/oracle/scopePrice.d.ts +7 -0
- package/dist/oracle/scopePrice.d.ts.map +1 -0
- package/dist/oracle/scopePrice.js +31 -0
- package/dist/oracle/scopePrice.js.map +1 -0
- package/dist/pdas.d.ts +33 -0
- package/dist/pdas.d.ts.map +1 -0
- package/dist/pdas.js +116 -0
- package/dist/pdas.js.map +1 -0
- package/dist/position.d.ts +45 -0
- package/dist/position.d.ts.map +1 -0
- package/dist/position.js +68 -0
- package/dist/position.js.map +1 -0
- package/dist/positionMetrics.d.ts +108 -0
- package/dist/positionMetrics.d.ts.map +1 -0
- package/dist/positionMetrics.js +238 -0
- package/dist/positionMetrics.js.map +1 -0
- package/dist/program.d.ts +12 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +24 -0
- package/dist/program.js.map +1 -0
- package/dist/quote.d.ts +90 -0
- package/dist/quote.d.ts.map +1 -0
- package/dist/quote.js +198 -0
- package/dist/quote.js.map +1 -0
- package/dist/rates/borrowRates.d.ts +44 -0
- package/dist/rates/borrowRates.d.ts.map +1 -0
- package/dist/rates/borrowRates.js +229 -0
- package/dist/rates/borrowRates.js.map +1 -0
- package/dist/rates/collateralInfo.d.ts +21 -0
- package/dist/rates/collateralInfo.d.ts.map +1 -0
- package/dist/rates/collateralInfo.js +104 -0
- package/dist/rates/collateralInfo.js.map +1 -0
- package/dist/rates/constants.d.ts +22 -0
- package/dist/rates/constants.d.ts.map +1 -0
- package/dist/rates/constants.js +70 -0
- package/dist/rates/constants.js.map +1 -0
- package/dist/rates/index.d.ts +11 -0
- package/dist/rates/index.d.ts.map +1 -0
- package/dist/rates/index.js +11 -0
- package/dist/rates/index.js.map +1 -0
- package/dist/rates/kaminoApi.d.ts +24 -0
- package/dist/rates/kaminoApi.d.ts.map +1 -0
- package/dist/rates/kaminoApi.js +98 -0
- package/dist/rates/kaminoApi.js.map +1 -0
- package/dist/rates/supplyRates.d.ts +23 -0
- package/dist/rates/supplyRates.d.ts.map +1 -0
- package/dist/rates/supplyRates.js +67 -0
- package/dist/rates/supplyRates.js.map +1 -0
- package/dist/transactionBuilder.d.ts +5 -0
- package/dist/transactionBuilder.d.ts.map +1 -0
- package/dist/transactionBuilder.js +287 -0
- package/dist/transactionBuilder.js.map +1 -0
- package/dist/txHelpers.d.ts +16 -0
- package/dist/txHelpers.d.ts.map +1 -0
- package/dist/txHelpers.js +82 -0
- package/dist/txHelpers.js.map +1 -0
- package/dist/userState.d.ts +21 -0
- package/dist/userState.d.ts.map +1 -0
- package/dist/userState.js +60 -0
- package/dist/userState.js.map +1 -0
- package/dist/vault/vaultAccounts.d.ts +82 -0
- package/dist/vault/vaultAccounts.d.ts.map +1 -0
- package/dist/vault/vaultAccounts.js +275 -0
- package/dist/vault/vaultAccounts.js.map +1 -0
- package/dist/wallet.d.ts +12 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +2 -0
- package/dist/wallet.js.map +1 -0
- package/package.json +63 -0
- package/src/amountUtils.ts +69 -0
- package/src/constants.ts +263 -0
- package/src/errors.ts +33 -0
- package/src/executeAction.ts +884 -0
- package/src/executeDepositBorrow.ts +677 -0
- package/src/idl/hobba.json +5072 -0
- package/src/idl.ts +7 -0
- package/src/index.ts +21 -0
- package/src/juplend/accountResolvers.ts +207 -0
- package/src/juplend/operateRemaining.ts +81 -0
- package/src/juplend/positionInit.ts +86 -0
- package/src/juplend/positionParser.ts +41 -0
- package/src/juplend/sdkApi.ts +112 -0
- package/src/juplend/tickMath.ts +82 -0
- package/src/juplend/tickUtils.ts +163 -0
- package/src/juplend/vaultConfigParser.ts +45 -0
- package/src/kamino/accountResolvers.ts +299 -0
- package/src/kamino/obligationParser.ts +123 -0
- package/src/kamino/refreshInstructions.ts +45 -0
- package/src/limits.ts +222 -0
- package/src/marketConfig.ts +139 -0
- package/src/oracle/scopePrice.ts +31 -0
- package/src/pdas.ts +226 -0
- package/src/position.ts +131 -0
- package/src/positionMetrics.ts +387 -0
- package/src/program.ts +30 -0
- package/src/quote.ts +310 -0
- package/src/rates/borrowRates.ts +270 -0
- package/src/rates/collateralInfo.ts +136 -0
- package/src/rates/constants.ts +87 -0
- package/src/rates/index.ts +38 -0
- package/src/rates/kaminoApi.ts +134 -0
- package/src/rates/supplyRates.ts +102 -0
- package/src/transactionBuilder.ts +324 -0
- package/src/txHelpers.ts +107 -0
- package/src/userState.ts +91 -0
- package/src/vault/vaultAccounts.ts +365 -0
- package/src/wallet.ts +12 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collateralInfo.js","sourceRoot":"","sources":["../../src/rates/collateralInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared vault-to-reserves mappings and borrow market definitions.
|
|
3
|
+
* Single source of truth used by /api/rates, /api/supply-rates, and /api/market-data.
|
|
4
|
+
*/
|
|
5
|
+
export interface VaultReserveDef {
|
|
6
|
+
name: string;
|
|
7
|
+
id: string;
|
|
8
|
+
vault: string;
|
|
9
|
+
sharesMint: string;
|
|
10
|
+
reserves: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface BorrowMarketDef {
|
|
13
|
+
name: string;
|
|
14
|
+
provider: "kamino" | "juplend";
|
|
15
|
+
usdcReserve: string;
|
|
16
|
+
cbbtcReserve?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const VAULT_RESERVE_MAP: VaultReserveDef[];
|
|
19
|
+
export declare const BORROW_MARKET_DEFS: BorrowMarketDef[];
|
|
20
|
+
export declare const JUPLEND_USDC_RESERVE = "94vK29npVbyRHXH63rRcTiSr26SFhrQTzbpNJuhQEDu";
|
|
21
|
+
export declare const JUPLEND_VAULT_STATE_ADDR = "HnSMEmypWgJ1a6JNnBycccsBeQQvqNKphgSMquCaFiy9";
|
|
22
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/rates/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB,EAAE,eAAe,EA2C9C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,EAkB/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,gDAAgD,CAAC;AAClF,eAAO,MAAM,wBAAwB,iDAAiD,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared vault-to-reserves mappings and borrow market definitions.
|
|
3
|
+
* Single source of truth used by /api/rates, /api/supply-rates, and /api/market-data.
|
|
4
|
+
*/
|
|
5
|
+
export const VAULT_RESERVE_MAP = [
|
|
6
|
+
{
|
|
7
|
+
name: "Allez USDC",
|
|
8
|
+
id: "allez",
|
|
9
|
+
vault: "A1USdzqDHmw5oz97AkqAGLxEQZfFjASZFuy4T6Qdvnpo",
|
|
10
|
+
sharesMint: "BDh5h1uqhdL3pdCcTB1AEc2dyRsorDx9fF8Y72H1XZu8",
|
|
11
|
+
reserves: [
|
|
12
|
+
"D6q6wuQSrifJKZYpR1M8R4YawnLDtDsMmWM1NbBmgJ59", // Main Market
|
|
13
|
+
"Ga4rZytCpq1unD4DbEJ5bkHeUz9g3oh9AAFEi6vSauXp", // Altcoin
|
|
14
|
+
"9FRZvAsjDJ6WM8BJ2S45h9PoDCLAq8DNY9zZDX7MyGzT", // JLP
|
|
15
|
+
"9TD2TSv4pENb8VwfbVYg25jvym7HN6iuAR6pFNSrKjqQ", // Market 4
|
|
16
|
+
"F22tnLsbv66vEU2GZRc7coaqZsr8UcBbyp9V2kqWAiWK", // Market 5
|
|
17
|
+
"Atj6UREVWa7WxbF2EMKNyfmYUY1U1txughe2gjhcPDCo", // Market 6
|
|
18
|
+
"9GJ9GBRwCp4pHmWrQ43L5xpc9Vykg7jnfwcFGN8FoHYu", // Market 7
|
|
19
|
+
"ALnjBHECcdBsSwgVJ6A8pFEZ15qxE5jJQriCXSKT3Bte", // Market 8
|
|
20
|
+
"4QKFoFDzNFnvfkzVazABbCEfMwd3y1pZqUVzmpnkCphj", // Market 9
|
|
21
|
+
"AYL4LMc4ZCVyq3Z7XPJGWDM4H9PiWjqXAAuuHBEGVR2Z", // Market 10
|
|
22
|
+
"CxvpximovDBSPXhPj4VXechMWEV5G2DtuKwa9v9Hswrc", // Market 11
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "Prime USDC",
|
|
27
|
+
id: "prime",
|
|
28
|
+
vault: "HDsayqAsDWy3QvANGqh2yNraqcD8Fnjgh73Mhb3WRS5E",
|
|
29
|
+
sharesMint: "7D8C5pDFxug58L9zkwK7bCiDg4kD4AygzbcZUmf5usHS",
|
|
30
|
+
reserves: [
|
|
31
|
+
"Ga4rZytCpq1unD4DbEJ5bkHeUz9g3oh9AAFEi6vSauXp", // Altcoin
|
|
32
|
+
"D6q6wuQSrifJKZYpR1M8R4YawnLDtDsMmWM1NbBmgJ59", // Main Market
|
|
33
|
+
"9FRZvAsjDJ6WM8BJ2S45h9PoDCLAq8DNY9zZDX7MyGzT", // JLP
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "RockawayRWA USDC",
|
|
38
|
+
id: "rockawayRWA",
|
|
39
|
+
vault: "DWSXb18xZApz29vnQpgR2m6MynCT7PznaXt7Ut7M7KaP",
|
|
40
|
+
sharesMint: "DgHN3q3dSYAchNX7V3D4aYiTWMx8RHTgHbfPiwiqBkE9",
|
|
41
|
+
reserves: [
|
|
42
|
+
"6XdN3zXeoYKgfSeZb8h1LpiEkUXRJ3CbimE5FJ35XFBP", // RWA
|
|
43
|
+
"4QKFoFDzNFnvfkzVazABbCEfMwd3y1pZqUVzmpnkCphj", // Market 9
|
|
44
|
+
"AYL4LMc4ZCVyq3Z7XPJGWDM4H9PiWjqXAAuuHBEGVR2Z", // Market 10
|
|
45
|
+
"9GJ9GBRwCp4pHmWrQ43L5xpc9Vykg7jnfwcFGN8FoHYu", // Market 7
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
export const BORROW_MARKET_DEFS = [
|
|
50
|
+
{
|
|
51
|
+
name: "Kamino Main Market",
|
|
52
|
+
provider: "kamino",
|
|
53
|
+
usdcReserve: "D6q6wuQSrifJKZYpR1M8R4YawnLDtDsMmWM1NbBmgJ59",
|
|
54
|
+
cbbtcReserve: "37Jk2zkz23vkAYBT66HM2gaqJuNg2nYLsCreQAVt5MWK",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: "Kamino xStocks",
|
|
58
|
+
provider: "kamino",
|
|
59
|
+
usdcReserve: "97zoywd8mPZsGTg8q1wdD2Wgkdrs2tqusp1Qqcxbyj7E",
|
|
60
|
+
cbbtcReserve: "5AWpVYJvNASoUM8toSDQRcVyA9dvoUuFj5qNx9v32bjj",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "JupLend",
|
|
64
|
+
provider: "juplend",
|
|
65
|
+
usdcReserve: "94vK29npVbyRHXH63rRcTiSr26SFhrQTzbpNJuhQEDu",
|
|
66
|
+
},
|
|
67
|
+
];
|
|
68
|
+
export const JUPLEND_USDC_RESERVE = "94vK29npVbyRHXH63rRcTiSr26SFhrQTzbpNJuhQEDu";
|
|
69
|
+
export const JUPLEND_VAULT_STATE_ADDR = "HnSMEmypWgJ1a6JNnBycccsBeQQvqNKphgSMquCaFiy9";
|
|
70
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/rates/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD;QACE,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,8CAA8C;QACrD,UAAU,EAAE,8CAA8C;QAC1D,QAAQ,EAAE;YACR,8CAA8C,EAAE,cAAc;YAC9D,8CAA8C,EAAE,UAAU;YAC1D,8CAA8C,EAAE,MAAM;YACtD,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,YAAY;YAC5D,8CAA8C,EAAE,YAAY;SAC7D;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,8CAA8C;QACrD,UAAU,EAAE,8CAA8C;QAC1D,QAAQ,EAAE;YACR,8CAA8C,EAAE,UAAU;YAC1D,8CAA8C,EAAE,cAAc;YAC9D,8CAA8C,EAAE,MAAM;SACvD;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,8CAA8C;QACrD,UAAU,EAAE,8CAA8C;QAC1D,QAAQ,EAAE;YACR,8CAA8C,EAAE,MAAM;YACtD,8CAA8C,EAAE,WAAW;YAC3D,8CAA8C,EAAE,YAAY;YAC5D,8CAA8C,EAAE,WAAW;SAC5D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD;QACE,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,8CAA8C;QAC3D,YAAY,EAAE,8CAA8C;KAC7D;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,8CAA8C;QAC3D,YAAY,EAAE,8CAA8C;KAC7D;IACD;QACE,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,6CAA6C;KAC3D;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,6CAA6C,CAAC;AAClF,MAAM,CAAC,MAAM,wBAAwB,GAAG,8CAA8C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { decodeReserve, computeKaminoBorrowRate, computeKaminoSupplyRate, computeJuplendBorrowRate, computeJuplendSupplyRate, getCollateralInfo, getCollateralLtvInfo, getJuplendCollateral, getJuplendCollateralLtvInfo, getRecentSlotDurationMs, } from "./borrowRates";
|
|
2
|
+
export type { BorrowRateResult, CollateralInfo, CollateralLtvInfo, CurvePoint } from "./borrowRates";
|
|
3
|
+
export { computeSupplyRate, computeWeightedVaultAPY, } from "./supplyRates";
|
|
4
|
+
export type { SupplyRateResult, VaultAPYResult } from "./supplyRates";
|
|
5
|
+
export { VAULT_RESERVE_MAP, BORROW_MARKET_DEFS, JUPLEND_USDC_RESERVE, JUPLEND_VAULT_STATE_ADDR, } from "./constants";
|
|
6
|
+
export type { VaultReserveDef, BorrowMarketDef } from "./constants";
|
|
7
|
+
export { fetchKaminoVaultAPYs, fetchPerenaVaultAPY } from "./kaminoApi";
|
|
8
|
+
export type { KaminoVaultMetrics } from "./kaminoApi";
|
|
9
|
+
export { computeCollateralRatesInfo } from "./collateralInfo";
|
|
10
|
+
export type { CollateralRatesInfo } from "./collateralInfo";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rates/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAErG,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Server-leaning rate math shared by the app's API routes, the rebalancer and
|
|
2
|
+
// scripts. Deliberately NOT re-exported from @hobba/core's index: decodeReserve
|
|
3
|
+
// lazy-requires @kamino-finance/klend-sdk (heavy, effectively server-only), so
|
|
4
|
+
// consumers import via the subpath (`@hobba/core/rates`) to keep it out of
|
|
5
|
+
// browser/widget bundles.
|
|
6
|
+
export { decodeReserve, computeKaminoBorrowRate, computeKaminoSupplyRate, computeJuplendBorrowRate, computeJuplendSupplyRate, getCollateralInfo, getCollateralLtvInfo, getJuplendCollateral, getJuplendCollateralLtvInfo, getRecentSlotDurationMs, } from "./borrowRates";
|
|
7
|
+
export { computeSupplyRate, computeWeightedVaultAPY, } from "./supplyRates";
|
|
8
|
+
export { VAULT_RESERVE_MAP, BORROW_MARKET_DEFS, JUPLEND_USDC_RESERVE, JUPLEND_VAULT_STATE_ADDR, } from "./constants";
|
|
9
|
+
export { fetchKaminoVaultAPYs, fetchPerenaVaultAPY } from "./kaminoApi";
|
|
10
|
+
export { computeCollateralRatesInfo } from "./collateralInfo";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rates/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,2EAA2E;AAC3E,0BAA0B;AAC1B,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch vault APYs from Kamino's public API.
|
|
3
|
+
* This includes base lending yield + farming rewards + incentives,
|
|
4
|
+
* matching what the Kamino UI displays.
|
|
5
|
+
*/
|
|
6
|
+
import { Connection } from "@solana/web3.js";
|
|
7
|
+
export interface KaminoVaultMetrics {
|
|
8
|
+
name: string;
|
|
9
|
+
id: string;
|
|
10
|
+
vault: string;
|
|
11
|
+
supplyAPY: number;
|
|
12
|
+
baseAPY: number;
|
|
13
|
+
rewardsAPY: number;
|
|
14
|
+
isDisabled: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function fetchKaminoVaultAPYs(): Promise<KaminoVaultMetrics[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Fetch Perena vault APY by reading on-chain state.
|
|
19
|
+
* Share price is a 6-decimal fixed-point u64 (e.g. 1055691 = 1.055691 USDC per star*).
|
|
20
|
+
* APY is annualized from share price appreciation between a known reference point
|
|
21
|
+
* and the current on-chain price.
|
|
22
|
+
*/
|
|
23
|
+
export declare function fetchPerenaVaultAPY(connection: Connection): Promise<KaminoVaultMetrics>;
|
|
24
|
+
//# sourceMappingURL=kaminoApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kaminoApi.d.ts","sourceRoot":"","sources":["../../src/rates/kaminoApi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,iBAAiB,CAAC;AAKxD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IAGnB,UAAU,EAAE,OAAO,CAAC;CACrB;AASD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAkC1E;AAwBD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuC7F"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch vault APYs from Kamino's public API.
|
|
3
|
+
* This includes base lending yield + farming rewards + incentives,
|
|
4
|
+
* matching what the Kamino UI displays.
|
|
5
|
+
*/
|
|
6
|
+
import { PublicKey } from "@solana/web3.js";
|
|
7
|
+
import { VAULT_RESERVE_MAP } from "./constants";
|
|
8
|
+
const KAMINO_API = "https://api.kamino.finance";
|
|
9
|
+
export async function fetchKaminoVaultAPYs() {
|
|
10
|
+
const results = await Promise.all(VAULT_RESERVE_MAP.map(async (v) => {
|
|
11
|
+
try {
|
|
12
|
+
const resp = await fetch(`${KAMINO_API}/kvaults/${v.vault}/metrics`, { cache: 'no-store' });
|
|
13
|
+
if (!resp.ok) {
|
|
14
|
+
return fallback(v);
|
|
15
|
+
}
|
|
16
|
+
const data = await resp.json();
|
|
17
|
+
const apy = toNum(data.apy);
|
|
18
|
+
const farmRewards = toNum(data.apyFarmRewards);
|
|
19
|
+
const incentives = toNum(data.apyIncentives);
|
|
20
|
+
const reserveIncentives = toNum(data.apyReservesIncentives);
|
|
21
|
+
const rewardsAPY = farmRewards + incentives + reserveIncentives;
|
|
22
|
+
// Kamino's API `apy` excludes reserveIncentives; the website includes them
|
|
23
|
+
const totalAPY = apy + reserveIncentives;
|
|
24
|
+
return {
|
|
25
|
+
name: v.name,
|
|
26
|
+
id: v.id,
|
|
27
|
+
vault: v.vault,
|
|
28
|
+
supplyAPY: totalAPY * 100,
|
|
29
|
+
baseAPY: apy * 100,
|
|
30
|
+
rewardsAPY: rewardsAPY * 100,
|
|
31
|
+
isDisabled: true,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return fallback(v);
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
38
|
+
return results;
|
|
39
|
+
}
|
|
40
|
+
function toNum(val) {
|
|
41
|
+
if (val === undefined || val === null)
|
|
42
|
+
return 0;
|
|
43
|
+
const n = typeof val === "string" ? parseFloat(val) : val;
|
|
44
|
+
return isNaN(n) ? 0 : n;
|
|
45
|
+
}
|
|
46
|
+
function fallback(v) {
|
|
47
|
+
return { name: v.name, id: v.id, vault: v.vault, supplyAPY: 0, baseAPY: 0, rewardsAPY: 0, isDisabled: true };
|
|
48
|
+
}
|
|
49
|
+
// --- Perena vault ---
|
|
50
|
+
const PERENA_VAULT_STATE_ADDRESS = new PublicKey("sM6P4mh53CnG4faN4Fo3seY7wMSAiHdy8o6gKjwQF7A");
|
|
51
|
+
const PERENA_TOTAL_SHARES_OFFSET = 200;
|
|
52
|
+
const PERENA_PRICE_PER_SHARE_OFFSET = 352;
|
|
53
|
+
// Known reference point from the Perena USD* historical price chart:
|
|
54
|
+
// 2026-06-25 02:00 CEST (UTC+2) = 2026-06-25 00:00:00 UTC, price per share 1.0744.
|
|
55
|
+
// (Verified against on-chain state: offset 352 read 1.07609 on 2026-07-01.)
|
|
56
|
+
const PERENA_REF_PRICE = 1.0744;
|
|
57
|
+
const PERENA_REF_TIMESTAMP_MS = Date.UTC(2026, 5, 25, 0, 0, 0);
|
|
58
|
+
/**
|
|
59
|
+
* Fetch Perena vault APY by reading on-chain state.
|
|
60
|
+
* Share price is a 6-decimal fixed-point u64 (e.g. 1055691 = 1.055691 USDC per star*).
|
|
61
|
+
* APY is annualized from share price appreciation between a known reference point
|
|
62
|
+
* and the current on-chain price.
|
|
63
|
+
*/
|
|
64
|
+
export async function fetchPerenaVaultAPY(connection) {
|
|
65
|
+
const id = "perena";
|
|
66
|
+
const name = "Perena USDC";
|
|
67
|
+
const vault = PERENA_VAULT_STATE_ADDRESS.toBase58();
|
|
68
|
+
try {
|
|
69
|
+
const accountInfo = await connection.getAccountInfo(PERENA_VAULT_STATE_ADDRESS);
|
|
70
|
+
if (!accountInfo || !accountInfo.data) {
|
|
71
|
+
return { name, id, vault, supplyAPY: 0, baseAPY: 0, rewardsAPY: 0, isDisabled: false };
|
|
72
|
+
}
|
|
73
|
+
const data = accountInfo.data;
|
|
74
|
+
// Read total shares (u64 LE at offset 200)
|
|
75
|
+
const _totalShares = data.readBigUInt64LE(PERENA_TOTAL_SHARES_OFFSET);
|
|
76
|
+
// Read price per share (u64 LE at offset 352, 6-decimal fixed point)
|
|
77
|
+
const rawPrice = data.readBigUInt64LE(PERENA_PRICE_PER_SHARE_OFFSET);
|
|
78
|
+
const currentPrice = Number(rawPrice) / 1000000;
|
|
79
|
+
// Annualize the share-price appreciation since the reference point.
|
|
80
|
+
const elapsedDays = (Date.now() - PERENA_REF_TIMESTAMP_MS) / (1000 * 60 * 60 * 24);
|
|
81
|
+
const apy = elapsedDays > 0 && currentPrice > PERENA_REF_PRICE
|
|
82
|
+
? ((currentPrice / PERENA_REF_PRICE - 1) * (365 / elapsedDays)) * 100
|
|
83
|
+
: 0;
|
|
84
|
+
return {
|
|
85
|
+
name,
|
|
86
|
+
id,
|
|
87
|
+
vault,
|
|
88
|
+
supplyAPY: apy,
|
|
89
|
+
baseAPY: apy,
|
|
90
|
+
rewardsAPY: 0,
|
|
91
|
+
isDisabled: false,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return { name, id, vault, supplyAPY: 0, baseAPY: 0, rewardsAPY: 0, isDisabled: false };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=kaminoApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kaminoApi.js","sourceRoot":"","sources":["../../src/rates/kaminoApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared supply rate computation functions.
|
|
3
|
+
* Extracted from /api/supply-rates/route.ts to be reused by /api/market-data and the rebalancer.
|
|
4
|
+
*/
|
|
5
|
+
import { decodeReserve } from "./borrowRates";
|
|
6
|
+
export interface SupplyRateResult {
|
|
7
|
+
totalDeposited: number;
|
|
8
|
+
utilization: number;
|
|
9
|
+
supplyAPY: number;
|
|
10
|
+
}
|
|
11
|
+
export interface VaultAPYResult {
|
|
12
|
+
name: string;
|
|
13
|
+
supplyAPY: number;
|
|
14
|
+
utilization?: number;
|
|
15
|
+
totalDeposited?: number;
|
|
16
|
+
numReserves: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function computeSupplyRate(reserve: any, recentSlotDurationMs?: number): SupplyRateResult;
|
|
19
|
+
export declare function computeWeightedVaultAPY(reserveAddresses: string[], rateMap: Map<string, SupplyRateResult>): VaultAPYResult & {
|
|
20
|
+
supplyAPY: number;
|
|
21
|
+
};
|
|
22
|
+
export { decodeReserve };
|
|
23
|
+
//# sourceMappingURL=supplyRates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supplyRates.d.ts","sourceRoot":"","sources":["../../src/rates/supplyRates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAc,MAAM,eAAe,CAAC;AAO1D,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,oBAAoB,SAA2B,GAAG,gBAAgB,CA0CjH;AAED,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACrC,cAAc,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CA0BxC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared supply rate computation functions.
|
|
3
|
+
* Extracted from /api/supply-rates/route.ts to be reused by /api/market-data and the rebalancer.
|
|
4
|
+
*/
|
|
5
|
+
import { decodeReserve } from "./borrowRates";
|
|
6
|
+
const SF_SCALE = BigInt("1152921504606846976"); // 2^60
|
|
7
|
+
const SLOTS_PER_YEAR = 63072000;
|
|
8
|
+
const SLOTS_PER_SECOND = 2;
|
|
9
|
+
const DEFAULT_SLOT_DURATION_MS = 400;
|
|
10
|
+
export function computeSupplyRate(reserve, recentSlotDurationMs = DEFAULT_SLOT_DURATION_MS) {
|
|
11
|
+
const availableAmount = Number(reserve.liquidity.availableAmount);
|
|
12
|
+
const borrowedAmount = Number(BigInt(reserve.liquidity.borrowedAmountSf.toString()) / SF_SCALE);
|
|
13
|
+
const protocolFees = Number(BigInt(reserve.liquidity.accumulatedProtocolFeesSf.toString()) / SF_SCALE);
|
|
14
|
+
const referrerFees = Number(BigInt(reserve.liquidity.accumulatedReferrerFeesSf.toString()) / SF_SCALE);
|
|
15
|
+
const pendingFees = Number(BigInt(reserve.liquidity.pendingReferrerFeesSf.toString()) / SF_SCALE);
|
|
16
|
+
const totalSupply = availableAmount + borrowedAmount - protocolFees - referrerFees - pendingFees;
|
|
17
|
+
const utilization = totalSupply > 0 ? borrowedAmount / totalSupply : 0;
|
|
18
|
+
const curve = reserve.config.borrowRateCurve.points;
|
|
19
|
+
const utilBps = utilization * 10000;
|
|
20
|
+
let borrowRateBps = 0;
|
|
21
|
+
for (let i = 1; i < curve.length; i++) {
|
|
22
|
+
if (curve[i].utilizationRateBps === 0 && curve[i].borrowRateBps === 0 && i > 1)
|
|
23
|
+
break;
|
|
24
|
+
if (utilBps <= curve[i].utilizationRateBps) {
|
|
25
|
+
const x0 = curve[i - 1].utilizationRateBps;
|
|
26
|
+
const x1 = curve[i].utilizationRateBps;
|
|
27
|
+
const y0 = curve[i - 1].borrowRateBps;
|
|
28
|
+
const y1 = curve[i].borrowRateBps;
|
|
29
|
+
borrowRateBps = y0 + ((utilBps - x0) * (y1 - y0)) / (x1 - x0);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const slotAdjustment = 1000 / SLOTS_PER_SECOND / recentSlotDurationMs;
|
|
34
|
+
const adjustedBorrowRate = (borrowRateBps / 10000) * slotAdjustment;
|
|
35
|
+
const hostFixedRate = (reserve.config.hostFixedInterestRateBps / 10000) * slotAdjustment;
|
|
36
|
+
const borrowAPR = adjustedBorrowRate + hostFixedRate;
|
|
37
|
+
const protocolTakeRate = reserve.config.protocolTakeRatePct / 100;
|
|
38
|
+
const supplyAPR = borrowAPR * utilization * (1 - protocolTakeRate);
|
|
39
|
+
const supplyAPY = Math.pow(1 + supplyAPR / SLOTS_PER_YEAR, SLOTS_PER_YEAR) - 1;
|
|
40
|
+
const mintDecimals = Number(reserve.liquidity.mintDecimals);
|
|
41
|
+
const divisor = Math.pow(10, mintDecimals);
|
|
42
|
+
return {
|
|
43
|
+
totalDeposited: totalSupply / divisor,
|
|
44
|
+
utilization: utilization * 100,
|
|
45
|
+
supplyAPY: supplyAPY * 100,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function computeWeightedVaultAPY(reserveAddresses, rateMap) {
|
|
49
|
+
const reserveRates = reserveAddresses
|
|
50
|
+
.map((addr) => rateMap.get(addr))
|
|
51
|
+
.filter((r) => r != null && r.totalDeposited > 0);
|
|
52
|
+
if (reserveRates.length === 0) {
|
|
53
|
+
return { name: "", supplyAPY: 0, totalDeposited: 0, numReserves: 0 };
|
|
54
|
+
}
|
|
55
|
+
const totalWeight = reserveRates.reduce((s, r) => s + r.totalDeposited, 0);
|
|
56
|
+
const weightedAPY = reserveRates.reduce((s, r) => s + r.supplyAPY * (r.totalDeposited / totalWeight), 0);
|
|
57
|
+
const avgUtilization = reserveRates.reduce((s, r) => s + r.utilization * (r.totalDeposited / totalWeight), 0);
|
|
58
|
+
return {
|
|
59
|
+
name: "",
|
|
60
|
+
supplyAPY: weightedAPY,
|
|
61
|
+
utilization: avgUtilization,
|
|
62
|
+
totalDeposited: totalWeight,
|
|
63
|
+
numReserves: reserveRates.length,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export { decodeReserve };
|
|
67
|
+
//# sourceMappingURL=supplyRates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supplyRates.js","sourceRoot":"","sources":["../../src/rates/supplyRates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Connection, TransactionInstruction, PublicKey } from "@solana/web3.js";
|
|
2
|
+
import type { HobbaSigner } from "./wallet";
|
|
3
|
+
export declare function sendLegacyTx(connection: Connection, instructions: TransactionInstruction[], wallet: HobbaSigner, computeUnits?: number): Promise<string>;
|
|
4
|
+
export declare function sendVersionedTx(connection: Connection, instructions: TransactionInstruction[], wallet: HobbaSigner, lutAddresses: PublicKey[], computeUnits?: number, skipSimulation?: boolean, rebuildOnTickError?: () => Promise<TransactionInstruction[] | null>): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=transactionBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../src/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,sBAAsB,EAKtB,SAAS,EAEV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA2B5C,wBAAsB,YAAY,CAChC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,sBAAsB,EAAE,EACtC,MAAM,EAAE,WAAW,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,sBAAsB,EAAE,EACtC,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,SAAS,EAAE,EACzB,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,OAAO,EAKxB,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,GAClE,OAAO,CAAC,MAAM,CAAC,CA+OjB"}
|