Address Contract Partially Verified
Address
0x8f1477eb096d664D317C2c31CB647C9E2E98dC28
Balance
0 ETH
Nonce
1
Code Size
5721 bytes
Creator
0x6969acca...9f25 at tx 0xb35ac5d2...ef162a
Indexed Transactions
0
Contract Bytecode
5721 bytes
0x5f3560e01c6002601f821660011b61157901601e395f51565b638da5cb5b811861127e5734611575575f5460405260206040f35b637f4ec4c3811861004f57346115755760015460405260206040f35b635efa4943811861127e5760843610341761157557604060246101a0376064358060a01c611575576101e0525b6100846114f5565b60043560206115d95f395f516370a082316102005230610220526020610200602461021c845afa6100b7573d5f5f3e3d5ffd5b60203d10611575576102009050511015610148576020806102a0526004610240527f214153460000000000000000000000000000000000000000000000000000000061026052610240816102a00160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b600435610200526101a0511561017f5761020051600435670de0b6b3a7640000810690508082038281116115755790509050610200525b6102005160a0526101a05160c0526101986102406113e6565b610240516102205261022051610225576020806102a0526005610240527f21636f696e00000000000000000000000000000000000000000000000000000061026052610240816102a00160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b6101c0516102205111156102b0576020806102a0526011610240527f736c6970706167652072656b7420796f7500000000000000000000000000000061026052610240816102a00160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610280528060040161029cfd5b60206116195f395f51639dc29fac6102405233610260526102005161028052803b15611575575f610240604461025c5f855af16102ef573d5f5f3e3d5ffd5b5060206116395f395f516323b872dd61024052336102605260035461028052610220516102a0526020610240606461025c5f855af1610330573d5f5f3e3d5ffd5b3d61034757803b156115755760016102c052610371565b3d602081183d602010021880610240016102601161157557610240518060011c611575576102c052505b6102c090505115611575576101a05161040a5760206115d95f395f5163a9059cbb6102405260406101e06102605e6020610240604461025c5f855af16103b9573d5f5f3e3d5ffd5b3d6103d057803b156115755760016102a0526103fa565b3d602081183d602010021880610240016102601161157557610240518060011c611575576102a052505b6102a090505115611575576104a8565b60206115f95f395f5163e2ab691d610240526101e0516102605261020051670de0b6b3a764000081049050610280526101a0516102a0526020610240606461025c5f855af161045b573d5f5f3e3d5ffd5b3d61047257803b156115755760016102c05261049c565b3d602081183d602010021880610240016102601161157557610240518060011c611575576102c052505b6102c090505115611575575b6101e0517f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f336102405260406102006102605e6101a0516102a0526080610240a2005b63f0350c04811861127e57602436103417611575576004358060a01c6115755761010052610517611282565b610100516001557f23e1f881d1e797ea57a7247e53536f0bfc37c42e6645b3bdc4b1c9a0e0d8a1335f546101205261010051610140526040610120a1005b63a67c2dcb811861127e5734611575573360015418156105e95760208061012052600a60c0527f216e6577206f776e65720000000000000000000000000000000000000000000060e05260c0816101200160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610100528060040161011cfd5b336040526105f5611303565b005b634f068da7811861127e576024361034176115755760346101a052610634565b6394565d40811861127e57604436103417611575576024356101a0525b602060043560a0526101a05160c05261064e6101c06113e6565b6101c0f35b630b1d07de811861067e5760243610341761157557602060043560405261067a60a0611386565b60a0f35b63d7e0df7e811861127e57602436103417611575576004358060a01c6115755760405260076040516020525f5260405f205460605260206060f35b636839b449811861127e57346115755760206106d56080611345565b6080f35b63db006a758118610723576024361034176115755760346101a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c052336101e05261007c565b6341c0e1b5811861127e57346115755761073b6114f5565b610743611282565b600160025560206115d95f395f516370a082316101205230610140526020610120602461013c845afa610778573d5f5f3e3d5ffd5b60203d106115755761012090505161010052610100511561081a5760206115d95f395f5163a9059cbb610120525f546101405261010051610160526020610120604461013c5f855af16107cd573d5f5f3e3d5ffd5b3d6107e457803b156115755760016101805261080e565b3d602081183d602010021880610120016101401161157557610120518060011c6115755761018052505b61018090505115611575575b7ff4a991ad9e7f9711696f7bd41529beb4c470d75788573535d4ca3f0857c79ce861010051610120526020610120a1005b637cbc2373811861089657604436103417611575576024356101a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c052336101e05261007c565b63ae90b213811861127e57346115755760035460405260206040f35b63b819220581186108d95760643610341761157557604060246101a037336101e05261007c565b635ccbecc5811861127e57346115755760206115d960403960206040f35b63fa108c97811861127e5760243610341761157557336101005261093b565b638c662c828118610b9b57604436103417611575576024358060a01c61157557610100525b6109436114f5565b6007336020525f5260405f20546109d15760208061018052600b610120527f2170726976696c6567656400000000000000000000000000000000000000000061014052610120816101800160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610160528060040161017cfd5b60043560206115d95f395f516370a082316101205230610140526020610120602461013c845afa610a04573d5f5f3e3d5ffd5b60203d10611575576101209050511015610a95576020806101c0526004610160527f214153460000000000000000000000000000000000000000000000000000000061018052610160816101c00160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101a052806004016101bcfd5b60206116195f395f51639dc29fac61012052336101405260043561016052803b15611575575f610120604461013c5f855af1610ad3573d5f5f3e3d5ffd5b5060206115d95f395f5163a9059cbb610120526101005161014052600435610160526020610120604461013c5f855af1610b0f573d5f5f3e3d5ffd5b3d610b2657803b1561157557600161018052610b50565b3d602081183d602010021880610120016101401161157557610120518060011c6115755761018052505b6101809050511561157557610100517f215abfcd108b85fbee47f26fda2de66f90f14fa5fcaf0201698ad8ac9323545f336101205260043561014052604036610160376080610120a2005b6301681a62811861127e57602436103417611575576004358060a01c6115755761010052600254610bda5760206115d95f395f51610100511415610bdd565b60015b610c5e57602080610180526006610120527f21746f6b656e000000000000000000000000000000000000000000000000000061014052610120816101800160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610160528060040161017cfd5b610c66611282565b610100516370a082316101405230610160526020610140602461015c845afa610c91573d5f5f3e3d5ffd5b60203d10611575576101409050516101205261012051610d28576020806101a0526008610140527f2162616c616e636500000000000000000000000000000000000000000000000061016052610140816101a00160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b6101005163a9059cbb610140525f546101605261012051610180526020610140604461015c5f855af1610d5d573d5f5f3e3d5ffd5b3d610d7457803b156115755760016101a052610d9e565b3d602081183d602010021880610140016101601161157557610140518060011c611575576101a052505b6101a090505115611575577fab2246061d7b0dd3631d037e3f6da75782ae489eeb9f6af878a4b25df9b07c7760406101006101405e6040610140a16020610120f35b63ec9b28f18118610ec957602436103417611575576004358060a01c6115755761010052610e0c611282565b61010051610e9157602080610180526006610120527f217061796565000000000000000000000000000000000000000000000000000061014052610120816101800160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610160528060040161017cfd5b610100516003557fb35cb534021632242cdd9c586df6a75869880552d76afbabb674b6bd1f1b4f9f61010051610120526020610120a1005b6326ae7f91811861127e57346115755760055460405260206040f35b63d4228c1c811861127e5760443610341761157557610f02611282565b60243560043510610f8a5760208061016052600d610100527f216d696e5f646973636f756e740000000000000000000000000000000000000061012052610100816101600160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610140528060040161015cfd5b670de0b6b3a763ffff60243511156110195760208061016052600d610100527f216d61785f646973636f756e740000000000000000000000000000000000000061012052610100816101600160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610140528060040161015cfd5b6004356004556024356005557f445654c96a6384ec9889231c6a8971e28dc6b193bf8e80c96685a229ba97e2e960406004610100376040610100a1005b639e4266d8811861127e5760243610341761157557611073611282565b603460043511156110fb5760208061016052600f610100527f216d696e5f6c6f636b5f7765656b73000000000000000000000000000000000061012052610100816101600160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610140528060040161015cfd5b6004356006557f96d8fcb88a398f8f65159c5fd590be7594e9900d884622b05d10fece920f2553600435610100526020610100a1005b63058a40c181186111b257604436103417611575576004358060a01c61157557610100526024358060011c611575576101205261116c611282565b610120516007610100516020525f5260405f20557f82ab77a724bef2ddcd532c84cf3d8e5afb877331b92e893da8bb8dc5abf4ef8b60406101006101405e6040610140a1005b631f3a0e41811861127e57346115755760025460405260206040f35b6331eb318a811861127e57346115755760206115b960403960206040f35b638c2c4aee811861127e57346115755760206115f960403960206040f35b63c19d9cf2811861127e573461157557602061161960403960206040f35b6365f64696811861127e573461157557602061163960403960206040f35b63bcac600c811861127e57346115755760045460405260206040f35b63859d3c48811861127e57346115755760065460405260206040f35b5f5ffd5b5f543318156113015760208060a05260066040527f216f776e6572000000000000000000000000000000000000000000000000000060605260408160a00160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b565b5f6001555f546060526040515f557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060605160805260405160a05260406080a1565b60206115b95f395f516350d25bcd604052602060406004605c845afa61136d573d5f5f3e3d5ffd5b60203d106115755760409050515f811261157557815250565b60045460605260055460805260605160805160605180820382811161157557905090506040516034818118603483100218905080820281158383830414171561157557905090506034810490508082018281106115755790509050815250565b60065460c051101561146d5760208061014052600660e0527f217765656b7300000000000000000000000000000000000000000000000000006101005260e0816101400160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610120528060040161013cfd5b60a05161147a60e0611345565b60e0518082028115838383041417156115755790509050670de0b6b3a76400008104905060c0516040526114af610100611386565b6101005180670de0b6b3a764000003670de0b6b3a764000081116115755790508082028115838383041417156115755790509050670de0b6b3a764000081049050815250565b600254156115735760208060a05260066040527f6b696c6c6564000000000000000000000000000000000000000000000000000060605260408160a00160208251018083835e508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b565b5f80fd061711310916003304eb08b2127e05f7126206b911ce05551246127e11ec127e127e0de0120a084b127e06d9122808f71056127e127e00180ee5127e0653127e000000000000000000000000ec1f936198ccf8c0a21bf3aaef31b081b314135200000000000000000000000059a529070fbb61e6d6c91f952ccb7f35c34cf8aa000000000000000000000000f119b5aa93a7755b09952b3a88d04cdaf53290340000000000000000000000007fe24f1a024d33506966cb7ca48bab8c65fb632d0000000000000000000000009cf12ccd6020b6888e4d4c4e4c7aca33c1eb91f8
Verified Source Code Partial Match
Compiler: v0.4.1+commit.8a93dd27
ownable_2step.vy 94 lines
# @version 0.4.1
"""
@title Ownable 2-step
@license MIT
@author yearn.finance, asymmetry.finance
@notice ownable_2step.vy is a two-step ownable contract that allows for a two-step transfer of ownership
"""
# ============================================================================================
# Events
# ============================================================================================
event PendingOwnershipTransfer:
old_owner: address
new_owner: address
event OwnershipTransferred:
old_owner: address
new_owner: address
# ============================================================================================
# Storage
# ============================================================================================
owner: public(address)
pending_owner: public(address)
# ============================================================================================
# Constructor
# ============================================================================================
@deploy
def __init__(owner: address):
"""
@notice Initialize the contract
@dev Sets the deployer as the initial owner
@param owner The address of the initial owner
"""
assert owner != empty(address), "!owner"
self._transfer_ownership(owner)
# ============================================================================================
# Owner functions
# ============================================================================================
@external
def transfer_ownership(new_owner: address):
"""
@notice Starts the ownership transfer of the contract to a new account
@dev Only callable by the current `owner`
@dev Replaces the pending transfer if there is one
@param new_owner The address of the new owner
"""
self._check_owner()
self.pending_owner = new_owner
log PendingOwnershipTransfer(old_owner=self.owner, new_owner=new_owner)
@external
def accept_ownership():
"""
@notice The new owner accepts the ownership transfer
@dev Only callable by the current `pending_owner`
"""
assert self.pending_owner == msg.sender, "!new owner"
self._transfer_ownership(msg.sender)
# ============================================================================================
# Internal functions
# ============================================================================================
@internal
def _check_owner():
assert msg.sender == self.owner, "!owner"
@internal
def _transfer_ownership(new_owner: address):
self.pending_owner = empty(address)
old_owner: address = self.owner
self.owner = new_owner
log OwnershipTransferred(old_owner=old_owner, new_owner=new_owner)
redemption.vy 397 lines
# @version 0.4.1
"""
@title dASF Redemptions
@license MIT
@author yearn.finance, asymmetry.finance (johnnyonline)
@notice
redemption.vy is used to redeem dASF for ASF using USDaf
ASF/USD price is fetched from Curve and Chainlink oracles
ASF is sold at a discounted rate, which is determined by the lock period
"""
from ethereum.ercs import IERC20
from interfaces import AggregatorV3Interface
from interfaces import IVEASF
from interfaces import IDASF
from interfaces import IRedemption
import ownable_2step as ownable
# ============================================================================================
# Modules
# ============================================================================================
initializes: ownable
exports: (
ownable.owner,
ownable.pending_owner,
ownable.transfer_ownership,
ownable.accept_ownership,
)
# ============================================================================================
# Interfaces
# ============================================================================================
implements: IRedemption
# ============================================================================================
# Constants
# ============================================================================================
WAD: constant(uint256) = 10**18
MAX_WEEKS: constant(uint256) = 52
# ============================================================================================
# Immutable
# ============================================================================================
PRICE_FEED: public(immutable(AggregatorV3Interface))
ASF: public(immutable(IERC20))
VEASF: public(immutable(IVEASF))
DASF: public(immutable(IDASF))
USDAF: public(immutable(IERC20))
# ============================================================================================
# Storage
# ============================================================================================
killed: public(bool)
payee: public(address)
min_discount: public(uint256)
max_discount: public(uint256)
min_lock_weeks: public(uint256)
privileged: public(HashMap[address, bool])
# ============================================================================================
# Constructor
# ============================================================================================
@deploy
def __init__(
owner: address,
payee: address,
price_feed: address,
asf: address,
veasf: address,
dasf: address,
usdaf: address,
):
"""
@notice Initialize the contract
@param owner Address of the owner
@param payee Address of the payee
@param price_feed Address of the price feed
@param asf Address of the ASF token
@param veasf Address of the veASF token
@param dasf Address of the dASF token
@param usdaf Address of the USDaf token
"""
ownable.__init__(owner)
assert payee != empty(address), "!payee"
self.min_discount = 20 * 10**16 # 20%
self.max_discount = 80 * 10**16 # 80%
self.min_lock_weeks = 0
self.payee = payee
PRICE_FEED = AggregatorV3Interface(price_feed)
ASF = IERC20(asf)
VEASF = IVEASF(veasf)
DASF = IDASF(dasf)
USDAF = IERC20(usdaf)
assert extcall ASF.approve(
veasf, max_value(uint256), default_return_value=True
)
log IRedemption.SetDiscount(
min_discount=self.min_discount, max_discount=self.max_discount
)
log IRedemption.SetMinLockWeeks(min_lock_weeks=self.min_lock_weeks)
log IRedemption.SetPayee(new_payee=payee)
# ============================================================================================
# View functions
# ============================================================================================
@external
@view
def coin_required(amount: uint256, weeks: uint256 = MAX_WEEKS) -> uint256:
"""
@notice Estimate the required amount of USDaf to redeem the amount of dASF for ASF
@param amount Amount of dASF
@param weeks Number of weeks to lock the ASF for
@return Amount of USDaf required
"""
return self._coin_required(amount, weeks)
@external
@view
def discount(weeks: uint256) -> uint256:
"""
@notice Get the discount for a given number of weeks
@param weeks Number of weeks to lock the ASF for
@return Discount in percentage (18 decimals)
"""
return self._discount(weeks)
@external
@view
def latest_price() -> uint256:
"""
@notice Get the latest price of ASF in USDaf
@return Price of ASF in USDaf (18 decimals)
"""
return self._latest_price()
# ============================================================================================
# Mutative functions
# ============================================================================================
@external
def redeem(
amount: uint256,
weeks: uint256 = MAX_WEEKS,
max_coin_required: uint256 = max_value(uint256),
recipient: address = msg.sender,
):
"""
@notice Redeem your dASF for ASF using a USDaf
@dev If locking, rounds down the amount of dASF to avoid overpaying
@param amount amount of dASF to spend
@param weeks number of weeks to lock the ASF for
@param max_coin_required maximum amount of USDaf to pay
@param recipient of the exercised ASF
"""
self._check_killed()
assert staticcall ASF.balanceOf(self) >= amount, "!ASF"
rounded_amount: uint256 = amount
if weeks > 0:
rounded_amount -= amount % WAD
coin_required: uint256 = self._coin_required(rounded_amount, weeks)
assert coin_required > 0, "!coin"
assert coin_required <= max_coin_required, "slippage rekt you"
extcall DASF.burn(msg.sender, rounded_amount)
assert extcall USDAF.transferFrom(
msg.sender, self.payee, coin_required, default_return_value=True
)
if weeks == 0:
assert extcall ASF.transfer(
recipient, rounded_amount, default_return_value=True
)
else:
assert extcall VEASF.lock(
recipient, rounded_amount // WAD, weeks, default_return_value=True
)
log IRedemption.Redeem(
sender=msg.sender,
recipient=recipient,
amount=rounded_amount,
coin_required=coin_required,
weeks=weeks,
)
# ============================================================================================
# Privileged user functions
# ============================================================================================
@external
def privileged_redeem(amount: uint256, recipient: address = msg.sender):
"""
@notice Redeem your dASF for ASF for free
@dev Only callable by privileged users
@param amount amount of dASF to spend
@param recipient of the exercised ASF
"""
self._check_killed()
assert self.privileged[msg.sender], "!privileged"
assert staticcall ASF.balanceOf(self) >= amount, "!ASF"
extcall DASF.burn(msg.sender, amount)
assert extcall ASF.transfer(recipient, amount, default_return_value=True)
log IRedemption.Redeem(
sender=msg.sender,
recipient=recipient,
amount=amount,
coin_required=0,
weeks=0,
)
# ============================================================================================
# Owner functions
# ============================================================================================
@external
def set_payee(new_payee: address):
"""
@notice Set the payee of the USDaf used for redemptions
@dev Only callable by the owner
@param new_payee the new payee
"""
ownable._check_owner()
assert new_payee != empty(address), "!payee"
self.payee = new_payee
log IRedemption.SetPayee(new_payee=new_payee)
@external
def set_discount(min_discount: uint256, max_discount: uint256):
"""
@notice Set the min and max discount for redemptions
@dev Only callable by the owner
@param min_discount the minimum discount in percentage (18 decimals)
@param max_discount the maximum discount in percentage (18 decimals)
"""
ownable._check_owner()
assert min_discount < max_discount, "!min_discount"
assert max_discount < WAD, "!max_discount"
self.min_discount = min_discount
self.max_discount = max_discount
log IRedemption.SetDiscount(
min_discount=min_discount, max_discount=max_discount
)
@external
def set_min_lock_weeks(min_lock_weeks: uint256):
"""
@notice Set the minimum lock weeks for redemptions
@dev Only callable by the owner
@param min_lock_weeks the minimum lock weeks
"""
ownable._check_owner()
assert min_lock_weeks <= MAX_WEEKS, "!min_lock_weeks"
self.min_lock_weeks = min_lock_weeks
log IRedemption.SetMinLockWeeks(min_lock_weeks=min_lock_weeks)
@external
def set_privileged(user: address, privileged: bool):
"""
@notice Set the privileged status of a user
@dev Only callable by the owner
@param user the user to set
@param privileged the privileged status
"""
ownable._check_owner()
self.privileged[user] = privileged
log IRedemption.SetPrivileged(user=user, privileged=privileged)
@external
def kill():
"""
@notice Stop the contract from being used and reclaim ASF
@dev Only callable by the owner
"""
self._check_killed()
ownable._check_owner()
self.killed = True
balance: uint256 = staticcall ASF.balanceOf(self)
if balance > 0:
assert extcall ASF.transfer(
ownable.owner, balance, default_return_value=True
)
log IRedemption.Killed(balance=balance)
@external
def sweep(token: address) -> uint256:
"""
@notice Sweep any token other than ASF to the owner
@dev Only callable by the owner
@param token address of the token to sweep
@return amount of token swept
"""
assert self.killed or token != ASF.address, "!token"
ownable._check_owner()
amount: uint256 = staticcall IERC20(token).balanceOf(self)
assert amount > 0, "!balance"
assert extcall IERC20(token).transfer(
ownable.owner, amount, default_return_value=True
)
log IRedemption.Sweep(token=token, amount=amount)
return amount
# ============================================================================================
# Internal functions
# ============================================================================================
@internal
@view
def _coin_required(amount: uint256, weeks: uint256) -> uint256:
assert weeks >= self.min_lock_weeks, "!weeks"
return (
amount
* self._latest_price() // WAD
* (WAD - self._discount(weeks)) // WAD
)
@internal
@view
def _discount(weeks: uint256) -> uint256:
min_discount: uint256 = self.min_discount
max_discount: uint256 = self.max_discount
return min_discount + (
(max_discount - min_discount) * min(weeks, MAX_WEEKS) // MAX_WEEKS
)
@internal
@view
def _latest_price() -> uint256:
return convert(staticcall PRICE_FEED.latestAnswer(), uint256)
@internal
def _check_killed():
assert self.killed == False, "killed"
Read Contract
ASF 0x5ccbecc5 → address
DASF 0xc19d9cf2 → address
PRICE_FEED 0x31eb318a → address
USDAF 0x65f64696 → address
VEASF 0x8c2c4aee → address
coin_required 0x4f068da7 → uint256
coin_required 0x94565d40 → uint256
discount 0x0b1d07de → uint256
killed 0x1f3a0e41 → bool
latest_price 0x6839b449 → uint256
max_discount 0x26ae7f91 → uint256
min_discount 0xbcac600c → uint256
min_lock_weeks 0x859d3c48 → uint256
owner 0x8da5cb5b → address
payee 0xae90b213 → address
pending_owner 0x7f4ec4c3 → address
privileged 0xd7e0df7e → bool
Write Contract 14 functions
These functions modify contract state and require a wallet transaction to execute.
accept_ownership 0xa67c2dcb
No parameters
kill 0x41c0e1b5
No parameters
privileged_redeem 0xfa108c97
uint256 amount
privileged_redeem 0x8c662c82
uint256 amount
address recipient
redeem 0xdb006a75
uint256 amount
redeem 0x7cbc2373
uint256 amount
uint256 weeks
redeem 0xb8192205
uint256 amount
uint256 weeks
uint256 max_coin_required
redeem 0x5efa4943
uint256 amount
uint256 weeks
uint256 max_coin_required
address recipient
set_discount 0xd4228c1c
uint256 min_discount
uint256 max_discount
set_min_lock_weeks 0x9e4266d8
uint256 min_lock_weeks
set_payee 0xec9b28f1
address new_payee
set_privileged 0x058a40c1
address user
bool privileged
sweep 0x01681a62
address token
returns: uint256
transfer_ownership 0xf0350c04
address new_owner
Recent Transactions
No transactions found for this address