14 txs
25 calls
constructor
constructor(address _fxToken, address _migrator, address _uniswapFactory, address _lockerFactory, address _initialOwner)
functions
creatorTokenInfo
viewfunction creatorTokenInfo(address) view returns (address user, address graduatedToken, uint256 supply, bool tradingEnabled, bool isGraduated)
creatorTokens
viewfunction creatorTokens(uint256) view returns (address)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
feePercentage
viewfunction feePercentage() view returns (uint256)
feeReceiver
viewfunction feeReceiver() view returns (address)
fxToken
viewfunction fxToken() view returns (address)
getAmountOut
viewfunction getAmountOut(address _creatorToken, uint256 _amountIn, uint8 _orderType) view returns (uint256 amountOut, uint256 feeAmount)
getCreatorTokens
viewfunction getCreatorTokens(address _user) view returns (address[])
getCreatorTokensPaginated
viewfunction getCreatorTokensPaginated(uint256 _offset, uint256 _limit) view returns (address[] tokens, uint256 total)
getGraduatedToken
viewfunction getGraduatedToken(address _creatorToken) view returns (address graduatedToken)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getTokenReserves
viewfunction getTokenReserves(address _creatorToken) view returns (uint256, uint256)
getTotalCreatorTokens
viewfunction getTotalCreatorTokens() view returns (uint256)
getTotalReserves
viewfunction getTotalReserves(address _creatorToken) view returns (uint256, uint256)
getTotalUsers
viewfunction getTotalUsers() view returns (uint256)
getUserTokensPaginated
viewfunction getUserTokensPaginated(address _user, uint256 _offset, uint256 _limit) view returns (address[] tokens, uint256 total)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
INITIAL_FEE_PERCENTAGE
viewfunction INITIAL_FEE_PERCENTAGE() view returns (uint256)
INITIAL_K
viewfunction INITIAL_K() view returns (uint256)
INITIAL_MAX_GRADUATION_RESERVE
viewfunction INITIAL_MAX_GRADUATION_RESERVE() view returns (uint256)
INITIAL_MIN_SEED_AMOUNT
viewfunction INITIAL_MIN_SEED_AMOUNT() view returns (uint256)
INITIAL_SUPPLY
viewfunction INITIAL_SUPPLY() view returns (uint256)
initialSupply
viewfunction initialSupply() view returns (uint256)
isEligibleForGraduation
viewfunction isEligibleForGraduation(address _creatorToken) view returns (uint8)
k
viewfunction k() view returns (uint256)
LAUNCHER_ROLE
viewfunction LAUNCHER_ROLE() view returns (bytes32)
lockerFactory
viewfunction lockerFactory() view returns (address)
MAX_FEE_PERCENTAGE
viewfunction MAX_FEE_PERCENTAGE() view returns (uint256)
maxGraduationReserve
viewfunction maxGraduationReserve() view returns (uint256)
minSeedAmount
viewfunction minSeedAmount() view returns (uint256)
owner
viewfunction owner() view returns (address)
paused
viewfunction paused() view returns (bool)
pausedSelectors
viewfunction pausedSelectors(bytes4) view returns (bool)
poolInfo
viewfunction poolInfo(address) view returns (uint256 creatorReserve, uint256 fxReserve, uint256 k, uint256 feePercentage, address feeReceiver, uint256 virtualReserveAmount)
previewLaunch
viewfunction previewLaunch(uint256 _desiredAmountOut) view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
uniswapFactory
viewfunction uniswapFactory() view returns (address)
uniswapMigrator
viewfunction uniswapMigrator() view returns (address)
users
viewfunction users(uint256) view returns (address)
virtualReserve
viewfunction virtualReserve() view returns (uint256)
buy
nonpayablefunction buy(address _creatorToken, uint256 _amountIn, uint256 _minAmountOut)
graduate
nonpayablefunction graduate(address _creatorToken)
grantLauncherRole
nonpayablefunction grantLauncherRole(address _launcher)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
launch
nonpayablefunction launch(string _name, string _symbol, uint256 _totalFxAmountIn, string _contractURI) returns (address creatorToken)
launchFor
nonpayablefunction launchFor(address _creator, string _name, string _symbol, uint256 _totalFxAmountIn, string _contractURI) returns (address creatorToken)
migrate
nonpayablefunction migrate(address _creatorToken)
migrateFor
nonpayablefunction migrateFor(address _creatorToken, address _user)
pause
nonpayablefunction pause()
pauseSelector
nonpayablefunction pauseSelector(bytes4 _selector)
renounceOwnership
nonpayablefunction renounceOwnership()
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeLauncherRole
nonpayablefunction revokeLauncherRole(address _launcher)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
sell
nonpayablefunction sell(address _creatorToken, uint256 _amountIn, uint256 _minAmountOut)
setFeePercentage
nonpayablefunction setFeePercentage(uint256 _newPercentage)
setFeeReceiver
nonpayablefunction setFeeReceiver(address _newReceiver)
setInitialSupply
nonpayablefunction setInitialSupply(uint256 _newSupply)
setK
nonpayablefunction setK(uint256 _newK)
setMaxGraduationReserve
nonpayablefunction setMaxGraduationReserve(uint256 _newReserve)
setMinSeedAmount
nonpayablefunction setMinSeedAmount(uint256 _newAmount)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unpause
nonpayablefunction unpause()
unpauseSelector
nonpayablefunction unpauseSelector(bytes4 _selector)
events
FeeCollected
event FeeCollected(address indexed creatorToken, address indexed feeReceiver, uint256 feeAmount)
FeePercentageUpdated
event FeePercentageUpdated(uint256 feePercentage)
FeeReceiverUpdated
event FeeReceiverUpdated(address indexed feeReceiver)
Graduated
event Graduated(address indexed creatorToken, address indexed graduatedToken, uint256 creatorLiquidity, uint256 fxLiquidity)
InitialSupplyUpdated
event InitialSupplyUpdated(uint256 initialSupply)
KUpdated
event KUpdated(uint256 k)
Launched
event Launched(address indexed user, address indexed creatorToken, address indexed graduatedToken, uint256 id, string name, string symbol)
LockerCreated
event LockerCreated(address indexed creatorToken, address indexed pair, address indexed locker, uint256 liquidity)
MaxGraduationReserveUpdated
event MaxGraduationReserveUpdated(uint256 maxGraduationReserve)
Migrated
event Migrated(address indexed user, address indexed creatorToken, address indexed graduatedToken, uint256 amount)
MinSeedAmountUpdated
event MinSeedAmountUpdated(uint256 minSeedAmount)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
Paused
event Paused(address account)
PoolInitialized
event PoolInitialized(address indexed creatorToken, address indexed feeReceiver, uint256 creatorReserve, uint256 fxReserve, uint256 k, uint256 feeAmount)
PoolUpdated
event PoolUpdated(address indexed creatorToken, uint256 creatorReserve, uint256 fxReserve)
Purchased
event Purchased(address indexed creatorToken, address indexed sender, address indexed recipient, uint256 amountIn, uint256 amountOut, uint256 feeAmount)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
SelectorPaused
event SelectorPaused(bytes4 indexed selector)
SelectorUnpaused
event SelectorUnpaused(bytes4 indexed selector)
Sold
event Sold(address indexed creatorToken, address indexed sender, address indexed recipient, uint256 amountIn, uint256 amountOut, uint256 feeAmount)
Unpaused
event Unpaused(address account)
UserCreated
event UserCreated(address indexed user)
VirtualReserveUpdated
event VirtualReserveUpdated(uint256 virtualReserve)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
EnforcedPause
error EnforcedPause()
ExpectedPause
error ExpectedPause()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
SelectorNotPausedError
error SelectorNotPausedError(bytes4 selector)
SelectorPausedError
error SelectorPausedError(bytes4 selector)
TokenLaunchpad__CalculationOverflow
error TokenLaunchpad__CalculationOverflow()
TokenLaunchpad__FeeExceedsMaximum
error TokenLaunchpad__FeeExceedsMaximum()
TokenLaunchpad__InsufficientAmountOut
error TokenLaunchpad__InsufficientAmountOut()
TokenLaunchpad__InsufficientLiquidity
error TokenLaunchpad__InsufficientLiquidity()
TokenLaunchpad__InvalidCreatorAddress
error TokenLaunchpad__InvalidCreatorAddress()
TokenLaunchpad__InvalidGraduation
error TokenLaunchpad__InvalidGraduation()
TokenLaunchpad__InvalidGraduationReserve
error TokenLaunchpad__InvalidGraduationReserve()
TokenLaunchpad__InvalidK
error TokenLaunchpad__InvalidK()
TokenLaunchpad__InvalidPurchaseAmount
error TokenLaunchpad__InvalidPurchaseAmount()
TokenLaunchpad__InvalidRate
error TokenLaunchpad__InvalidRate()
TokenLaunchpad__InvalidSeedAmount
error TokenLaunchpad__InvalidSeedAmount()
TokenLaunchpad__InvalidSupply
error TokenLaunchpad__InvalidSupply()
TokenLaunchpad__NoTokensToMigrate
error TokenLaunchpad__NoTokensToMigrate()
TokenLaunchpad__TokenNotGraduated
error TokenLaunchpad__TokenNotGraduated()
TokenLaunchpad__TokenNotLaunched
error TokenLaunchpad__TokenNotLaunched()
TokenLaunchpad__TradingNotEnabled
error TokenLaunchpad__TradingNotEnabled()
TokenLaunchpad__ZeroAddress
error TokenLaunchpad__ZeroAddress()
TokenLaunchpad__ZeroAmountIn
error TokenLaunchpad__ZeroAmountIn()
creation bytecode
0x610100604052348015610010575f5ffd5b506040516139d43803806139d483398101604081905261002f91610535565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100668161016e565b505f805460ff60a01b191690556001600160a01b038516158061009057506001600160a01b038416155b806100a257506001600160a01b038316155b806100b457506001600160a01b038216155b156100d15760405162cf25c560e51b815260040160405180910390fd5b6100db5f826101bd565b506001600160a01b0380861660805284811660c05283811660a052821660e0526101048161026a565b61010e60646102d9565b61012169d3c21bcecceda1000000610338565b61013469021e19e0c9bab240000061038d565b61015173059aedfc10d7279c5eed140164540000000000006103e2565b610164692a5a058fc295ed000000610445565b50505050506105d4565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8281526002602090815260408083206001600160a01b038516845290915281205460ff16610261575f8381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556102193390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610264565b505f5b92915050565b6001600160a01b0381166102905760405162cf25c560e51b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040517f27aae5db36d94179909d019ae0b1ac7c16d96d953148f63c0f6a0a9c8ead79ee905f90a250565b6103e88111156102fc57604051636722ab9d60e01b815260040160405180910390fd5b60038190556040518181527f74516f05eb4bd2461d57aa1e935ee553f86a3e02bfed7759f2f772915de3d9be906020015b60405180910390a150565b805f0361035857604051633ef357b760e01b815260040160405180910390fd5b60058190556040518181527f884fe55db8b81cd3003cf17b0fad42fc4d1002485eb39f74e9376a2dd36358179060200161032d565b805f036103ad57604051638bf4427360e01b815260040160405180910390fd5b60088190556040518181527fc6401d370d464388ca86aac05bdfce09a9fc6d02bd99b5bab0e6ca65ba078a4f9060200161032d565b805f03610402576040516310fb7dc760e21b815260040160405180910390fd5b60068190556040518181527f2e88a2d0a480beaf8dd33fa2607a21a2b337d879dff1273e7ca7cc5f32c4c16a9060200160405180910390a16104426104a5565b50565b692a5a058fc295ed00000081111561047057604051631cf8f61d60e01b815260040160405180910390fd5b60078190556040518181527f1e4ae943a661f117a4ecbcafa4080a3cc78c3aceba77fc84969a7112872ae3d29060200161032d565b5f6005546006546104b69190610596565b90506008548111156104e0575f600854826104d191906105b5565b90506104dc816104e5565b5050565b6104425f5b60098190556040518181527ff35b4ebd8a8a7295bf255a8d8c4545758f706b0d5e290520bd07e2acff46dea19060200161032d565b80516001600160a01b0381168114610530575f5ffd5b919050565b5f5f5f5f5f60a08688031215610549575f5ffd5b6105528661051a565b94506105606020870161051a565b935061056e6040870161051a565b925061057c6060870161051a565b915061058a6080870161051a565b90509295509295909350565b5f826105b057634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561026457634e487b7160e01b5f52601160045260245ffd5b60805160a05160c05160e05161337961065b5f395f8181610508015281816129ae01526129e001525f81816104ac0152818161274d015281816127a1015261282d01525f81816106fc01526128c301525f818161046d01528181611a5b01528181611f2101528181612121015281816124c50152818161270c015261277f01526133795ff3fe608060405234801561000f575f5ffd5b50600436106103be575f3560e01c80638301fb6d116101f5578063ae06c1b711610114578063cfa79460116100a9578063f1d8de2611610079578063f1d8de261461099a578063f2fde38b146109ad578063f7d0ba32146109c0578063ff6d8d05146109db575f5ffd5b8063cfa7946014610959578063d547741f1461096c578063d64f192d1461097f578063efdcd97414610987575f5ffd5b8063c6810717116100e4578063c68107171461088e578063c838aa8914610912578063ce5494bb14610933578063ce901d8a14610946575f5ffd5b8063ae06c1b71461084e578063b3f0067414610861578063b4f40c6114610874578063b8aaa1ba1461087d575f5ffd5b80639a7b5f111161018a578063a34442341161015a578063a3444234146107f0578063a4b657d514610804578063a59ac6dd1461080d578063a63e700814610820575f5ffd5b80639a7b5f11146107545780639be572f6146107d8578063a001ecdd146107e0578063a217fddf146107e9575f5ffd5b80638bdb2afa116101c55780638bdb2afa146106f75780638da5cb5b1461071e57806391d148541461072e578063983b115c14610741575f5ffd5b80638301fb6d146106a957806384428245146106c95780638456cb59146106dc5780638b3e121e146106e4575f5ffd5b80633b99eddc116102e157806362fd9d1c1161027657806372df1e841161024657806372df1e841461066457806373135f261461067757806374abfa541461068057806380c08a5d146106a0575f5ffd5b806362fd9d1c1461062357806367de8be9146106365780636a27246214610649578063715018a61461065c575f5ffd5b8063558e44d3116102b1578063558e44d3146105e357806355db5896146105ec5780635c975abb146105ff5780636140259614610610575f5ffd5b80633b99eddc146105905780633f4ba83a1461059857806341d3b180146105a05780634e0370c8146105b3575f5ffd5b8063290ff1a3116103575780632ff2e9dc116103275780632ff2e9dc1461055057806336568abe14610561578063365b98b214610574578063378dc3dc14610587575f5ffd5b8063290ff1a3146104f05780632a123b16146105035780632c066f631461052a5780632f2ff15d1461053d575f5ffd5b8063050e570511610392578063050e570514610440578063084ed21614610468578063118c496b146104a7578063248a9ca3146104ce575f5ffd5b8062699a80146103c257806301ffc9a7146103d757806302cfd3a9146103ff57806303f13e251461041e575b5f5ffd5b6103d56103d0366004612d3c565b6109ee565b005b6103ea6103e5366004612d57565b610a14565b60405190151581526020015b60405180910390f35b61041069021e19e0c9bab240000081565b6040519081526020016103f6565b6103ea61042c366004612d57565b60016020525f908152604090205460ff1681565b61045361044e366004612d3c565b610a4a565b604080519283526020830191909152016103f6565b61048f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016103f6565b61048f7f000000000000000000000000000000000000000000000000000000000000000081565b6104106104dc366004612d7e565b5f9081526002602052604090206001015490565b6103d56104fe366004612d7e565b610a84565b61048f7f000000000000000000000000000000000000000000000000000000000000000081565b610453610538366004612d95565b610aa0565b6103d561054b366004612dd7565b610bd0565b61041069d3c21bcecceda100000081565b6103d561056f366004612dd7565b610bfa565b61048f610582366004612d7e565b610c2d565b61041060055481565b600b54610410565b6103d5610c55565b6103d56105ae366004612d57565b610c67565b6104536105c1366004612d3c565b6001600160a01b03165f908152600d6020526040902080546001909101549091565b6104106103e881565b6103d56105fa366004612e05565b610c78565b5f54600160a01b900460ff166103ea565b6103d561061e366004612d7e565b610c8e565b610410610631366004612d7e565b610c9f565b6103d5610644366004612d7e565b610d3f565b6103d5610657366004612e31565b610d50565b6103d5610e06565b6103d5610672366004612d3c565b610e17565b61041060085481565b61069361068e366004612d3c565b610e38565b6040516103f69190612ea6565b61041060095481565b6106bc6106b7366004612d3c565b610eab565b6040516103f69190612ecc565b61048f6106d7366004612f91565b610f62565b6103d5610f81565b6103d56106f2366004612d7e565b610f91565b61048f7f000000000000000000000000000000000000000000000000000000000000000081565b5f546001600160a01b031661048f565b6103ea61073c366004612dd7565b610fa2565b6103d561074f366004612d57565b610fcc565b6107a2610762366004612d3c565b600d6020525f908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160a01b039091169086565b6040805196875260208701959095529385019290925260608401526001600160a01b0316608083015260a082015260c0016103f6565b600a54610410565b61041060035481565b6104105f81565b6104105f51602061334d5f395f51905f5281565b61041060075481565b6103d561081b366004612e31565b610fdd565b61048f61082e366004612d3c565b6001600160a01b039081165f908152600c60205260409020600101541690565b6103d561085c366004612d7e565b6110ad565b60045461048f906001600160a01b031681565b61041060065481565b610410692a5a058fc295ed00000081565b6108db61089c366004612d3c565b600c6020525f908152604090208054600182015460028301546003909301546001600160a01b0392831693919092169160ff8082169161010090041685565b604080516001600160a01b03968716815295909416602086015292840191909152151560608301521515608082015260a0016103f6565b610925610920366004613029565b6110be565b6040516103f6929190613049565b6103d5610941366004612d3c565b6111ab565b61048f610954366004612d7e565b6111bd565b61048f61096736600461306a565b6111cc565b6103d561097a366004612dd7565b61122b565b610410606481565b6103d5610995366004612d3c565b61124f565b6109256109a8366004612e31565b611260565b6103d56109bb366004612d3c565b611351565b61041073059aedfc10d7279c5eed1401645400000000000081565b6103d56109e9366004612d3c565b611377565b5f6109f881611388565b610a0f5f51602061334d5f395f51905f5283611392565b505050565b5f6001600160e01b03198216637965db0b60e01b1480610a4457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160a01b0381165f908152600d6020526040812080546005820154600183015484939291610a7a91613128565b9250925050915091565b610a8c611423565b610a9581611454565b610a9d6114b0565b50565b5f5f835f03610ac25760405163013ef1e360e71b815260040160405180910390fd5b6001600160a01b0385165f908152600d6020526040902080541580610ae957506001810154155b15610b075760405163570b42a560e01b815260040160405180910390fd5b5f846001811115610b1a57610b1a612eb8565b03610b7a57610b2d8582600301546114f0565b9150610b39828661313b565b94505f81600501548260010154610b509190613128565b9050610b5c8682613128565b8254610b68908861314e565b610b729190613179565b935050610bc7565b5f81600501548260010154610b8f9190613128565b8254909150610b9f908790613128565b610ba9828861314e565b610bb39190613179565b9350610bc38483600301546114f0565b9250505b50935093915050565b5f82815260026020526040902060010154610bea81611388565b610bf48383611392565b50505050565b6001600160a01b0381163314610c235760405163334bd91960e11b815260040160405180910390fd5b610a0f828261150f565b600a8181548110610c3c575f80fd5b5f918252602090912001546001600160a01b0316905081565b610c5d611423565b610c6561157a565b565b610c6f611423565b610a9d816115ce565b610c80611626565b610c8a8282611642565b5050565b610c96611423565b610a9d81611890565b5f811580610caf57506005548210155b15610ccd57604051631b80d40160e31b815260040160405180910390fd5b6008546005545f90841015610d26575f60095483610ceb9190613128565b905084600554610cfb919061313b565b610d05828761314e565b610d0f9190613179565b91505f610d1c8385613128565b9695505050505050565b6040516324c63f2360e11b815260040160405180910390fd5b610d47611423565b610a9d816118e5565b610d58611626565b610d6183611945565b5f5f610d6f85856001610aa0565b90925090505f610d7f828461313b565b905083811015610da257604051635757248160e11b815260040160405180910390fd5b610dae868685856119b6565b6040805186815260208101859052908101839052339081906001600160a01b038916907f08e6c75843825654ebf8e0105264a482dca551d29d3f74f0568861868f59f3b79060600160405180910390a4505050505050565b610e0e611423565b610c655f611a8c565b5f610e2181611388565b610a0f5f51602061334d5f395f51905f528361150f565b6001600160a01b0381165f908152600e6020908152604091829020805483518184028101840190945280845260609392830182828015610e9f57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610e81575b50505050509050919050565b6001600160a01b038082165f908152600c60209081526040808320815160a081018352815486168082526001830154909616938101939093526002810154918301919091526003015460ff8082161515606084015261010090910416151560808201529091610f1c57505f92915050565b806080015115610f2f5750600392915050565b6007546001600160a01b0384165f908152600d60205260409020541115610f595750600192915050565b50600292915050565b5f610f6b611626565b610f783386868686611adb565b95945050505050565b610f89611423565b610c65611fb7565b610f99611423565b610a9d81611ff9565b5f9182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b610fd4611423565b610a9d81612059565b610fe5611626565b610fee83611945565b5f5f610ffb85855f610aa0565b915091508282101561102057604051635757248160e11b815260040160405180910390fd5b61102c858584846120ab565b6007546001600160a01b0386165f908152600d6020526040902054116110555761105585612177565b6040805185815260208101849052908101829052339081906001600160a01b038816907f0ca214f8a19535023cdee0ea74c48997966a87ed490c81c28c235d8c93c8d19a906060015b60405180910390a45050505050565b6110b5611423565b610a9d81612192565b600b546060905f816110d08587613128565b116110e4576110df8486613128565b6110e6565b815b90506110f2858261313b565b67ffffffffffffffff81111561110a5761110a612ef2565b604051908082528060200260200182016040528015611133578160200160208202803683370190505b509250845b818110156111a257600b81815481106111535761115361318c565b5f918252602090912001546001600160a01b031684611172888461313b565b815181106111825761118261318c565b6001600160a01b0390921660209283029190910190910152600101611138565b50509250929050565b6111b3611626565b610a9d8133611642565b600b8181548110610c3c575f80fd5b5f5f51602061334d5f395f51905f526111e481611388565b6111ec611626565b6001600160a01b03871661121357604051630a614c8960e41b815260040160405180910390fd5b6112208787878787611adb565b979650505050505050565b5f8281526002602052604090206001015461124581611388565b610bf4838361150f565b611257611423565b610a9d816121ea565b60605f5f61126d86610e38565b8051925090505f8261127f8688613128565b116112935761128e8587613128565b611295565b825b90506112a1868261313b565b67ffffffffffffffff8111156112b9576112b9612ef2565b6040519080825280602002602001820160405280156112e2578160200160208202803683370190505b509350855b81811015611346578281815181106113015761130161318c565b6020026020010151858883611316919061313b565b815181106113265761132661318c565b6001600160a01b03909216602092830291909101909101526001016112e7565b505050935093915050565b611359611423565b61136281612259565b61136c5f82611392565b50610c8a5f3361150f565b61137f611626565b610a9d81612177565b610a9d8133612293565b5f61139d8383610fa2565b61141c575f8381526002602090815260408083206001600160a01b03861684529091529020805460ff191660011790556113d43390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610a44565b505f610a44565b5f546001600160a01b03163314610c655760405163118cdaa760e01b81523360048201526024015b60405180910390fd5b805f0361147457604051638bf4427360e01b815260040160405180910390fd5b60088190556040518181527fc6401d370d464388ca86aac05bdfce09a9fc6d02bd99b5bab0e6ca65ba078a4f906020015b60405180910390a150565b5f6005546006546114c19190613179565b90506008548111156114e7575f600854826114dc919061313b565b9050610c8a816122cc565b610a9d5f6122cc565b5f6127106114fe838561314e565b6115089190613179565b9392505050565b5f61151a8383610fa2565b1561141c575f8381526002602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610a44565b611582612301565b5f805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6115d78161232a565b6001600160e01b031981165f818152600160208190526040808320805460ff1916909217909155517f0e537dd2f63ec58dc3739dffa33dcf389cf602fbfc51cf36546d7b07af7df41e9190a250565b61162e612370565b610c655f356001600160e01b03191661232a565b6001600160a01b038083165f908152600c6020908152604091829020825160a081018452815485168152600182015490941691840182905260028101549284019290925260039091015460ff808216151560608501526101009091041615156080830152806116c45760405163750e414360e01b815260040160405180910390fd5b81608001516116e65760405163750e414360e01b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b0384811660048301525f91908616906370a0823190602401602060405180830381865afa15801561172d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175191906131a0565b9050805f03611773576040516313ddf16d60e01b815260040160405180910390fd5b60405163079cc67960e41b81526001600160a01b038581166004830152602482018390528616906379cc6790906044015f604051808303815f87803b1580156117ba575f5ffd5b505af11580156117cc573d5f5f3e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018590528516925063a9059cbb91506044016020604051808303815f875af115801561181c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184091906131b7565b50816001600160a01b0316856001600160a01b0316856001600160a01b03167fc7ea1a149fa86d488de0d46911cc7c13bc51bbab90c2481c4318bc4083a354228460405161109e91815260200190565b805f036118b057604051633ef357b760e01b815260040160405180910390fd5b60058190556040518181527f884fe55db8b81cd3003cf17b0fad42fc4d1002485eb39f74e9376a2dd3635817906020016114a5565b805f03611905576040516310fb7dc760e21b815260040160405180910390fd5b60068190556040518181527f2e88a2d0a480beaf8dd33fa2607a21a2b337d879dff1273e7ca7cc5f32c4c16a9060200160405180910390a1610a9d6114b0565b6001600160a01b038181165f908152600c60205260409020541661197c5760405163052946c760e31b815260040160405180910390fd5b6001600160a01b0381165f908152600c602052604090206003015460ff16610a9d576040516253577f60e11b815260040160405180910390fd5b6001600160a01b0384165f908152600d60205260408120906119d8838561313b565b90505f85835f01546119ea9190613128565b90505f8584600101546119fd919061313b565b9050611a1382828660050154876002015461239a565b611a1f888584846123f7565b611a346001600160a01b03891633308a61244b565b6004840154611a4e9089906001600160a01b0316876124b2565b611a826001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338561253e565b5050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f600854831015611aff57604051631b80d40160e31b815260040160405180910390fd5b6008545f611b0d828661313b565b90505f5f73961b7b0bcbe7af3182cdfde92537b5dd37ee946363ee7489ed8a8a600554308f60045f9054906101000a90046001600160a01b0316611b585f546001600160a01b031690565b8e6040518963ffffffff1660e01b8152600401611b7c989796959493929190613204565b6040805180830381865af4158015611b96573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bba919061327b565b6001600160a01b038c165f908152600e602052604081205492945090925003611c5257600a80546001810182555f9182527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b038d1690811790915560405190917f0b0376a109cbb578b709f85f6a7befcdac3ac1ab251c99ede87f30c9572ac4d391a25b6001600160a01b03808b165f818152600e602090815260408083208054600181810183559185528385200180548988166001600160a01b03199182168117909255835160a0810185529687528888168786019081526005805489870190815260608a0186815260808b018a8152868b52600c8a52888b209b518c54908e16908716178c5593518b88018054918e1691871691909117905590516002808c0191909155905160039a8b018054945115156101000261ff00199215159290921661ffff199095169490941717909255600b80548087019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018054841685179055928752600d909552928520815481559182018b90556006549382019390935584549481019490945560048054908501805490921695169490941790935560095492820192909255908415611e97576003820180545f9182905590611dba9086908890610aa0565b5083549092505f90611dcd90849061313b565b90505f878560010154611de09190613128565b9050611df682828760050154886002015461239a565b611e02878684846123f7565b611e208f85896001600160a01b031661253e9092919063ffffffff16565b8285600301819055508e6001600160a01b03168f6001600160a01b0316886001600160a01b03167f0ca214f8a19535023cdee0ea74c48997966a87ed490c81c28c235d8c93c8d19a8b885f604051611e8b939291909283526020830191909152604082015260600190565b60405180910390a45050505b611eb0825f01548360010154846005015460065461239a565b600454825460018401546006546003546040805194855260208501939093529183015260608201526001600160a01b03918216918616907f88dbf1309beb71a70cfe78acf965a39f14d1932d2ca26a8da0e94cdeea20be0d9060800160405180910390a3611f496001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308c61244b565b826001600160a01b0316846001600160a01b03168d6001600160a01b03167f8a3533006858a7d7915ea414d626b329f1860b67ef6f90db8ffb7cd1a350429e600b805490508f8f604051611f9f939291906132a8565b60405180910390a450919a9950505050505050505050565b611fbf611626565b5f805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115b13390565b692a5a058fc295ed00000081111561202457604051631cf8f61d60e01b815260040160405180910390fd5b60078190556040518181527f1e4ae943a661f117a4ecbcafa4080a3cc78c3aceba77fc84969a7112872ae3d2906020016114a5565b6120628161256f565b6001600160e01b031981165f81815260016020526040808220805460ff19169055517f2727e23868bf9fbf6f8140b8ae0ddca078eb0c3cb157939f35724bcaf7de6fae9190a250565b6001600160a01b0384165f908152600d60205260408120906120cd838661313b565b90505f84835f01546120df919061313b565b90505f8284600101546120f29190613128565b905061210882828660050154876002015461239a565b612114888584846123f7565b6121496001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308a61244b565b60048401546121639089906001600160a01b0316876124b2565b611a826001600160a01b038916338861253e565b61218081611945565b612189816125b4565b610a9d81612613565b6103e88111156121b557604051636722ab9d60e01b815260040160405180910390fd5b60038190556040518181527f74516f05eb4bd2461d57aa1e935ee553f86a3e02bfed7759f2f772915de3d9be906020016114a5565b6001600160a01b0381166122105760405162cf25c560e51b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040517f27aae5db36d94179909d019ae0b1ac7c16d96d953148f63c0f6a0a9c8ead79ee905f90a250565b612261611423565b6001600160a01b03811661228a57604051631e4fbdf760e01b81525f600482015260240161144b565b610a9d81611a8c565b61229d8282610fa2565b610c8a5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161144b565b60098190556040518181527ff35b4ebd8a8a7295bf255a8d8c4545758f706b0d5e290520bd07e2acff46dea1906020016114a5565b5f54600160a01b900460ff16610c6557604051638dfc202b60e01b815260040160405180910390fd5b6001600160e01b031981165f9081526001602052604090205460ff1615610a9d57604051639b3eea4f60e01b81526001600160e01b03198216600482015260240161144b565b5f54600160a01b900460ff1615610c655760405163d93c066560e01b815260040160405180910390fd5b8315806123a5575082155b156123c35760405163570b42a560e01b815260040160405180910390fd5b806123ce8385613128565b6123d8908661314e565b1015610bf45760405163570b42a560e01b815260040160405180910390fd5b8183556001830181905560408051838152602081018390526001600160a01b038616917ffe9371d05ef5f3f0e1c8bd622b21d0c06aa6b7b6a2ce7d07ad9f5e526979ffcc910160405180910390a250505050565b6040516001600160a01b038481166024830152838116604483015260648201839052610bf49186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612c05565b8015610a0f576124ec6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016838361253e565b816001600160a01b0316836001600160a01b03167ff228de527fc1b9843baac03b9a04565473a263375950e63435d4138464386f468360405161253191815260200190565b60405180910390a3505050565b6040516001600160a01b03838116602483015260448201839052610a0f91859182169063a9059cbb90606401612480565b6001600160e01b031981165f9081526001602052604090205460ff16610a9d57604051631d7e88d160e21b81526001600160e01b03198216600482015260240161144b565b6001600160a01b038181165f908152600c60205260409020541633148015906125f557506007546001600160a01b0382165f908152600d6020526040902054115b15610a9d576040516336010aa960e01b815260040160405180910390fd5b6001600160a01b038082165f908152600d6020908152604091829020825160c0810184528154808252600183015493820184905260028301549482019490945260038201546060820152600482015490941660808501526005015460a084015281158061267e575080155b1561269c5760405163570b42a560e01b815260040160405180910390fd5b6001600160a01b038085165f908152600d6020908152604080832083815560018082018590556002820185905560038083018690556004830180546001600160a01b03191690556005909201859055600c9093529220908101549101805461ffff191661010017905581169081907f00000000000000000000000000000000000000000000000000000000000000009085908590831684111561273e57919291905b6127726001600160a01b0386167f00000000000000000000000000000000000000000000000000000000000000008961253e565b6127c66001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000008861253e565b5f6127d18383612c71565b6001600160a01b038b81165f908152600c6020526040808220549051635994a71d60e11b81526001600160e01b0385166004820152898416602482015288841660448201523060648201529083166084820181905293945090917f0000000000000000000000000000000000000000000000000000000000000000169063b3294e3a9060a4016020604051808303815f875af1158015612873573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061289791906131a0565b60405163e6a4390560e01b81526001600160a01b03898116600483015288811660248301529192505f917f0000000000000000000000000000000000000000000000000000000000000000169063e6a4390590604401602060405180830381865afa158015612908573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061292c91906132d2565b90506001600160a01b0381166129555760405163570b42a560e01b815260040160405180910390fd5b604051636c5cf77560e01b81526001600160a01b0382811660048301528a1690636c5cf775906024015f604051808303815f87803b158015612995575f5ffd5b505af11580156129a7573d5f5f3e3d5ffd5b505050505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663df55d84c8386877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630fd6699b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a3a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a5e91906131a0565b6040516001600160e01b031960e087901b1681526001600160a01b03948516600482015292841660248401529216604482015260648101919091526084016020604051808303815f875af1158015612ab8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612adc91906132d2565b9050612af26001600160a01b038316828561253e565b60405163f435f5a760e01b81526001600160a01b03838116600483015282169063f435f5a7906024015f604051808303815f87803b158015612b32575f5ffd5b505af1158015612b44573d5f5f3e3d5ffd5b50505050896001600160a01b03168e6001600160a01b03167f18a56450d3c666e2bae9e0829fcada82a9ab0deef6e33c2496752c88d4155c9d8e8e604051612b96929190918252602082015260400190565b60405180910390a3806001600160a01b0316826001600160a01b03168f6001600160a01b03167f430b2883a14e0879b99597c64f5cd1526fd615a2b38fe52bfeea4a7209cffdba86604051612bed91815260200190565b60405180910390a45050505050505050505050505050565b5f5f60205f8451602086015f885af180612c24576040513d5f823e3d81fd5b50505f513d91508115612c3b578060011415612c48565b6001600160a01b0384163b155b15610bf457604051635274afe760e01b81526001600160a01b038516600482015260240161144b565b5f5f836001600160701b0316118015612c9257505f826001600160701b0316115b612cde5760405162461bcd60e51b815260206004820181905260248201527f5551313132783131323a20494e53554646494349454e545f5245534552564553604482015260640161144b565b5f612ce883612cfc565b9050612cf48185612d14565b949350505050565b5f610a44600160701b6001600160701b0384166132ed565b5f6115086001600160701b0383168461331e565b6001600160a01b0381168114610a9d575f5ffd5b5f60208284031215612d4c575f5ffd5b813561150881612d28565b5f60208284031215612d67575f5ffd5b81356001600160e01b031981168114611508575f5ffd5b5f60208284031215612d8e575f5ffd5b5035919050565b5f5f5f60608486031215612da7575f5ffd5b8335612db281612d28565b925060208401359150604084013560028110612dcc575f5ffd5b809150509250925092565b5f5f60408385031215612de8575f5ffd5b823591506020830135612dfa81612d28565b809150509250929050565b5f5f60408385031215612e16575f5ffd5b8235612e2181612d28565b91506020830135612dfa81612d28565b5f5f5f60608486031215612e43575f5ffd5b8335612e4e81612d28565b95602085013595506040909401359392505050565b5f8151808452602084019350602083015f5b82811015612e9c5781516001600160a01b0316865260209586019590910190600101612e75565b5093949350505050565b602081525f6115086020830184612e63565b634e487b7160e01b5f52602160045260245ffd5b6020810160048310612eec57634e487b7160e01b5f52602160045260245ffd5b91905290565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612f15575f5ffd5b813567ffffffffffffffff811115612f2f57612f2f612ef2565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715612f5e57612f5e612ef2565b604052818152838201602001851015612f75575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f60808587031215612fa4575f5ffd5b843567ffffffffffffffff811115612fba575f5ffd5b612fc687828801612f06565b945050602085013567ffffffffffffffff811115612fe2575f5ffd5b612fee87828801612f06565b93505060408501359150606085013567ffffffffffffffff811115613011575f5ffd5b61301d87828801612f06565b91505092959194509250565b5f5f6040838503121561303a575f5ffd5b50508035926020909101359150565b604081525f61305b6040830185612e63565b90508260208301529392505050565b5f5f5f5f5f60a0868803121561307e575f5ffd5b853561308981612d28565b9450602086013567ffffffffffffffff8111156130a4575f5ffd5b6130b088828901612f06565b945050604086013567ffffffffffffffff8111156130cc575f5ffd5b6130d888828901612f06565b93505060608601359150608086013567ffffffffffffffff8111156130fb575f5ffd5b61310788828901612f06565b9150509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a4457610a44613114565b81810381811115610a4457610a44613114565b8082028115828204841417610a4457610a44613114565b634e487b7160e01b5f52601260045260245ffd5b5f8261318757613187613165565b500490565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156131b0575f5ffd5b5051919050565b5f602082840312156131c7575f5ffd5b81518015158114611508575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b61010081525f61321861010083018b6131d6565b828103602084015261322a818b6131d6565b604084018a90526001600160a01b038981166060860152888116608086015287811660a0860152861660c085015283810360e0850152905061326c81856131d6565b9b9a5050505050505050505050565b5f5f6040838503121561328c575f5ffd5b825161329781612d28565b6020840151909250612dfa81612d28565b838152606060208201525f6132c060608301856131d6565b8281036040840152610d1c81856131d6565b5f602082840312156132e2575f5ffd5b815161150881612d28565b6001600160e01b0381811683821681810290921691818304811482151761331657613316613114565b505092915050565b5f6001600160e01b0383168061333657613336613165565b6001600160e01b0392909216919091049291505056feb9da96f64f247aab47739337442191dcd3a6c543aae2cb944a94c62b69a4066ba164736f6c634300081b000a000000000000000000000000d78cac09f62d19eec389f1c5eafe02dcb6f6dd4300000000000000000000000067510e860b90063b7e9ad7cdfa9592aee32b4ea70000000000000000000000008909dc15e40173ff4699343b6eb8132c65e18ec60000000000000000000000003f3283e76b5fe81f87731b4a84c7b62fb784e1f00000000000000000000000000e7de56cbf04719f5910e845885eb925a1cc39e0