@sonarwatch/portfolio-plugins 0.11.113 → 0.11.115

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. package/CHANGELOG.md +1175 -1167
  2. package/README.md +3 -3
  3. package/package.json +2 -2
  4. package/src/index.d.ts +0 -1
  5. package/src/index.js +18 -4
  6. package/src/index.js.map +1 -1
  7. package/src/plugins/abex/constants.d.ts +7 -0
  8. package/src/plugins/abex/constants.js +17 -0
  9. package/src/plugins/abex/constants.js.map +1 -0
  10. package/src/plugins/abex/index.d.ts +6 -0
  11. package/src/plugins/abex/index.js +13 -0
  12. package/src/plugins/abex/index.js.map +1 -0
  13. package/src/plugins/abex/marketsJob.d.ts +3 -0
  14. package/src/plugins/abex/marketsJob.js +90 -0
  15. package/src/plugins/abex/marketsJob.js.map +1 -0
  16. package/src/plugins/abex/positionsFetcher.js +65 -0
  17. package/src/plugins/abex/positionsFetcher.js.map +1 -0
  18. package/src/plugins/abex/types.d.ts +69 -0
  19. package/src/plugins/abex/types.js +3 -0
  20. package/src/plugins/abex/types.js.map +1 -0
  21. package/src/plugins/balancer/helpers/pools.js +21 -21
  22. package/src/plugins/foo/index.js +2 -2
  23. package/src/plugins/foo/index.js.map +1 -1
  24. package/src/plugins/foo/positionsFetcher.d.ts +3 -0
  25. package/src/plugins/foo/{positionFetcher.js → positionsFetcher.js} +2 -2
  26. package/src/plugins/foo/positionsFetcher.js.map +1 -0
  27. package/src/plugins/kai/constants.d.ts +9 -0
  28. package/src/plugins/kai/constants.js +37 -0
  29. package/src/plugins/kai/constants.js.map +1 -0
  30. package/src/plugins/kai/index.d.ts +6 -0
  31. package/src/plugins/kai/index.js +12 -0
  32. package/src/plugins/kai/index.js.map +1 -0
  33. package/src/plugins/kai/types.d.ts +57 -0
  34. package/src/plugins/kai/types.js +3 -0
  35. package/src/plugins/kai/types.js.map +1 -0
  36. package/src/plugins/kai/vaultsJob.d.ts +3 -0
  37. package/src/plugins/kai/vaultsJob.js +60 -0
  38. package/src/plugins/kai/vaultsJob.js.map +1 -0
  39. package/src/plugins/raydium/lpTokensJob.js +4 -1
  40. package/src/plugins/raydium/lpTokensJob.js.map +1 -1
  41. package/src/plugins/solend/obligationsFetcher.js +5 -2
  42. package/src/plugins/solend/obligationsFetcher.js.map +1 -1
  43. package/src/plugins/suilend/constants.d.ts +8 -0
  44. package/src/plugins/suilend/constants.js +18 -0
  45. package/src/plugins/suilend/constants.js.map +1 -0
  46. package/src/plugins/suilend/index.d.ts +6 -0
  47. package/src/plugins/suilend/index.js +13 -0
  48. package/src/plugins/suilend/index.js.map +1 -0
  49. package/src/plugins/suilend/marketsJob.d.ts +3 -0
  50. package/src/plugins/suilend/marketsJob.js +45 -0
  51. package/src/plugins/suilend/marketsJob.js.map +1 -0
  52. package/src/plugins/suilend/obligationsFetcher.d.ts +3 -0
  53. package/src/plugins/suilend/obligationsFetcher.js +151 -0
  54. package/src/plugins/suilend/obligationsFetcher.js.map +1 -0
  55. package/src/plugins/suilend/types.d.ts +137 -0
  56. package/src/plugins/suilend/types.js +3 -0
  57. package/src/plugins/suilend/types.js.map +1 -0
  58. package/src/plugins/sushiswap/helpers.js +24 -24
  59. package/src/plugins/symmetry/basketsJob.d.ts +3 -0
  60. package/src/plugins/symmetry/basketsJob.js +69 -0
  61. package/src/plugins/symmetry/basketsJob.js.map +1 -0
  62. package/src/plugins/symmetry/constants.d.ts +7 -0
  63. package/src/plugins/symmetry/constants.js +17 -0
  64. package/src/plugins/symmetry/constants.js.map +1 -0
  65. package/src/plugins/symmetry/filters.d.ts +2 -0
  66. package/src/plugins/symmetry/filters.js +15 -0
  67. package/src/plugins/symmetry/filters.js.map +1 -0
  68. package/src/plugins/symmetry/index.d.ts +6 -0
  69. package/src/plugins/symmetry/index.js +12 -0
  70. package/src/plugins/symmetry/index.js.map +1 -0
  71. package/src/plugins/symmetry/structs.d.ts +78 -0
  72. package/src/plugins/symmetry/structs.js +78 -0
  73. package/src/plugins/symmetry/structs.js.map +1 -0
  74. package/src/plugins/uniswap-v2/helpers.js +22 -22
  75. package/src/utils/misc/getLpTokenSourceRaw.d.ts +1 -1
  76. package/src/utils/sei/constants.js +8 -8
  77. package/src/utils/sei/getQueryBalanceByOwner.js +4 -4
  78. package/src/plugins/foo/positionFetcher.js.map +0 -1
  79. /package/src/plugins/{foo/positionFetcher.d.ts → abex/positionsFetcher.d.ts} +0 -0
