2.7k txs
6.9k calls
constructor
constructor(address pin_, address pinOracle_, address rewardToken_)
functions
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
FEE_DENOMINATOR
viewfunction FEE_DENOMINATOR() view returns (uint256)
feeReceiver
viewfunction feeReceiver() view returns (address)
getAssetInfo
viewfunction getAssetInfo(address fractionalAssets, uint256 tokenId) view returns (uint256 assetSupply, uint256 currentGlobalRewardsPerStaked, uint256 lastDepositTimestamp, uint256 drippingPeriod)
getBalances
viewfunction getBalances(address fractionalAssets, uint256 tokenId, address account) view returns (uint256 stakedBalance, uint256 listedBalance, uint256 notListedBalance)
getListing
viewfunction getListing(bytes32 listingId) view returns (tuple)
getPendingRewards
viewfunction getPendingRewards(address fractionalAssets, uint256 tokenId, address account) view returns (uint256)
getQuoteInTokens
viewfunction getQuoteInTokens(bytes32 listingId, uint256 fractionsAmount) view returns (uint256 totalPurchasePriceInPIN)
getRewardsConstants
purefunction getRewardsConstants() pure returns (uint256 minRewardsDepositAmount, uint256 maxAssetSupply, uint256 minDrippingPeriod, uint256 maxDrippingPeriod)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isAssetEnabled
viewfunction isAssetEnabled(address fractionalAssets, uint256 tokenId) view returns (bool)
MAX_FEE_PERC
viewfunction MAX_FEE_PERC() view returns (uint256)
OPERATOR_ROLE
viewfunction OPERATOR_ROLE() view returns (bytes32)
oracle
viewfunction oracle() view returns (address)
PIN
viewfunction PIN() view returns (address)
purchaseFeePerc
viewfunction purchaseFeePerc() view returns (uint256)
REWARDS_PROXY_ACCOUNT
viewfunction REWARDS_PROXY_ACCOUNT() view returns (address)
REWARDS_TOKEN
viewfunction REWARDS_TOKEN() view returns (address)
streams
viewfunction streams(address fractionalAssets, uint256 tokenId) view returns (uint256 globalRewardsPerStakedTarget, uint256 assetSupply, uint256 deltaGlobalRewardsPerStaked, uint256 lastDepositTimestamp, uint256 drippingPeriod)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
claimRewards
nonpayablefunction claimRewards(address fractionalAssets, uint256 tokenId)
claimRewardsMultiple
nonpayablefunction claimRewardsMultiple(address fractionalAssets, uint256[] tokenIds)
claimUnassignedRewards
nonpayablefunction claimUnassignedRewards(address fractionalAssets, uint256 tokenId, address to)
delist
nonpayablefunction delist(bytes32 listingId, uint256 amount)
depositAndList
nonpayablefunction depositAndList(address fractionalAssets, uint256 tokenId, uint256 amount, uint256 usdPricePerFraction, uint256 deadline) returns (bytes32 listingId)
depositAsset
nonpayablefunction depositAsset(address fractionalAssets, uint256 tokenId, uint256 amount)
depositRewards
nonpayablefunction depositRewards(address fractionalAssets, uint256 tokenId, uint256 amount, uint256 drippingPeriod)
enableAsset
nonpayablefunction enableAsset(address fractionalAssets, uint256 tokenId, address receiver)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
list
nonpayablefunction list(address fractionalAssets, uint256 tokenId, uint256 amount, uint256 usdPricePerFraction, uint256 deadline) returns (bytes32 listingId)
modifyListing
nonpayablefunction modifyListing(bytes32 listingId, uint256 usdPricePerFraction, uint256 newDeadline)
onERC1155BatchReceived
nonpayablefunction onERC1155BatchReceived(address, address, uint256[], uint256[], bytes) returns (bytes4)
onERC1155Received
nonpayablefunction onERC1155Received(address, address, uint256, uint256, bytes) returns (bytes4)
purchase
nonpayablefunction purchase(bytes32 listingId, uint256 fractionsAmount, uint256 maxTotalPinAmount)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
rescueToken
nonpayablefunction rescueToken(address erc20Token, address to)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setFee
nonpayablefunction setFee(uint256 newFee)
setFeeReceiver
nonpayablefunction setFeeReceiver(address receiver)
setOracle
nonpayablefunction setOracle(address oracle_)
withdrawAsset
nonpayablefunction withdrawAsset(address fractionalAssets, uint256 tokenId, uint256 amount, address receiver)
events
AssetEnabled
event AssetEnabled(address indexed fractionalAssets, uint256 indexed tokenId, uint256 assetSupply, address depositor, address receiver)
Claimed
event Claimed(address indexed fractionalAssets, uint256 indexed tokenId, address indexed account, uint256 amount)
DeadlineExtended
event DeadlineExtended(bytes32 indexed listingId, uint256 newDeadline)
Delisted
event Delisted(bytes32 indexed listingId, uint256 amount)
FeePercentageSet
event FeePercentageSet(uint256 newFeePerc)
FeeReceiverSet
event FeeReceiverSet(address indexed receiver)
FractionsDeposited
event FractionsDeposited(address indexed fractionalAssets, uint256 indexed tokenId, uint256 amount, address receiver)
FractionsWithdrawn
event FractionsWithdrawn(address indexed fractionalAssets, uint256 indexed tokenId, uint256 amount, address receiver)
Listed
event Listed(bytes32 indexed listingId, address indexed seller, uint256 indexed tokenId, address fractionalAssets, uint256 amount, uint256 usdPricePerFraction, uint256 deadline)
OracleSet
event OracleSet(address indexed oracle)
PriceUpdated
event PriceUpdated(bytes32 indexed listingId, uint256 usdPricePerItem)
Purchased
event Purchased(bytes32 indexed listingId, address indexed buyer, address indexed seller, uint256 amount, uint256 pinPaymentForSeller, uint256 usdPaymentForSeller, uint256 feesPerc)
RewardsDistributed
event RewardsDistributed(address indexed fractionalAssets, uint256 indexed tokenId, address indexed operator, uint256 amount, uint256 drippingPeriod)
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)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AlreadyEnabled
error AlreadyEnabled()
AssetNotEnabled
error AssetNotEnabled()
DeadlineHasExpiredAlready
error DeadlineHasExpiredAlready()
ExpectedNonZero
error ExpectedNonZero()
ExpectedNonZeroAmount
error ExpectedNonZeroAmount()
ExpectedNonZeroPrice
error ExpectedNonZeroPrice()
InvalidListingId
error InvalidListingId()
InvalidOracleInterface
error InvalidOracleInterface()
InvalidOraclePrice
error InvalidOraclePrice()
InvalidParameter
error InvalidParameter()
ListingDeadlineExpired
error ListingDeadlineExpired()
ListingIdAlreadyExists
error ListingIdAlreadyExists()
NotEnoughTokens
error NotEnoughTokens()
NotEnoughUnlistedTokens
error NotEnoughUnlistedTokens()
PinlinkRewards_AmountTooLow
error PinlinkRewards_AmountTooLow()
PinlinkRewards_AssetNotEnabled
error PinlinkRewards_AssetNotEnabled()
PinlinkRewards_AssetSupplyIsZero
error PinlinkRewards_AssetSupplyIsZero()
PinlinkRewards_AssetSupplyTooHigh
error PinlinkRewards_AssetSupplyTooHigh()
PinlinkRewards_DepositRewardsTooEarly
error PinlinkRewards_DepositRewardsTooEarly()
PinlinkRewards_DrippingPeriodTooLong
error PinlinkRewards_DrippingPeriodTooLong()
PinlinkRewards_DrippingPeriodTooShort
error PinlinkRewards_DrippingPeriodTooShort()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
SenderIsNotSeller
error SenderIsNotSeller()
SlippageExceeded
error SlippageExceeded()
StaleOraclePrice
error StaleOraclePrice()
creation bytecode
0x60c06040526101f4600155348015610015575f5ffd5b50604051612c4e380380612c4e8339810160408190526100349161016f565b6001600160a01b0380841660805281811660a052600380549184166001600160a01b03199283161790556002805490911633908117909155610077905f906100ab565b506100a27f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929336100ab565b505050506101af565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661014b575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101033390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161014e565b505f5b92915050565b80516001600160a01b038116811461016a575f5ffd5b919050565b5f5f5f60608486031215610181575f5ffd5b61018a84610154565b925061019860208501610154565b91506101a660408501610154565b90509250925092565b60805160a051612a3f61020f5f395f81816105fc015281816107bd0152818161099601528181610bb5015281816112d7015261187a01525f81816106d10152818161101201528181611503015281816115420152611dee0152612a3f5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c806391d1485411610140578063bcdd56e3116100bf578063dec38fc611610084578063dec38fc61461064d578063e7b6208314610660578063efdcd97414610673578063f23a6e6114610686578063f5b541a6146106a5578063fdeb3597146106cc575f5ffd5b8063bcdd56e3146105e4578063c5601072146105f7578063cc64044e1461061e578063d547741f14610631578063d73792a914610644575f5ffd5b8063ab2d662b11610105578063ab2d662b14610560578063b3f0067414610573578063b8bf029b14610586578063b99ce51714610599578063bc197c81146105ac575f5ffd5b806391d14854146104b3578063963091e7146104c65780639a99b4f0146104d95780639b9d6cc1146104ec578063a217fddf14610559575f5ffd5b806336568abe116101d75780635518d94d1161019c5780635518d94d146104215780636244cea51461043457806369fe0e2d146104475780637adbf9731461045a5780637dc0d1d01461046d578063807042d414610498575f5ffd5b806336568abe146103a45780633decc726146103b75780634707d000146103ca57806349d7e6de146103dd5780634f3b09ac14610410575f5ffd5b8063248a9ca31161021d578063248a9ca31461032557806325d0f5cb1461034757806328e7e7ab146103505780632de5e9161461037e5780632f2ff15d14610391575f5ffd5b806301ffc9a714610259578063044ac89b146102815780630f8166c114610298578063175c0d16146102ad578063222cd11c14610312575b5f5ffd5b61026c610267366004612421565b6106f3565b60405190151581526020015b60405180910390f35b61028a6103e881565b604051908152602001610278565b6102ab6102a6366004612463565b610712565b005b6102c06102bb366004612499565b6107ed565b6040805182516001600160a01b03908116825260208085015190830152838301511691810191909152606080830151908201526080808301519082015260a0918201519181019190915260c001610278565b61028a6103203660046124b0565b610895565b61028a610333366004612499565b5f9081526020819052604090206001015490565b61028a60015481565b61036361035e3660046124b0565b6108c9565b60408051938452602084019290925290820152606001610278565b6102ab61038c3660046124b0565b610930565b6102ab61039f3660046124e9565b610a13565b6102ab6103b23660046124e9565b610a37565b6102ab6103c536600461250a565b610a6f565b6102ab6103d836600461254d565b610ba9565b6103f06103eb366004612575565b610c82565b604080519485526020850193909352918301526060820152608001610278565b61271060966154606213c6806103f0565b61028a61042f36600461259d565b610cd4565b6102ab6104423660046124b0565b610d84565b6102ab610455366004612499565b610efe565b6102ab6104683660046125bd565b610f67565b600354610480906001600160a01b031681565b6040516001600160a01b039091168152602001610278565b61048073aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa81565b61026c6104c13660046124e9565b611110565b6102ab6104d436600461259d565b611138565b6102ab6104e7366004612575565b611290565b6105316104fa366004612575565b600460208181525f938452604080852090915291835291208054600182015460028301546003840154939094015491939092909185565b604080519586526020860194909452928401919091526060830152608082015260a001610278565b61028a5f81565b6102ab61056e3660046125d6565b611351565b600254610480906001600160a01b031681565b61028a6105943660046125ff565b6115d2565b6102ab6105a73660046125d6565b6115e0565b6105cb6105ba366004612764565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610278565b61026c6105f2366004612575565b611716565b6104807f000000000000000000000000000000000000000000000000000000000000000081565b6102ab61062c366004612813565b611746565b6102ab61063f3660046124e9565b611751565b61028a61271081565b61028a61065b3660046125ff565b611775565b6102ab61066e366004612843565b61178e565b6102ab6106813660046125bd565b6118a1565b6105cb6106943660046128c4565b63f23a6e6160e01b95945050505050565b61028a7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b6104807f000000000000000000000000000000000000000000000000000000000000000081565b5f6106fd8261191c565b8061070c575061070c82611950565b92915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961073c81611974565b6001600160a01b0385165f9081526004602090815260408083208784529091529020610769818585611981565b6040805185815260208101859052339187916001600160a01b038a16917e8b59ac4abb1dbfbaca4b6f8e8a7cba68f6b5560c43f1821ba9136491d1a023910160405180910390a46107e56001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087611a86565b505050505050565b6108326040518060c001604052805f6001600160a01b031681526020015f81526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b505f90815260056020818152604092839020835160c08101855281546001600160a01b039081168252600183015493820193909352600282015490921693820193909352600383015460608201526004830154608082015291015460a082015290565b6001600160a01b0383165f90815260046020908152604080832085845290915281206108c19083611aed565b949350505050565b6001600160a01b038084165f81815260046020908152604080832087845282528083209486168084526005909501825280832054938352600682528083208784528252808320948352939052918220549091610925828461292c565b905093509350939050565b5f61093a81611974565b6001600160a01b0384165f908152600460209081526040808320868452909152812061097a9073aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa611b29565b9050805f036109895750610a0d565b6109bd6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168483611b56565b826001600160a01b031684866001600160a01b03167f8dab6d35466ca3cba614bc5b262979b277949786977e81107f375f7e39f7734a84604051610a0391815260200190565b60405180910390a4505b50505050565b5f82815260208190526040902060010154610a2d81611974565b610a0d8383611b87565b6001600160a01b0381163314610a605760405163334bd91960e11b815260040160405180910390fd5b610a6a8282611c16565b505050565b815f03610a8f5760405163129f6bd160e31b815260040160405180910390fd5b81610a9b858533611c7f565b1015610aba5760405163a2cd942d60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526004602090815260408083208684529091529020610afc903373aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa85611ce6565b604080518381526001600160a01b0383811660208301528592908716917f03d66a40aac8a6fad64d0eb68424a2a5603c4503e7c47afe7d42cb3ebb59b86f910160405180910390a3604051637921219560e11b81526001600160a01b0385169063f242432a90610b7690309085908890889060040161293f565b5f604051808303815f87803b158015610b8d575f5ffd5b505af1158015610b9f573d5f5f3e3d5ffd5b5050505050505050565b5f610bb381611974565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031603610c0557604051630309cb8760e51b815260040160405180910390fd5b6040516370a0823160e01b8152306004820152610a6a9083906001600160a01b038616906370a0823190602401602060405180830381865afa158015610c4d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c719190612976565b6001600160a01b0386169190611b56565b6001600160a01b0382165f9081526004602090815260408083208484529091528120600181015482918291829190610cb982611d5c565b60038301546004909301549199909850919650945092505050565b5f82815260056020526040812060030154821115610cff57610cf860015f1961292c565b905061070c565b5f83815260056020819052604090912001544210610d2357610cf860025f1961292c565b5f83815260056020526040812060040154610d3f90849061298d565b90505f5f610d4f83600154611dd4565b91509150815f03610d7057610d6660035f1961292c565b935050505061070c565b610d7a81836129a4565b9695505050505050565b5f610d8e81611974565b6001600160a01b0384165f9081526004602090815260408083208684529091529020600181015415610dd357604051637952fbad60e11b815260040160405180910390fd5b60405163bd85b03960e01b8152600481018590525f906001600160a01b0387169063bd85b03990602401602060405180830381865afa158015610e18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3c9190612976565b9050610e49828286611e8c565b604080518281523360208201526001600160a01b0386811682840152915187928916917f22ed7b8953e27cf8288fa80e1af99242a1c3e6aac1726bd7a6989129ccde7192919081900360600190a3604051637921219560e11b81526001600160a01b0387169063f242432a90610ec990339030908a90879060040161293f565b5f604051808303815f87803b158015610ee0575f5ffd5b505af1158015610ef2573d5f5f3e3d5ffd5b50505050505050505050565b5f610f0881611974565b6103e8821115610f2b57604051630309cb8760e51b815260040160405180910390fd5b60018290556040518281527ffdb174bbb157048e9f3962e375891bace08d9741796e3288bf79ab8ccd1dfa209060200160405180910390a15050565b5f610f7181611974565b6040516301ffc9a760e01b8152630e8c0a0960e41b60048201526001600160a01b038316906301ffc9a790602401602060405180830381865afa158015610fba573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fde91906129b7565b610ffb5760405163132f25b560e21b815260040160405180910390fd5b60405163774abccb60e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152670de0b6b3a764000060248301525f919084169063ee95799690604401602060405180830381865afa158015611070573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110949190612976565b9050620f42408110156110b95760405162fc7cad60e51b815260040160405180910390fd5b6040516001600160a01b038416907f3f32684a32a11dabdbb8c0177de80aa3ae36a004d75210335b49e544e48cd0aa905f90a25050600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8281526005602052604090206002015482906001600160a01b03168061117257604051632d36379960e11b815260040160405180910390fd5b6001600160a01b038116331461119b5760405163d2f821cb60e01b815260040160405180910390fd5b5f83116111bb57604051631536c32360e21b815260040160405180910390fd5b5f8481526005602052604090206003810154600185016111d9578094505b808511156111fa576040516308aeed0f60e21b815260040160405180910390fd5b84826003015461120a919061292c565b600383015581546001600160a01b03165f9081526006602090815260408083206001860154845282528083203384529091528120805487929061124e90849061292c565b909155505060405185815286907f99fd154aaab6bddfb6bac5c75897e456c3a5c2831c4bc0ba7bef6a7475af45b19060200160405180910390a2505050505050565b6001600160a01b0382165f90815260046020908152604080832084845290915281206112bc9033611b29565b9050805f036112ca57505050565b6112fe6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611b56565b336001600160a01b031682846001600160a01b03167f8dab6d35466ca3cba614bc5b262979b277949786977e81107f375f7e39f7734a8460405161134491815260200190565b60405180910390a4505050565b5f821161137157604051631536c32360e21b815260040160405180910390fd5b5f8381526005602052604090206002810154600182015482546001600160a01b039283169216826113b557604051632d36379960e11b815260040160405180910390fd5b836005015442106113d9576040516329b0853f60e01b815260040160405180910390fd5b6003840154868110156113ff576040516308aeed0f60e21b815260040160405180910390fd5b611409878261292c565b60038601556001600160a01b038083165f90815260066020908152604080832087845282528083209388168352929052908120805489929061144c90849061292c565b90915550506001600160a01b0382165f908152600460209081526040808320868452909152902061147f9085338a611ce6565b5060015460048501545f9061149590899061298d565b90505f5f6114a38385611dd4565b90925090505f6114b382846129a4565b9050825f036114d557604051631510fe5b60e31b815260040160405180910390fd5b898111156114f657604051638199f5f360e01b815260040160405180910390fd5b61152b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338a86611a86565b811561156d5760025461156d906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169133911685611a86565b604080518c815260208101859052908101859052606081018690526001600160a01b0389169033908e907f4f06481cdc091a77d7889b166758de403c64fbea2a4f3ba7386f157966cd6e7f9060800160405180910390a4505050505050505050505050565b5f610d7a8686868686611f0e565b5f8381526005602052604090206002015483906001600160a01b03168061161a57604051632d36379960e11b815260040160405180910390fd5b6001600160a01b03811633146116435760405163d2f821cb60e01b815260040160405180910390fd5b8315611699575f85815260056020526040908190206004018590555185907f46eec4e0eeeef5830de3472bb39db7e52b1c809286dc87c4b85b20e003cc70c3906116909087815260200190565b60405180910390a25b821561170f574283116116bf57604051632a6d119960e01b815260040160405180910390fd5b5f85815260056020819052604091829020018490555185907f525e3492d4aa37e8489b5badf4500a88d3e8037aeec1d1ab672f7f8c17b12b66906117069086815260200190565b60405180910390a25b5050505050565b6001600160a01b0382165f90815260046020908152604080832084845290915281206001015415155b9392505050565b610a6a838383612148565b5f8281526020819052604090206001015461176b81611974565b610a0d8383611c16565b5f611781868686612148565b610d7a8686868686611f0e565b5f805b82811015611866576001600160a01b0385165f9081526004602052604081206117eb903390838888878181106117c9576117c96129d6565b9050602002013581526020019081526020015f20611b2990919063ffffffff16565b90506117f781846129a4565b9250801561185d5733858584818110611812576118126129d6565b90506020020135876001600160a01b03167f8dab6d35466ca3cba614bc5b262979b277949786977e81107f375f7e39f7734a8460405161185491815260200190565b60405180910390a45b50600101611791565b508015610a0d57610a0d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383611b56565b5f6118ab81611974565b6001600160a01b0382166118d257604051631536c32360e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0384169081179091556040517fbdf37c276f641820b141429d245add2552b4118c0866e5a78638e3de5ef18d9d905f90a25050565b5f6001600160e01b03198216630271189760e51b148061070c57506301ffc9a760e01b6001600160e01b031983161461070c565b5f6001600160e01b03198216637965db0b60e01b148061070c575061070c8261191c565b61197e8133612296565b50565b6213c6808111156119a557604051634edf692d60e11b815260040160405180910390fd5b6154608110156119c8576040516328fbaa9160e21b815260040160405180910390fd5b6119d1836122d8565b6119ee5760405163f6d7b92560e01b815260040160405180910390fd5b6001830154611a105760405163fa782c2160e01b815260040160405180910390fd5b612710821015611a3357604051631ac030b960e21b815260040160405180910390fd5b60018301545f90611a4c670de0b6b3a76400008561298d565b611a5691906129ea565b905080845f015f828254611a6a91906129a4565b9091555050600284015542600384015560049092019190915550565b6040516001600160a01b038481166024830152838116604483015260648201839052610a0d9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506122f5565b5f5f611af884611d5c565b9050611b05848285612361565b6001600160a01b0384165f9081526006860160205260409020546108c191906129a4565b5f611b3483836123bd565b506001600160a01b03165f908152600690910160205260408120805491905590565b6040516001600160a01b03838116602483015260448201839052610a6a91859182169063a9059cbb90606401611abb565b5f611b928383611110565b611c0f575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055611bc73390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161070c565b505f61070c565b5f611c218383611110565b15611c0f575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161070c565b6001600160a01b038084165f8181526004602090815260408083208784528252808320948616808452600590950182528083205493835260068252808320878452825280832094835293905291822054808211611cdc575f610d7a565b610d7a818361292c565b611cf084846123bd565b611cfa84836123bd565b6001600160a01b0383165f90815260058501602052604081208054839290611d2390849061292c565b90915550506001600160a01b0382165f90815260058501602052604081208054839290611d519084906129a4565b909155505050505050565b5f81600301545f03611d6f57505f919050565b5f826003015442611d80919061292c565b60048401549091505f818311611db95781611d9b848261292c565b8660020154611daa919061298d565b611db491906129ea565b611dbb565b5f5b8554909150611dcb90829061292c565b95945050505050565b6003546040516357f1915d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590525f9283929116906357f1915d90604401602060405180830381865afa158015611e46573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6a9190612976565b9150612710611e79848461298d565b611e8391906129ea565b90509250929050565b5f8211611eac57604051631410107b60e31b815260040160405180910390fd5b60968210611ecd57604051639ca294f560e01b815260040160405180910390fd5b611ed783826123bd565b6001600160a01b0381165f90815260058401602052604081208054849290611f009084906129a4565b909155505050600190910155565b604080516001600160a01b03871660208201529081018590523360608201526080810184905260a0810183905260c081018290524360e08201525f90610100016040516020818303038152906040528051906020012090505f8411611f865760405163129f6bd160e31b815260040160405180910390fd5b428211611fa657604051632a6d119960e01b815260040160405180910390fd5b5f8311611fc6576040516366d7713f60e01b815260040160405180910390fd5b5f818152600560205260409020600201546001600160a01b031615611ffe576040516334f05e0f60e21b815260040160405180910390fd5b612009868633611c7f565b8411156120295760405163a2cd942d60e01b815260040160405180910390fd5b6040805160c0810182526001600160a01b0380891680835260208084018a815233858701818152606087018c8152608088018c815260a089018c81525f8c815260058089528c82209b518c54908c166001600160a01b0319918216178d55975160018d0155945160028c01805491909b1697169690961790985590516003890155516004880155945195909401949094559083526006815283832089845281528383209183525290812080548692906120e39084906129a4565b9091555050604080516001600160a01b038816815260208101869052908101849052606081018390528590339083907f211be1b00d760b08c7a624160b3c87d846267c5a1241f2cbc91d3df9e41ce4e59060800160405180910390a495945050505050565b805f036121685760405163129f6bd160e31b815260040160405180910390fd5b6001600160a01b0383165f9081526004602090815260408083208584529091529020600101546121ab5760405163a3bd944560e01b815260040160405180910390fd5b6001600160a01b0383165f90815260046020908152604080832085845290915290206121ed9073aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3384611ce6565b6040805182815233602082015283916001600160a01b038616917f09c077d55485b153863a57acdf9af51a2f97ad358d28218fed0f7e235e391eb8910160405180910390a3604051637921219560e11b81526001600160a01b0384169063f242432a9061226490339030908790879060040161293f565b5f604051808303815f87803b15801561227b575f5ffd5b505af115801561228d573d5f5f3e3d5ffd5b50505050505050565b6122a08282611110565b6122d45760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b5050565b5f816004015482600301546122ed91906129a4565b421192915050565b5f5f60205f8451602086015f885af180612314576040513d5f823e3d81fd5b50505f513d9150811561232b578060011415612338565b6001600160a01b0384163b155b15610a0d57604051635274afe760e01b81526001600160a01b03851660048201526024016122cb565b6001600160a01b0381165f908152600784016020526040812054670de0b6b3a76400009061238f908561292c565b6001600160a01b0384165f9081526005870160205260409020546123b3919061298d565b6108c191906129ea565b5f6123c783611d5c565b90506123d4838284612361565b6001600160a01b0383165f908152600685016020526040812080549091906123fd9084906129a4565b90915550506001600160a01b039091165f9081526007909201602052604090912055565b5f60208284031215612431575f5ffd5b81356001600160e01b03198116811461173f575f5ffd5b80356001600160a01b038116811461245e575f5ffd5b919050565b5f5f5f5f60808587031215612476575f5ffd5b61247f85612448565b966020860135965060408601359560600135945092505050565b5f602082840312156124a9575f5ffd5b5035919050565b5f5f5f606084860312156124c2575f5ffd5b6124cb84612448565b9250602084013591506124e060408501612448565b90509250925092565b5f5f604083850312156124fa575f5ffd5b82359150611e8360208401612448565b5f5f5f5f6080858703121561251d575f5ffd5b61252685612448565b9350602085013592506040850135915061254260608601612448565b905092959194509250565b5f5f6040838503121561255e575f5ffd5b61256783612448565b9150611e8360208401612448565b5f5f60408385031215612586575f5ffd5b61258f83612448565b946020939093013593505050565b5f5f604083850312156125ae575f5ffd5b50508035926020909101359150565b5f602082840312156125cd575f5ffd5b61173f82612448565b5f5f5f606084860312156125e8575f5ffd5b505081359360208301359350604090920135919050565b5f5f5f5f5f60a08688031215612613575f5ffd5b61261c86612448565b97602087013597506040870135966060810135965060800135945092505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561267a5761267a61263d565b604052919050565b5f82601f830112612691575f5ffd5b813567ffffffffffffffff8111156126ab576126ab61263d565b8060051b6126bb60208201612651565b918252602081850181019290810190868411156126d6575f5ffd5b6020860192505b83831015610d7a5782358252602092830192909101906126dd565b5f82601f830112612707575f5ffd5b813567ffffffffffffffff8111156127215761272161263d565b612734601f8201601f1916602001612651565b818152846020838601011115612748575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f5f60a08688031215612778575f5ffd5b61278186612448565b945061278f60208701612448565b9350604086013567ffffffffffffffff8111156127aa575f5ffd5b6127b688828901612682565b935050606086013567ffffffffffffffff8111156127d2575f5ffd5b6127de88828901612682565b925050608086013567ffffffffffffffff8111156127fa575f5ffd5b612806888289016126f8565b9150509295509295909350565b5f5f5f60608486031215612825575f5ffd5b61282e84612448565b95602085013595506040909401359392505050565b5f5f5f60408486031215612855575f5ffd5b61285e84612448565b9250602084013567ffffffffffffffff811115612879575f5ffd5b8401601f81018613612889575f5ffd5b803567ffffffffffffffff81111561289f575f5ffd5b8660208260051b84010111156128b3575f5ffd5b939660209190910195509293505050565b5f5f5f5f5f60a086880312156128d8575f5ffd5b6128e186612448565b94506128ef60208701612448565b93506040860135925060608601359150608086013567ffffffffffffffff8111156127fa575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561070c5761070c612918565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a0608082018190525f9082015260c00190565b5f60208284031215612986575f5ffd5b5051919050565b808202811582820484141761070c5761070c612918565b8082018082111561070c5761070c612918565b5f602082840312156129c7575f5ffd5b8151801515811461173f575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f82612a0457634e487b7160e01b5f52601260045260245ffd5b50049056fea264697066735822122043d176fd111c66aa4b880eb644c8e33c06536c3658e4b893a7fe2a04f4befd9d64736f6c634300081b00330000000000000000000000002e44f3f609ff5aa4819b323fd74690f07c3607c40000000000000000000000008681a9cee0b43022e85f1cddbe9745d5d0770c3e000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48