FTM Price: $1.01 (+0.07%)
Gas: 220 GWei

Contract

0xAF8E832C507BbcB6debF4177F4378461C552639A
 

Overview

FTM Balance

Fantom LogoFantom LogoFantom Logo0 FTM

FTM Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
0x60206108220424822021-11-14 16:39:55865 days ago1636907995IN
 Create: Vyper_contract
0 FTM0.05989586109.5415

Latest 1 internal transaction

Parent Txn Hash Block From To Value
220424822021-11-14 16:39:55865 days ago1636907995  Contract Creation0 FTM
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.3.0

Optimization Enabled:
N/A

Other Settings:
MIT license

Contract Source Code (Vyper language format)

# @version 0.3.0
"""
@title cToken Burner
@notice Converts cToken lending coins to USDT
"""

from vyper.interfaces import ERC20


interface LendingPool:
    def withdraw(_underlying_asset: address, _amount: uint256, _receiver: address): nonpayable

interface cERC20:
    def redeem(redeemTokens: uint256) -> uint256: nonpayable
    def underlying() -> address: view

interface RegistrySwap:
    def exchange_with_best_rate(
        _from: address,
        _to: address,
        _amount: uint256,
        _expected: uint256,
        _receiver: address,
    ) -> uint256: payable

interface AddressProvider:
    def get_address(_id: uint256) -> address: view


receiver: public(address)
is_killed: public(bool)

owner: public(address)
future_owner: public(address)

is_approved: HashMap[address, HashMap[address, bool]]

ADDRESS_PROVIDER: constant(address) = 0x0000000022D53366457F9d5E68Ec105046FC4383
USDT: constant(address) = 0x049d68029688eAbF473097a2fC38ef61633A3C7A


@external
def __init__(_receiver: address, _owner: address):
    """
    @notice Contract constructor
    @param _receiver Address that converted tokens are transferred to.
                     Should be set to the `ChildBurner` deployment.
    @param _owner Owner address. Can kill the contract and recover tokens.
    """
    self.receiver = _receiver
    self.owner = _owner


@external
def burn(_coin: address) -> bool:
    """
    @notice Unwrap `_coin` and transfer to the underlying burner
    @param _coin Address of the coin being unwrapped
    @return bool success
    """
    assert not self.is_killed  # dev: is killed

    # transfer coins from caller
    amount: uint256 = ERC20(_coin).balanceOf(msg.sender)
    if amount != 0:
        ERC20(_coin).transferFrom(msg.sender, self, amount)

    # get actual balance in case of transfer fee or pre-existing balance
    amount = ERC20(_coin).balanceOf(self)


    # unwrap cTokens for underlying asset
    assert cERC20(_coin).redeem(amount) == 0
    underlying: address = cERC20(_coin).underlying()
    amount = ERC20(underlying).balanceOf(self)

    if underlying == USDT:
        response: Bytes[32] = raw_call(
            underlying,
            _abi_encode(self.receiver, amount, method_id=method_id("transfer(address,uint256)")),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)
    else:
        registry_swap: address = AddressProvider(ADDRESS_PROVIDER).get_address(2)
        if not self.is_approved[registry_swap][underlying]:
            response: Bytes[32] = raw_call(
                underlying,
                _abi_encode(registry_swap, MAX_UINT256, method_id=method_id("approve(address,uint256)")),
                max_outsize=32,
            )
            if len(response) != 0:
                assert convert(response, bool)
            self.is_approved[registry_swap][underlying] = True

        RegistrySwap(registry_swap).exchange_with_best_rate(underlying, USDT, amount, 0, self.receiver)



    # transfer underlying to underlying burner
    response: Bytes[32] = raw_call(
        underlying,
        concat(
            method_id("transfer(address,uint256)"),
            convert(self.receiver, bytes32),
            convert(amount, bytes32),
        ),
        max_outsize=32,
    )
    if len(response) != 0:
        assert convert(response, bool)

    return True


