Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x88778F0Afb23A8c970d170ecEf7cc54e23918472
Balance 0 ETH
Nonce 1
Code Size 4935 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

4935 bytes
0x5f3560e01c6002601b820660011b6112f101601e395f51565b6361d027b3811861003657346112ed57602061132760403960206040f35b63d34aec238118611209576044361034176112ed576024358060011c6112ed576060525f5433186112ed5760065460405261007160a061120d565b60a0516080526004351561008c57608051600435111561008e565b5f5b156112ed5760076004358060081c90506020525f5260405f205460a052600160043560ff811690501b60c0526060516100d15760c0511960a0511660a0526100dc565b60c05160a0511760a0525b60a05160076004358060081c90506020525f5260405f20556004357f5cc7a340f7950e5da236ab12977fda19fa1b4947411992be42df339da25770b760605160e052602060e0a200611209565b6388a8d602811861014457346112ed575f5460405260206040f35b6320d763818118611209576024361034176112ed576004358060a01c6112ed576040527311111111111111111111111111111111111111116040511461019a5760056040516020525f5260405f2054151561019c565b5f5b60605260206060f3611209565b63770817ec811861120957346112ed5760015460405260206040f3611209565b63570ca735811861120957346112ed5760025460405260206040f3611209565b63a411a59d811861020557346112ed5760035460405260206040f35b6386f890558118611209576044361034176112ed576004358060a01c6112ed576040526024358060a01c6112ed576060525f5433186112ed57604051156112ed5760056040516020525f5260405f20546112ed5760056060516020525f5260405f2054608052608051156112ed5760045460a052603f60a051116112ed5760a051600181018181106112ed57905060045560405160056060516020525f5260405f205560805160056040516020525f5260405f20556040517f35048ea94bd1fdcfae4ba1111bc30a3f804061808deba1783b46c3926635f52860605160c052602060c0a200611209565b6366c7ffd6811861030b57346112ed5760045460405260206040f35b6378860fea81186103f1576044361034176112ed576004358060a01c6112ed576040526024358060a01c6112ed576060525f5433186112ed57731111111111111111111111111111111111111111604051146112ed5760056040516020525f5260405f2054608052608051156112ed5760405160056060516020525f5260405f2054186112ed57600454600181038181116112ed57905060045560805160056060516020525f5260405f20555f60056040516020525f5260405f20556040517f0a6e596c177d9b5e39257453142334cb9ec82513528306cef2fed81de46278055f60a0a2005b6330c7be728118611209576024361034176112ed576004358060a01c6112ed576040525f5433186112ed576040516002556040517fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee5f6060a200611209565b63504007a2811861048b576024361034176112ed576004358060a01c6112ed5760405260056040516020525f5260405f205460605260206060f35b63e5b5b4208118611209576044361034176112ed576004358060a01c6112ed57610120526024358060a01c6112ed57610140526005336020525f5260405f2054156104d75760016104de565b6002543318155b156112ed57604061012060605e6104f661018061125f565b61018051610160526101605161061c576040366101803760065460405261051e6101c061120d565b6101c080516101805260208101516101a052506101a051156112ed576101805160405261054c6101c0611236565b6101c051156112ed576101a05163545e7c616101c05260406101206101e05e60206101c060446101dc5f855af1610585573d5f5f3e3d5ffd5b60203d106112ed576101c0518060a01c6112ed57610220526102209050516101605261018051604052610160516060526105c06101c06112c9565b6101c0516008610120516020525f5260405f2080610140516020525f5260405f2090505561014051610120517feba46d78c72b4ca800dec608477ba2bff7d96b590d7c61df4f3ada072a306334610160516101c05260206101c0a35b6020610160f3611209565b635f82a933811861120957346112ed5760065460405260206040f3611209565b63cd852cdf8118611209576024361034176112ed5760076004356020525f5260405f205460405260206040f3611209565b637c9d7cd48118611209576044361034176112ed576004358060a01c6112ed576040526024358060a01c6112ed5760605260086040516020525f5260405f20806060516020525f5260405f2090505460805260206080f3611209565b6337ea2b9181186107c957346112ed575f604052731111111111111111111111111111111111111111610860525f6040905b80610880526005610860516020525f5260405f20546108605273111111111111111111111111111111111111111161086051186107425761076c565b604051603f81116112ed57610860518160051b606001526001810160405250600101818118610706575b50506020806108805280610880015f6040518083528060051b5f82604081116112ed5780156107b457905b8060051b606001518160051b602088010152600101818118610797575b50508201602001915050905081019050610880f35b634b41a5018118611209576064361034176112ed576004358060a01c6112ed576080526024358060a01c6112ed5760a0526044358060a01c6112ed5760c0525f5433186112ed575f60405260c05160605261082460e06112c9565b60e05160086080516020525f5260405f208060a0516020525f5260405f2090505560a0516080517f304562ece6c846eb82a8b84b5370f7f035e32bd2c10433989984bcf15513f41f60c05160e052602060e0a300611209565b63d936547e8118610967576024361034176112ed576004358060a01c6112ed576040527311111111111111111111111111111111111111116060525f6040905b8060805260056060516020525f5260405f2054606052731111111111111111111111111111111111111111606051186108f55761095a565b60605163d936547e60a05260405160c052602060a0602460bc845afa61091d573d5f5f3e3d5ffd5b60203d106112ed5760a0518060011c6112ed5760e05260e09050511561094f5750506001610100526020610100610965565b6001018181186108bd575b50505f608052602060805bf35b6301681a6281186109a5576024361034176112ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff606052610ab5565b63e2a7515e81186112095760e4361034176112ed576004358060a01c6112ed576040526024358060a01c6112ed5760605260843560040160018135116112ed57803560208160051b0180836080375050505f60c052602060c0f3611209565b63c45a0155811861120957346112ed57604036606037600654604052610a2a60a061120d565b60a080516060526020810151608052505f60a05260805115610a5d57606051604052610a5660c0611236565b60c05160a0525b6060606060c05e606060c0f3611209565b63aea5058e8118610a99576024361034176112ed576020600435604052610a956060611236565b6060f35b636ea056a98118610ba9576044361034176112ed576024356060525b6004358060a01c6112ed576040525f5433186112ed5760605160805260605119610b10576040516370a0823160a0523060c052602060a0602460bc845afa610aff573d5f5f3e3d5ffd5b60203d106112ed5760a09050516080525b60405163a9059cbb60a0525f5460c05260805160e052602060a0604460bc5f855af1610b3e573d5f5f3e3d5ffd5b3d610b5557803b156112ed57600161010052610b6d565b60203d106112ed5760a0518060011c6112ed57610100525b610100905051156112ed576040517fab2246061d7b0dd3631d037e3f6da75782ae489eeb9f6af878a4b25df9b07c7760805160a052602060a0a2005b63085e2c5b81186112095760a4361034176112ed576004358060a01c6112ed576040526024358060a01c6112ed5760605260405f6080528060a052806080015f5f610120526001610100525f610100518084528060051b5f82600181116112ed578015610c3057905b8060051b61012001518160051b602089010152600101818118610c12575b5050820160200191505090509050810190506080f3611209565b6352d112388118610c88576024361034176112ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff606052610cf0565b63759be10c811861120957346112ed5760015433186112ed575f600155335f55337fafe23f9e1f603b288748a507d5a993957e9f14313a5889d5a070851299939d595f6040a200611209565b63f2d5d56b8118611209576044361034176112ed576024356060525b6004358060a01c6112ed5760405260025433186112ed57604051156112ed57606051156112ed577311111111111111111111111111111111111111116080525f6040905b8060a05260056080516020525f5260405f205460805273111111111111111111111111111111111111111160805118610d6c57610f36565b6080516393d5188f60c052602060c0600460dc5f855af1610d8f573d5f5f3e3d5ffd5b60203d106112ed5760c0518060011c6112ed576101005261010090505115610db657610f2b565b60035460c05260c0516367c6e39c60e052604051610100525f61012052803b156112ed575f60e0604460fc5f855af1610df1573d5f5f3e3d5ffd5b5060605160e05260605119610e3e576040516370a082316101005260c051610120526020610100602461011c845afa610e2c573d5f5f3e3d5ffd5b60203d106112ed5761010090505160e0525b6040516323b872dd6101005260c051610120526080516101405260e051610160526020610100606461011c5f855af1610e79573d5f5f3e3d5ffd5b3d610e9057803b156112ed57600161018052610ea9565b60203d106112ed57610100518060011c6112ed57610180525b610180905051156112ed576080516367c6e39c610100526040516101205260e05161014052803b156112ed575f610100604461011c5f855af1610eee573d5f5f3e3d5ffd5b506040517fe1a5602e30931761352458316383b4fb6cb0f5ebe0b746c614d3e4836c4ccef560e051610100526020610100a2505060206080610f94565b600101818118610d34575b5050601360a0527f6e6f206275636b657420617661696c61626c650000000000000000000000000060c05260a05060a0518060c001601f825f031636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5bf3611209565b6341bda9cc8118611209576044361034176112ed576004358060a01c6112ed57610120526024358060a01c6112ed57610140526020604061012060605e610fe261016061125f565b610160f3611209565b6369f2e4928118611209576064361034176112ed576004358060a01c6112ed576040526024358060a01c6112ed576060526044358060a01c6112ed576080525f5433186112ed57731111111111111111111111111111111111111111604051146112ed5760056040516020525f5260405f205460a05260a051156112ed57606051156112ed5760056060516020525f5260405f20546112ed5760405160056080516020525f5260405f2054186112ed5760605160056080516020525f5260405f20555f60056040516020525f5260405f205560a05160056060516020525f5260405f20556060516040517f21462a07a732e567350042c254c89c29419e62fc59951aa1a6aa37411e6468335f60c0a300611209565b63ee2af3fb8118611209576024361034176112ed576004358060a01c6112ed576080525f5433186112ed5760065460405261113b60c061120d565b60c05160a0526080511561115d5760a051600181018181106112ed57905060a0525b60a05160405260805160605261117360c06112c9565b60c0516006556080517f8d95e6b7f3e91dac5f4c8e6bd2ec031e14cb5c8699d0740a9bca228c989124ff60a05160c052602060c0a200611209565b63fd066ecc8118611209576024361034176112ed576004358060a01c6112ed576040525f5433186112ed576040516001556040517fe7b5cc087e6e47e33e86bdfe4720b7e849891938b18ff6e0c3f92299de79e60c5f6060a2005b5f5ffd5b6bffffffffffffffffffffffff60405116815260405160601c8060a01c6112ed57602082015250565b600160405160ff811690501b60076040518060081c90506020525f5260405f2054161515815250565b60403660a03760086060516020525f5260405f20806080516020525f5260405f2090505460405261129060e061120d565b60e0805160a052602081015160c0525060a0516040526112b060e0611236565b60e0516112c0575f8152506112c7565b60c0518152505b565b6bffffffffffffffffffffffff604051116112ed5760605160601b60405117815250565b5f80fd0f9a012902ef06d406270678120900180c4a11000cd401e91209087d12090a0404501209120901c9120911ae0feb06470a6e120901a9000000000000000000000000ef77cc176c748d291efb6cdc982c5744fc7211c8