@@ -0,0 +1,137 @@
1
+ import { ParsedData } from '../../utils/sui/types';
2
+ export type ObligationCapFields = {
3
+ id: ID;
4
+ obligation_id: string;
5
+ };
6
+ export type Obligation = {
7
+ id: ID;
8
+ lending_market_id: string;
9
+ deposits: ParsedData<Deposit>[];
10
+ borrows: ParsedData<Borrow>[];
11
+ deposited_value_usd: ParsedData<Value>;
12
+ allowed_borrow_value_usd: ParsedData<Value>;
13
+ unhealthy_borrow_value_usd: ParsedData<Value>;
14
+ super_unhealthy_borrow_value_usd: ParsedData<Value>;
15
+ unweighted_borrowed_value_usd: ParsedData<Value>;
16
+ weighted_borrowed_value_usd: ParsedData<Value>;
17
+ weighted_borrowed_value_upper_bound_usd: ParsedData<Value>;
18
+ borrowing_isolated_asset: boolean;
19
+ user_reward_managers: ParsedData<UserRewardManager>[];
20
+ bad_debt_usd: ParsedData<Value>;
21
+ closable: boolean;
22
+ };
23
+ export type Deposit = {
24
+ attributed_borrow_value: ParsedData<Value>;
25
+ coin_type: ParsedData<Name>;
26
+ deposited_ctoken_amount: string;
27
+ market_value: ParsedData<Value>;
28
+ user_reward_manager_index: string;
29
+ reserve_array_index: string;
30
+ };
31
+ export type Borrow = {
32
+ coin_type: ParsedData<Name>;
33
+ borrowed_amount: ParsedData<Value>;
34
+ cumulative_borrow_rate: ParsedData<Value>;
35
+ market_value: ParsedData<Value>;
36
+ user_reward_manager_index: string;
37
+ reserve_array_index: string;
38
+ };
39
+ export type UserRewardManager = {
40
+ last_update_time_ms: string;
41
+ pool_reward_manager_id: string;
42
+ rewards: ParsedData<Reward>[];
43
+ share: string;
44
+ };
45
+ export type Reward = {
46
+ cumulative_rewards_per_share: ParsedData<Value>;
47
+ earned_rewards: ParsedData<Value>;
48
+ pool_reward_id: string;
49
+ };
50
+ export type LendingMarket = {
51
+ id: ID;
52
+ version: string;
53
+ reserves: ParsedData<Reserve>[];
54
+ };
55
+ export type Reserve = {
56
+ id: ID;
57
+ array_index: string;
58
+ attributed_borrow_value: ParsedData<Value>;
59
+ available_amount: string;
60
+ borrowed_amount: ParsedData<Value>;
61
+ borrows_pool_reward_manager: ParsedData<SPoolRewardManager>;
62
+ coin_type: ParsedData<Name>;
63
+ config: ParsedData<Config>;
64
+ ctoken_supply: string;
65
+ cumulative_borrow_rate: ParsedData<Value>;
66
+ deposits_pool_reward_manager: ParsedData<SPoolRewardManager>;
67
+ interest_last_update_timestamp_s: string;
68
+ lending_market_id: string;
69
+ mint_decimals: number;
70
+ price: ParsedData<Value>;
71
+ price_identifier: ParsedData<PriceIdentifier>;
72
+ price_last_update_timestamp_s: string;
73
+ smoothed_price: ParsedData<Value>;
74
+ unclaimed_spread_fees: ParsedData<Value>;
75
+ };
76
+ export type SPoolRewardManager = {
77
+ id: ID;
78
+ last_update_time_ms: string;
79
+ pool_rewards: ParsedData<PoolReward>[];
80
+ total_shares: string;
81
+ };
82
+ export type PoolReward = {
83
+ id: ID;
84
+ additional_fields: ParsedData<AdditionalFields>;
85
+ allocated_rewards: ParsedData<Value>;
86
+ coin_type: ParsedData<Name>;
87
+ cumulative_rewards_per_share: ParsedData<Value>;
88
+ end_time_ms: string;
89
+ num_user_reward_managers: string;
90
+ pool_reward_manager_id: string;
91
+ start_time_ms: string;
92
+ total_rewards: string;
93
+ };
94
+ export type AdditionalFields = {
95
+ id: ID;
96
+ size: string;
97
+ };
98
+ export type Config = {
99
+ element: ParsedData<Element>;
100
+ };
101
+ export type Element = {
102
+ additional_fields: ParsedData<AdditionalFields>;
103
+ borrow_fee_bps: string;
104
+ borrow_limit: string;
105
+ borrow_limit_usd: string;
106
+ borrow_weight_bps: string;
107
+ close_attributed_borrow_limit_usd: string;
108
+ close_ltv_pct: number;
109
+ deposit_limit: string;
110
+ deposit_limit_usd: string;
111
+ interest_rate_aprs: string[];
112
+ interest_rate_utils: number[];
113
+ isolated: boolean;
114
+ liquidation_bonus_bps: string;
115
+ max_close_ltv_pct: number;
116
+ max_liquidation_bonus_bps: string;
117
+ open_attributed_borrow_limit_usd: string;
118
+ open_ltv_pct: number;
119
+ protocol_liquidation_fee_bps: string;
120
+ spread_fee_bps: string;
121
+ };
122
+ export type PriceIdentifier = {
123
+ bytes: number[];
124
+ };
125
+ export type Value = {
126
+ value: string;
127
+ };
128
+ export type Name = {
129
+ name: string;
130
+ };
131
+ export type ID = {
132
+ id: string;
133
+ };
134
+ export type RewardInfo = {
135
+ poolId: string;
136
+ rewardMint: string;
137
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/suilend/types.ts"],"names":[],"mappings":""}
@@ -54,30 +54,30 @@ function sushiV3PairToUniV2(pair) {
54
54
  }
55
55
  function getV3PairsAddresses(url, length = 300) {
56
56
  return __awaiter(this, void 0, void 0, function* () {
57
- const query = (0, graphql_request_1.gql) `
58
- {
59
- pools(
60
- orderBy: totalValueLockedUSD
61
- first: ${length}
62
- orderDirection: desc
63
- where: { volumeUSD_not: "0", liquidity_not: "0" }
64
- ) {
65
- id
66
- token0Price
67
- token1Price
68
- liquidity
69
- token0 {
70
- id
71
- totalSupply
72
- decimals
73
- }
74
- token1 {
75
- id
76
- totalSupply
77
- decimals
78
- }
79
- }
80
- }
57
+ const query = (0, graphql_request_1.gql) `
58
+ {
59
+ pools(
60
+ orderBy: totalValueLockedUSD
61
+ first: ${length}
62
+ orderDirection: desc
63
+ where: { volumeUSD_not: "0", liquidity_not: "0" }
64
+ ) {
65
+ id
66
+ token0Price
67
+ token1Price
68
+ liquidity
69
+ token0 {
70
+ id
71
+ totalSupply
72
+ decimals
73
+ }
74
+ token1 {
75
+ id
76
+ totalSupply
77
+ decimals
78
+ }
79
+ }
80
+ }
81
81
  `;
82
82
  const res = yield (0, graphql_request_1.default)(url, query);
83
83
  const pools = res.pools;
@@ -0,0 +1,3 @@
1
+ import { Job } from '../../Job';
2
+ declare const job: Job;
3
+ export default job;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const portfolio_core_1 = require("@sonarwatch/portfolio-core");
16
+ const constants_1 = require("./constants");
17
+ const solana_1 = require("../../utils/solana");
18
+ const clients_1 = require("../../utils/clients");
19
+ const structs_1 = require("./structs");
20
+ const filters_1 = require("./filters");
21
+ const getParsedAccountInfo_1 = require("../../utils/solana/getParsedAccountInfo");
22
+ const getLpTokenSourceRaw_1 = __importDefault(require("../../utils/misc/getLpTokenSourceRaw"));
23
+ const runInBatch_1 = __importDefault(require("../../utils/misc/runInBatch"));
24
+ const executor = (cache) => __awaiter(void 0, void 0, void 0, function* () {
25
+ const connection = (0, clients_1.getClientSolana)();
26
+ const tokenListRes = yield (0, getParsedAccountInfo_1.getParsedAccountInfo)(connection, structs_1.tokenListStruct, constants_1.tokenListAddress);
27
+ if (!tokenListRes)
28
+ return;
29
+ const tokenList = tokenListRes.list
30
+ .map((t) => t.tokenMint.toString())
31
+ .slice(0, tokenListRes.numTokens.toNumber());
32
+ const tokenPrices = yield cache.getTokenPrices(tokenList, portfolio_core_1.NetworkId.solana);
33
+ const accounts = yield (0, solana_1.getParsedProgramAccounts)(connection, structs_1.fundStruct, constants_1.basketProgramId, filters_1.fundFilters);
34
+ const lpSources = [];
35
+ for (let i = 0; i < accounts.length; i++) {
36
+ const account = accounts[i];
37
+ if (account.supplyOutstanding.isZero())
38
+ continue;
39
+ const poolUnderlyingRaw = [];
40
+ for (let j = 0; j < account.numOfTokens.toNumber(); j++) {
41
+ const tokenIndex = account.currentCompToken[j].toNumber();
42
+ const tokenPrice = tokenPrices[tokenIndex];
43
+ if (!tokenPrice)
44
+ continue;
45
+ poolUnderlyingRaw.push({
46
+ address: tokenPrice.address,
47
+ decimals: tokenPrice.decimals,
48
+ price: tokenPrice.price,
49
+ reserveAmountRaw: account.currentCompAmount[j],
50
+ });
51
+ }
52
+ if (poolUnderlyingRaw.length === 0)
53
+ continue;
54
+ const lpSource = (0, getLpTokenSourceRaw_1.default)(portfolio_core_1.NetworkId.solana, constants_1.platformId, constants_1.platformId, 'Basket', {
55
+ address: account.fundToken.toString(),
56
+ decimals: 6,
57
+ supplyRaw: account.supplyOutstanding,
58
+ }, poolUnderlyingRaw);
59
+ lpSources.push(lpSource);
60
+ }
61
+ yield (0, runInBatch_1.default)(lpSources.map((s) => () => cache.setTokenPriceSource(s)), 20);
62
+ });
63
+ const job = {
64
+ id: `${constants_1.platformId}-baskets`,
65
+ executor,
66
+ label: 'normal',
67
+ };
68
+ exports.default = job;
69
+ //# sourceMappingURL=basketsJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basketsJob.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/symmetry/basketsJob.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,+DAAyE;AAGzE,2CAA4E;AAC5E,+CAA8D;AAC9D,iDAAsD;AACtD,uCAAwD;AACxD,uCAAwC;AACxC,kFAA+E;AAC/E,+FAE8C;AAC9C,6EAAqD;AAErD,MAAM,QAAQ,GAAgB,CAAO,KAAY,EAAE,EAAE;IACnD,MAAM,UAAU,GAAG,IAAA,yBAAe,GAAE,CAAC;IAErC,MAAM,YAAY,GAAG,MAAM,IAAA,2CAAoB,EAC7C,UAAU,EACV,yBAAe,EACf,4BAAgB,CACjB,CAAC;IACF,IAAI,CAAC,YAAY;QAAE,OAAO;IAC1B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;SAClC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,0BAAS,CAAC,MAAM,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAG,MAAM,IAAA,iCAAwB,EAC7C,UAAU,EACV,oBAAU,EACV,2BAAe,EACf,qBAAW,CACZ,CAAC;IAEF,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE;YAAE,SAAS;QAEjD,MAAM,iBAAiB,GAAwB,EAAE,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YACxD,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC1D,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;YAC3C,IAAI,CAAC,UAAU;gBAAE,SAAS;YAC1B,iBAAiB,CAAC,IAAI,CAAC;gBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,gBAAgB,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC;QACD,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE7C,MAAM,QAAQ,GAAG,IAAA,6BAAmB,EAClC,0BAAS,CAAC,MAAM,EAChB,sBAAU,EACV,sBAAU,EACV,QAAQ,EACR;YACE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE;YACrC,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,OAAO,CAAC,iBAAiB;SACrC,EACD,iBAAiB,CAClB,CAAC;QACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,IAAA,oBAAU,EACd,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EACxD,EAAE,CACH,CAAC;AACJ,CAAC,CAAA,CAAC;AACF,MAAM,GAAG,GAAQ;IACf,EAAE,EAAE,GAAG,sBAAU,UAAU;IAC3B,QAAQ;IACR,KAAK,EAAE,QAAQ;CAChB,CAAC;AACF,kBAAe,GAAG,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ import { Platform } from '@sonarwatch/portfolio-core';
3
+ export declare const platformId = "symmetry";
4
+ export declare const platform: Platform;
5
+ export declare const basketsCachePrefix = "symmetry-baskets";
6
+ export declare const basketProgramId: PublicKey;
7
+ export declare const tokenListAddress: PublicKey;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokenListAddress = exports.basketProgramId = exports.basketsCachePrefix = exports.platform = exports.platformId = void 0;
4
+ const web3_js_1 = require("@solana/web3.js");
5
+ exports.platformId = 'symmetry';
6
+ exports.platform = {
7
+ id: exports.platformId,
8
+ name: 'Symmetry',
9
+ image: 'https://sonar.watch/img/platforms/symmetry.webp',
10
+ website: 'https://www.symmetry.fi/',
11
+ twitter: 'https://twitter.com/symmetry_fi',
12
+ defiLlamaId: 'symmetry', // from https://defillama.com/docs/api
13
+ };
14
+ exports.basketsCachePrefix = `${exports.platformId}-baskets`;
15
+ exports.basketProgramId = new web3_js_1.PublicKey('2KehYt3KsEQR53jYcxjbQp2d2kCp4AkuQW68atufRwSr');
16
+ exports.tokenListAddress = new web3_js_1.PublicKey('3SnUughtueoVrhevXTLMf586qvKNNXggNsc7NgoMUU1t');
17
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/symmetry/constants.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAG/B,QAAA,UAAU,GAAG,UAAU,CAAC;AACxB,QAAA,QAAQ,GAAa;IAChC,EAAE,EAAE,kBAAU;IACd,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,iDAAiD;IACxD,OAAO,EAAE,0BAA0B;IACnC,OAAO,EAAE,iCAAiC;IAC1C,WAAW,EAAE,UAAU,EAAE,sCAAsC;CAChE,CAAC;AACW,QAAA,kBAAkB,GAAG,GAAG,kBAAU,UAAU,CAAC;AAC7C,QAAA,eAAe,GAAG,IAAI,mBAAS,CAC1C,8CAA8C,CAC/C,CAAC;AACW,QAAA,gBAAgB,GAAG,IAAI,mBAAS,CAC3C,8CAA8C,CAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { GetProgramAccountsFilter } from '@solana/web3.js';
2
+ export declare const fundFilters: GetProgramAccountsFilter[];
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fundFilters = void 0;
4
+ const structs_1 = require("./structs");
5
+ exports.fundFilters = [
6
+ { dataSize: structs_1.fundStruct.byteSize },
7
+ { memcmp: { offset: 112, bytes: '11111111' } },
8
+ {
9
+ memcmp: {
10
+ offset: 128,
11
+ bytes: '4Vry5hGDmbwGwhjgegHmoitjMHniSotpjBFkRuDYHcDG',
12
+ },
13
+ },
14
+ ];
15
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/symmetry/filters.ts"],"names":[],"mappings":";;;AACA,uCAAuC;AAE1B,QAAA,WAAW,GAA+B;IACrD,EAAE,QAAQ,EAAE,oBAAU,CAAC,QAAQ,EAAE;IACjC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;IAC9C;QACE,MAAM,EAAE;YACN,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,8CAA8C;SACtD;KACF;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Platform } from '@sonarwatch/portfolio-core';
2
+ import { Fetcher } from '../../Fetcher';
3
+ import { Job } from '../../Job';
4
+ export declare const platforms: Platform[];
5
+ export declare const jobs: Job[];
6
+ export declare const fetchers: Fetcher[];
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchers = exports.jobs = exports.platforms = void 0;
7
+ const constants_1 = require("./constants");
8
+ const basketsJob_1 = __importDefault(require("./basketsJob"));
9
+ exports.platforms = [constants_1.platform];
10
+ exports.jobs = [basketsJob_1.default];
11
+ exports.fetchers = [];
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/symmetry/index.ts"],"names":[],"mappings":";;;;;;AAGA,2CAAuC;AACvC,8DAAsC;AAEzB,QAAA,SAAS,GAAe,CAAC,oBAAQ,CAAC,CAAC;AACnC,QAAA,IAAI,GAAU,CAAC,oBAAU,CAAC,CAAC;AAC3B,QAAA,QAAQ,GAAc,EAAE,CAAC"}
@@ -0,0 +1,78 @@
1
+ /// <reference types="node" />
2
+ import { BeetStruct, FixableBeetStruct } from '@metaplex-foundation/beet';
3
+ import BigNumber from 'bignumber.js';
4
+ import { PublicKey } from '@solana/web3.js';
5
+ export type Fund = {
6
+ buffer: Buffer;
7
+ version: BigNumber;
8
+ manager: PublicKey;
9
+ fundToken: PublicKey;
10
+ managerFee: BigNumber;
11
+ supplyOutstanding: BigNumber;
12
+ activelyManaged: BigNumber;
13
+ activeBuyStates: BigNumber;
14
+ sellState: BigNumber;
15
+ rebalanceSellState: BigNumber;
16
+ hostPubkey: PublicKey;
17
+ hostFee: BigNumber;
18
+ numOfTokens: BigNumber;
19
+ currentCompToken: BigNumber[];
20
+ currentCompAmount: BigNumber[];
21
+ lastRebalanceTime: BigNumber[];
22
+ targetWeight: BigNumber[];
23
+ weightSum: BigNumber;
24
+ currentWeight: BigNumber[];
25
+ fundWorth: BigNumber;
26
+ lastUpdateTime: BigNumber;
27
+ refilterInterval: BigNumber;
28
+ reweightInterval: BigNumber;
29
+ rebalanceInterval: BigNumber;
30
+ rebalanceThreshold: BigNumber;
31
+ rebalanceSlippage: BigNumber;
32
+ lpOffsetThreshold: BigNumber;
33
+ lastRefilterTime: BigNumber;
34
+ lastReweightTime: BigNumber;
35
+ rulesReady: BigNumber;
36
+ assetPool: BigNumber[];
37
+ numOfRules: BigNumber;
38
+ rules: Buffer[];
39
+ numRuleTokens: BigNumber;
40
+ ruleTokens: BigNumber[];
41
+ ruleTokenWeights: BigNumber[];
42
+ messageDigestFive: number[];
43
+ disableRebalance: BigNumber;
44
+ disableLp: BigNumber;
45
+ allowMultiAssetContribution: number;
46
+ symbolLength: number;
47
+ symbol: number[];
48
+ nameLength: number;
49
+ name: number[];
50
+ uriLength: number;
51
+ uri: number[];
52
+ extraBytes: number[];
53
+ };
54
+ export declare const fundStruct: BeetStruct<Fund, Partial<Fund>>;
55
+ export type TokenSettings = {
56
+ tokenMint: PublicKey;
57
+ decimals: number;
58
+ coingeckoId: number[];
59
+ pdaTokenAccount: PublicKey;
60
+ oracleType: number;
61
+ oracleAccount: PublicKey;
62
+ oracleIndex: number;
63
+ oracleConfidencePct: number;
64
+ fixedConfidenceBps: number;
65
+ tokenSwapFeeAfterTwBps: number;
66
+ tokenSwapFeeBeforeTwBps: number;
67
+ isLive: number;
68
+ lpOn: number;
69
+ useCurveData: number;
70
+ additionalData: number[];
71
+ };
72
+ export declare const tokenSettingsStruct: BeetStruct<TokenSettings, Partial<TokenSettings>>;
73
+ export type TokenList = {
74
+ buffer: Buffer;
75
+ numTokens: BigNumber;
76
+ list: TokenSettings[];
77
+ };
78
+ export declare const tokenListStruct: FixableBeetStruct<TokenList, Partial<TokenList>>;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokenListStruct = exports.tokenSettingsStruct = exports.fundStruct = void 0;
4
+ const beet_solana_1 = require("@metaplex-foundation/beet-solana");
5
+ const beet_1 = require("@metaplex-foundation/beet");
6
+ const solana_1 = require("../../utils/solana");
7
+ exports.fundStruct = new beet_1.BeetStruct([
8
+ ['buffer', (0, solana_1.blob)(8)],
9
+ ['version', solana_1.u64],
10
+ ['manager', beet_solana_1.publicKey],
11
+ ['fundToken', beet_solana_1.publicKey],
12
+ ['managerFee', solana_1.u64],
13
+ ['supplyOutstanding', solana_1.u64],
14
+ ['activelyManaged', solana_1.u64],
15
+ ['activeBuyStates', solana_1.u64],
16
+ ['sellState', solana_1.u64],
17
+ ['rebalanceSellState', solana_1.u64],
18
+ ['hostPubkey', beet_solana_1.publicKey],
19
+ ['hostFee', solana_1.u64],
20
+ ['numOfTokens', solana_1.u64],
21
+ ['currentCompToken', (0, beet_1.uniformFixedSizeArray)(solana_1.u64, 20)],
22
+ ['currentCompAmount', (0, beet_1.uniformFixedSizeArray)(solana_1.u64, 20)],
23
+ ['lastRebalanceTime', (0, beet_1.uniformFixedSizeArray)(solana_1.u64, 20)],
24
+ ['targetWeight', (0, beet_1.uniformFixedSizeArray)(solana_1.u64, 20)],
25
+ ['weightSum', solana_1.u64],
26
+ ['currentWeight', (0, beet_1.uniformFixedSizeArray)(solana_1.u64, 20)],
27
+ ['fundWorth', solana_1.u64],
28
+ ['lastUpdateTime', solana_1.u64],
29
+ ['refilterInterval', solana_1.u64],
30
+ ['reweightInterval', solana_1.u64],
31
+ ['rebalanceInterval', solana_1.u64],
32
+ ['rebalanceThreshold', solana_1.u64],
33
+ ['rebalanceSlippage', solana_1.u64],
34
+ ['lpOffsetThreshold', solana_1.u64],
35
+ ['lastRefilterTime', solana_1.u64],
36
+ ['lastReweightTime', solana_1.u64],
37
+ ['rulesReady', solana_1.u64],
38
+ ['assetPool', (0, beet_1.uniformFixedSizeArray)(solana_1.u64, 200)],
39
+ ['numOfRules', solana_1.u64],
40
+ ['rules', (0, beet_1.uniformFixedSizeArray)((0, solana_1.blob)(320), 20)],
41
+ ['numRuleTokens', solana_1.u64],
42
+ ['ruleTokens', (0, beet_1.uniformFixedSizeArray)(solana_1.u64, 20)],
43
+ ['ruleTokenWeights', (0, beet_1.uniformFixedSizeArray)(solana_1.u64, 20)],
44
+ ['messageDigestFive', (0, beet_1.uniformFixedSizeArray)(beet_1.u8, 16)],
45
+ ['disableRebalance', solana_1.u64],
46
+ ['disableLp', solana_1.u64],
47
+ ['allowMultiAssetContribution', beet_1.u8],
48
+ ['symbolLength', beet_1.u8],
49
+ ['symbol', (0, beet_1.uniformFixedSizeArray)(beet_1.u8, 10)],
50
+ ['nameLength', beet_1.u8],
51
+ ['name', (0, beet_1.uniformFixedSizeArray)(beet_1.u8, 60)],
52
+ ['uriLength', beet_1.u8],
53
+ ['uri', (0, beet_1.uniformFixedSizeArray)(beet_1.u8, 300)],
54
+ ['extraBytes', (0, beet_1.uniformFixedSizeArray)(beet_1.u8, 394)],
55
+ ], (args) => args);
56
+ exports.tokenSettingsStruct = new beet_1.BeetStruct([
57
+ ['tokenMint', beet_solana_1.publicKey],
58
+ ['decimals', beet_1.u8],
59
+ ['coingeckoId', (0, beet_1.uniformFixedSizeArray)(beet_1.u8, 30)],
60
+ ['pdaTokenAccount', beet_solana_1.publicKey],
61
+ ['oracleType', beet_1.u8],
62
+ ['oracleAccount', beet_solana_1.publicKey],
63
+ ['oracleIndex', beet_1.u8],
64
+ ['oracleConfidencePct', beet_1.u8],
65
+ ['fixedConfidenceBps', beet_1.u8],
66
+ ['tokenSwapFeeAfterTwBps', beet_1.u8],
67
+ ['tokenSwapFeeBeforeTwBps', beet_1.u8],
68
+ ['isLive', beet_1.u8],
69
+ ['lpOn', beet_1.u8],
70
+ ['useCurveData', beet_1.u8],
71
+ ['additionalData', (0, beet_1.uniformFixedSizeArray)(beet_1.u8, 63)],
72
+ ], (args) => args);
73
+ exports.tokenListStruct = new beet_1.FixableBeetStruct([
74
+ ['buffer', (0, solana_1.blob)(8)],
75
+ ['numTokens', solana_1.u64],
76
+ ['list', (0, beet_1.uniformFixedSizeArray)(exports.tokenSettingsStruct, 20)],
77
+ ], (args) => args);
78
+ //# sourceMappingURL=structs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structs.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/symmetry/structs.ts"],"names":[],"mappings":";;;AAAA,kEAA6D;AAC7D,oDAKmC;AAGnC,+CAA+C;AAqDlC,QAAA,UAAU,GAAG,IAAI,iBAAU,CACtC;IACE,CAAC,QAAQ,EAAE,IAAA,aAAI,EAAC,CAAC,CAAC,CAAC;IACnB,CAAC,SAAS,EAAE,YAAG,CAAC;IAChB,CAAC,SAAS,EAAE,uBAAS,CAAC;IACtB,CAAC,WAAW,EAAE,uBAAS,CAAC;IACxB,CAAC,YAAY,EAAE,YAAG,CAAC;IACnB,CAAC,mBAAmB,EAAE,YAAG,CAAC;IAC1B,CAAC,iBAAiB,EAAE,YAAG,CAAC;IACxB,CAAC,iBAAiB,EAAE,YAAG,CAAC;IACxB,CAAC,WAAW,EAAE,YAAG,CAAC;IAClB,CAAC,oBAAoB,EAAE,YAAG,CAAC;IAC3B,CAAC,YAAY,EAAE,uBAAS,CAAC;IACzB,CAAC,SAAS,EAAE,YAAG,CAAC;IAChB,CAAC,aAAa,EAAE,YAAG,CAAC;IAEpB,CAAC,kBAAkB,EAAE,IAAA,4BAAqB,EAAC,YAAG,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC,mBAAmB,EAAE,IAAA,4BAAqB,EAAC,YAAG,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC,mBAAmB,EAAE,IAAA,4BAAqB,EAAC,YAAG,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC,cAAc,EAAE,IAAA,4BAAqB,EAAC,YAAG,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC,WAAW,EAAE,YAAG,CAAC;IAClB,CAAC,eAAe,EAAE,IAAA,4BAAqB,EAAC,YAAG,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC,WAAW,EAAE,YAAG,CAAC;IAClB,CAAC,gBAAgB,EAAE,YAAG,CAAC;IACvB,CAAC,kBAAkB,EAAE,YAAG,CAAC;IACzB,CAAC,kBAAkB,EAAE,YAAG,CAAC;IACzB,CAAC,mBAAmB,EAAE,YAAG,CAAC;IAC1B,CAAC,oBAAoB,EAAE,YAAG,CAAC;IAC3B,CAAC,mBAAmB,EAAE,YAAG,CAAC;IAC1B,CAAC,mBAAmB,EAAE,YAAG,CAAC;IAC1B,CAAC,kBAAkB,EAAE,YAAG,CAAC;IACzB,CAAC,kBAAkB,EAAE,YAAG,CAAC;IACzB,CAAC,YAAY,EAAE,YAAG,CAAC;IACnB,CAAC,WAAW,EAAE,IAAA,4BAAqB,EAAC,YAAG,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC,YAAY,EAAE,YAAG,CAAC;IACnB,CAAC,OAAO,EAAE,IAAA,4BAAqB,EAAC,IAAA,aAAI,EAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC,eAAe,EAAE,YAAG,CAAC;IACtB,CAAC,YAAY,EAAE,IAAA,4BAAqB,EAAC,YAAG,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,kBAAkB,EAAE,IAAA,4BAAqB,EAAC,YAAG,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC,mBAAmB,EAAE,IAAA,4BAAqB,EAAC,SAAE,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC,kBAAkB,EAAE,YAAG,CAAC;IACzB,CAAC,WAAW,EAAE,YAAG,CAAC;IAClB,CAAC,6BAA6B,EAAE,SAAE,CAAC;IACnC,CAAC,cAAc,EAAE,SAAE,CAAC;IACpB,CAAC,QAAQ,EAAE,IAAA,4BAAqB,EAAC,SAAE,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,YAAY,EAAE,SAAE,CAAC;IAClB,CAAC,MAAM,EAAE,IAAA,4BAAqB,EAAC,SAAE,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC,WAAW,EAAE,SAAE,CAAC;IACjB,CAAC,KAAK,EAAE,IAAA,4BAAqB,EAAC,SAAE,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC,YAAY,EAAE,IAAA,4BAAqB,EAAC,SAAE,EAAE,GAAG,CAAC,CAAC;CAC/C,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAY,CACvB,CAAC;AAoBW,QAAA,mBAAmB,GAAG,IAAI,iBAAU,CAC/C;IACE,CAAC,WAAW,EAAE,uBAAS,CAAC;IACxB,CAAC,UAAU,EAAE,SAAE,CAAC;IAChB,CAAC,aAAa,EAAE,IAAA,4BAAqB,EAAC,SAAE,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,iBAAiB,EAAE,uBAAS,CAAC;IAC9B,CAAC,YAAY,EAAE,SAAE,CAAC;IAClB,CAAC,eAAe,EAAE,uBAAS,CAAC;IAC5B,CAAC,aAAa,EAAE,SAAE,CAAC;IACnB,CAAC,qBAAqB,EAAE,SAAE,CAAC;IAC3B,CAAC,oBAAoB,EAAE,SAAE,CAAC;IAC1B,CAAC,wBAAwB,EAAE,SAAE,CAAC;IAC9B,CAAC,yBAAyB,EAAE,SAAE,CAAC;IAC/B,CAAC,QAAQ,EAAE,SAAE,CAAC;IACd,CAAC,MAAM,EAAE,SAAE,CAAC;IACZ,CAAC,cAAc,EAAE,SAAE,CAAC;IACpB,CAAC,gBAAgB,EAAE,IAAA,4BAAqB,EAAC,SAAE,EAAE,EAAE,CAAC,CAAC;CAClD,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAqB,CAChC,CAAC;AAQW,QAAA,eAAe,GAAG,IAAI,wBAAiB,CAClD;IACE,CAAC,QAAQ,EAAE,IAAA,aAAI,EAAC,CAAC,CAAC,CAAC;IACnB,CAAC,WAAW,EAAE,YAAG,CAAC;IAClB,CAAC,MAAM,EAAE,IAAA,4BAAqB,EAAC,2BAAmB,EAAE,EAAE,CAAC,CAAC;CACzD,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAiB,CAC5B,CAAC"}
@@ -40,28 +40,28 @@ function getPairKey(version) {
40
40
  exports.getPairKey = getPairKey;
41
41
  function getPairsV2FromTheGraph(url, length = 300) {
42
42
  return __awaiter(this, void 0, void 0, function* () {
43
- const query = (0, graphql_request_1.gql) `
44
- {
45
- pairs(
46
- orderBy: reserveUSD
47
- first: ${length}
48
- orderDirection: desc
49
- where: { trackedReserveETH_not: "0" }
50
- ) {
51
- id
52
- reserve0
53
- reserve1
54
- totalSupply
55
- token0 {
56
- id
57
- decimals
58
- }
59
- token1 {
60
- id
61
- decimals
62
- }
63
- }
64
- }
43
+ const query = (0, graphql_request_1.gql) `
44
+ {
45
+ pairs(
46
+ orderBy: reserveUSD
47
+ first: ${length}
48
+ orderDirection: desc
49
+ where: { trackedReserveETH_not: "0" }
50
+ ) {
51
+ id
52
+ reserve0
53
+ reserve1
54
+ totalSupply
55
+ token0 {
56
+ id
57
+ decimals
58
+ }
59
+ token1 {
60
+ id
61
+ decimals
62
+ }
63
+ }
64
+ }
65
65
  `;
66
66
  const res = yield (0, graphql_request_1.default)(url, query);
67
67
  const pairs = res.pairs;
@@ -1,6 +1,6 @@
1
1
  import { NetworkIdType, TokenPriceSource } from '@sonarwatch/portfolio-core';
2
2
  import BigNumber from 'bignumber.js';
3
- type PoolUnderlyingRaw = {
3
+ export type PoolUnderlyingRaw = {
4
4
  address: string;
5
5
  reserveAmountRaw: BigNumber;
6
6
  price: number;
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.poolQueryMsg = exports.minterQueryMsg = exports.tokenInfoQueryMsg = exports.infoQueryMsg = void 0;
4
- exports.infoQueryMsg = JSON.parse(`{
5
- "info": {}
4
+ exports.infoQueryMsg = JSON.parse(`{
5
+ "info": {}
6
6
  }`);
7
- exports.tokenInfoQueryMsg = JSON.parse(`{
8
- "token_info": {}
7
+ exports.tokenInfoQueryMsg = JSON.parse(`{
8
+ "token_info": {}
9
9
  }`);
10
- exports.minterQueryMsg = JSON.parse(`{
11
- "minter": {}
10
+ exports.minterQueryMsg = JSON.parse(`{
11
+ "minter": {}
12
12
  }`);
13
- exports.poolQueryMsg = JSON.parse(`{
14
- "pool": {}
13
+ exports.poolQueryMsg = JSON.parse(`{
14
+ "pool": {}
15
15
  }`);
16
16
  //# sourceMappingURL=constants.js.map
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  function getQueryBalanceByOwner(owner) {
4
- return JSON.parse(`{
5
- "balance": {
6
- "address": "${owner}"
7
- }
4
+ return JSON.parse(`{
5
+ "balance": {
6
+ "address": "${owner}"
7
+ }
8
8
  }`);
9
9
  }
10
10
  exports.default = getQueryBalanceByOwner;
@@ -1 +0,0 @@
1
- {"version":3,"file":"positionFetcher.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/foo/positionFetcher.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAMoC;AAEpC,2CAAyC;AAGzC,MAAM,QAAQ,GAAoB,CAAO,KAAa,EAAE,KAAY,EAAE,EAAE;IACtE,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,aAAa,CAC7C,sCAAqB,EACrB,0BAAS,CAAC,QAAQ,CACnB,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,KAAK,GAAG,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,KAAI,IAAI,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAE5C,MAAM,OAAO,GAA6B;QACxC,SAAS,EAAE,0BAAS,CAAC,QAAQ;QAC7B,KAAK,EAAE,SAAS;QAChB,UAAU,EAAV,sBAAU;QACV,IAAI,EAAE,qCAAoB,CAAC,QAAQ;QACnC,KAAK;QACL,IAAI,EAAE;YACJ,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,mCAAkB,CAAC,KAAK;oBAC9B,SAAS,EAAE,0BAAS,CAAC,QAAQ;oBAC7B,KAAK;oBACL,UAAU,EAAE,EAAE;oBACd,IAAI,EAAE;wBACJ,OAAO,EAAE,sCAAqB;wBAC9B,MAAM;wBACN,KAAK;qBACN;iBACF;aACF;SACF;KACF,CAAC;IAEF,OAAO,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC,CAAA,CAAC;AAEF,MAAM,OAAO,GAAY;IACvB,EAAE,EAAE,GAAG,sBAAU,WAAW;IAC5B,SAAS,EAAE,0BAAS,CAAC,QAAQ;IAC7B,QAAQ;CACT,CAAC;AAEF,kBAAe,OAAO,CAAC"}