0 txs
4 calls
constructor
constructor()
functions
acceptedStablecoins
viewfunction acceptedStablecoins(address stablecoin) view returns (bool accepted)
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
allowlistRegistry
viewfunction allowlistRegistry() view returns (address)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
custodyAddress
viewfunction custodyAddress() view returns (address)
decimals
viewfunction decimals() view returns (uint8)
depositLimits
viewfunction depositLimits(address stablecoin) view returns (uint256 limit)
effectivePerAssetCapacity
viewfunction effectivePerAssetCapacity(address stablecoin) view returns (uint256)
globalDepositLimit
viewfunction globalDepositLimit() view returns (uint256)
kredConfig
viewfunction kredConfig() view returns (address)
maxOpenRedemptionsPerUser
viewfunction maxOpenRedemptionsPerUser() view returns (uint256)
maxRedemptionDelay
viewfunction maxRedemptionDelay() view returns (uint256)
minDepositAmount
viewfunction minDepositAmount() view returns (uint256)
minRedemptionAmount
viewfunction minRedemptionAmount() view returns (uint256)
minRedemptionDelay
viewfunction minRedemptionDelay() view returns (uint256)
name
viewfunction name() view returns (string)
openRedemptionCount
viewfunction openRedemptionCount(address) view returns (uint256)
paused
viewfunction paused() view returns (bool)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
redemptionCounter
viewfunction redemptionCounter(address user) view returns (uint256 count)
redemptionDelay
viewfunction redemptionDelay() view returns (uint256)
redemptions
viewfunction redemptions(address user, uint256 redemptionId) view returns (uint256 amount, address stablecoin, bool completed, uint256 unlockTime)
remainingGlobalCapacity
viewfunction remainingGlobalCapacity() view returns (uint256)
remainingPerAssetCapacity
viewfunction remainingPerAssetCapacity(address stablecoin) view returns (uint256)
symbol
viewfunction symbol() view returns (string)
totalDepositedGlobal
viewfunction totalDepositedGlobal() view returns (uint256)
totalDepositedPerStablecoin
viewfunction totalDepositedPerStablecoin(address stablecoin) view returns (uint256 totalDeposited)
totalSupply
viewfunction totalSupply() view returns (uint256)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
cancelRedemption
nonpayablefunction cancelRedemption(uint256 redemptionId)
completeRedemption
nonpayablefunction completeRedemption(uint256 redemptionId)
completeRedemptionAsManager
nonpayablefunction completeRedemptionAsManager(address user, uint256 redemptionId)
deposit
nonpayablefunction deposit(address stablecoin, uint256 amount, string referralId)
initialize
nonpayablefunction initialize(address _kredConfig, address _allowlistRegistry)
initiateRedemption
nonpayablefunction initiateRedemption(uint256 kusdAmount, address stablecoin) returns (uint256 redemptionId)
moveAssetsToCustody
nonpayablefunction moveAssetsToCustody(address stablecoin, uint256 amount)
pause
nonpayablefunction pause()
setCustodyAddress
nonpayablefunction setCustodyAddress(address newCustodyAddress)
setDepositLimit
nonpayablefunction setDepositLimit(address stablecoin, uint256 limit)
setGlobalDepositLimit
nonpayablefunction setGlobalDepositLimit(uint256 newLimit)
setMaxOpenRedemptionsPerUser
nonpayablefunction setMaxOpenRedemptionsPerUser(uint256 newMax)
setMinDepositAmount
nonpayablefunction setMinDepositAmount(uint256 newMinDepositAmount)
setMinRedemptionAmount
nonpayablefunction setMinRedemptionAmount(uint256 newMinRedemptionAmount)
setRedemptionDelay
nonpayablefunction setRedemptionDelay(uint256 newDelay)
setRedemptionDelayBounds
nonpayablefunction setRedemptionDelayBounds(uint256 newMinDelay, uint256 newMaxDelay)
setStablecoinAccepted
nonpayablefunction setStablecoinAccepted(address stablecoin, bool accepted)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
unpause
nonpayablefunction unpause()
updateKredConfig
nonpayablefunction updateKredConfig(address kredConfigAddr)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
AssetsMovedToCustody
event AssetsMovedToCustody(address indexed stablecoin, address indexed custodyAddress, uint256 amount)
CustodyAddressUpdated
event CustodyAddressUpdated(address indexed newCustodyAddress)
Deposit
event Deposit(address indexed user, address indexed stablecoin, uint256 stablecoinAmount, uint256 kusdAmount, string referralId)
DepositLimitUpdated
event DepositLimitUpdated(address indexed stablecoin, uint256 newLimit)
GlobalDepositLimitUpdated
event GlobalDepositLimitUpdated(uint256 newLimit)
Initialized
event Initialized(uint64 version)
KredConfigUpdated
event KredConfigUpdated(address indexed kredConfig)
MaxOpenRedemptionsPerUserUpdated
event MaxOpenRedemptionsPerUserUpdated(uint256 newMax)
MinDepositAmountUpdated
event MinDepositAmountUpdated(uint256 newMinDepositAmount)
MinRedemptionAmountUpdated
event MinRedemptionAmountUpdated(uint256 newMinRedemptionAmount)
Paused
event Paused(address account)
RedemptionCancelled
event RedemptionCancelled(address indexed user, uint256 indexed redemptionId)
RedemptionCompleted
event RedemptionCompleted(address indexed user, uint256 indexed redemptionId, address stablecoin, uint256 stablecoinAmount)
RedemptionDelayBoundsUpdated
event RedemptionDelayBoundsUpdated(uint256 newMinDelay, uint256 newMaxDelay)
RedemptionDelayUpdated
event RedemptionDelayUpdated(uint256 newRedemptionDelay)
RedemptionInitiated
event RedemptionInitiated(address indexed user, uint256 indexed redemptionId, uint256 kusdAmount, address stablecoin, uint256 unlockTime)
StablecoinAccepted
event StablecoinAccepted(address indexed stablecoin, bool accepted)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Unpaused
event Unpaused(address account)
Upgraded
event Upgraded(address indexed implementation)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
AddressOnForbiddenList
error AddressOnForbiddenList(address account)
AmountTooSmall
error AmountTooSmall()
BelowMinDeposit
error BelowMinDeposit(uint256 minRequired)
BelowMinRedemption
error BelowMinRedemption(uint256 minRequired)
CallerNotKredConfigAdmin
error CallerNotKredConfigAdmin()
CallerNotKredConfigManager
error CallerNotKredConfigManager()
CallerNotKredConfigPauser
error CallerNotKredConfigPauser()
DepositLimitExceeded
error DepositLimitExceeded(address stablecoin, uint256 limit, uint256 currentTotal, uint256 attemptedDeposit)
EnforcedPause
error EnforcedPause()
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
ExpectedPause
error ExpectedPause()
FailedCall
error FailedCall()
GlobalDepositLimitExceeded
error GlobalDepositLimitExceeded(uint256 limit, uint256 currentTotal, uint256 attemptedDeposit)
InsufficientStablecoinBalance
error InsufficientStablecoinBalance(address stablecoin, uint256 required, uint256 available)
InvalidInitialization
error InvalidInitialization()
InvalidRedemption
error InvalidRedemption(uint256 redemptionId)
InvalidRedemptionDelayBounds
error InvalidRedemptionDelayBounds(uint256 newMinDelay, uint256 newMaxDelay)
NotAllowlisted
error NotAllowlisted()
NotInitializing
error NotInitializing()
RedemptionAlreadyCompleted
error RedemptionAlreadyCompleted(uint256 redemptionId)
RedemptionDelayOutOfBounds
error RedemptionDelayOutOfBounds(uint256 minAllowed, uint256 maxAllowed, uint256 requested)
RedemptionNotReady
error RedemptionNotReady()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StablecoinNotAccepted
error StablecoinNotAccepted(address stablecoin)
TooManyOpenRedemptions
error TooManyOpenRedemptions(uint256 current, uint256 maxAllowed)
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
ZeroAddressNotAllowed
error ZeroAddressNotAllowed()
ZeroAddressNotAllowed
error ZeroAddressNotAllowed()
ZeroAmount
error ZeroAmount()
creation bytecode
0x60a060405230608052348015610013575f5ffd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051613dac6100f95f395f81816128bf015281816128e80152612a980152613dac5ff3fe60806040526004361061032f575f3560e01c8063645006ca116101a75780639b31c3a8116100e7578063c48fd0f411610092578063dd62ed3e1161006d578063dd62ed3e14610971578063ed1a0989146109d4578063f0baa81614610a6e578063f1a9ee0314610a8d575f5ffd5b8063c48fd0f414610908578063c8ae5d8614610927578063d810e6f814610946575f5ffd5b8063ad3cb1cc116100c2578063ad3cb1cc1461088c578063b8d94b80146108d4578063bfe07da6146108e9575f5ffd5b80639b31c3a8146108435780639f027e7314610858578063a9059cbb1461086d575f5ffd5b80637d42151b116101525780638456cb591161012d5780638456cb59146107dd578063875601eb146107f15780639219e5101461081057806395d89b411461082f575f5ffd5b80637d42151b1461077457806381c43ccf14610793578063840ecba0146107be575f5ffd5b8063753e80d411610182578063753e80d41461070b57806375896d651461073657806379c303a814610755575f5ffd5b8063645006ca14610678578063708eaefb1461068d57806370a08231146106b8575f5ffd5b806326973c4d11610272578063464f2e991161021d57806350fc32d0116101f857806350fc32d0146105fa57806352d1902d1461060f5780635c975abb146106235780635dd319e214610659575f5ffd5b8063464f2e99146105a9578063485cc955146105c85780634f1ef286146105e7575f5ffd5b80632a80cda31161024d5780632a80cda31461055b578063313ce5671461057a5780633f4ba83a14610595575f5ffd5b806326973c4d146104e7578063272d177d1461050657806327fd80cf14610525575f5ffd5b806313d7cafb116102dd5780631e0c929d116102b85780631e0c929d1461048a578063211ec2dd1461049f57806323b872dd146104b45780632657d8d9146104d3575f5ffd5b806313d7cafb1461040a57806318160ddd1461042957806319fee2561461045c575f5ffd5b806306fdde031161030d57806306fdde0314610399578063095ea7b3146103ba5780630fd07b34146103e9575f5ffd5b80630134363c14610333578063048b808d1461036557806304b6b9a614610384575b5f5ffd5b34801561033e575f5ffd5b5061035261034d3660046136d4565b610aac565b6040519081526020015b60405180910390f35b348015610370575f5ffd5b5061035261037f3660046136ed565b610ae8565b34801561038f575f5ffd5b5061035260055481565b3480156103a4575f5ffd5b506103ad610d80565b60405161035c9190613717565b3480156103c5575f5ffd5b506103d96103d436600461374c565b610e53565b604051901515815260200161035c565b3480156103f4575f5ffd5b50610408610403366004613774565b610e6a565b005b348015610415575f5ffd5b5061040861042436600461378b565b610eae565b348015610434575f5ffd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610352565b348015610467575f5ffd5b506103d96104763660046136d4565b600c6020525f908152604090205460ff1681565b348015610495575f5ffd5b5061035260085481565b3480156104aa575f5ffd5b5061035260065481565b3480156104bf575f5ffd5b506103d96104ce3660046137ab565b610f77565b3480156104de575f5ffd5b50610352610fa9565b3480156104f2575f5ffd5b5061040861050136600461374c565b610fec565b348015610511575f5ffd5b5061040861052036600461374c565b61103e565b348015610530575f5ffd5b505f54610543906001600160a01b031681565b6040516001600160a01b03909116815260200161035c565b348015610566575f5ffd5b50610408610575366004613774565b6110a9565b348015610585575f5ffd5b506040516012815260200161035c565b3480156105a0575f5ffd5b506104086110e6565b3480156105b4575f5ffd5b506104086105c3366004613774565b6110f8565b3480156105d3575f5ffd5b506104086105e23660046137e5565b611135565b6104086105f536600461383a565b6113de565b348015610605575f5ffd5b5061035260045481565b34801561061a575f5ffd5b506103526113f9565b34801561062e575f5ffd5b507fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166103d9565b348015610664575f5ffd5b5061040861067336600461374c565b611427565b348015610683575f5ffd5b5061035260015481565b348015610698575f5ffd5b506103526106a73660046136d4565b600b6020525f908152604090205481565b3480156106c3575f5ffd5b506103526106d23660046136d4565b6001600160a01b03165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00602052604090205490565b348015610716575f5ffd5b506103526107253660046136d4565b600f6020525f908152604090205481565b348015610741575f5ffd5b506104086107503660046136d4565b6115f0565b348015610760575f5ffd5b5061040861076f366004613774565b611697565b34801561077f575f5ffd5b50600754610543906001600160a01b031681565b34801561079e575f5ffd5b506103526107ad3660046136d4565b600e6020525f908152604090205481565b3480156107c9575f5ffd5b506104086107d8366004613774565b6116d4565b3480156107e8575f5ffd5b50610408611725565b3480156107fc575f5ffd5b50601054610543906001600160a01b031681565b34801561081b575f5ffd5b5061040861082a366004613774565b611735565b34801561083a575f5ffd5b506103ad6118de565b34801561084e575f5ffd5b5061035260035481565b348015610863575f5ffd5b5061035260025481565b348015610878575f5ffd5b506103d961088736600461374c565b61192f565b348015610897575f5ffd5b506103ad6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156108df575f5ffd5b5061035260095481565b3480156108f4575f5ffd5b506104086109033660046138ff565b61195f565b348015610913575f5ffd5b506103526109223660046136d4565b611bef565b348015610932575f5ffd5b506104086109413660046136d4565b611c62565b348015610951575f5ffd5b506103526109603660046136d4565b600a6020525f908152604090205481565b34801561097c575f5ffd5b5061035261098b3660046137e5565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b3480156109df575f5ffd5b50610a406109ee36600461374c565b600d60209081525f928352604080842090915290825290208054600182015460029092015490916001600160a01b038116917401000000000000000000000000000000000000000090910460ff169084565b604080519485526001600160a01b03909316602085015290151591830191909152606082015260800161035c565b348015610a79575f5ffd5b50610408610a8836600461398f565b611d0b565b348015610a98575f5ffd5b50610408610aa7366004613774565b611dcf565b5f81610ab781611e76565b5f610ac0610fa9565b90505f610acc85611bef565b9050808210610adb5780610add565b815b935050505b50919050565b5f610af1611ed2565b610af9611f2e565b610b0233611faf565b33610b0c8161206a565b82610b1681611e76565b845f03610b4f576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025415801590610b61575060025485105b15610ba7576002546040517fdd582203000000000000000000000000000000000000000000000000000000008152600401610b9e91815260200190565b60405180910390fd5b60045415610c0657335f908152600f60205260409020546004548110610c0457600480546040517fa865d7bf0000000000000000000000000000000000000000000000000000000081529182018390526024820152604401610b9e565b505b610c11333087612131565b335f908152600e60205260408120805491610c2b836139f1565b9190505592505f60035442610c409190613a09565b604080516080810182528881526001600160a01b0380891660208084019182525f8486018181526060860188815233808452600d85528884208e855285528884209751885594516001880180549351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090941691909716179190911790945592516002909401939093558152600f909152908120805492935090610cfc836139f1565b9091555050604080518781526001600160a01b0387166020820152908101829052849033907f64c50aebb091b98cb862f8e7036591a538b9f4d10eeeb94073a3d866ff323d7f9060600160405180910390a3505050610d7a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b92915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610dd190613a1c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfd90613a1c565b8015610e485780601f10610e1f57610100808354040283529160200191610e48565b820191905f5260205f20905b815481529060010190602001808311610e2b57829003601f168201915b505050505091505090565b5f33610e608185856121eb565b5060019392505050565b610e726121f8565b60088190556040518181527f838b17f2793ab3b163f66fdf1e893d98d02a056b0343844720f1a4148a04b806906020015b60405180910390a150565b610eb66121f8565b8015801590610ec457508181105b15610f05576040517f5a316b4d0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610b9e565b816003541015610f155760038290555b8015801590610f25575080600354115b15610f305760038190555b6005829055600681905560408051838152602081018390527fd890e0c6f1071ab35356bde262238a9ce1f1d5909ea563f7e90bd2f574eeba83910160405180910390a15050565b5f610f80611ed2565b83610f8a8161206a565b83610f948161206a565b610f9f868686612336565b9695505050505050565b6008545f9060018101610fbe575f1991505090565b801580610fcd57508060095410155b15610fd9575f91505090565b600954610fe69082613a67565b91505090565b610ff4611f2e565b610ffc6121f8565b816110068161206a565b611010838361235b565b5061103a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050565b6110466121f8565b8161105081611e76565b6001600160a01b0383165f818152600a602052604090819020849055517feaf15143570c71834bfc4bbd80560897b6b67aaa704aeefeeb2a3fb7f6054d0e9061109c9085815260200190565b60405180910390a2505050565b6110b16121f8565b60018190556040518181527fb443c8bd39a1b60d415144f9148c6f90c2b68a553eb90c62cef5e44979db009d90602001610ea3565b6110ee612692565b6110f66127d0565b565b6111006121f8565b60028190556040518181527fe0db4efef2f1bffa9dbb9493053afedd55a2bc80a9c2044a8c9e3c66f1bdcefd90602001610ea3565b5f61113e61285a565b805490915060ff68010000000000000000820416159067ffffffffffffffff165f8115801561116a5750825b90505f8267ffffffffffffffff1660011480156111865750303b155b905081158015611194575080155b156111cb576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561122c5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b6001600160a01b03871661126c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0386166112ac576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113206040518060400160405280600881526020017f4b726564205553440000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4b55534400000000000000000000000000000000000000000000000000000000815250612882565b611328612894565b61133061289c565b611338612894565b611341876128ac565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881617905583156113d55784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6113e66128b4565b6113ef82612984565b61103a828261298c565b5f611402612a8d565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b61142f6121f8565b8161143981611e76565b6010546001600160a01b031661147b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f036114b4576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015611511573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115359190613a7a565b90508281101561158a576040517f06badb9a0000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024810184905260448101829052606401610b9e565b6010546115a4906001600160a01b03868116911685612aef565b6010546040518481526001600160a01b03918216918616907fa0787b1453b33f13bb59b8a0e4b8d0eb9add8ce37d6e85a969956acca49100b9906020015b60405180910390a350505050565b6115f8612692565b6001600160a01b038116611638576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117825560405190917f812b30cbd6b8c4ed99403bddd98415674b357a8618673598e6bb618602782a0391a250565b61169f6121f8565b60048190556040518181527f3a09631aa06300cbe61df327a74c5548d5597c626da976dceaa1f329efb84bd790602001610ea3565b6116dc611ed2565b6116e4611f2e565b336116ee8161206a565b6116f8338361235b565b5061172260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50565b61172d612b63565b6110f6612ca1565b61173d611f2e565b611745611ed2565b3361174f8161206a565b335f908152600d602090815260408083208584529091529020600181015474010000000000000000000000000000000000000000900460ff16156117c2576040517fcb2b534700000000000000000000000000000000000000000000000000000000815260048101849052602401610b9e565b80545f036117ff576040517f5c7bf7ac00000000000000000000000000000000000000000000000000000000815260048101849052602401610b9e565b80546001820180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905561184d303383612131565b335f908152600f60205260409020541561188657335f908152600f60205260408120805460019290611880908490613a67565b90915550505b604051849033907f9aec5cafc1451c1485e4a0099bd4dfb4c9d2bb972b4e5c798da07db8323deaa3905f90a350505061172260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060917f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0091610dd190613a1c565b5f611938611ed2565b336119428161206a565b8361194c8161206a565b6119568585612d1a565b95945050505050565b611967611ed2565b61196f611f2e565b61197833611faf565b336119828161206a565b8461198c81611e76565b845f036119c5576040517f1f2a200500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6119d08787612d27565b90506001545f141580156119e5575060015481105b15611a22576001546040517f37bc4e18000000000000000000000000000000000000000000000000000000008152600401610b9e91815260200190565b5f1960085414611a93575f81600954611a3b9190613a09565b9050600854811115611a8f576008546009546040517f1c5fb39a0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260448101839052606401610b9e565b6009555b6001600160a01b0387165f908152600a60205260409020545f198114611b4c576001600160a01b0388165f908152600b602052604081205490611ad68483613a09565b905082811115611b32576040517f13a4226c0000000000000000000000000000000000000000000000000000000081526001600160a01b038b166004820152602481018490526044810183905260648101859052608401610b9e565b6001600160a01b038a165f908152600b6020526040902055505b611b616001600160a01b03891633308a612e12565b611b6b3383612e4b565b876001600160a01b0316336001600160a01b03167f907ff0b577abac3b4513f9292baa8233f05fb09942f8ee9a6b676216d557598a89858a8a604051611bb49493929190613a91565b60405180910390a350505050611be960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050565b5f81611bfa81611e76565b6001600160a01b0383165f908152600a602052604090205460018101611c24575f19925050610ae2565b6001600160a01b0384165f908152600b6020526040902054811580611c495750818110155b15611c58575f93505050610ae2565b610add8183613a67565b611c6a612692565b6001600160a01b038116611caa576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517fcb16112dbd42611696c17aac7aa2fb48fbe66c992d92226599939cce873fade0905f90a250565b611d136121f8565b6001600160a01b038216611d53576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382165f818152600c602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527fc710aeab1431896d09dedd68a6f5a4d9fdb93941799e14e8b856b5471cbc25e0910160405180910390a25050565b611dd76121f8565b600554811080611df4575060065415801590611df4575060065481115b15611e41576005546006546040517fc8b240230000000000000000000000000000000000000000000000000000000081526004810192909252602482015260448101829052606401610b9e565b60038190556040518181527f7b2cd1e2d4db53ff7b172aac08b8f6bdcd5420e86662c33f7328017e3a88669a90602001610ea3565b6001600160a01b0381165f908152600c602052604090205460ff16611722576040517ff25337770000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610b9e565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16156110f6576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080547ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01611fa9576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60029055565b6007546040517fbabcc5390000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301529091169063babcc53990602401602060405180830381865afa158015612010573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120349190613acd565b611722576040517f06fb10a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546040517f9e37878c0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015290911690639e37878c90602401602060405180830381865afa1580156120cb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ef9190613acd565b15611722576040517fcae32f290000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610b9e565b6001600160a01b038316612173576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610b9e565b6001600160a01b0382166121b5576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610b9e565b6121c0838383612e94565b505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6121c08383836001612feb565b5f54604080517fec87621c00000000000000000000000000000000000000000000000000000000815290516001600160a01b03909216916391d1485491839163ec87621c916004808201926020929091908290030181865afa158015612260573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122849190613a7a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152336024820152604401602060405180830381865afa1580156122dc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123009190613acd565b6110f6576040517f32e3808400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3361234385828561310b565b61234e858585612131565b60019150505b9392505050565b6001600160a01b0382165f908152600d602090815260408083208484529091529020600181015474010000000000000000000000000000000000000000900460ff16156123d7576040517fcb2b534700000000000000000000000000000000000000000000000000000000815260048101839052602401610b9e565b80545f03612414576040517f5c7bf7ac00000000000000000000000000000000000000000000000000000000815260048101839052602401610b9e565b8060020154421015612452576040517f9aeb1d7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181015481545f91612470916001600160a01b03909116906131b9565b9050805f036124ab576040517fc2f5625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018201546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561250c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125309190613a7a565b90508181101561258b5760018301546040517f06badb9a0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024810183905260448101829052606401610b9e565b6001830180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905582546125d9903090613272565b60018301546125f2906001600160a01b03168684612aef565b6001600160a01b0385165f908152600f60205260409020541561263d576001600160a01b0385165f908152600f60205260408120805460019290612637908490613a67565b90915550505b6001830154604080516001600160a01b0392831681526020810185905286928816917ffd418381fd385fa40c54005e4745aac73c2bc925bdbcf3ace12712373c8674a791015b60405180910390a35050505050565b5f54604080517fa217fddf00000000000000000000000000000000000000000000000000000000815290516001600160a01b03909216916391d1485491839163a217fddf916004808201926020929091908290030181865afa1580156126fa573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271e9190613a7a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152336024820152604401602060405180830381865afa158015612776573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061279a9190613acd565b6110f6576040517f943f789c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127d86132bf565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001610ea3565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610d7a565b61288a61331a565b61103a8282613358565b6110f661331a565b6128a461331a565b6110f66133bb565b6115f861331a565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061294d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166129417f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b156110f6576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611722612692565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156129e6575060408051601f3d908101601f191682019092526129e391810190613a7a565b60015b612a27576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b9e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612a83576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610b9e565b6121c083836133c3565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110f6576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038381166024830152604482018390526121c091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613418565b5f54604080517fe63ab1e900000000000000000000000000000000000000000000000000000000815290516001600160a01b03909216916391d1485491839163e63ab1e9916004808201926020929091908290030181865afa158015612bcb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bef9190613a7a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152336024820152604401602060405180830381865afa158015612c47573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c6b9190613acd565b6110f6576040517f37cf9f0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ca9611ed2565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612842565b5f33610e60818585612131565b5f5f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d65573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d899190613ae8565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee60ff821601612dbe5782915050610d7a565b601260ff82161015612df257612dd5816012613b08565b612de090600a613c04565b612dea9084613c12565b915050610d7a565b612dfd601282613b08565b612e0890600a613c04565b612dea9084613c29565b6040516001600160a01b038481166024830152838116604483015260648201839052611be99186918216906323b872dd90608401612b1c565b6001600160a01b038216612e8d576040517fec442f050000000000000000000000000000000000000000000000000000000081525f6004820152602401610b9e565b61103a5f83835b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b038416612ee15781816002015f828254612ed69190613a09565b90915550612f6a9050565b6001600160a01b0384165f9081526020829052604090205482811015612f4c576040517fe450d38c0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905260448101849052606401610b9e565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316612f88576002810180548390039055612fa6565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115e291815260200190565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace006001600160a01b03851661304e576040517fe602df050000000000000000000000000000000000000000000000000000000081525f6004820152602401610b9e565b6001600160a01b038416613090576040517f94280d620000000000000000000000000000000000000000000000000000000081525f6004820152602401610b9e565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561310457836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161268391815260200190565b5050505050565b6001600160a01b038381165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160209081526040808320938616835292905220545f19811015611be957818110156131ab576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810182905260448101839052606401610b9e565b611be984848484035f612feb565b5f5f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061321b9190613ae8565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee60ff8216016132505782915050610d7a565b601260ff8216101561326757612dfd816012613b08565b612dd5601282613b08565b6001600160a01b0382166132b4576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f6004820152602401610b9e565b61103a825f83612e94565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff166110f6576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61332261349d565b6110f6576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61336061331a565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036133ac8482613ca5565b5060048101611be98382613ca5565b6121c561331a565b6133cc826134bb565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613410576121c08282613562565b61103a6135cb565b5f5f60205f8451602086015f885af180613437576040513d5f823e3d81fd5b50505f513d9150811561344e57806001141561345b565b6001600160a01b0384163b155b15611be9576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610b9e565b5f6134a661285a565b5468010000000000000000900460ff16919050565b806001600160a01b03163b5f03613509576040517f4c9c8ce30000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610b9e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161357e9190613d60565b5f60405180830381855af49150503d805f81146135b6576040519150601f19603f3d011682016040523d82523d5f602084013e6135bb565b606091505b5091509150611956858383613603565b34156110f6576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826136185761361382613678565b612354565b815115801561362f57506001600160a01b0384163b155b15613671576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610b9e565b5080612354565b80511561368757805160208201fd5b6040517fd6bda27500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b03811681146136cf575f5ffd5b919050565b5f602082840312156136e4575f5ffd5b612354826136b9565b5f5f604083850312156136fe575f5ffd5b8235915061370e602084016136b9565b90509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f6040838503121561375d575f5ffd5b613766836136b9565b946020939093013593505050565b5f60208284031215613784575f5ffd5b5035919050565b5f5f6040838503121561379c575f5ffd5b50508035926020909101359150565b5f5f5f606084860312156137bd575f5ffd5b6137c6846136b9565b92506137d4602085016136b9565b929592945050506040919091013590565b5f5f604083850312156137f6575f5ffd5b6137ff836136b9565b915061370e602084016136b9565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5f6040838503121561384b575f5ffd5b613854836136b9565b9150602083013567ffffffffffffffff81111561386f575f5ffd5b8301601f8101851361387f575f5ffd5b803567ffffffffffffffff8111156138995761389961380d565b604051601f19603f601f19601f8501160116810181811067ffffffffffffffff821117156138c9576138c961380d565b6040528181528282016020018710156138e0575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f5f5f60608587031215613912575f5ffd5b61391b856136b9565b935060208501359250604085013567ffffffffffffffff81111561393d575f5ffd5b8501601f8101871361394d575f5ffd5b803567ffffffffffffffff811115613963575f5ffd5b876020828401011115613974575f5ffd5b949793965060200194505050565b8015158114611722575f5ffd5b5f5f604083850312156139a0575f5ffd5b6139a9836136b9565b915060208301356139b981613982565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f5f198203613a0257613a026139c4565b5060010190565b80820180821115610d7a57610d7a6139c4565b600181811c90821680613a3057607f821691505b602082108103610ae2577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b81810381811115610d7a57610d7a6139c4565b5f60208284031215613a8a575f5ffd5b5051919050565b84815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f60208284031215613add575f5ffd5b815161235481613982565b5f60208284031215613af8575f5ffd5b815160ff81168114612354575f5ffd5b60ff8281168282160390811115610d7a57610d7a6139c4565b6001815b6001841115613b5c57808504811115613b4057613b406139c4565b6001841615613b4e57908102905b60019390931c928002613b25565b935093915050565b5f82613b7257506001610d7a565b81613b7e57505f610d7a565b8160018114613b945760028114613b9e57613bba565b6001915050610d7a565b60ff841115613baf57613baf6139c4565b50506001821b610d7a565b5060208310610133831016604e8410600b8410161715613bdd575081810a610d7a565b613be95f198484613b21565b805f1904821115613bfc57613bfc6139c4565b029392505050565b5f61235460ff841683613b64565b8082028115828204841417610d7a57610d7a6139c4565b5f82613c5c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b601f8211156121c057805f5260205f20601f840160051c81016020851015613c865750805b601f840160051c820191505b81811015613104575f8155600101613c92565b815167ffffffffffffffff811115613cbf57613cbf61380d565b613cd381613ccd8454613a1c565b84613c61565b6020601f821160018114613d05575f8315613cee5750848201515b5f19600385901b1c1916600184901b178455613104565b5f84815260208120601f198516915b82811015613d345787850151825560209485019460019092019101613d14565b5084821015613d5157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f92019182525091905056fea2646970667358221220e65911c81f4ca96c7499817280d0aba9a94bdbca12200e92387af299d6d27e8564736f6c634300081e0033