Verified Source Code Partial Match

Compiler: v0.3.10+commit.91361694
RoboTreasury.vy 468 lines
# pragma version 0.3.10
# pragma optimize gas
# pragma evm-version cancun
"""
@title RoboTreasury
@author Yearn Finance
@license GNU AGPLv3
@notice
    The main entrypoint for the RoboTreasury system. This contract's responsibility 
    is to pull funds from the ingress and deposit them into buckets. The buckets are 
    sorted by priority, and are filled in order until their floor is reached.
    Since buckets are allowed to convert the incoming assets to their liking,
    this contract maintains a list of canocnical conversion contracts. These are
    deployed by a factory but can be overwritten by management to allow for more 
    efficient implementations for specific pairs.
"""

from vyper.interfaces import ERC20

interface Ingress:
    def convert(_token: address, _dummy: uint256): nonpayable

interface Bucket:
    def whitelisted(_token: address) -> bool: view
    def above_floor() -> bool: nonpayable
    def convert(_token: address, _amount: uint256): nonpayable

interface Factory:
    def deploy(_from: address, _to: address) -> address: nonpayable

interface Robo:
    def is_bucket(_bucket: address) -> bool: view
    def deploy_converter(_from: address, _to: address) -> address: nonpayable

interface OneSplit:
    def getExpectedReturn(
        _a: address, _b: address, _c: uint256, _d: uint256, _e: uint256
    ) -> (uint256, DynArray[uint256, 1]): view
    def swap(
        _a: address, _b: address, _c: uint256, _d: uint256, _e: DynArray[uint256 ,1], _f: uint256
    ) -> uint256: nonpayable

