@sablier/bob 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE-BUSL.md +82 -0
  3. package/LICENSE-GPL.md +470 -0
  4. package/LICENSE.md +9 -0
  5. package/README.md +81 -0
  6. package/artifacts/BobVaultShare.json +936 -0
  7. package/artifacts/SablierBob.json +1683 -0
  8. package/artifacts/SablierEscrow.json +1316 -0
  9. package/artifacts/SablierLidoAdapter.json +1649 -0
  10. package/artifacts/erc20/IERC20.json +226 -0
  11. package/artifacts/interfaces/IBobVaultShare.json +393 -0
  12. package/artifacts/interfaces/ISablierBob.json +1171 -0
  13. package/artifacts/interfaces/ISablierEscrow.json +999 -0
  14. package/artifacts/interfaces/ISablierLidoAdapter.json +1141 -0
  15. package/artifacts/interfaces/external/ICurveStETHPool.json +128 -0
  16. package/artifacts/interfaces/external/ILidoWithdrawalQueue.json +209 -0
  17. package/artifacts/interfaces/external/IStETH.json +262 -0
  18. package/artifacts/interfaces/external/IWETH9.json +259 -0
  19. package/artifacts/interfaces/external/IWstETH.json +311 -0
  20. package/artifacts/libraries/Errors.json +868 -0
  21. package/package.json +68 -0
  22. package/src/BobVaultShare.sol +119 -0
  23. package/src/SablierBob.sol +543 -0
  24. package/src/SablierEscrow.sol +288 -0
  25. package/src/SablierLidoAdapter.sol +549 -0
  26. package/src/abstracts/SablierBobState.sol +156 -0
  27. package/src/abstracts/SablierEscrowState.sol +159 -0
  28. package/src/interfaces/IBobVaultShare.sol +51 -0
  29. package/src/interfaces/ISablierBob.sol +261 -0
  30. package/src/interfaces/ISablierBobAdapter.sol +157 -0
  31. package/src/interfaces/ISablierBobState.sol +74 -0
  32. package/src/interfaces/ISablierEscrow.sol +148 -0
  33. package/src/interfaces/ISablierEscrowState.sol +77 -0
  34. package/src/interfaces/ISablierLidoAdapter.sol +110 -0
  35. package/src/interfaces/external/ICurveStETHPool.sol +31 -0
  36. package/src/interfaces/external/ILidoWithdrawalQueue.sol +67 -0
  37. package/src/interfaces/external/IStETH.sol +18 -0
  38. package/src/interfaces/external/IWETH9.sol +19 -0
  39. package/src/interfaces/external/IWstETH.sol +32 -0
  40. package/src/libraries/Errors.sol +189 -0
  41. package/src/types/Bob.sol +49 -0
  42. package/src/types/Escrow.sol +49 -0
