@stake-dao/reader 0.5.36 → 0.5.38

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.
Files changed (64) hide show
  1. package/dist/esm/bytecodes/index.js +0 -1
  2. package/dist/esm/bytecodes/index.js.map +1 -1
  3. package/dist/esm/index.js +0 -3
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/lockers/fetch/index.js +3 -5
  6. package/dist/esm/lockers/fetch/index.js.map +1 -1
  7. package/dist/esm/lockers/fetch/static.js +0 -2
  8. package/dist/esm/lockers/fetch/static.js.map +1 -1
  9. package/dist/esm/strategies/utils/boost.js +0 -4
  10. package/dist/esm/strategies/utils/boost.js.map +1 -1
  11. package/dist/esm/utils.js +0 -1
  12. package/dist/esm/utils.js.map +1 -1
  13. package/dist/esm/votemarket/curve/fetchUserVlCvxClaimable.js +58 -6
  14. package/dist/esm/votemarket/curve/fetchUserVlCvxClaimable.js.map +1 -1
  15. package/dist/esm/votemarket/fetchCampaigns/processRawCampaigns.js +1 -0
  16. package/dist/esm/votemarket/fetchCampaigns/processRawCampaigns.js.map +1 -1
  17. package/dist/types/bytecodes/index.d.ts +0 -1
  18. package/dist/types/bytecodes/index.d.ts.map +1 -1
  19. package/dist/types/index.d.ts +0 -2
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/types/lockers/fetch/index.d.ts +5 -2
  22. package/dist/types/lockers/fetch/index.d.ts.map +1 -1
  23. package/dist/types/lockers/fetch/static.d.ts.map +1 -1
  24. package/dist/types/strategies/utils/boost.d.ts.map +1 -1
  25. package/dist/types/utils.d.ts.map +1 -1
  26. package/dist/types/votemarket/curve/fetchUserVlCvxClaimable.d.ts.map +1 -1
  27. package/dist/types/votemarket/fetchCampaigns/processRawCampaigns.d.ts.map +1 -1
  28. package/dist/types/votemarket/types.d.ts +2 -0
  29. package/dist/types/votemarket/types.d.ts.map +1 -1
  30. package/package.json +2 -2
  31. package/src/bytecodes/index.ts +0 -1
  32. package/src/index.ts +0 -4
  33. package/src/lockers/fetch/index.ts +4 -5
  34. package/src/lockers/fetch/static.ts +0 -2
  35. package/src/strategies/utils/boost.ts +0 -6
  36. package/src/utils.ts +0 -1
  37. package/src/votemarket/curve/fetchUserVlCvxClaimable.ts +67 -6
  38. package/src/votemarket/fetchCampaigns/processRawCampaigns.ts +1 -0
  39. package/src/votemarket/types.ts +2 -0
  40. package/dist/esm/abis/angleVaultsMulticall.js +0 -85
  41. package/dist/esm/abis/angleVaultsMulticall.js.map +0 -1
  42. package/dist/esm/bytecodes/strategies/batches/batchAngleStrats.js +0 -24
  43. package/dist/esm/bytecodes/strategies/batches/batchAngleStrats.js.map +0 -1
  44. package/dist/esm/lockers/fetch/protocols/angle.js +0 -136
  45. package/dist/esm/lockers/fetch/protocols/angle.js.map +0 -1
  46. package/dist/esm/strategies/angle/endpoints.js +0 -3
  47. package/dist/esm/strategies/angle/endpoints.js.map +0 -1
  48. package/dist/esm/strategies/angle/fetch.js +0 -213
  49. package/dist/esm/strategies/angle/fetch.js.map +0 -1
  50. package/dist/types/abis/angleVaultsMulticall.d.ts +0 -42
  51. package/dist/types/abis/angleVaultsMulticall.d.ts.map +0 -1
  52. package/dist/types/bytecodes/strategies/batches/batchAngleStrats.d.ts +0 -4
  53. package/dist/types/bytecodes/strategies/batches/batchAngleStrats.d.ts.map +0 -1
  54. package/dist/types/lockers/fetch/protocols/angle.d.ts +0 -9
  55. package/dist/types/lockers/fetch/protocols/angle.d.ts.map +0 -1
  56. package/dist/types/strategies/angle/endpoints.d.ts +0 -3
  57. package/dist/types/strategies/angle/endpoints.d.ts.map +0 -1
  58. package/dist/types/strategies/angle/fetch.d.ts +0 -22
  59. package/dist/types/strategies/angle/fetch.d.ts.map +0 -1
  60. package/src/abis/angleVaultsMulticall.ts +0 -85
  61. package/src/bytecodes/strategies/batches/batchAngleStrats.ts +0 -26
  62. package/src/lockers/fetch/protocols/angle.ts +0 -157
  63. package/src/strategies/angle/endpoints.ts +0 -2
  64. package/src/strategies/angle/fetch.ts +0 -253
@@ -3,6 +3,7 @@ export type Period = {
3
3
  rewardPerVote: string;
4
4
  leftover: string;
5
5
  updated: boolean;
6
+ totalClaimed: string;
6
7
  };
7
8
  type NonEmptyAddressesList = [`0x${string}`, ...`0x${string}`[]];