treasury: public(immutable(address))
management: public(address)
pending_management: public(address)
operator: public(address)
ingress: public(Ingress)
num_buckets: public(uint256)
linked_buckets: public(HashMap[address, address])
packed_factory: public(uint256) # version | factory
packed_factory_versions: public(HashMap[uint256, uint256])
packed_converters: public(HashMap[address, HashMap[address, uint256]]) # from => to => (version | converter)

event Pull:
    _token: indexed(address)
    _amount: uint256

event SetOperator:
    operator: indexed(address)

event DeployConverter:
    _from: indexed(address)
    _to: indexed(address)
    _converter: address

event Sweep:
    _token: indexed(address)
    _amount: uint256

event AddBucket:
    _bucket: indexed(address)
    _after: address

event RemoveBucket:
    _bucket: indexed(address)

event ReplaceBucket:
    _old: indexed(address)
    _new: indexed(address)

event SetConverter:
    _from: indexed(address)
    _to: indexed(address)
    _converter: address

event SetFactory:
    _factory: indexed(address)
    _version: uint256

event SetFactoryVersionEnabled:
    _version: indexed(uint256)
    _enabled: bool

event PendingManagement:
    management: indexed(address)

event SetManagement:
    management: indexed(address)

MAX_NUM_BUCKETS: constant(uint256) = 64
MASK: constant(uint256) = (1 << 96) - 1
SENTINEL: constant(address) = 0x1111111111111111111111111111111111111111