@external
def recover_balance(_coin: address) -> bool:
    """
    @notice Recover ERC20 tokens from this contract
    @param _coin Token address
    @return bool success
    """
    assert msg.sender == self.owner  # dev: only owner

    amount: uint256 = ERC20(_coin).balanceOf(self)
    response: Bytes[32] = raw_call(
        _coin,
        _abi_encode(msg.sender, amount, method_id=method_id("transfer(address,uint256)")),
        max_outsize=32,
    )
    if len(response) != 0:
        assert convert(response, bool)

    return True


@external
def set_receiver(_receiver: address):
    assert msg.sender == self.owner
    self.receiver = _receiver


@external
def set_killed(_is_killed: bool) -> bool:
    """
    @notice Set killed status for this contract
    @dev When killed, the `burn` function cannot be called
    @param _is_killed Killed status
    @return bool success
    """
    assert msg.sender == self.owner  # dev: only owner
    self.is_killed = _is_killed

    return True


@external
def commit_transfer_ownership(_future_owner: address) -> bool:
    """
    @notice Commit a transfer of ownership
    @dev Must be accepted by the new owner via `accept_transfer_ownership`
    @param _future_owner New owner address
    @return bool success
    """
    assert msg.sender == self.owner  # dev: only owner
    self.future_owner = _future_owner

    return True


@external
def accept_transfer_ownership() -> bool:
    """
    @notice Accept a transfer of ownership
    @return bool success
    """
    assert msg.sender == self.future_owner  # dev: only owner
    self.owner = msg.sender

    return True

Contract Security Audit

Contract ABI

[{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_receiver","type":"address"},{"name":"_owner","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"burn","inputs":[{"name":"_coin","type":"address"}],"outputs":[{"name":"","type":"bool"}],"gas":81377},{"stateMutability":"nonpayable","type":"function","name":"recover_balance","inputs":[{"name":"_coin","type":"address"}],"outputs":[{"name":"","type":"bool"}],"gas":12531},{"stateMutability":"nonpayable","type":"function","name":"set_receiver","inputs":[{"name":"_receiver","type":"address"}],"outputs":[],"gas":37702},{"stateMutability":"nonpayable","type":"function","name":"set_killed","inputs":[{"name":"_is_killed","type":"bool"}],"outputs":[{"name":"","type":"bool"}],"gas":37875},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_future_owner","type":"address"}],"outputs":[{"name":"","type":"bool"}],"gas":37905},{"stateMutability":"nonpayable","type":"function","name":"accept_transfer_ownership","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":37774},{"stateMutability":"view","type":"function","name":"receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2706},{"stateMutability":"view","type":"function","name":"is_killed","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":2736},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2766},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2796}]

