Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x61216051 | 18261793 | 392 days ago | IN | 0 ETH | 0.03136441 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xF113929F...7196Aa34C The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
crvUSD deleverage zap
Compiler Version
vyper:0.3.9
Contract Source Code (Vyper language format)
# @version 0.3.9 """ @title crvUSD deleverage zap @author Curve.Fi @license Copyright (c) Curve.Fi, 2020-2023 - all rights reserved """ interface ERC20: def balanceOf(_for: address) -> uint256: view def approve(_spender: address, _value: uint256) -> bool: nonpayable def decimals() -> uint256: view interface Router: def exchange(_route: address[11], _swap_params: uint256[5][5], _amount: uint256, _expected: uint256, _pools: address[5]) -> uint256: payable def get_dy(_route: address[11], _swap_params: uint256[5][5], _amount: uint256, _pools: address[5]) -> uint256: view interface Controller: def calculate_debt_n1(collateral: uint256, debt: uint256, N: uint256) -> int256: view def user_state(user: address) -> uint256[4]: view CRVUSD: constant(address) = 0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E CONTROLLER: public(immutable(address)) COLLATERAL: public(immutable(address)) ROUTER: public(immutable(address)) routes: public(HashMap[uint256, address[11]]) route_params: public(HashMap[uint256, uint256[5][5]]) route_pools: public(HashMap[uint256, address[5]]) route_names: public(HashMap[uint256, String[100]]) routes_count: public(constant(uint256)) = 5 @external def __init__( _controller: address, _collateral: address, _router: address, _routes: DynArray[address[11], 5], _route_params: DynArray[uint256[5][5], 5], _route_pools: DynArray[address[5], 5], _route_names: DynArray[String[100], 5], ): CONTROLLER = _controller COLLATERAL = _collateral ROUTER = _router for i in range(5): self.routes[i] = _routes[i] self.route_params[i] = _route_params[i] self.route_pools[i] = _route_pools[i] self.route_names[i] = _route_names[i] ERC20(_collateral).approve(_router, max_value(uint256), default_return_value=True) ERC20(_collateral).approve(_controller, max_value(uint256), default_return_value=True) ERC20(CRVUSD).approve(_controller, max_value(uint256), default_return_value=True) @view @external def get_stablecoins(collateral: uint256, route_idx: uint256) -> uint256: return Router(ROUTER).get_dy(self.routes[route_idx], self.route_params[route_idx], collateral, self.route_pools[route_idx]) @external @view def calculate_debt_n1(collateral: uint256, route_idx: uint256, user: address) -> int256: """ @notice Calculate the upper band number after deleverage repay, which means that collateral from user's position is converted to stablecoins to repay the debt. @param collateral Amount of collateral (at its native precision). @param route_idx Index of the route which should be use for exchange stablecoin to collateral. @return Upper band n1 (n1 <= n2) to deposit into. Signed integer. """ deleverage_collateral: uint256 = Router(ROUTER).get_dy(self.routes[route_idx], self.route_params[route_idx], collateral, self.route_pools[route_idx]) state: uint256[4] = Controller(CONTROLLER).user_state(user) #collateral, stablecoin, debt, N assert state[1] == 0, "Underwater, only full repayment is allowed" assert deleverage_collateral < state[2], "Full repayment, position will be closed" return Controller(CONTROLLER).calculate_debt_n1(state[0] - collateral, state[2] - deleverage_collateral, state[3]) @external @nonreentrant('lock') def callback_repay(user: address, stablecoins: uint256, collateral: uint256, debt: uint256, callback_args: DynArray[uint256, 5]) -> uint256[2]: """ @notice Callback method which should be called by controller to repay by selling collateral @param user Address of the user @param stablecoins Amount of user's stablecoin in AMM @param collateral Amount of user's collateral in AMM @param debt Current debt amount @param callback_args [route_idx, collateral_amount, min_recv] return [deleverage_stablecoins, (collateral - collateral_amount)], deleverage_stablecoins is the amount of stablecoins got as a result of selling collateral """ assert msg.sender == CONTROLLER route_idx: uint256 = callback_args[0] collateral_amount: uint256 = callback_args[1] min_recv: uint256 = callback_args[2] deleverage_stablecoins: uint256 = Router(ROUTER).exchange(self.routes[route_idx], self.route_params[route_idx], collateral_amount, min_recv, self.route_pools[route_idx]) return [deleverage_stablecoins, ERC20(COLLATERAL).balanceOf(self)]
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_controller","type":"address"},{"name":"_collateral","type":"address"},{"name":"_router","type":"address"},{"name":"_routes","type":"address[11][]"},{"name":"_route_params","type":"uint256[5][5][]"},{"name":"_route_pools","type":"address[5][]"},{"name":"_route_names","type":"string[]"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"get_stablecoins","inputs":[{"name":"collateral","type":"uint256"},{"name":"route_idx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calculate_debt_n1","inputs":[{"name":"collateral","type":"uint256"},{"name":"route_idx","type":"uint256"},{"name":"user","type":"address"}],"outputs":[{"name":"","type":"int256"}]},{"stateMutability":"nonpayable","type":"function","name":"callback_repay","inputs":[{"name":"user","type":"address"},{"name":"stablecoins","type":"uint256"},{"name":"collateral","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"callback_args","type":"uint256[]"}],"outputs":[{"name":"","type":"uint256[2]"}]},{"stateMutability":"view","type":"function","name":"CONTROLLER","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"COLLATERAL","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"ROUTER","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"routes","inputs":[{"name":"arg0","type":"uint256"},{"name":"arg1","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"route_params","inputs":[{"name":"arg0","type":"uint256"},{"name":"arg1","type":"uint256"},{"name":"arg2","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"route_pools","inputs":[{"name":"arg0","type":"uint256"},{"name":"arg1","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"route_names","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"routes_count","inputs":[],"outputs":[{"name":"","type":"uint256"}]}]
Deployed Bytecode
0x6003361161000c57610a9b565b5f3560e01c34610a9f5763ee0fc1218118610033576020610ab05f395f5160405260206040f35b6324bbab8b8118610050576020610ad05f395f5160405260206040f35b6332fe7b26811861006d576020610af05f395f5160405260206040f35b634a17588c81186100a75760443610610a9f5760016004356020525f5260405f20602435600a8111610a9f57810190505460405260206040f35b63c2ab304481186100f35760643610610a9f5760026004356020525f5260405f20600560243560048111610a9f57028101905060443560048111610a9f57810190505460405260206040f35b63cd4e6c24811861012d5760443610610a9f5760036004356020525f5260405f2060243560048111610a9f57810190505460405260206040f35b631dcfe05e81186101c35760243610610a9f5760208060405260046004356020525f5260405f2081604001815460018301602083015f83601f0160051c60048111610a9f57801561019057905b808401548160051b84015260010181811861017a575b50505050808252508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506040f35b639841575881186101d957600560405260206040f35b63b01a3d5081186103c45760443610610a9f5760206020610af05f395f5163637653cb60405260016024356020525f5260405f2080546060526001810154608052600281015460a052600381015460c052600481015460e052600581015461010052600681015461012052600781015461014052600881015461016052600981015461018052600a8101546101a0525060026024356020525f5260405f2080546101c05260018101546101e0526002810154610200526003810154610220526004810154610240526005810180546102605260018101546102805260028101546102a05260038101546102c05260048101546102e05250600a810180546103005260018101546103205260028101546103405260038101546103605260048101546103805250600f810180546103a05260018101546103c05260028101546103e052600381015461040052600481015461042052506014810180546104405260018101546104605260028101546104805260038101546104a05260048101546104c05250506004356104e05260036024356020525f5260405f208054610500526001810154610520526002810154610540526003810154610560526004810154610580525060206040610544605c845afa6103b6573d5f5f3e3d5ffd5b60203d10610a9f5760409050f35b6324085f1e81186107b05760643610610a9f576044358060a01c610a9f576040526020610af05f395f5163637653cb60805260016024356020525f5260405f20805460a052600181015460c052600281015460e05260038101546101005260048101546101205260058101546101405260068101546101605260078101546101805260088101546101a05260098101546101c052600a8101546101e0525060026024356020525f5260405f208054610200526001810154610220526002810154610240526003810154610260526004810154610280526005810180546102a05260018101546102c05260028101546102e05260038101546103005260048101546103205250600a810180546103405260018101546103605260028101546103805260038101546103a05260048101546103c05250600f810180546103e052600181015461040052600281015461042052600381015461044052600481015461046052506014810180546104805260018101546104a05260028101546104c05260038101546104e05260048101546105005250506004356105205260036024356020525f5260405f2080546105405260018101546105605260028101546105805260038101546105a05260048101546105c0525060206080610544609c845afa6105af573d5f5f3e3d5ffd5b60203d10610a9f5760809050516060526020610ab05f395f5163ec74d0a861010052604051610120526080610100602461011c845afa6105f1573d5f5f3e3d5ffd5b60803d10610a9f5761010090508051608052602081015160a052604081015160c052606081015160e0525060a051156106ab57602a610100527f556e64657277617465722c206f6e6c792066756c6c2072657061796d656e7420610120527f697320616c6c6f776564000000000000000000000000000000000000000000006101405261010050610100518061012001601f825f031636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b60c0516060511061073d576027610100527f46756c6c2072657061796d656e742c20706f736974696f6e2077696c6c206265610120527f20636c6f736564000000000000000000000000000000000000000000000000006101405261010050610100518061012001601f825f031636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5b60206020610ab05f395f5163720fb25461010052608051600435808203828111610a9f57905090506101205260c051606051808203828111610a9f57905090506101405260e051610160526020610100606461011c845afa6107a1573d5f5f3e3d5ffd5b60203d10610a9f576101009050f35b63ef67dc748118610a995760c43610610a9f576004358060a01c610a9f576040526084356004016005813511610a9f578035602082018160051b808260803750508060605250505f54600214610a9f5760025f556020610ab05f395f513318610a9f5760605115610a9f575f60051b6080015161012052600260605110610a9f57600160051b6080015161014052600360605110610a9f57600260051b60800151610160526020610af05f395f51635c9c18e26101a0526001610120516020525f5260405f2080546101c05260018101546101e05260028101546102005260038101546102205260048101546102405260058101546102605260068101546102805260078101546102a05260088101546102c05260098101546102e052600a81015461030052506002610120516020525f5260405f2080546103205260018101546103405260028101546103605260038101546103805260048101546103a0526005810180546103c05260018101546103e05260028101546104005260038101546104205260048101546104405250600a810180546104605260018101546104805260028101546104a05260038101546104c05260048101546104e05250600f8101805461050052600181015461052052600281015461054052600381015461056052600481015461058052506014810180546105a05260018101546105c05260028101546105e0526003810154610600526004810154610620525050610140516106405261016051610660526003610120516020525f5260405f2080546106805260018101546106a05260028101546106c05260038101546106e0526004810154610700525060206101a06105646101bc5f855af1610a32573d5f5f3e3d5ffd5b60203d10610a9f576101a090505161018052610180516101e0526020610ad05f395f516370a082316101a052306101c05260206101a060246101bc845afa610a7c573d5f5f3e3d5ffd5b60203d10610a9f576101a09050516102005260406101e060035f55f35b505b5f5ffd5b5f80fda165767970657283000309000b000000000000000000000000a920de414ea4ab66b97da1bfe9e6eca7d4219635000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000f0d4c12a5768d806021f80a262b4d39d26c58b8d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.