implements: Robo
implements: OneSplit

@external
def __init__(_treasury: address, _ingress: address):
    """
    @notice Constructor
    @param _treasury Treasury contract, ultimate destination of all assets
    @param _ingress Ingress contract, where assets get pulled from
    """
    treasury = _treasury
    self.management = msg.sender
    self.operator = msg.sender
    self.ingress = Ingress(_ingress)
    self.linked_buckets[SENTINEL] = SENTINEL
    self.packed_factory_versions[0] = 1

@external
@view
def is_bucket(_bucket: address) -> bool:
    """
    @notice Query whether the address is a valid bucket
    @param _bucket Bucket address
    @return True: address is a valid bucket, False: address is not a valid bucket
    """
    return _bucket != SENTINEL and self.linked_buckets[_bucket] != empty(address)

@external
@view
def buckets() -> DynArray[address, MAX_NUM_BUCKETS]:
    """
    @notice Query list of configured buckets
    @return Array of buckets
    """
    buckets: DynArray[address, MAX_NUM_BUCKETS] = []
    bucket: address = SENTINEL
    for _ in range(MAX_NUM_BUCKETS):
        bucket = self.linked_buckets[bucket]
        if bucket == SENTINEL:
            break
        buckets.append(bucket)
    return buckets

@external
@view
def whitelisted(_token: address) -> bool:
    """
    @notice Query whether a token is whitelisted in any of the buckets
    @param _token Token address
    @return True: token is whitelisted in a bucket, False: token is not whitelisted
        in a bucket
    """
    bucket: address = SENTINEL
    for _ in range(MAX_NUM_BUCKETS):
        bucket = self.linked_buckets[bucket]
        if bucket == SENTINEL:
            break
        if Bucket(bucket).whitelisted(_token):
            return True
    return False

