@stake-dao/reader 0.5.36 → 0.5.37

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 (57) 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 +0 -2
  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/types/bytecodes/index.d.ts +0 -1
  16. package/dist/types/bytecodes/index.d.ts.map +1 -1
  17. package/dist/types/index.d.ts +0 -2
  18. package/dist/types/index.d.ts.map +1 -1
  19. package/dist/types/lockers/fetch/index.d.ts +1 -1
  20. package/dist/types/lockers/fetch/index.d.ts.map +1 -1
  21. package/dist/types/lockers/fetch/static.d.ts.map +1 -1
  22. package/dist/types/strategies/utils/boost.d.ts.map +1 -1
  23. package/dist/types/utils.d.ts.map +1 -1
  24. package/dist/types/votemarket/curve/fetchUserVlCvxClaimable.d.ts.map +1 -1
  25. package/package.json +2 -2
  26. package/src/bytecodes/index.ts +0 -1
  27. package/src/index.ts +0 -4
  28. package/src/lockers/fetch/index.ts +0 -2
  29. package/src/lockers/fetch/static.ts +0 -2
  30. package/src/strategies/utils/boost.ts +0 -6
  31. package/src/utils.ts +0 -1
  32. package/src/votemarket/curve/fetchUserVlCvxClaimable.ts +67 -6
  33. package/dist/esm/abis/angleVaultsMulticall.js +0 -85
  34. package/dist/esm/abis/angleVaultsMulticall.js.map +0 -1
  35. package/dist/esm/bytecodes/strategies/batches/batchAngleStrats.js +0 -24
  36. package/dist/esm/bytecodes/strategies/batches/batchAngleStrats.js.map +0 -1
  37. package/dist/esm/lockers/fetch/protocols/angle.js +0 -136
  38. package/dist/esm/lockers/fetch/protocols/angle.js.map +0 -1
  39. package/dist/esm/strategies/angle/endpoints.js +0 -3
  40. package/dist/esm/strategies/angle/endpoints.js.map +0 -1
  41. package/dist/esm/strategies/angle/fetch.js +0 -213
  42. package/dist/esm/strategies/angle/fetch.js.map +0 -1
  43. package/dist/types/abis/angleVaultsMulticall.d.ts +0 -42
  44. package/dist/types/abis/angleVaultsMulticall.d.ts.map +0 -1
  45. package/dist/types/bytecodes/strategies/batches/batchAngleStrats.d.ts +0 -4
  46. package/dist/types/bytecodes/strategies/batches/batchAngleStrats.d.ts.map +0 -1
  47. package/dist/types/lockers/fetch/protocols/angle.d.ts +0 -9
  48. package/dist/types/lockers/fetch/protocols/angle.d.ts.map +0 -1
  49. package/dist/types/strategies/angle/endpoints.d.ts +0 -3
  50. package/dist/types/strategies/angle/endpoints.d.ts.map +0 -1
  51. package/dist/types/strategies/angle/fetch.d.ts +0 -22
  52. package/dist/types/strategies/angle/fetch.d.ts.map +0 -1
  53. package/src/abis/angleVaultsMulticall.ts +0 -85
  54. package/src/bytecodes/strategies/batches/batchAngleStrats.ts +0 -26
  55. package/src/lockers/fetch/protocols/angle.ts +0 -157
  56. package/src/strategies/angle/endpoints.ts +0 -2
  57. package/src/strategies/angle/fetch.ts +0 -253