8
9
  type CampaignAddresses = {
@@ -81,6 +82,7 @@ export type RawPeriod = {
81
82
  rewardPerVote: bigint;
82
83
  leftover: bigint;
83
84
  updated: boolean;
85
+ totalClaimed: bigint;
84
86
  };
85
87
  export type RawCampaign = {
86
88
  chainId: bigint;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/votemarket/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/votemarket/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stake-dao/reader",
3
3
  "description": "",
4
- "version": "0.5.36",
4
+ "version": "0.5.38",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
7
7
  "type": "git",
@@ -35,7 +35,7 @@
35
35
  "graphql-request": "^6.0.0",
36
36
  "lodash-es": "^4.17.21",
37
37
  "viem": "2.35.0",
38
- "@stake-dao/constants": "0.5.15"
38
+ "@stake-dao/constants": "0.5.17"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/lodash-es": "^4.17.12",
@@ -17,7 +17,6 @@ export { default as buildPancakeswapNotDeployedErc20Strats } from './strategies/
17
17
  export { default as buildPendleStrats } from './strategies/builds/buildPendleStrats.js'
18
18
 
19
19
  export { default as batchCurveStrats } from './strategies/batches/batchCurveStrats.js'
20
- export { default as batchAngleStrats } from './strategies/batches/batchAngleStrats.js'
21
20
  export { default as batchBalancerStrats } from './strategies/batches/batchBalancerStrats.js'
22
21
  export { default as batchPendleStrats } from './strategies/batches/batchPendleStrats.js'
23
22
  export { default as batchPancakeSwapStrats } from './strategies/batches/batchPancakeswapStrats.js'
package/src/index.ts CHANGED
@@ -25,7 +25,6 @@ export { getVeNFTUser } from './lockers/utils/getVeNFTUser.js'
25
25
  export { default as pegCalls } from './lockers/utils/callsForLockers/pegCalls.js'
26
26
  export { lockerWithAutovoter } from './lockers/utils/getBribesRewardsData.js'
27
27
 
28
- export { locker as angleLocker } from './lockers/fetch/protocols/angle.js'
29
28
  export { locker as balancerLocker } from './lockers/fetch/protocols/balancer.js'
30
29
  export { locker as blackpoolLocker } from './lockers/fetch/protocols/blackpool.js'
31
30
  export { locker as curveLocker } from './lockers/fetch/protocols/curve.js'
@@ -55,9 +54,6 @@ export { getGaugesWeights } from './strategies/curve/fetch/curveApiData/getGauge
55
54
  export { getGaugesFromRegistry } from './strategies/curve/fetch/curveApiData/getGaugesFromRegistry.js'
56
55
  export { default as getOnlyboostData } from './strategies/curve/fetch/getOnlyboostData.js'
57
56
 
58
- // Angle
59
- export { fetchAngle } from './strategies/angle/fetch.js'
60
-
61
57
  // Balancer
62
58
  export { buildBalancerStrategies } from './strategies/balancer/build.js'
63
59
  export { fetchBalancer } from './strategies/balancer/fetch.js'
@@ -1,10 +1,9 @@
1
- import { RPC, contract } from '@stake-dao/constants'
1
+ import { contract } from '@stake-dao/constants'
2
2
  import { formatUnits } from 'viem'
3
3
  import { base, bsc, fraxtal, linea, mainnet } from 'viem/chains'
4
4
  import { GH_STAKE_DAO_BOUNTIES_REPORT } from '../../endpoints.js'
5
5
  import { getSdtInflationData, rpcCall } from '../../index.js'
6
6
  import type { Price } from '../../prices.js'
7
- import angleLocker from './protocols/angle.js'
8
7
  import balancerLocker from './protocols/balancer.js'
9
8
  import blackpoolLocker from './protocols/blackpool.js'
10
9
  import curveLocker from './protocols/curve.js'
@@ -21,11 +20,12 @@ import yieldnestLocker from './protocols/yieldnest.js'
21
20
  import zerolendLocker from './protocols/zerolend.js'
22
21
 
23
22
  interface TFetchLockers {
23
+ rpc: { [chainId: number]: any }
24
24
  provider: { [chainId: number]: any }
25
25
  prices: Price[]
26
26
  }
27
27
 
28
- export const fetchLockers = async ({ provider, prices }: TFetchLockers) => {
28
+ export const fetchLockers = async ({ rpc, provider, prices }: TFetchLockers) => {
29
29
  const [sdtInflationData, bribesData, veSdtTotalSupply, cvgAprs, spectraAprs] = await Promise.all([
30
30
  // SDT Inflation Data
31
31
  getSdtInflationData(provider[mainnet.id]),
@@ -34,7 +34,7 @@ export const fetchLockers = async ({ provider, prices }: TFetchLockers) => {
34
34
  res.json(),
35
35
  ),
36
36
  // veSDT total supply
37
- rpcCall(RPC[mainnet.id], [{ to: contract('veSdt', mainnet.id), data: '0x18160ddd' }]).then((res) =>
37
+ rpcCall(rpc[mainnet.id], [{ to: contract('veSdt', mainnet.id), data: '0x18160ddd' }]).then((res) =>
38
38
  BigInt(res[0].result),
39
39
  ),
40
40
  // Alternatives Yields
@@ -59,7 +59,6 @@ export const fetchLockers = async ({ provider, prices }: TFetchLockers) => {
59
59
  maverickLocker({ provider: provider[mainnet.id], common, prices }),
60
60
  blackpoolLocker({ provider: provider[mainnet.id], common, prices }),
61
61
  fraxFpisLocker({ provider: provider[mainnet.id], common, prices }),
62
- angleLocker({ provider: provider[mainnet.id], common, prices }),
63
62
  pancakeswapLocker({ provider: provider[bsc.id], common, prices }),
64
63
  ])
65
64
 
@@ -1,6 +1,5 @@
1
1
  import type { Locker } from './types.js'
2
2
 
3
- import { locker as staticAngleLocker } from './protocols/angle.js'
4
3
  import { locker as staticBalancerLocker } from './protocols/balancer.js'
5
4
  import { locker as staticBlackpoolLocker } from './protocols/blackpool.js'
6
5
  import { locker as staticCurveLocker } from './protocols/curve.js'
@@ -17,7 +16,6 @@ import { locker as staticYieldnestLocker } from './protocols/yieldnest.js'
17
16
  import { locker as staticZerolendLocker } from './protocols/zerolend.js'
18
17
 
19
18
  export const staticLockers: Locker[] = [
20
- staticAngleLocker,
21
19
  staticBalancerLocker,
22
20
  staticBlackpoolLocker,
23
21
  staticCurveLocker,
@@ -15,12 +15,6 @@ export const getBoost = (protocol: string, strategyHoldings: bigint, workingBala
15
15
  ? formatUnits((workingBalance * OneEther) / ((strategyHoldings * BigInt(4)) / BigInt(10)), 18)
16
16
  : '1',
17
17
  )
18
- case 'angle':
19
- return Number(
20
- strategyHoldings > Zero
21
- ? formatUnits((workingBalance * OneEther) / ((strategyHoldings * BigInt(4)) / BigInt(10)), 18)
22
- : '1',
23
- )
24
18
  case 'pendle':
25
19
  return Number(
26
20
  strategyHoldings > Zero
package/src/utils.ts CHANGED
@@ -17,7 +17,6 @@ import { withTwoDec } from './number.js'
17
17
  export const isProtocolToken = (protocol: string, tokenSymbol: string) =>
18
18
  (protocol === 'curve' && tokenSymbol === 'CRV') ||
19
19
  (protocol === 'balancer' && tokenSymbol === 'BAL') ||
20
- (protocol === 'angle' && tokenSymbol === 'ANGLE') ||
21
20
  (protocol === 'pendle' && tokenSymbol === 'PENDLE') ||
22
21
  (protocol === 'yearn' && tokenSymbol === 'dYFI') ||
23
22
  (protocol === 'pancakeswap' && (tokenSymbol === 'CAKE' || tokenSymbol === 'Cake'))
@@ -19,7 +19,7 @@ type UnknownToken = {
19
19
  }
20
20
 
21
21
  const getMerkleData = async (chainId: number) => {
22
- const [delegators, nonDelegators, votiumMerkle] = await Promise.all([
22
+ const [delegators, nonDelegators, votiumMerkle, hackMerkle] = await Promise.all([
23
23
  chainId === mainnet.id
24
24
  ? fetch(
25
25
  `${GH_STAKE_DAO_BOUNTIES_REPORT}/refs/heads/main/bounties-reports/latest/vlCVX/vlcvx_merkle_delegators.json`,
@@ -33,9 +33,12 @@ const getMerkleData = async (chainId: number) => {
33
33
  chainId === mainnet.id
34
34
  ? fetch(`${STAKE_DAO_API}/main/api/votemarket/votium_merkles.json`).then((res) => res.json())
35
35
  : { claims: {} },
36
+ chainId === mainnet.id
37
+ ? fetch(`${STAKE_DAO_API}/main/api/votemarket/hack-merkle-refunds.json`).then((res) => res.json())
38
+ : { claims: {} },
36
39
  ])
37
40
 
38
- return { delegators, nonDelegators, votiumMerkle }
41
+ return { delegators, nonDelegators, votiumMerkle, hackMerkle }
39
42
  }
40
43
 
41
44
  const validateMerkleRoots = (delegatorRoot: string, nonDelegatorRoot: string, merkleData: any, isMainnet: boolean) => {
@@ -45,7 +48,11 @@ const validateMerkleRoots = (delegatorRoot: string, nonDelegatorRoot: string, me
45
48
  }
46
49
 
47
50
  const getMerkleRoots = async (provider: any, user: string) => {
48
- const contracts = [contract('vlCvxDelegatorMerkle', mainnet.id), contract('vlCvxNotDelegatorMerkle', mainnet.id)]
51
+ const contracts = [
52
+ contract('vlCvxDelegatorMerkle', mainnet.id),
53
+ contract('vlCvxNotDelegatorMerkle', mainnet.id),
54
+ contract('hackMerkle', mainnet.id),
55
+ ]
49
56
 
50
57
  const result = await multicall(
51
58
  provider,
@@ -64,6 +71,8 @@ const getMerkleRoots = async (provider: any, user: string) => {
64
71
  delegatorRecipient: result[1].result,
65
72
  nonDelegatorRoot: result[2].result,
66
73
  nonDelegatorRecipient: result[3].result,
74
+ hackRoot: result[4].result,
75
+ hackRecipient: result[5].result,
67
76
  }
68
77
  }
69
78
 
@@ -108,6 +117,24 @@ const getVotiumClaimedData = async (provider: any, merkle: any) => {
108
117
  }))
109
118
  }
110
119
 
120
+ const getHackClaimedData = async (provider: any, merkle: any) => {
121
+ const rawClaimed = await multicall(
122
+ provider,
123
+ Object.keys(merkle).map((t) => ({
124
+ address: contract('hackMerkle'),
125
+ name: 'isClaimed',
126
+ params: [t, merkle[t].index],
127
+ })),
128
+ parseAbi(['function isClaimed(address,uint256) external view returns(bool)']),
129
+ )
130
+
131
+ return Object.keys(merkle).map((t, index) => ({
132
+ ...merkle[t],
133
+ token: t,
134
+ claimed: rawClaimed[index].result,
135
+ }))
136
+ }
137
+
111
138
  const getParsedData = (
112
139
  user: string,
113
140
  recipient: string,
@@ -171,6 +198,33 @@ const getVotiumParsedData = (user: string, userData: any[], unknownTokensData: a
171
198
  : undefined
172
199
  }
173
200
 
201
+ const getHackParsedData = (user: string, userData: any[], unknownTokensData: any[], prices: Price[]) => {
202
+ return userData
203
+ ? userData.map((ud) => {
204
+ const rewardToken = tokenWithAddress(ud.token) || unknownTokensData.find((t) => equalTlc(t.address, ud.token))
205
+
206
+ const tokenPrice = prices.find((p) => equalTlc(ud.token, p.address))?.usdPrice || 0
207
+
208
+ return {
209
+ user,
210
+ recipient: user,
211
+ token: rewardToken,
212
+ claimable: ud.claimed ? '0' : formatUnits(BigInt(ud.amount), 0),
213
+ claimableUsd: ud.claimed
214
+ ? 0
215
+ : Number(formatUnits(BigInt(ud.amount), rewardToken?.decimals || 18)) * tokenPrice,
216
+ amount: formatUnits(BigInt(ud.amount), 0),
217
+ amountUsd: Number(formatUnits(BigInt(ud.amount), rewardToken?.decimals || 18)) * tokenPrice,
218
+ proof: ud.proof,
219
+ merkleAddress: contract('hackMerkle'),
220
+ isClaimed: ud.claimed,
221
+ index: ud.index,
222
+ chainId: mainnet.id,
223
+ }
224
+ })
225
+ : undefined
226
+ }
227
+
174
228
  export const fetchUserVlCvxClaimable = async (provider: any, rpc: Rpcs, user: string, chainId: number) => {
175
229
  const { delegatorRoot, delegatorRecipient, nonDelegatorRoot, nonDelegatorRecipient } = await getMerkleRoots(
176
230
  provider,
@@ -179,6 +233,7 @@ export const fetchUserVlCvxClaimable = async (provider: any, rpc: Rpcs, user: st
179
233
 
180
234
  let vlCvxClaimable: any
181
235
  let votiumMerkleData: any
236
+ let hackMerkleData: any
182
237
 
183
238
  try {
184
239
  const merkleData = await getMerkleData(chainId)
@@ -186,9 +241,10 @@ export const fetchUserVlCvxClaimable = async (provider: any, rpc: Rpcs, user: st
186
241
  vlCvxClaimable = { delegators: merkleData.delegators, nonDelegators: merkleData.nonDelegators }
187
242
  }
188
243
  votiumMerkleData = merkleData.votiumMerkle.claims[user]
244
+ hackMerkleData = merkleData.hackMerkle.claims[user]
189
245
  } catch {}
190
246
 
191
- if (!vlCvxClaimable && !votiumMerkleData) {
247
+ if (!vlCvxClaimable && !votiumMerkleData && !hackMerkleData) {
192
248
  console.error('Could not find valid merkle data')
193
249
  return []
194
250
  }
@@ -199,17 +255,21 @@ export const fetchUserVlCvxClaimable = async (provider: any, rpc: Rpcs, user: st
199
255
  const tokensDelegated = Object.keys(vlCvxUserDelegated?.tokens || {})
200
256
  const tokensNotDelegated = Object.keys(vlCvxUserNotDelegated?.tokens || {})
201
257
  const tokensVotium = Object.keys(votiumMerkleData?.tokens || {})
258
+ const tokensHack = Object.keys(hackMerkleData?.tokens || {})
202
259
 
203
- const tokens = [...tokensDelegated, ...tokensNotDelegated, ...tokensVotium]
260
+ const tokens = [...tokensDelegated, ...tokensNotDelegated, ...tokensVotium, ...tokensHack]
204
261
 
205
262
  if (!tokens.length) return []
206
263
 
207
- const [delegatedClaimed, notDelegatedClaimed, votiumClaimed] = await Promise.all([
264
+ const [delegatedClaimed, notDelegatedClaimed, votiumClaimed, hackClaimed] = await Promise.all([
208
265
  getClaimedData(provider, tokensDelegated, user, contract('vlCvxDelegatorMerkle')),
209
266
  getClaimedData(provider, tokensNotDelegated, user, contract('vlCvxNotDelegatorMerkle')),
210
267
  votiumMerkleData?.tokens && Object.keys(votiumMerkleData?.tokens).length > 0
211
268
  ? getVotiumClaimedData(provider, votiumMerkleData?.tokens)
212
269
  : [],
270
+ hackMerkleData?.tokens && Object.keys(hackMerkleData?.tokens).length > 0
271
+ ? getHackClaimedData(provider, hackMerkleData?.tokens)
272
+ : [],
213
273
  ])
214
274
 
215
275
  const unknownTokens = tokens.filter((t) => !tokenWithAddress(t))
@@ -246,6 +306,7 @@ export const fetchUserVlCvxClaimable = async (provider: any, rpc: Rpcs, user: st
246
306
  chainId,
247
307
  ),
248
308
  getVotiumParsedData(user, votiumClaimed, unknownTokensData, prices),
309
+ getHackParsedData(user, hackClaimed, unknownTokensData, prices),
249
310
  ]
250
311
  .filter(Boolean)
251
312
  .flat()
@@ -29,6 +29,7 @@ const formatPeriod = (rawPeriod: any, decimals: number) => ({
29
29
  rewardPerVote: formatUnits(rawPeriod.rewardPerVote, decimals),
30
30
  leftover: formatUnits(rawPeriod.leftover, decimals),
31
31
  updated: rawPeriod.updated,
32
+ totalClaimed: formatUnits(rawPeriod.totalClaimed ?? 0n, decimals),
32
33
  })
33
34
 
34
35
  export const processRawCampaigns = async ({
@@ -3,6 +3,7 @@ export type Period = {
3
3
  rewardPerVote: string
4
4
  leftover: string
5
5
  updated: boolean
6
+ totalClaimed: string
6
7
  }
7
8
 
8
9
  type NonEmptyAddressesList = [`0x${string}`, ...`0x${string}`[]]
@@ -92,6 +93,7 @@ export type RawPeriod = {
92
93
  rewardPerVote: bigint
93
94
  leftover: bigint
94
95
  updated: boolean
96
+ totalClaimed: bigint
95
97
  }
96
98
 
97
99
  export type RawCampaign = {
@@ -1,85 +0,0 @@
1
- const angleVaultsMulticall = [
2
- {
3
- inputs: [],
4
- name: 'totalSupply',
5
- outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
6
- payable: false,
7
- stateMutability: 'view',
8
- type: 'function',
9
- },
10
- {
11
- inputs: [],
12
- name: 'working_supply',
13
- outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
14
- payable: false,
15
- stateMutability: 'view',
16
- type: 'function',
17
- },
18
- {
19
- inputs: [],
20
- name: 'getUnderlyingBalances',
21
- outputs: [
22
- { internalType: 'uint256', name: '', type: 'uint256' },
23
- { internalType: 'uint256', name: '', type: 'uint256' },
24
- ],
25
- payable: false,
26
- stateMutability: 'view',
27
- type: 'function',
28
- },
29
- {
30
- inputs: [],
31
- name: 'getTotalAmounts',
32
- outputs: [
33
- { internalType: 'uint256', name: '', type: 'uint256' },
34
- { internalType: 'uint256', name: '', type: 'uint256' },
35
- ],
36
- payable: false,
37
- stateMutability: 'view',
38
- type: 'function',
39
- },
40
- {
41
- inputs: [],
42
- name: 'getTotalAmounts',
43
- outputs: [
44
- { internalType: 'uint256', name: '', type: 'uint256' },
45
- { internalType: 'uint256', name: '', type: 'uint256' },
46
- ],
47
- payable: false,
48
- stateMutability: 'view',
49
- type: 'function',
50
- },
51
- {
52
- inputs: [{ name: 'arg0', type: 'address' }],
53
- name: 'reward_data',
54
- outputs: [
55
- { name: 'token', type: 'address' },
56
- { name: 'distributor', type: 'address' },
57
- { name: 'period_finish', type: 'uint256' },
58
- { name: 'rate', type: 'uint256' },
59
- { name: 'last_update', type: 'uint256' },
60
- { name: 'integral', type: 'uint256' },
61
- ],
62
- stateMutability: 'view',
63
- type: 'function',
64
- },
65
- {
66
- inputs: [{ internalType: 'address', name: '', type: 'address' }],
67
- name: 'rewardData',
68
- outputs: [
69
- { internalType: 'address', name: 'rewardsDistributor', type: 'address' },
70
- { internalType: 'uint256', name: 'rewardsDuration', type: 'uint256' },
71
- { internalType: 'uint256', name: 'periodFinish', type: 'uint256' },
72
- { internalType: 'uint256', name: 'rewardRate', type: 'uint256' },
73
- { internalType: 'uint256', name: 'lastUpdateTime', type: 'uint256' },
74
- {
75
- internalType: 'uint256',
76
- name: 'rewardPerTokenStored',
77
- type: 'uint256',
78
- },
79
- ],
80
- stateMutability: 'view',
81
- type: 'function',
82
- },
83
- ];
84
- export default angleVaultsMulticall;
85
- //# sourceMappingURL=angleVaultsMulticall.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"angleVaultsMulticall.js","sourceRoot":"","sources":["../../../src/abis/angleVaultsMulticall.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- const batchAngleStrats = {
2
- bytecode: {
3
- 1: '0x608060405234801561001057600080fd5b506040516112ad3803806112ad83398181016040528101906100329190610c31565b60008151905060008167ffffffffffffffff81111561005457610053610a85565b5b60405190808252806020026020018201604052801561008d57816020015b61007a6108f7565b8152602001906001900390816100725790505b509050600084905060005b838110156108c75760008582815181106100b5576100b4610c8d565b5b60200260200101519050600081600001519050600082604001519050826020015173ffffffffffffffffffffffffffffffffffffffff166370a0823184600001516040518263ffffffff1660e01b81526004016101129190610ccb565b602060405180830381865afa15801561012f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101539190610d1c565b86858151811061016657610165610c8d565b5b602002602001015160000181815250508173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e59190610d1c565b8685815181106101f8576101f7610c8d565b5b602002602001015160200181815250508173ffffffffffffffffffffffffffffffffffffffff1663f8ce31646040518163ffffffff1660e01b8152600401602060405180830381865afa158015610253573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102779190610d1c565b86858151811061028a57610289610c8d565b5b602002602001015160400181815250508173ffffffffffffffffffffffffffffffffffffffff1663422ede426040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103099190610d1c565b86858151811061031c5761031b610c8d565b5b602002602001015160600181815250508473ffffffffffffffffffffffffffffffffffffffff16636207d86684604001516040518263ffffffff1660e01b81526004016103699190610ccb565b602060405180830381865afa158015610386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103aa9190610d1c565b8685815181106103bd576103bc610c8d565b5b60200260200101516101600181815250508473ffffffffffffffffffffffffffffffffffffffff16634e791a3a84604001516040518263ffffffff1660e01b815260040161040b9190610ccb565b602060405180830381865afa158015610428573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044c9190610d1c565b86858151811061045f5761045e610c8d565b5b60200260200101516101800181815250508473ffffffffffffffffffffffffffffffffffffffff16636977ff926040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104df9190610d1c565b8685815181106104f2576104f1610c8d565b5b60200260200101516101a00181815250508073ffffffffffffffffffffffffffffffffffffffff166317e280896040518163ffffffff1660e01b8152600401602060405180830381865afa15801561054e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105729190610d1c565b86858151811061058557610584610c8d565b5b60200260200101516101c00181815250508073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106059190610d1c565b86858151811061061857610617610c8d565b5b60200260200101516101e001818152505060008173ffffffffffffffffffffffffffffffffffffffff1663963c94b96040518163ffffffff1660e01b8152600401602060405180830381865afa158015610676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069a9190610d1c565b90508067ffffffffffffffff8111156106b6576106b5610a85565b5b6040519080825280602002602001820160405280156106ef57816020015b6106dc61097b565b8152602001906001900390816106d45790505b5087868151811061070357610702610c8d565b5b6020026020010151610200018190525060005b818110156108af5760008373ffffffffffffffffffffffffffffffffffffffff166354c49fe9836040518263ffffffff1660e01b81526004016107599190610d58565b602060405180830381865afa158015610776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079a9190610d73565b90508373ffffffffffffffffffffffffffffffffffffffff166348e9c65e826040518263ffffffff1660e01b81526004016107d59190610ccb565b60c060405180830381865afa1580156107f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108169190610e40565b89888151811061082957610828610c8d565b5b60200260200101516102000151838151811061084857610847610c8d565b5b602002602001015160000181905250600089888151811061086c5761086b610c8d565b5b60200260200101516102000151838151811061088b5761088a610c8d565b5b602002602001015160200181815250505080806108a790610e9c565b915050610716565b505050505080806108bf90610e9c565b915050610098565b506000826040516020016108db919061128a565b6040516020818303038152906040529050602081018059038082f35b60405180610220016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081525090565b604051806040016040528061098e61099b565b8152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a3c82610a11565b9050919050565b610a4c81610a31565b8114610a5757600080fd5b50565b600081519050610a6981610a43565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610abd82610a74565b810181811067ffffffffffffffff82111715610adc57610adb610a85565b5b80604052505050565b6000610aef6109fd565b9050610afb8282610ab4565b919050565b600067ffffffffffffffff821115610b1b57610b1a610a85565b5b602082029050602081019050919050565b600080fd5b600080fd5b600060608284031215610b4c57610b4b610b31565b5b610b566060610ae5565b90506000610b6684828501610a5a565b6000830152506020610b7a84828501610a5a565b6020830152506040610b8e84828501610a5a565b60408301525092915050565b6000610bad610ba884610b00565b610ae5565b90508083825260208201905060608402830185811115610bd057610bcf610b2c565b5b835b81811015610bf95780610be58882610b36565b845260208401935050606081019050610bd2565b5050509392505050565b600082601f830112610c1857610c17610a6f565b5b8151610c28848260208601610b9a565b91505092915050565b60008060408385031215610c4857610c47610a07565b5b6000610c5685828601610a5a565b925050602083015167ffffffffffffffff811115610c7757610c76610a0c565b5b610c8385828601610c03565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b610cc581610a31565b82525050565b6000602082019050610ce06000830184610cbc565b92915050565b6000819050919050565b610cf981610ce6565b8114610d0457600080fd5b50565b600081519050610d1681610cf0565b92915050565b600060208284031215610d3257610d31610a07565b5b6000610d4084828501610d07565b91505092915050565b610d5281610ce6565b82525050565b6000602082019050610d6d6000830184610d49565b92915050565b600060208284031215610d8957610d88610a07565b5b6000610d9784828501610a5a565b91505092915050565b600060c08284031215610db657610db5610b31565b5b610dc060c0610ae5565b90506000610dd084828501610a5a565b6000830152506020610de484828501610a5a565b6020830152506040610df884828501610d07565b6040830152506060610e0c84828501610d07565b6060830152506080610e2084828501610d07565b60808301525060a0610e3484828501610d07565b60a08301525092915050565b600060c08284031215610e5657610e55610a07565b5b6000610e6484828501610da0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610ea782610ce6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ed957610ed8610e6d565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f1981610ce6565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610f5481610a31565b82525050565b60c082016000820151610f706000850182610f4b565b506020820151610f836020850182610f4b565b506040820151610f966040850182610f10565b506060820151610fa96060850182610f10565b506080820151610fbc6080850182610f10565b5060a0820151610fcf60a0850182610f10565b50505050565b60e082016000820151610feb6000850182610f5a565b506020820151610ffe60c0850182610f10565b50505050565b60006110108383610fd5565b60e08301905092915050565b6000602082019050919050565b600061103482610f1f565b61103e8185610f2a565b935061104983610f3b565b8060005b8381101561107a5781516110618882611004565b975061106c8361101c565b92505060018101905061104d565b5085935050505092915050565b6000610220830160008301516110a06000860182610f10565b5060208301516110b36020860182610f10565b5060408301516110c66040860182610f10565b5060608301516110d96060860182610f10565b5060808301516110ec6080860182610f10565b5060a08301516110ff60a0860182610f10565b5060c083015161111260c0860182610f10565b5060e083015161112560e0860182610f10565b5061010083015161113a610100860182610f10565b5061012083015161114f610120860182610f10565b50610140830151611164610140860182610f10565b50610160830151611179610160860182610f10565b5061018083015161118e610180860182610f10565b506101a08301516111a36101a0860182610f10565b506101c08301516111b86101c0860182610f10565b506101e08301516111cd6101e0860182610f10565b506102008301518482036102008601526111e78282611029565b9150508091505092915050565b60006112008383611087565b905092915050565b6000602082019050919050565b600061122082610ee4565b61122a8185610eef565b93508360208202850161123c85610f00565b8060005b85811015611278578484038952815161125985826111f4565b945061126483611208565b925060208a01995050600181019050611240565b50829750879550505050505092915050565b600060208201905081810360008301526112a48184611215565b90509291505056fe',
4
- },
5
- inputType: {
6
- 1: [
7
- 'address gaugeController, AngleStategyInfo[] inputs',
8
- 'struct AngleStategyInfo { address vault; address token; address sdtLiquidityGauge; }',
9
- ],
10
- },
11
- outputTypeHr: {
12
- 1: [
13
- 'AngleStratsData[] stratsData',
14
- 'struct AngleStratsData { uint256 vaultHoldings; uint256 totalSupply; uint256 accumulatedFees; uint256 keeperFee; uint256 veSDTFee; uint256 perfFee; uint256 accumulatorFee; uint256 claimerFee; uint256 strategyHoldings; uint256 workingBalance; uint256 workingSupplyStaked; uint256 gaugeRelativeWeight; uint256 gaugeWeight; uint256 totalGaugeWeights; uint256 sdWorkingSupply; uint256 sdGaugeTotalSupply; RewardsWithClaimable[] rewardsData; }',
15
- 'struct RewardsWithClaimable { RewardData rewardData; uint256 claimablePendingRewards; }',
16
- 'struct RewardData { address token; address distributor; uint256 period_finish; uint256 rate; uint256 last_update; uint256 integral; }',
17
- ],
18
- },
19
- outputType: {
20
- 1: [],
21
- },
22
- };
23
- export default batchAngleStrats;
24
- //# sourceMappingURL=batchAngleStrats.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"batchAngleStrats.js","sourceRoot":"","sources":["../../../../../src/bytecodes/strategies/batches/batchAngleStrats.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAkB;IACtC,QAAQ,EAAE;QACR,CAAC,EAAE,81SAA81S;KACl2S;IACD,SAAS,EAAE;QACT,CAAC,EAAE;YACD,oDAAoD;YACpD,sFAAsF;SACvF;KACF;IACD,YAAY,EAAE;QACZ,CAAC,EAAE;YACD,8BAA8B;YAC9B,wbAAwb;YACxb,yFAAyF;YACzF,uIAAuI;SACxI;KACF;IACD,UAAU,EAAE;QACV,CAAC,EAAE,EAAE;KACN;CACF,CAAA;AAED,eAAe,gBAAgB,CAAA"}
@@ -1,136 +0,0 @@
1
- import { One, STAKE_DAO_ASSETS_BASE_URL, Zero, tokenWithId } from '@stake-dao/constants';
2
- import { formatUnits, parseUnits } from 'viem';
3
- import lockersMulticallAbi from '../../../abis/lockersMulticall.js';
4
- import { getRes, multicall } from '../../../utils.js';
5
- import { parse, parsePeg } from '../parse.js';
6
- export const locker = {
7
- id: 'angle',
8
- symbol: 'ANGLE',
9
- protocol: 'Angle',
10
- protocolDescription: 'Angle is a decentralized, capital efficient and over-collateralized stablecoin protocol composed of smart contracts running on open blockchains.',
11
- website: 'https://angle.money/',
12
- logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/archive/angle.svg`,
13
- chainId: 1,
14
- rgb: '249, 145, 144',
15
- token: tokenWithId('angle'),
16
- sdToken: tokenWithId('sdangle'),
17
- rewards: [
18
- { ...tokenWithId('sdt'), distribution: 'streamed', origin: 'sdtEmission' },
19
- { ...tokenWithId('angle'), distribution: 'streamed', origin: 'stratPerf' },
20
- { ...tokenWithId('eura'), distribution: 'streamed', origin: 'native.common' },
21
- { ...tokenWithId('sdangle'), distribution: 'distributed', origin: 'bounties' },
22
- ],
23
- delegation: ['sdangle.eth'],
24
- modules: {
25
- depositor: '0x0000000000000000000000000000000000000000',
26
- locker: '0xD13F8C25CceD32cdfA79EB5eD654Ce3e484dCAF5',
27
- veToken: '0x0C462Dbb9EC8cD1630f1728B2CFD2769d09f0dd5',
28
- gauge: '0xE55843a90672f7d8218285e51EE8fF8E233F35d5',
29
- accumulator: '0x8cc02F4f383A11b989708437DbA6BB0628d7eE78',
30
- redeem: '0x1D8A9c30E4e25033498347c1A054717bd0c4D356',
31
- },
32
- secondaryMarket: {
33
- label: 'Curve',
34
- poolKey: 'factory-v2-101',
35
- vaultKey: '',
36
- pool: '0x48fF31bBbD8Ab553Ebe7cBD84e1eA3dBa8f54957',
37
- pools: ['0x48fF31bBbD8Ab553Ebe7cBD84e1eA3dBa8f54957'],
38
- pegBase: 300000,
39
- },
40
- fees: [
41
- {
42
- label: { key: 'liquidity', variable: 'sdANGLE/ANGLE' },
43
- value: 10,
44
- key: 'liquidityFee',
45
- static: true,
46
- },
47
- {
48
- label: { key: 'treasury' },
49
- value: 5,
50
- key: 'daoFee',
51
- static: true,
52
- },
53
- {
54
- label: { key: 'harvester' },
55
- value: 0.1,
56
- key: 'claimerFee',
57
- static: true,
58
- },
59
- ],
60
- extensions: {
61
- coingeckoBaseSlug: 'angle',
62
- },
63
- };
64
- const angleLocker = async ({ provider, common, prices }) => {
65
- const token = locker.token.address;
66
- const sdToken = locker.sdToken.address;
67
- const gauge = locker.modules.gauge;
68
- const depositor = locker.modules.depositor;
69
- const votingEscrow = locker.modules.veToken;
70
- const lockerAddress = locker.modules.locker;
71
- const secondaryMarket = locker.secondaryMarket;
72
- const rewards = locker.rewards;
73
- const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18);
74
- const format = (value) => formatUnits(value, locker.token.decimals);
75
- const formatRes = (value) => format(getRes(value));
76
- const calls = [
77
- /*********************************************************************************
78
- *** Voting Escrow
79
- *********************************************************************************/
80
- // Token locked by the Locker
81
- { address: votingEscrow, name: 'locked', params: [lockerAddress] },
82
- // veToken Balance of the Locker
83
- { address: votingEscrow, name: 'balanceOf', params: [lockerAddress] },
84
- // Total token locked
85
- { address: votingEscrow, name: 'supply' },
86
- // Total veToken supply
87
- { address: votingEscrow, name: 'totalSupply' },
88
- /*********************************************************************************
89
- *** Gauge
90
- *********************************************************************************/
91
- // Total sdToken staked
92
- { address: gauge, name: 'totalSupply' },
93
- // Gauge working supply
94
- { address: gauge, name: 'working_supply' },
95
- /*********************************************************************************
96
- *** Token & sdToken
97
- *********************************************************************************/
98
- // Token balance not locked
99
- { address: token, name: 'balanceOf', params: [depositor] },
100
- // sdToken in secondary market pool
101
- { address: sdToken, name: 'balanceOf', params: [secondaryMarket.pool] },
102
- /*********************************************************************************
103
- *** Peg
104
- *********************************************************************************/
105
- // Return amount when swapping {pegBase} sdToken to token -> get_dy(int128,int128,uint256)
106
- { address: secondaryMarket.pool, name: '0x5e0d443f', params: [One, Zero, pegBase] },
107
- /*********************************************************************************
108
- *** Rewards
109
- *********************************************************************************/
110
- // Streaming status for each reward token
111
- ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
112
- ];
113
- const res = await multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId));
114
- const raw = {
115
- tokenLocked: getRes(res.shift()),
116
- veBalanceOfLocker: formatRes(res.shift()),
117
- totalTokenLocked: formatRes(res.shift()),
118
- veTotalSupply: formatRes(res.shift()),
119
- totalSupplyStaked: formatRes(res.shift()),
120
- gaugeWorkingSupply: formatRes(res.shift()),
121
- amountTokenNotLock: formatRes(res.shift()),
122
- sdTokenInPool: formatRes(res.shift()),
123
- peg: getRes(res.shift()),
124
- rewards: rewards.map(() => getRes(res.shift())),
125
- veTokenRate: '4',
126
- _workingSupply: '0',
127
- _veBalanceOfLocker: '0',
128
- };
129
- raw.tokenLocked = format(raw.tokenLocked[0]);
130
- raw.peg = parsePeg(locker, raw.peg);
131
- raw._workingSupply = raw.gaugeWorkingSupply;
132
- raw._veBalanceOfLocker = raw.veBalanceOfLocker;
133
- return parse({ locker, common, prices, raw });
134
- };
135
- export default angleLocker;
136
- //# sourceMappingURL=angle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"angle.js","sourceRoot":"","sources":["../../../../../src/lockers/fetch/protocols/angle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,yBAAyB,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAC9C,OAAO,mBAAmB,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG7C,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,EAAE,EAAE,OAAO;IACX,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,OAAO;IACjB,mBAAmB,EACjB,kJAAkJ;IACpJ,OAAO,EAAE,sBAAsB;IAC/B,OAAO,EAAE,GAAG,yBAAyB,2BAA2B;IAChE,OAAO,EAAE,CAAC;IACV,GAAG,EAAE,eAAe;IACpB,KAAK,EAAE,WAAW,CAAC,OAAO,CAAE;IAC5B,OAAO,EAAE,WAAW,CAAC,SAAS,CAAE;IAChC,OAAO,EAAE;QACP,EAAE,GAAG,WAAW,CAAC,KAAK,CAAE,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE;QAC3E,EAAE,GAAG,WAAW,CAAC,OAAO,CAAE,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE;QAC3E,EAAE,GAAG,WAAW,CAAC,MAAM,CAAE,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE;QAC9E,EAAE,GAAG,WAAW,CAAC,SAAS,CAAE,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE;KAChF;IACD,UAAU,EAAE,CAAC,aAAa,CAAC;IAC3B,OAAO,EAAE;QACP,SAAS,EAAE,4CAA4C;QACvD,MAAM,EAAE,4CAA4C;QACpD,OAAO,EAAE,4CAA4C;QACrD,KAAK,EAAE,4CAA4C;QACnD,WAAW,EAAE,4CAA4C;QACzD,MAAM,EAAE,4CAA4C;KACrD;IACD,eAAe,EAAE;QACf,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,4CAA4C;QAClD,KAAK,EAAE,CAAC,4CAA4C,CAAC;QACrD,OAAO,EAAE,MAAM;KAChB;IACD,IAAI,EAAE;QACJ;YACE,KAAK,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE;YACtD,KAAK,EAAE,EAAE;YACT,GAAG,EAAE,cAAc;YACnB,MAAM,EAAE,IAAI;SACb;QACD;YACE,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE;YAC1B,KAAK,EAAE,CAAC;YACR,GAAG,EAAE,QAAQ;YACb,MAAM,EAAE,IAAI;SACb;QACD;YACE,KAAK,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;YAC3B,KAAK,EAAE,GAAG;YACV,GAAG,EAAE,YAAY;YACjB,MAAM,EAAE,IAAI;SACb;KACF;IACD,UAAU,EAAE;QACV,iBAAiB,EAAE,OAAO;KAC3B;CACF,CAAA;AAED,MAAM,WAAW,GAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAgC,EAAE,EAAE;IACvF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAA;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAA;IAEtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAA;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAA;IAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAA;IAC3C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAA;IAE3C,MAAM,eAAe,GAAG,MAAM,CAAC,eAAgB,CAAA;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;IAE9B,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAA;IAE3E,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC3E,MAAM,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvD,MAAM,KAAK,GAAW;QACpB;;2FAEmF;QAEnF,6BAA6B;QAC7B,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE;QAClE,gCAAgC;QAChC,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE;QACrE,qBAAqB;QACrB,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzC,uBAAuB;QACvB,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE;QAE9C;;2FAEmF;QAEnF,uBAAuB;QACvB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE;QACvC,uBAAuB;QACvB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE;QAE1C;;2FAEmF;QAEnF,2BAA2B;QAC3B,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;QAC1D,mCAAmC;QACnC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;QAEvE;;2FAEmF;QAEnF,0FAA0F;QAC1F,EAAE,OAAO,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE;QAEnF;;2FAEmF;QAEnF,yCAAyC;QACzC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;KACtF,CAAA;IAED,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IAC5F,MAAM,GAAG,GAAG;QACV,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAChC,iBAAiB,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACzC,gBAAgB,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACxC,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACrC,iBAAiB,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACzC,kBAAkB,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1C,kBAAkB,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1C,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACrC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,GAAG;QACnB,kBAAkB,EAAE,GAAG;KACxB,CAAA;IAED,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IACnC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,kBAAkB,CAAA;IAC3C,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC,iBAAiB,CAAA;IAE9C,OAAO,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,eAAe,WAAW,CAAA"}
@@ -1,3 +0,0 @@
1
- export const ANGLE_APR_URL = 'https://api.angle.money/v1/apr';
2
- export const ANGLE_PRICE_URL = 'https://api.angle.money/v1/prices';
3
- //# sourceMappingURL=endpoints.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../../../src/strategies/angle/endpoints.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,gCAAgC,CAAA;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,mCAAmC,CAAA"}