@external
@view
def factory() -> (uint256, address, bool):
    """
    @notice Query current factory details
    @return Tuple with factory version, factory address and a flag representing
        the enable status of this factory version
    """
    version: uint256 = 0
    factory: address = empty(address)
    (version, factory) = self._unpack(self.packed_factory)
    enabled: bool = False
    if factory != empty(address):
        enabled = self._enabled(version)
    return (version, factory, enabled)

@external
@view
def factory_version_enabled(_version: uint256) -> bool:
    """
    @notice Query whether a specific factory version is enabled
    @param _version Factory version
    @return True: factory version enabled, False: factory version disabled
    """
    return self._enabled(_version)

@external
def pull(_token: address, _amount: uint256 = max_value(uint256)) -> address:
    """
    @notice Pull a token from the ingress into a bucket
    @param _token Token to pull
    @param _amount Amount of token to pull. Defaults to current ingress balance
    @return The bucket the funds were sent to
    @dev Can only be called by the operator
    """
    assert msg.sender == self.operator
    assert _token != empty(address)
    assert _amount > 0

    bucket: address = SENTINEL
    for _ in range(MAX_NUM_BUCKETS):
        bucket = self.linked_buckets[bucket]
        if bucket == SENTINEL:
            break

        if Bucket(bucket).above_floor():
            continue

        # obtain an allowance to transfer from the ingress
        ingress: Ingress = self.ingress
        ingress.convert(_token, 0)

        amount: uint256 = _amount
        if _amount == max_value(uint256):
            amount = ERC20(_token).balanceOf(ingress.address)

        # handle conversion inside bucket
        assert ERC20(_token).transferFrom(ingress.address, bucket, amount, default_return_value=True)
        Bucket(bucket).convert(_token, amount)
        log Pull(_token, amount)

        return bucket

    raise "no bucket available"

@external
@view
def converter(_from: address, _to: address) -> address:
    """
    @notice Query converter contract for a pair, if any is known
    @param _from The token to convert from
    @param _to The token to convert to
    @return The converter contract, if any
    """
    return self._converter(_from, _to)

@external
def deploy_converter(_from: address, _to: address) -> address:
    """
    @notice Deploy a converter for a pair, if none is known
    @param _from The token to convert from
    @param _to The token to convert to
    @return The converter contract
    @dev Can only be called by an existing bucket or the operator
    """
    assert self.linked_buckets[msg.sender] != empty(address) or msg.sender == self.operator

    converter: address = self._converter(_from, _to)
    if converter == empty(address):
        version: uint256 = 0
        factory: address = empty(address)
        (version, factory) = self._unpack(self.packed_factory)
        assert factory != empty(address)
        assert self._enabled(version)
        converter = Factory(factory).deploy(_from, _to)
        self.packed_converters[_from][_to] = self._pack(version, converter)
        log DeployConverter(_from, _to, converter)

    return converter