@@ -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()
@@ -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":"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"}
@@ -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"}
@@ -1,213 +0,0 @@
1
- import { STRAT_FEES, Zero, angleStrats, contracts } from '@stake-dao/constants';
2
- import { chunk, uniq } from 'lodash-es';
3
- import { encodeAbiParameters, formatUnits, parseAbiParameters } from 'viem';
4
- import { mainnet } from 'viem/chains';
5
- import multicallAngleVaultsAbi from '../../abis/angleVaultsMulticall.js';
6
- import { batchAngleStrats } from '../../bytecodes/index.js';
7
- import { getPricesFromLlama } from '../../prices.js';
8
- import { batchJsonRpc, equalTlc, multicall } from '../../utils.js';
9
- import { getAprBreakdown } from '../utils/getAprBreakdown.js';
10
- import getTokenTypes from '../utils/getTokenTypes.js';
11
- import { ANGLE_APR_URL, ANGLE_PRICE_URL } from './endpoints.js';
12
- export const fetchAngle = async ({ prices, provider, rpc, chainId }) => {
13
- const stratsDataCalls = [];
14
- const balancesCalls = [];
15
- const dataCalls = [];
16
- const strats = angleStrats.strats[chainId].filter((s) => s.chainId === chainId);
17
- const tokensToFetch = [];
18
- for (const s of strats) {
19
- tokensToFetch.push(...s.underlyingCoins);
20
- if (s.lpToken.symbol !== 'SLP') {
21
- balancesCalls.push(...[
22
- {
23
- address: s.lpToken.address,
24
- name: s.key.includes('gamma') ? 'getTotalAmounts' : 'getUnderlyingBalances',
25
- },
26
- {
27
- address: s.lpToken.address,
28
- name: 'totalSupply',
29
- },
30
- ]);
31
- }
32
- dataCalls.push(...[
33
- { address: s.vault, name: 'totalSupply' },
34
- { address: s.rewards[0].gauge, name: 'totalSupply' },
35
- { address: s.rewards[0].gauge, name: 'working_supply' },
36
- ]);
37
- }
38
- const httpCalls = [
39
- // Angle APR
40
- (await fetch(ANGLE_APR_URL)).json(),
41
- // Angle Prices
42
- (await fetch(ANGLE_PRICE_URL)).json(),
43
- // Defillama prices
44
- await getPricesFromLlama(uniq(tokensToFetch), chainId),
45
- ];
46
- const httpResponses = await Promise.all(httpCalls);
47
- const rawBalances = await multicall(provider, balancesCalls, multicallAngleVaultsAbi);
48
- const rawData = await multicall(provider, dataCalls, multicallAngleVaultsAbi);
49
- const angleAprData = httpResponses[0];
50
- const anglePriceData = httpResponses[1];
51
- const defillamaPrices = httpResponses[2];
52
- let rawPriceIndex = 0;
53
- const stratsWithApy = strats.map((s) => {
54
- const aprData = angleAprData[s.aprApiKey];
55
- let priceData = anglePriceData.find((d) => d.token === s.aprApiKey);
56
- if (!priceData) {
57
- const token0 = s.underlyingCoins[0];
58
- const token1 = s.underlyingCoins[1];
59
- const token0Price = defillamaPrices.find((p) => p.symbol === token0.symbol);
60
- const token1Price = defillamaPrices.find((p) => p.symbol === token1.symbol);
61
- const token0AmountUsd = Number(formatUnits(rawBalances[rawPriceIndex].result[0], token0.decimals)) * token0Price.usdPrice;
62
- const token1AmountUsd = Number(formatUnits(rawBalances[rawPriceIndex].result[1], token1.decimals)) * token1Price.usdPrice;
63
- const totalLp = Number(formatUnits(rawBalances[rawPriceIndex + 1].result, 18));
64
- const lpPriceInUsd = (token0AmountUsd + token1AmountUsd) / totalLp;
65
- priceData = { rate: lpPriceInUsd };
66
- rawPriceIndex += 2;
67
- }
68
- let maxApr = 0;
69
- let tradingApy = 0;
70
- if (aprData?.details && aprData.value && aprData.address) {
71
- tradingApy = aprData.details.fees ? aprData.details.fees : 0;
72
- const aprDetailsKeys = Object.keys(aprData.details);
73
- const indexOfApy = aprDetailsKeys.map((k) => k.includes(s.lpToken.address.toLowerCase())).indexOf(true);
74
- maxApr =
75
- indexOfApy > 0
76
- ? aprData.details[aprDetailsKeys[indexOfApy]]
77
- : aprData.details.max
78
- ? aprData.details.max
79
- : aprData.value - tradingApy;
80
- }
81
- if (s.key === 'angle-sushi-eura-angle') {
82
- stratsDataCalls.push({
83
- vault: s.vault,
84
- token: s.lpToken.address,
85
- sdtLiquidityGauge: s.gaugeAddress,
86
- });
87
- }
88
- return {
89
- ...s,
90
- tradingApy,
91
- minApr: (maxApr * ((100 - STRAT_FEES) / 100)) / 2.5,
92
- maxApr: maxApr * ((100 - STRAT_FEES) / 100),
93
- lpPriceInUsd: priceData ? priceData.rate : 1,
94
- };
95
- });
96
- const inputArgsChunks = chunk(stratsDataCalls, 20);
97
- const angleCalls = inputArgsChunks.map((inputArgs) => {
98
- const inputData = encodeAbiParameters(parseAbiParameters(batchAngleStrats.inputType[chainId]), [
99
- contracts.sdGaugeController[chainId],
100
- inputArgs,
101
- ]);
102
- return batchAngleStrats.bytecode[chainId].concat(inputData.slice(2));
103
- });
104
- const rawAngleData = await batchJsonRpc({
105
- rpc,
106
- calls: angleCalls,
107
- outputTypeAbi: batchAngleStrats.outputTypeHr[chainId],
108
- callsKey: `strategies/angle/fetch.ts: rawAngleData - chainId ${chainId} - rpc ${rpc}`,
109
- });
110
- let offchainDataIndex = 0;
111
- const parsedStrats = stratsWithApy.map((s) => {
112
- let fetchedData;
113
- if (s.offchain) {
114
- fetchedData = {
115
- totalSupply: rawData[offchainDataIndex].result,
116
- sdGaugeTotalSupply: rawData[offchainDataIndex + 1].result,
117
- sdWorkingSupply: chainId === mainnet.id ? rawData[offchainDataIndex + 2].result : Zero,
118
- accumulatedFees: Zero,
119
- keeperFee: Zero,
120
- };
121
- }
122
- else {
123
- fetchedData = rawAngleData.shift();
124
- }
125
- offchainDataIndex += 3;
126
- const rewardsData = s.rewards.map((r) => {
127
- const rewardToken = {
128
- symbol: r.symbol,
129
- name: r.name,
130
- decimals: r.decimals,
131
- address: r.address,
132
- };
133
- const rewardPrice = prices.find((p) => equalTlc(p.address, rewardToken.address));
134
- return {
135
- token: rewardToken,
136
- price: rewardPrice ? rewardPrice.usdPrice : 0,
137
- apr: 0,
138
- streaming: false,
139
- periodFinish: 0,
140
- rate: '0',
141
- lastUpdate: '0',
142
- claimablePendingRewards: '0',
143
- };
144
- });
145
- const boost = 2.5;
146
- const sdtApr = {
147
- sdtUserApr: 0,
148
- sdtFuturUserApr: 0,
149
- sdtMinApr: 0,
150
- sdtFuturMinApr: 0,
151
- sdtMaxApr: 0,
152
- sdtFuturMaxApr: 0,
153
- sdtBoost: 1,
154
- };
155
- const apr = getAprBreakdown(s, rewardsData, boost, sdtApr);
156
- const totalSupply = formatUnits(fetchedData.totalSupply, 0);
157
- const lpPriceInUsd = s.lpPriceInUsd;
158
- const tvl = lpPriceInUsd * Number(formatUnits(BigInt(fetchedData.totalSupply), 18));
159
- const sdGauge = {
160
- address: s.gaugeAddress,
161
- totalSupply: formatUnits(fetchedData.sdGaugeTotalSupply, 0),
162
- relativeWeight: '0',
163
- weight: '0',
164
- futureWeight: '0',
165
- workingSupply: '0',
166
- };
167
- return {
168
- key: s.key,
169
- name: s.name,
170
- tokensFilter: getTokenTypes(s),
171
- protocol: s.protocol,
172
- chainId: s.chainId,
173
- vault: s.vault,
174
- lpToken: s.lpToken,
175
- gaugeAddress: s.gaugeAddress,
176
- coins: s.coins,
177
- sdGauge,
178
- lpPriceInUsd,
179
- streaming: rewardsData.some((r) => Number(r.periodFinish) > Math.floor(Date.now() / 1000)),
180
- tvl,
181
- apr: {
182
- boost,
183
- ...apr,
184
- },
185
- rewards: rewardsData,
186
- // Base APR data
187
- tradingApy: s.tradingApy,
188
- minApr: s.minApr,
189
- maxApr: s.maxApr,
190
- // Raw data
191
- totalSupply,
192
- // Gas optimised
193
- vaultFees: {
194
- keeper: Number(fetchedData.keeperFee) / 100,
195
- accumulated: formatUnits(fetchedData.accumulatedFees, 0),
196
- },
197
- };
198
- });
199
- return {
200
- global: {
201
- fees: {
202
- veSdt: 5,
203
- perf: 2,
204
- accumulator: 8,
205
- claimer: 0.5,
206
- },
207
- },
208
- deployed: parsedStrats,
209
- notDeployed: [],
210
- fetched: true,
211
- };
212
- };
213
- //# sourceMappingURL=fetch.js.map