@@ -0,0 +1,259 @@
1
+ {
2
+ "abi": [
3
+ {
4
+ "type": "function",
5
+ "name": "allowance",
6
+ "inputs": [
7
+ { "name": "owner", "type": "address", "internalType": "address" },
8
+ { "name": "spender", "type": "address", "internalType": "address" }
9
+ ],
10
+ "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
11
+ "stateMutability": "view"
12
+ },
13
+ {
14
+ "type": "function",
15
+ "name": "approve",
16
+ "inputs": [
17
+ { "name": "spender", "type": "address", "internalType": "address" },
18
+ { "name": "value", "type": "uint256", "internalType": "uint256" }
19
+ ],
20
+ "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
21
+ "stateMutability": "nonpayable"
22
+ },
23
+ {
24
+ "type": "function",
25
+ "name": "balanceOf",
26
+ "inputs": [{ "name": "account", "type": "address", "internalType": "address" }],
27
+ "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
28
+ "stateMutability": "view"
29
+ },
30
+ { "type": "function", "name": "deposit", "inputs": [], "outputs": [], "stateMutability": "payable" },
31
+ {
32
+ "type": "function",
33
+ "name": "totalSupply",
34
+ "inputs": [],
35
+ "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
36
+ "stateMutability": "view"
37
+ },
38
+ {
39
+ "type": "function",
40
+ "name": "transfer",
41
+ "inputs": [
42
+ { "name": "to", "type": "address", "internalType": "address" },
43
+ { "name": "value", "type": "uint256", "internalType": "uint256" }
44
+ ],
45
+ "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
46
+ "stateMutability": "nonpayable"
47
+ },
48
+ {
49
+ "type": "function",
50
+ "name": "transferFrom",
51
+ "inputs": [
52
+ { "name": "from", "type": "address", "internalType": "address" },
53
+ { "name": "to", "type": "address", "internalType": "address" },
54
+ { "name": "value", "type": "uint256", "internalType": "uint256" }
55
+ ],
56
+ "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
57
+ "stateMutability": "nonpayable"
58
+ },
59
+ {
60
+ "type": "function",
61
+ "name": "withdraw",
62
+ "inputs": [{ "name": "amount", "type": "uint256", "internalType": "uint256" }],
63
+ "outputs": [],
64
+ "stateMutability": "nonpayable"
65
+ },
66
+ {
67
+ "type": "event",
68
+ "name": "Approval",
69
+ "inputs": [
70
+ { "name": "owner", "type": "address", "indexed": true, "internalType": "address" },
71
+ { "name": "spender", "type": "address", "indexed": true, "internalType": "address" },
72
+ { "name": "value", "type": "uint256", "indexed": false, "internalType": "uint256" }
73
+ ],
74
+ "anonymous": false
75
+ },
76
+ {
77
+ "type": "event",
78
+ "name": "Transfer",
79
+ "inputs": [
80
+ { "name": "from", "type": "address", "indexed": true, "internalType": "address" },
81
+ { "name": "to", "type": "address", "indexed": true, "internalType": "address" },
82
+ { "name": "value", "type": "uint256", "indexed": false, "internalType": "uint256" }
83
+ ],
84
+ "anonymous": false
85
+ }
86
+ ],
87
+ "bytecode": { "object": "0x", "sourceMap": "", "linkReferences": {} },
88
+ "deployedBytecode": { "object": "0x", "sourceMap": "", "linkReferences": {} },
89
+ "methodIdentifiers": {
90
+ "allowance(address,address)": "dd62ed3e",
91
+ "approve(address,uint256)": "095ea7b3",
92
+ "balanceOf(address)": "70a08231",
93
+ "deposit()": "d0e30db0",
94
+ "totalSupply()": "18160ddd",
95
+ "transfer(address,uint256)": "a9059cbb",
96
+ "transferFrom(address,address,uint256)": "23b872dd",
97
+ "withdraw(uint256)": "2e1a7d4d"
98
+ },
99
+ "rawMetadata": "{\"compiler\":{\"version\":\"0.8.29+commit.ab55807c\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"withdraw(uint256)\":{\"params\":{\"amount\":\"The amount of WETH to burn.\"}}},\"title\":\"IWETH9\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deposit()\":{\"notice\":\"Deposits ETH and mints WETH.\"},\"withdraw(uint256)\":{\"notice\":\"Burns WETH and withdraws ETH.\"}},\"notice\":\"Minimal interface for Wrapped Ether.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/interfaces/external/IWETH9.sol\":\"IWETH9\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":@arbitrum/=node_modules/@arbitrum/\",\":@chainlink/=node_modules/@chainlink/\",\":@eth-optimism/=node_modules/@eth-optimism/\",\":@offchainlabs/=node_modules/@offchainlabs/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@prb/=node_modules/@prb/\",\":@sablier/=node_modules/@sablier/\",\":@scroll-tech/=node_modules/@scroll-tech/\",\":@zksync/=node_modules/@zksync/\",\":forge-std/=node_modules/forge-std/\"],\"viaIR\":true},\"sources\":{\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"src/interfaces/external/IWETH9.sol\":{\"keccak256\":\"0x1c3b4200172a52de8c9271172239a9cf41a197df289586480e2bfc6e14fe5bb3\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://bf4c6da85bf6214d4281915625c208cef5afec832414c2c2d4473b9217112ef0\",\"dweb:/ipfs/QmTTdUP6dXAot7dXJy7Zsbew3yA6VRHNgKGwR2fSXLoxUq\"]}},\"version\":1}",
100
+ "metadata": {
101
+ "compiler": { "version": "0.8.29+commit.ab55807c" },
102
+ "language": "Solidity",
103
+ "output": {
104
+ "abi": [
105
+ {
106
+ "inputs": [
107
+ { "internalType": "address", "name": "owner", "type": "address", "indexed": true },
108
+ { "internalType": "address", "name": "spender", "type": "address", "indexed": true },
109
+ { "internalType": "uint256", "name": "value", "type": "uint256", "indexed": false }
110
+ ],
111
+ "type": "event",
112
+ "name": "Approval",
113
+ "anonymous": false
114
+ },
115
+ {
116
+ "inputs": [
117
+ { "internalType": "address", "name": "from", "type": "address", "indexed": true },
118
+ { "internalType": "address", "name": "to", "type": "address", "indexed": true },
119
+ { "internalType": "uint256", "name": "value", "type": "uint256", "indexed": false }
120
+ ],
121
+ "type": "event",
122
+ "name": "Transfer",
123
+ "anonymous": false
124
+ },
125
+ {
126
+ "inputs": [
127
+ { "internalType": "address", "name": "owner", "type": "address" },
128
+ { "internalType": "address", "name": "spender", "type": "address" }
129
+ ],
130
+ "stateMutability": "view",
131
+ "type": "function",
132
+ "name": "allowance",
133
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
134
+ },
135
+ {
136
+ "inputs": [
137
+ { "internalType": "address", "name": "spender", "type": "address" },
138
+ { "internalType": "uint256", "name": "value", "type": "uint256" }
139
+ ],
140
+ "stateMutability": "nonpayable",
141
+ "type": "function",
142
+ "name": "approve",
143
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
144
+ },
145
+ {
146
+ "inputs": [{ "internalType": "address", "name": "account", "type": "address" }],
147
+ "stateMutability": "view",
148
+ "type": "function",
149
+ "name": "balanceOf",
150
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
151
+ },
152
+ { "inputs": [], "stateMutability": "payable", "type": "function", "name": "deposit" },
153
+ {
154
+ "inputs": [],
155
+ "stateMutability": "view",
156
+ "type": "function",
157
+ "name": "totalSupply",
158
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
159
+ },
160
+ {
161
+ "inputs": [
162
+ { "internalType": "address", "name": "to", "type": "address" },
163
+ { "internalType": "uint256", "name": "value", "type": "uint256" }
164
+ ],
165
+ "stateMutability": "nonpayable",
166
+ "type": "function",
167
+ "name": "transfer",
168
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
169
+ },
170
+ {
171
+ "inputs": [
172
+ { "internalType": "address", "name": "from", "type": "address" },
173
+ { "internalType": "address", "name": "to", "type": "address" },
174
+ { "internalType": "uint256", "name": "value", "type": "uint256" }
175
+ ],
176
+ "stateMutability": "nonpayable",
177
+ "type": "function",
178
+ "name": "transferFrom",
179
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
180
+ },
181
+ {
182
+ "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }],
183
+ "stateMutability": "nonpayable",
184
+ "type": "function",
185
+ "name": "withdraw"
186
+ }
187
+ ],
188
+ "devdoc": {
189
+ "kind": "dev",
190
+ "methods": {
191
+ "allowance(address,address)": {
192
+ "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."
193
+ },
194
+ "approve(address,uint256)": {
195
+ "details": "Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."
196
+ },
197
+ "balanceOf(address)": { "details": "Returns the value of tokens owned by `account`." },
198
+ "totalSupply()": { "details": "Returns the value of tokens in existence." },
199
+ "transfer(address,uint256)": {
200
+ "details": "Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
201
+ },
202
+ "transferFrom(address,address,uint256)": {
203
+ "details": "Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
204
+ },
205
+ "withdraw(uint256)": { "params": { "amount": "The amount of WETH to burn." } }
206
+ },
207
+ "version": 1
208
+ },
209
+ "userdoc": {
210
+ "kind": "user",
211
+ "methods": {
212
+ "deposit()": { "notice": "Deposits ETH and mints WETH." },
213
+ "withdraw(uint256)": { "notice": "Burns WETH and withdraws ETH." }
214
+ },
215
+ "version": 1
216
+ }
217
+ },
218
+ "settings": {
219
+ "remappings": [
220
+ "@arbitrum/=node_modules/@arbitrum/",
221
+ "@chainlink/=node_modules/@chainlink/",
222
+ "@eth-optimism/=node_modules/@eth-optimism/",
223
+ "@offchainlabs/=node_modules/@offchainlabs/",
224
+ "@openzeppelin/=node_modules/@openzeppelin/",
225
+ "@prb/=node_modules/@prb/",
226
+ "@sablier/=node_modules/@sablier/",
227
+ "@scroll-tech/=node_modules/@scroll-tech/",
228
+ "@zksync/=node_modules/@zksync/",
229
+ "forge-std/=node_modules/forge-std/"
230
+ ],
231
+ "optimizer": { "enabled": true, "runs": 1000000 },
232
+ "metadata": { "bytecodeHash": "ipfs" },
233
+ "compilationTarget": { "src/interfaces/external/IWETH9.sol": "IWETH9" },
234
+ "evmVersion": "shanghai",
235
+ "libraries": {},
236
+ "viaIR": true
237
+ },
238
+ "sources": {
239
+ "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": {
240
+ "keccak256": "0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7",
241
+ "urls": [
242
+ "bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db",
243
+ "dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"
244
+ ],
245
+ "license": "MIT"
246
+ },
247
+ "src/interfaces/external/IWETH9.sol": {
248
+ "keccak256": "0x1c3b4200172a52de8c9271172239a9cf41a197df289586480e2bfc6e14fe5bb3",
249
+ "urls": [
250
+ "bzz-raw://bf4c6da85bf6214d4281915625c208cef5afec832414c2c2d4473b9217112ef0",
251
+ "dweb:/ipfs/QmTTdUP6dXAot7dXJy7Zsbew3yA6VRHNgKGwR2fSXLoxUq"
252
+ ],
253
+ "license": "GPL-3.0-or-later"
254
+ }
255
+ },
256
+ "version": 1
257
+ },
258
+ "id": 96
259
+ }
@@ -0,0 +1,311 @@
1
+ {
2
+ "abi": [
3
+ {
4
+ "type": "function",
5
+ "name": "allowance",
6
+ "inputs": [
7
+ { "name": "owner", "type": "address", "internalType": "address" },
8
+ { "name": "spender", "type": "address", "internalType": "address" }
9
+ ],
10
+ "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
11
+ "stateMutability": "view"
12
+ },
13
+ {
14
+ "type": "function",
15
+ "name": "approve",
16
+ "inputs": [
17
+ { "name": "spender", "type": "address", "internalType": "address" },
18
+ { "name": "value", "type": "uint256", "internalType": "uint256" }
19
+ ],
20
+ "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
21
+ "stateMutability": "nonpayable"
22
+ },
23
+ {
24
+ "type": "function",
25
+ "name": "balanceOf",
26
+ "inputs": [{ "name": "account", "type": "address", "internalType": "address" }],
27
+ "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
28
+ "stateMutability": "view"
29
+ },
30
+ {
31
+ "type": "function",
32
+ "name": "getStETHByWstETH",
33
+ "inputs": [{ "name": "wstETHAmount", "type": "uint256", "internalType": "uint256" }],
34
+ "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
35
+ "stateMutability": "view"
36
+ },
37
+ {
38
+ "type": "function",
39
+ "name": "getWstETHByStETH",
40
+ "inputs": [{ "name": "stETHAmount", "type": "uint256", "internalType": "uint256" }],
41
+ "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
42
+ "stateMutability": "view"
43
+ },
44
+ {
45
+ "type": "function",
46
+ "name": "totalSupply",
47
+ "inputs": [],
48
+ "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
49
+ "stateMutability": "view"
50
+ },
51
+ {
52
+ "type": "function",
53
+ "name": "transfer",
54
+ "inputs": [
55
+ { "name": "to", "type": "address", "internalType": "address" },
56
+ { "name": "value", "type": "uint256", "internalType": "uint256" }
57
+ ],
58
+ "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
59
+ "stateMutability": "nonpayable"
60
+ },
61
+ {
62
+ "type": "function",
63
+ "name": "transferFrom",
64
+ "inputs": [
65
+ { "name": "from", "type": "address", "internalType": "address" },
66
+ { "name": "to", "type": "address", "internalType": "address" },
67
+ { "name": "value", "type": "uint256", "internalType": "uint256" }
68
+ ],
69
+ "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
70
+ "stateMutability": "nonpayable"
71
+ },
72
+ {
73
+ "type": "function",
74
+ "name": "unwrap",
75
+ "inputs": [{ "name": "wstETHAmount", "type": "uint256", "internalType": "uint256" }],
76
+ "outputs": [{ "name": "stETHAmount", "type": "uint256", "internalType": "uint256" }],
77
+ "stateMutability": "nonpayable"
78
+ },
79
+ {
80
+ "type": "function",
81
+ "name": "wrap",
82
+ "inputs": [{ "name": "stETHAmount", "type": "uint256", "internalType": "uint256" }],
83
+ "outputs": [{ "name": "wstETHAmount", "type": "uint256", "internalType": "uint256" }],
84
+ "stateMutability": "nonpayable"
85
+ },
86
+ {
87
+ "type": "event",
88
+ "name": "Approval",
89
+ "inputs": [
90
+ { "name": "owner", "type": "address", "indexed": true, "internalType": "address" },
91
+ { "name": "spender", "type": "address", "indexed": true, "internalType": "address" },
92
+ { "name": "value", "type": "uint256", "indexed": false, "internalType": "uint256" }
93
+ ],
94
+ "anonymous": false
95
+ },
96
+ {
97
+ "type": "event",
98
+ "name": "Transfer",
99
+ "inputs": [
100
+ { "name": "from", "type": "address", "indexed": true, "internalType": "address" },
101
+ { "name": "to", "type": "address", "indexed": true, "internalType": "address" },
102
+ { "name": "value", "type": "uint256", "indexed": false, "internalType": "uint256" }
103
+ ],
104
+ "anonymous": false
105
+ }
106
+ ],
107
+ "bytecode": { "object": "0x", "sourceMap": "", "linkReferences": {} },
108
+ "deployedBytecode": { "object": "0x", "sourceMap": "", "linkReferences": {} },
109
+ "methodIdentifiers": {
110
+ "allowance(address,address)": "dd62ed3e",
111
+ "approve(address,uint256)": "095ea7b3",
112
+ "balanceOf(address)": "70a08231",
113
+ "getStETHByWstETH(uint256)": "bb2952fc",
114
+ "getWstETHByStETH(uint256)": "b0e38900",
115
+ "totalSupply()": "18160ddd",
116
+ "transfer(address,uint256)": "a9059cbb",
117
+ "transferFrom(address,address,uint256)": "23b872dd",
118
+ "unwrap(uint256)": "de0e9a3e",
119
+ "wrap(uint256)": "ea598cb0"
120
+ },
121
+ "rawMetadata": "{\"compiler\":{\"version\":\"0.8.29+commit.ab55807c\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wstETHAmount\",\"type\":\"uint256\"}],\"name\":\"getStETHByWstETH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stETHAmount\",\"type\":\"uint256\"}],\"name\":\"getWstETHByStETH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"wstETHAmount\",\"type\":\"uint256\"}],\"name\":\"unwrap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stETHAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stETHAmount\",\"type\":\"uint256\"}],\"name\":\"wrap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"wstETHAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the value of tokens owned by `account`.\"},\"getStETHByWstETH(uint256)\":{\"params\":{\"wstETHAmount\":\"The amount of wstETH.\"},\"returns\":{\"_0\":\"The equivalent amount of stETH.\"}},\"getWstETHByStETH(uint256)\":{\"params\":{\"stETHAmount\":\"The amount of stETH.\"},\"returns\":{\"_0\":\"The equivalent amount of wstETH.\"}},\"totalSupply()\":{\"details\":\"Returns the value of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"title\":\"IWstETH\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getStETHByWstETH(uint256)\":{\"notice\":\"Returns the amount of stETH for a given amount of wstETH.\"},\"getWstETHByStETH(uint256)\":{\"notice\":\"Returns the amount of wstETH for a given amount of stETH.\"},\"unwrap(uint256)\":{\"notice\":\"Unwraps wstETH to stETH.\"},\"wrap(uint256)\":{\"notice\":\"Wraps stETH to wstETH.\"}},\"notice\":\"Minimal interface for Lido's wstETH.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/interfaces/external/IWstETH.sol\":\"IWstETH\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":@arbitrum/=node_modules/@arbitrum/\",\":@chainlink/=node_modules/@chainlink/\",\":@eth-optimism/=node_modules/@eth-optimism/\",\":@offchainlabs/=node_modules/@offchainlabs/\",\":@openzeppelin/=node_modules/@openzeppelin/\",\":@prb/=node_modules/@prb/\",\":@sablier/=node_modules/@sablier/\",\":@scroll-tech/=node_modules/@scroll-tech/\",\":@zksync/=node_modules/@zksync/\",\":forge-std/=node_modules/forge-std/\"],\"viaIR\":true},\"sources\":{\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"src/interfaces/external/IWstETH.sol\":{\"keccak256\":\"0x11b1260f6632c1211e375b357b6917601ea3892297b9a95a94ad85fbbedf6dfb\",\"license\":\"GPL-3.0-or-later\",\"urls\":[\"bzz-raw://b50753a61e6f0181f04a91a945e284ee88d8132eabf8beee90d0e9ad04e5974d\",\"dweb:/ipfs/QmWwbjyS7Z43K5QK2XjpnDuthzy12kcVSwBVxycwRP7Mqi\"]}},\"version\":1}",
122
+ "metadata": {
123
+ "compiler": { "version": "0.8.29+commit.ab55807c" },
124
+ "language": "Solidity",
125
+ "output": {
126
+ "abi": [
127
+ {
128
+ "inputs": [
129
+ { "internalType": "address", "name": "owner", "type": "address", "indexed": true },
130
+ { "internalType": "address", "name": "spender", "type": "address", "indexed": true },
131
+ { "internalType": "uint256", "name": "value", "type": "uint256", "indexed": false }
132
+ ],
133
+ "type": "event",
134
+ "name": "Approval",
135
+ "anonymous": false
136
+ },
137
+ {
138
+ "inputs": [
139
+ { "internalType": "address", "name": "from", "type": "address", "indexed": true },
140
+ { "internalType": "address", "name": "to", "type": "address", "indexed": true },
141
+ { "internalType": "uint256", "name": "value", "type": "uint256", "indexed": false }
142
+ ],
143
+ "type": "event",
144
+ "name": "Transfer",
145
+ "anonymous": false
146
+ },
147
+ {
148
+ "inputs": [
149
+ { "internalType": "address", "name": "owner", "type": "address" },
150
+ { "internalType": "address", "name": "spender", "type": "address" }
151
+ ],
152
+ "stateMutability": "view",
153
+ "type": "function",
154
+ "name": "allowance",
155
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
156
+ },
157
+ {
158
+ "inputs": [
159
+ { "internalType": "address", "name": "spender", "type": "address" },
160
+ { "internalType": "uint256", "name": "value", "type": "uint256" }
161
+ ],
162
+ "stateMutability": "nonpayable",
163
+ "type": "function",
164
+ "name": "approve",
165
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
166
+ },
167
+ {
168
+ "inputs": [{ "internalType": "address", "name": "account", "type": "address" }],
169
+ "stateMutability": "view",
170
+ "type": "function",
171
+ "name": "balanceOf",
172
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
173
+ },
174
+ {
175
+ "inputs": [{ "internalType": "uint256", "name": "wstETHAmount", "type": "uint256" }],
176
+ "stateMutability": "view",
177
+ "type": "function",
178
+ "name": "getStETHByWstETH",
179
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
180
+ },
181
+ {
182
+ "inputs": [{ "internalType": "uint256", "name": "stETHAmount", "type": "uint256" }],
183
+ "stateMutability": "view",
184
+ "type": "function",
185
+ "name": "getWstETHByStETH",
186
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
187
+ },
188
+ {
189
+ "inputs": [],
190
+ "stateMutability": "view",
191
+ "type": "function",
192
+ "name": "totalSupply",
193
+ "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }]
194
+ },
195
+ {
196
+ "inputs": [
197
+ { "internalType": "address", "name": "to", "type": "address" },
198
+ { "internalType": "uint256", "name": "value", "type": "uint256" }
199
+ ],
200
+ "stateMutability": "nonpayable",
201
+ "type": "function",
202
+ "name": "transfer",
203
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
204
+ },
205
+ {
206
+ "inputs": [
207
+ { "internalType": "address", "name": "from", "type": "address" },
208
+ { "internalType": "address", "name": "to", "type": "address" },
209
+ { "internalType": "uint256", "name": "value", "type": "uint256" }
210
+ ],
211
+ "stateMutability": "nonpayable",
212
+ "type": "function",
213
+ "name": "transferFrom",
214
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }]
215
+ },
216
+ {
217
+ "inputs": [{ "internalType": "uint256", "name": "wstETHAmount", "type": "uint256" }],
218
+ "stateMutability": "nonpayable",
219
+ "type": "function",
220
+ "name": "unwrap",
221
+ "outputs": [{ "internalType": "uint256", "name": "stETHAmount", "type": "uint256" }]
222
+ },
223
+ {
224
+ "inputs": [{ "internalType": "uint256", "name": "stETHAmount", "type": "uint256" }],
225
+ "stateMutability": "nonpayable",
226
+ "type": "function",
227
+ "name": "wrap",
228
+ "outputs": [{ "internalType": "uint256", "name": "wstETHAmount", "type": "uint256" }]
229
+ }
230
+ ],
231
+ "devdoc": {
232
+ "kind": "dev",
233
+ "methods": {
234
+ "allowance(address,address)": {
235
+ "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."
236
+ },
237
+ "approve(address,uint256)": {
238
+ "details": "Sets a `value` amount of tokens as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."
239
+ },
240
+ "balanceOf(address)": { "details": "Returns the value of tokens owned by `account`." },
241
+ "getStETHByWstETH(uint256)": {
242
+ "params": { "wstETHAmount": "The amount of wstETH." },
243
+ "returns": { "_0": "The equivalent amount of stETH." }
244
+ },
245
+ "getWstETHByStETH(uint256)": {
246
+ "params": { "stETHAmount": "The amount of stETH." },
247
+ "returns": { "_0": "The equivalent amount of wstETH." }
248
+ },
249
+ "totalSupply()": { "details": "Returns the value of tokens in existence." },
250
+ "transfer(address,uint256)": {
251
+ "details": "Moves a `value` amount of tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
252
+ },
253
+ "transferFrom(address,address,uint256)": {
254
+ "details": "Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism. `value` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
255
+ }
256
+ },
257
+ "version": 1
258
+ },
259
+ "userdoc": {
260
+ "kind": "user",
261
+ "methods": {
262
+ "getStETHByWstETH(uint256)": { "notice": "Returns the amount of stETH for a given amount of wstETH." },
263
+ "getWstETHByStETH(uint256)": { "notice": "Returns the amount of wstETH for a given amount of stETH." },
264
+ "unwrap(uint256)": { "notice": "Unwraps wstETH to stETH." },
265
+ "wrap(uint256)": { "notice": "Wraps stETH to wstETH." }
266
+ },
267
+ "version": 1
268
+ }
269
+ },
270
+ "settings": {
271
+ "remappings": [
272
+ "@arbitrum/=node_modules/@arbitrum/",
273
+ "@chainlink/=node_modules/@chainlink/",
274
+ "@eth-optimism/=node_modules/@eth-optimism/",
275
+ "@offchainlabs/=node_modules/@offchainlabs/",
276
+ "@openzeppelin/=node_modules/@openzeppelin/",
277
+ "@prb/=node_modules/@prb/",
278
+ "@sablier/=node_modules/@sablier/",
279
+ "@scroll-tech/=node_modules/@scroll-tech/",
280
+ "@zksync/=node_modules/@zksync/",
281
+ "forge-std/=node_modules/forge-std/"
282
+ ],
283
+ "optimizer": { "enabled": true, "runs": 1000000 },
284
+ "metadata": { "bytecodeHash": "ipfs" },
285
+ "compilationTarget": { "src/interfaces/external/IWstETH.sol": "IWstETH" },
286
+ "evmVersion": "shanghai",
287
+ "libraries": {},
288
+ "viaIR": true
289
+ },
290
+ "sources": {
291
+ "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": {
292
+ "keccak256": "0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7",
293
+ "urls": [
294
+ "bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db",
295
+ "dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"
296
+ ],
297
+ "license": "MIT"
298
+ },
299
+ "src/interfaces/external/IWstETH.sol": {
300
+ "keccak256": "0x11b1260f6632c1211e375b357b6917601ea3892297b9a95a94ad85fbbedf6dfb",
301
+ "urls": [
302
+ "bzz-raw://b50753a61e6f0181f04a91a945e284ee88d8132eabf8beee90d0e9ad04e5974d",
303
+ "dweb:/ipfs/QmWwbjyS7Z43K5QK2XjpnDuthzy12kcVSwBVxycwRP7Mqi"
304
+ ],
305
+ "license": "GPL-3.0-or-later"
306
+ }
307
+ },
308
+ "version": 1
309
+ },
310
+ "id": 97
311
+ }