@external
def sweep(_token: address, _amount: uint256 = max_value(uint256)):
    """
    @notice Sweep any tokens left over in the contract
    @param _token The token to sweep
    @param _amount The amount to sweep. Defaults to contract balance
    @dev Can only be called by management
    """
    assert msg.sender == self.management
    amount: uint256 = _amount
    if _amount == max_value(uint256):
        amount = ERC20(_token).balanceOf(self)
    assert ERC20(_token).transfer(self.management, amount, default_return_value=True)
    log Sweep(_token, amount)

@external
def add_bucket(_bucket: address, _after: address):
    """
    @notice Add a bucket
    @param _bucket Address of the bucket
    @param _after Address of the bucket to add it after in the list
    @dev Can only be called by management
    """
    assert msg.sender == self.management
    assert _bucket != empty(address)
    assert self.linked_buckets[_bucket] == empty(address)
    next: address = self.linked_buckets[_after]
    assert next != empty(address)
    num_buckets: uint256 = self.num_buckets
    assert num_buckets < MAX_NUM_BUCKETS

    self.num_buckets = num_buckets + 1
    self.linked_buckets[_after] = _bucket
    self.linked_buckets[_bucket] = next
    log AddBucket(_bucket, _after)

@external
def remove_bucket(_bucket: address, _previous: address):
    """
    @notice Remove a bucket
    @param _bucket Address of the bucket
    @param _previous Address of the bucket before the target in the list
    @dev Can only be called by management
    """
    assert msg.sender == self.management
    assert _bucket != SENTINEL
    next: address = self.linked_buckets[_bucket]
    assert next != empty(address)
    assert self.linked_buckets[_previous] == _bucket

    self.num_buckets -= 1
    self.linked_buckets[_previous] = next
    self.linked_buckets[_bucket] = empty(address)
    log RemoveBucket(_bucket)

@external
def replace_bucket(_old: address, _new: address, _previous: address):
    """
    @notice Replace a bucket
    @param _old Address of the old bucket
    @param _new Address of the new bucket
    @param _previous Address of the bucket before the target in the list
    @dev Can only be called by management
    """
    assert msg.sender == self.management
    assert _old != SENTINEL
    next: address = self.linked_buckets[_old]
    assert next != empty(address)
    assert _new != empty(address)
    assert self.linked_buckets[_new] == empty(address)
    assert self.linked_buckets[_previous] == _old

    self.linked_buckets[_previous] = _new
    self.linked_buckets[_old] = empty(address)
    self.linked_buckets[_new] = next
    log ReplaceBucket(_old, _new)

@external
def set_converter(_from: address, _to: address, _converter: address):
    """
    @notice Set a converter for a specific pair
    @param _from The token converted from
    @param _to The token converted to
    @param _converter Address of the converter
    @dev Can only be called by management
    """
    assert msg.sender == self.management
    self.packed_converters[_from][_to] = self._pack(0, _converter)
    log SetConverter(_from, _to, _converter)

@external
def set_factory(_factory: address):
    """
    @notice Set a new factory for converters
    @param _factory The factory address, if any
    @dev Can only be called by management
    @dev Increments the factory version if a factory is set
    @dev Factory version must be enabled separately
    """
    assert msg.sender == self.management
    version: uint256 = self._unpack(self.packed_factory)[0]
    if _factory != empty(address):
        version += 1
    self.packed_factory = self._pack(version, _factory)
    log SetFactory(_factory, version)

@external
def set_factory_version_enabled(_version: uint256, _enabled: bool):
    """
    @notice Toggle all conversion contracts deployed by a specific factory
    @param _version The version of the factory
    @param _enabled True: enable all conversions, False: disable all conversions
    @dev Can only be called by management
    """
    assert msg.sender == self.management
    latest: uint256 = self._unpack(self.packed_factory)[0]
    assert _version > 0 and _version <= latest
    flags: uint256 = self.packed_factory_versions[_version / 256]
    mask: uint256 = 1 << (_version % 256)
    if _enabled:
        flags |= mask
    else:
        flags &= ~mask
    self.packed_factory_versions[_version / 256] = flags
    log SetFactoryVersionEnabled(_version, _enabled)