602061087960c03960c0518060a01c6108745780905061014052602060206108790160c03960c0518060a01c6108745780905061016052610140516000556101605160025561085c56600436101561000d57610808565b60046000601c376000513461080e576389afcb4481141561059d576004358060a01c61080e578090506101405260015461080e576370a0823161018052336101a0526020610180602461019c610140515afa1561080e57601f3d111561080e57610180516101605260006101605118156100c1576323b872dd61018052336101a052306101c052610160516101e0526020610180606461019c6000610140515af11561080e57601f3d111561080e57610180505b6370a0823161018052306101a0526020610180602461019c610140515afa1561080e57601f3d111561080e57610180516101605263db006a7561018052610160516101a0526020610180602461019c6000610140515af11561080e57601f3d111561080e576101805161080e57636f307dc36101a05260206101a060046101bc610140515afa1561080e57601f3d111561080e576101a0518060a01c61080e57809050610180526370a082316101a052306101c05260206101a060246101bc610180515afa1561080e57601f3d111561080e576101a0516101605273049d68029688eabf473097a2fc38ef61633a3c7a61018051141561028a5763a9059cbb6101e45260046000546102045261016051610224526040016101e0526101e08051602001806102608284600060045af11561080e5750506020610300610260516102806000610180515af11561080e5760203d808211156102215780610223565b815b905090506102e0526102e08051602001806101a08284600060045af11561080e57505060006101a0511815610285576101a0806020015160008251806020901361080e578091901261080e57806020036101000a82049050905090501561080e575b61046c565b63493f4f746101c05260026101e05260206101c060246101dc6f22d53366457f9d5e68ec105046fc43835afa1561080e57601f3d111561080e576101c0518060a01c61080e578090506101a05260046101a05160e05260c052604060c0206101805160e05260c052604060c020546104085763095ea7b36102045260046101a051610224527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61024452604001610200526102008051602001806102808284600060045af11561080e5750506020610320610280516102a06000610180515af11561080e5760203d808211156103805780610382565b815b90509050610300526103008051602001806101c08284600060045af11561080e57505060006101c05118156103e4576101c0806020015160008251806020901361080e578091901261080e57806020036101000a82049050905090501561080e575b600160046101a05160e05260c052604060c0206101805160e05260c052604060c020555b639f69a6a66101c052610180516101e05273049d68029688eabf473097a2fc38ef61633a3c7a6102005261016051610220526000610240526000546102605260206101c060a46101dc60006101a0515af11561080e57601f3d111561080e576101c0505b600060046101e0527fa9059cbb00000000000000000000000000000000000000000000000000000000610200526101e060048060208461022001018260208501600060045af150508051820191505060005460208261022001015260208101905061016051602082610220010152602081019050806102205261022090508051602001806102a08284600060045af11561080e57505060206103406102a0516102c06000610180515af11561080e5760203d8082111561052c578061052e565b815b90509050610320526103208051602001806101a08284600060045af11561080e57505060006101a0511815610590576101a0806020015160008251806020901361080e578091901261080e57806020036101000a82049050905090501561080e575b60016101e05260206101e0f35b63db2f5f798114156106ce576004358060a01c61080e578090506101405260025433141561080e576370a0823161018052306101a0526020610180602461019c610140515afa1561080e57601f3d111561080e57610180516101605263a9059cbb6101c4526004336101e45261016051610204526040016101c0526101c08051602001806102408284600060045af11561080e57505060206102e0610240516102606000610140515af11561080e5760203d8082111561065d578061065f565b815b905090506102c0526102c08051602001806101808284600060045af11561080e57505060006101805118156106c157610180806020015160008251806020901361080e578091901261080e57806020036101000a82049050905090501561080e575b60016101c05260206101c0f35b63d1dd6f568114156106ff576004358060a01c61080e578090506101405260025433141561080e5761014051600055005b6390b2299781141561073b576004358060011c61080e578090506101405260025433141561080e57610140516001556001610160526020610160f35b636b441a40811415610777576004358060a01c61080e578090506101405260025433141561080e57610140516003556001610160526020610160f35b63e5ea47b881141561079e5760035433141561080e57336002556001610140526020610140f35b63f7260d3e8114156107b857600054610140526020610140f35b639c868ac08114156107d257600154610140526020610140f35b638da5cb5b8114156107ec57600254610140526020610140f35b631ec0cdc181141561080657600354610140526020610140f35b505b60006000fd5b600080fd5b61004961085c0361004960003961004961085c036000f35b600080fd000000000000000000000000ffbacce0cc7c19d46132f1258fc16cf6871d153c0000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a

Deployed Bytecode

