ETH Price: $2,567.85 (+2.50%)
Gas: 7.83 Gwei

Contract

0x9bE82CdDB5c266E010C97e4B1B5B2DF53C16384d
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x61216051182617932023-10-02 8:56:35392 days ago1696236995IN
 Contract Creation
0 ETH0.031364419.75945509

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

Optimization Enabled:
N/A

Other Settings:
None license

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

Contract ABI

[{"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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.