@external
def set_operator(_operator: address):
    """
    @notice Set the new operator address
    @param _operator New operator address
    @dev Can only be called by management
    """
    assert msg.sender == self.management
    self.operator = _operator
    log SetOperator(_operator)

@external
def set_management(_management: address):
    """
    @notice 
        Set the pending management address.
        Needs to be accepted by that account separately to transfer management over
    @param _management New pending management address
    """
    assert msg.sender == self.management
    self.pending_management = _management
    log PendingManagement(_management)

@external
def accept_management():
    """
    @notice 
        Accept management role.
        Can only be called by account previously marked as pending management by current management
    """
    assert msg.sender == self.pending_management
    self.pending_management = empty(address)
    self.management = msg.sender
    log SetManagement(msg.sender)


##### Compatibility with ingress contract #####

@external
@view
def getExpectedReturn(
    _a: address, _b: address, _c: uint256, _d: uint256, _e: uint256
) -> (uint256, DynArray[uint256, 1]):
    return (0, [0])

@external
def swap(
    _a: address, _b: address, _c: uint256, _d: uint256, _e: DynArray[uint256, 1], _f: uint256
) -> uint256:
    return 0

##### Internal utility functions #####

@internal
@view
def _converter(_from: address, _to: address) -> address:
    version: uint256 = 0
    converter: address = empty(address)
    (version, converter) = self._unpack(self.packed_converters[_from][_to])
    if not self._enabled(version):
        return empty(address)
    return converter

@internal
@view
def _enabled(_version: uint256) -> bool:
    return self.packed_factory_versions[_version / 256] & (1 << (_version % 256)) > 0

@internal
@pure
def _unpack(_packed: uint256) -> (uint256, address):
    return (_packed & MASK, convert(_packed >> 96, address))

@internal
@pure
def _pack(_version: uint256, _target: address) -> uint256:
    assert _version <= MASK
    return _version | (convert(_target, uint256) << 96)

Read Contract

buckets 0x37ea2b91 → address[]
converter 0x41bda9cc → address
factory 0xc45a0155 → uint256, address, bool
factory_version_enabled 0xaea5058e → bool
getExpectedReturn 0x085e2c5b → uint256, uint256[]
ingress 0xa411a59d → address
is_bucket 0x20d76381 → bool
linked_buckets 0x504007a2 → address
management 0x88a8d602 → address
num_buckets 0x66c7ffd6 → uint256
operator 0x570ca735 → address
packed_converters 0x7c9d7cd4 → uint256
packed_factory 0x5f82a933 → uint256
packed_factory_versions 0xcd852cdf → uint256
pending_management 0x770817ec → address
treasury 0x61d027b3 → address
whitelisted 0xd936547e → bool

Write Contract 15 functions

These functions modify contract state and require a wallet transaction to execute.

accept_management 0x759be10c
No parameters
add_bucket 0x86f89055
address _bucket
address _after
deploy_converter 0xe5b5b420
address _from
address _to
returns: address
pull 0x52d11238
address _token
returns: address
pull 0xf2d5d56b
address _token
uint256 _amount
returns: address
remove_bucket 0x78860fea
address _bucket
address _previous
replace_bucket 0x69f2e492
address _old
address _new
address _previous
set_converter 0x4b41a501
address _from
address _to
address _converter
set_factory 0xee2af3fb
address _factory
set_factory_version_enabled 0xd34aec23
uint256 _version
bool _enabled
set_management 0xfd066ecc
address _management
set_operator 0x30c7be72
address _operator
swap 0xe2a7515e
address _a
address _b
uint256 _c
uint256 _d
uint256[] _e
uint256 _f
returns: uint256
sweep 0x01681a62
address _token
sweep 0x6ea056a9
address _token
uint256 _amount

Recent Transactions

No transactions found for this address