0x600436101561000d57610808565b60046000601c376000513461080e576389afcb4481141561059d576004358060a01c61080e578090506101405260015461080e576370a0823161018052336101a0526020610180602461019c610140515afa1561080e57601f3d111561080e57610180516101605260006101605118156100c1576323b872dd61018052336101a052306101c052610160516101e0526020610180606461019c6000610140515af11561080e57601f3d111561080e57610180505b6370a0823161018052306101a0526020610180602461019c610140515afa1561080e57601f3d111561080e57610180516101605263db006a7561018052610160516101a0526020610180602461019c6000610140515af11561080e57601f3d111561080e576101805161080e57636f307dc36101a05260206101a060046101bc610140515afa1561080e57601f3d111561080e576101a0518060a01c61080e57809050610180526370a082316101a052306101c05260206101a060246101bc610180515afa1561080e57601f3d111561080e576101a0516101605273049d68029688eabf473097a2fc38ef61633a3c7a61018051141561028a5763a9059cbb6101e45260046000546102045261016051610224526040016101e0526101e08051602001806102608284600060045af11561080e5750506020610300610260516102806000610180515af11561080e5760203d808211156102215780610223565b815b905090506102e0526102e08051602001806101a08284600060045af11561080e57505060006101a0511815610285576101a0806020015160008251806020901361080e578091901261080e57806020036101000a82049050905090501561080e575b61046c565b63493f4f746101c05260026101e05260206101c060246101dc6f22d53366457f9d5e68ec105046fc43835afa1561080e57601f3d111561080e576101c0518060a01c61080e578090506101a05260046101a05160e05260c052604060c0206101805160e05260c052604060c020546104085763095ea7b36102045260046101a051610224527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61024452604001610200526102008051602001806102808284600060045af11561080e5750506020610320610280516102a06000610180515af11561080e5760203d808211156103805780610382565b815b90509050610300526103008051602001806101c08284600060045af11561080e57505060006101c05118156103e4576101c0806020015160008251806020901361080e578091901261080e57806020036101000a82049050905090501561080e575b600160046101a05160e05260c052604060c0206101805160e05260c052604060c020555b639f69a6a66101c052610180516101e05273049d68029688eabf473097a2fc38ef61633a3c7a6102005261016051610220526000610240526000546102605260206101c060a46101dc60006101a0515af11561080e57601f3d111561080e576101c0505b600060046101e0527fa9059cbb00000000000000000000000000000000000000000000000000000000610200526101e060048060208461022001018260208501600060045af150508051820191505060005460208261022001015260208101905061016051602082610220010152602081019050806102205261022090508051602001806102a08284600060045af11561080e57505060206103406102a0516102c06000610180515af11561080e5760203d8082111561052c578061052e565b815b90509050610320526103208051602001806101a08284600060045af11561080e57505060006101a0511815610590576101a0806020015160008251806020901361080e578091901261080e57806020036101000a82049050905090501561080e575b60016101e05260206101e0f35b63db2f5f798114156106ce576004358060a01c61080e578090506101405260025433141561080e576370a0823161018052306101a0526020610180602461019c610140515afa1561080e57601f3d111561080e57610180516101605263a9059cbb6101c4526004336101e45261016051610204526040016101c0526101c08051602001806102408284600060045af11561080e57505060206102e0610240516102606000610140515af11561080e5760203d8082111561065d578061065f565b815b905090506102c0526102c08051602001806101808284600060045af11561080e57505060006101805118156106c157610180806020015160008251806020901361080e578091901261080e57806020036101000a82049050905090501561080e575b60016101c05260206101c0f35b63d1dd6f568114156106ff576004358060a01c61080e578090506101405260025433141561080e5761014051600055005b6390b2299781141561073b576004358060011c61080e578090506101405260025433141561080e57610140516001556001610160526020610160f35b636b441a40811415610777576004358060a01c61080e578090506101405260025433141561080e57610140516003556001610160526020610160f35b63e5ea47b881141561079e5760035433141561080e57336002556001610140526020610140f35b63f7260d3e8114156107b857600054610140526020610140f35b639c868ac08114156107d257600154610140526020610140f35b638da5cb5b8114156107ec57600254610140526020610140f35b631ec0cdc181141561080657600354610140526020610140f35b505b60006000fd5b600080fd

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000ffbacce0cc7c19d46132f1258fc16cf6871d153c0000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a

-----Decoded View---------------
Arg [0] : _receiver (address): 0xffbACcE0CC7C19d46132f1258FC16CF6871D153c
Arg [1] : _owner (address): 0x7EeAC6CDdbd1D0B8aF061742D41877D7F707289a

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ffbacce0cc7c19d46132f1258fc16cf6871d153c
Arg [1] : 0000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a


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

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ 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.