Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
Available on 9 networks: Ethereum mainnet, Linea, Polygon, Optimism, BNB Chain, zkSync Era, Base, Avalanche.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
100s of games, generous bonuses, 20+ years of trusted gaming. Join CryptoWins & start winning today!
Overview
ETH Balance
Eth Value
$671.95 (@ $3,476.49/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (102)0.0005 alETHAlchemix ETH (alETH)$1.70@3,409.030.22764859 1INCH1INCH Token (1INCH)$0.09@0.414848.94335 ALDAladdin Toke... (ALD)$2.76@0.05640.22070477 ALCXAlchemix (ALCX)$4.48@20.311.0187296 APEApeCoin (APE)$1.27@1.250.5 BADGERBadger (BADGER)$2.16@4.320.36379107 BALBalancer (BAL)$0.98@2.69920.8561127 BANKBankless Tok... (BANK)$0.96@0.0010.5 CXOCargoX (CXO)$0.10@0.196510 CHAINChain Games (CHAIN)$0.20@0.020.11395235 LINKChainLink To... (LINK)$2.88@25.230.3 PEOPLEConstitution... (PEOPLE)$0.01@0.04540.19441996 CROCronos Coin (CRO)$0.03@0.163724.10162738 DGDecentral Ga... (DG)$0.35@0.01446.3115763 MANADecentraland (MANA)$3.38@0.5357418,007.1388747 ELONDogelon (ELON)$0.09@0.000.75380321 DOLADola USD Sta... (DOLA)$0.75@0.9905132.77360517 DUSKDusk Network (DUSK)$30.11@0.22684.20433376 DYDXdYdX (DYDX)$6.60@1.571 EGGTEgg n Partne... (EGGT)$0.33@0.32542 FOXFOX (FOX)$0.13@0.06271.25 FRAXFrax (FRAX)$1.25@0.9989120.57725793 SOLVEHealthcare A... (SOLVE)$0.82@0.00687.87889954 HEXHEX (HEX)$0.03@0.004233.54801422 HOPHop (HOP)$0.58@0.01720.08020653 ILVIlluvium (ILV)$3.45@42.973.47212565 IMXImmutable X (IMX)$5.10@1.470.00049837 icETHInterest Com... (icETH)$1.91@3,829.2914.48010565 KROMKromatika (KROM)$0.26@0.01770.005 LOKALeague of Ki... (LOKA)$0.00@0.22926.6637703 LDOLido DAO Tok... (LDO)$51.99@1.951.32144057 LRCLoopringCoin... (LRC)$0.29@0.21865.42360054 MAGICMAGIC (MAGIC)$2.52@0.46410.04818873 MIMMagic Intern... (MIM)$0.05@0.99740.09 MASKMask Network (MASK)$0.29@3.210.56963198 MCBMCDEX Token (MCB)$1.30@2.2946,969.86065337 MEMEMEMememe (MEMEME)$0.15@0.000.02877826 MVIMetaverse In... (MVI)$1.12@38.82040.02833249 OHMOlympus (OHM)$0.59@20.9869.5 PSPParaSwap (PSP)$1.69@0.02443.6895516 PERPPerpetual (PERP)$3.22@0.87371.26957357 POOLPoolTogether (POOL)$1.35@1.0611.71609953 POPPopcorn (POP)$0.12@0.00990.08 PYRPYR Token (PYR)$0.27@3.38746.26142453 REVVREVV (REVV)$0.03@0.00450.0120875 ROOKROOK (ROOK)$0.01@0.951113.32435172 SANDSAND (SAND)$8.22@0.6172,995,368.23200724 SHIBSHIBA INU (SHIB)$68.89@0.005.61192907 SDStader (SD)$5.58@0.994920.8019998 stMATICStaked MATIC (stMATI...)$12.32@0.59250.1 STGStargateToke... (STG)$0.03@0.32290.00013589 stETHstETH (stETH)$0.47@3,463.47387.75 DATAStreamr (DATA)$18.99@0.0490.25 STRPStrips Token (STRP)79.39901297 RARESuperRare (RARE)$9.33@0.11740.25 SUSHISushiToken (SUSHI)$0.42@1.670.03 SNXSynthetix Ne... (SNX)$0.07@2.230.75 TRIBETribe (TRIBE)$0.48@0.64253.5 UNIQUniqly (UNIQ)$188.45@53.84336.34852819 UNIUniswap (UNI)$91.80@14.462.81704741 VISIONVision Token (VISION)$0.54@0.1934,081.875 LUNCWrapped LUNC... (LUNC)$0.19@0.0069.94 USTCWrapped USTC... (USTC)$1.39@0.01980.07326937 AAVEAave Token (AAVE)$27.57@376.2412.84950282 ACXAcross Proto... (ACX)$7.52@0.5851.93431488 BLURBlur (BLUR)$0.53@0.274828.64152744 BUSDBUSD (BUSD)$28.53@0.99610.002451 COMPCompound (COMP)$0.21@86.24119.51938725 CRVCurve DAO To... (CRV)$123.88@1.036513.51495855 DAIDai Stableco... (DAI)$13.57@1.0040.93340951 ENSEthereum Nam... (ENS)$34.71@37.192.60739794 FTMFantom Token (FTM)$2.56@0.980822.5 GUSDGemini dolla... (GUSD)$22.55@1.0020.00571372 GNOGnosis (GNO)$1.58@276.31100.5672896 MATICMatic Token (MATIC)$52.03@0.517328.12342 USDTTether USD (USDT)$28.12@1.00273.654414 USDCUSDC (USDC)$274.20@1.0020.00000004 WBTCWrapped BTC (WBTC)$0.00@97,499.000.007946 WETHWrapped Ethe... (WETH)$27.64@3,478.90620.00753727 wstETHWrapped liqu... (wstETH)$30.99@4,111.657 ADADreward$0.00@0.00194.85 Swap at LINKToken.ioERC-20: aLIN... (Swap a...)0.2067391 BONEBONE SHIBASWAP$0.10@0.48671.84472368 LBRLBR43.96977661 $MECHAMechanium$0.25@0.005611.71736448 SWAPTrustSwap Token$1.38@0.11791 UPCUPCX$3.75@3.750.35355547 alUSDAlchemix USD$0.35@0.99575.03 CGGChainGuardians Governance Token$0.06@0.01281.64721073 cvxCRVConvex CRV$1.09@0.6619549.3486875 DFYNDFYN Token$4.37@0.0083.16946993 HAIHacken Token$0.22@0.068490.92985073 LUSDLUSD Stablecoin$90.31@0.993229,494.8120145 RFDREFUND$0.15@0.000.75841452 XCADXCAD Token$0.22@0.29360.7 TokenERC-20 TOKEN*[Suspicious]9,000 TokenERC-20 TOKEN*[Suspicious]900 TokenERC-20 TOKEN*[Suspicious]3,999.99 TokenERC-20 TOKEN*[Suspicious]870 TokenERC-20 TOKEN*[Suspicious]1.4 TokenERC-20 TOKEN*[Spam]3,999.99 TokenERC-20 TOKEN*[Spam]NFT Tokens (40)claim rewards on apyshib.orgapyshib.orgERC-1155BRAYCBlurredApeYachtClubERC-1155claim rewards on clinknetwork.orgclinknetwork.orgERC-1155claim rewards on dydxnetwork.orgdydxnetwork.orgERC-1155claim rewards on ensfoundation.orgensfoundation.orgERC-1155claim rewards on fraxprotocol.comfraxprotocol.comERC-1155claim rewards on getaave.orggetaave.orgERC-1155claim rewards illuviumnetwork.netilluviumnetwork.netERC-1155claim rewards on linkprize.iolinkprize.ioERC-1155Reward Club [h6zhi4sH]Reward Club [ZcT0ynwg]ERC-1155claim rewards on snxtoken.comsnxtoken.comERC-1155claim rewards on stakedeth.iostakedeth.ioERC-1155claim rewards on stether.netstether.netERC-1155claim rewards on univ4lab.comuniv4lab.comERC-1155claim rewards on wrappedbtc.netwrappedbtc.netERC-1155claim rewards on wsteth.netwsteth.netERC-1155ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]
More Info
Private Name Tags
ContractCreator
Multichain Info
1 address found via- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
- Cards New
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 7,986 transactions
Transaction Hash MethodBlockFromToCall Registry 19836934 2024-05-10 3:23:59 228 days ago 1715311439 IN 0.006312 ETH$21.94 0.0003568 3 Claim Fee 19834381 2024-05-09 18:49:11 229 days ago 1715280551 IN 0 ETH$0.00 0.0005509 5.96858249 Claim Fee 19834380 2024-05-09 18:48:59 229 days ago 1715280539 IN 0 ETH$0.00 0.00054281 5.64827721 Claim Fee 19834379 2024-05-09 18:48:47 229 days ago 1715280527 IN 0 ETH$0.00 0.00042943 6.16275132 Claim Fee 19834378 2024-05-09 18:48:35 229 days ago 1715280515 IN 0 ETH$0.00 0.00039387 6.07094652 Call Registry 18782872 2023-12-14 7:23:59 376 days ago 1702538639 IN 0.009 ETH$31.29 0.00552079 55.02032126 Call Registry 18636048 2023-11-23 17:53:59 397 days ago 1700762039 IN 0.00970322 ETH$33.73 0.00476107 47.44324723 Call Registry 18354627 2023-10-15 8:36:23 436 days ago 1697358983 IN 0 ETH$0.00 0.0020732 6.31187068 Call Registry 18350769 2023-10-14 19:41:11 437 days ago 1697312471 IN 0 ETH$0.00 0.00137511 6.60125159 Call Registry 18350690 2023-10-14 19:25:23 437 days ago 1697311523 IN 0 ETH$0.00 0.00119329 7.09452783 Call Registry 18183838 2023-09-21 11:05:11 460 days ago 1695294311 IN 0.1 ETH$347.65 0.00179769 10.31730961 Call Registry 18183369 2023-09-21 9:30:35 460 days ago 1695288635 IN 0 ETH$0.00 0.00541681 12.50638424 Call Registry 18183229 2023-09-21 9:01:59 460 days ago 1695286919 IN 0.05 ETH$173.82 0.00196487 11.27907254 Call Registry 18183123 2023-09-21 8:40:23 460 days ago 1695285623 IN 0.001 ETH$3.48 0.00104538 10.41960972 Call Registry 18183080 2023-09-21 8:31:47 460 days ago 1695285107 IN 1 ETH$3,476.49 0.00185181 9.12178364 Call Registry 18182919 2023-09-21 7:59:35 460 days ago 1695283175 IN 0.01 ETH$34.76 0.00090285 9 Call Registry 18182183 2023-09-21 5:30:11 460 days ago 1695274211 IN 0.02 ETH$69.53 0.00267784 8.915971 Call Registry 18181856 2023-09-21 4:23:59 460 days ago 1695270239 IN 0.78 ETH$2,711.66 0.00121948 8.48847711 Call Registry 18181771 2023-09-21 4:06:59 460 days ago 1695269219 IN 0.003 ETH$10.43 0.00096702 9.63855639 Call Registry 18180978 2023-09-21 1:27:35 460 days ago 1695259655 IN 0 ETH$0.00 0.00235911 9.52052591 Call Registry 18180931 2023-09-21 1:17:59 460 days ago 1695259079 IN 0.0045 ETH$15.64 0.00189239 9.32279961 Call Registry 18180799 2023-09-21 0:51:35 460 days ago 1695257495 IN 0 ETH$0.00 0.00421172 8.22624459 Call Registry 18180604 2023-09-21 0:12:35 460 days ago 1695255155 IN 0.077 ETH$267.69 0.00226582 11.8410961 Call Registry 18180562 2023-09-21 0:04:11 460 days ago 1695254651 IN 0 ETH$0.00 0.00278273 10.64254561 Claim Fee 18168870 2023-09-19 8:48:47 462 days ago 1695113327 IN 0 ETH$0.00 0.00161403 11.04424274 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block FromTo19836934 2024-05-10 3:23:59 228 days ago 1715311439 0.00629622 ETH$21.89 19834378 2024-05-09 18:48:35 229 days ago 1715280515 0.00214709 ETH$7.46 19834378 2024-05-09 18:48:35 229 days ago 1715280515 0.04079482 ETH$141.82 18782872 2023-12-14 7:23:59 376 days ago 1702538639 0.0089775 ETH$31.21 18636048 2023-11-23 17:53:59 397 days ago 1700762039 0.00967896 ETH$33.65 18183838 2023-09-21 11:05:11 460 days ago 1695294311 0.0995 ETH$345.91 18183229 2023-09-21 9:01:59 460 days ago 1695286919 0.04975 ETH$172.96 18183123 2023-09-21 8:40:23 460 days ago 1695285623 0.000995 ETH$3.46 18183080 2023-09-21 8:31:47 460 days ago 1695285107 0.995 ETH$3,459.11 18182919 2023-09-21 7:59:35 460 days ago 1695283175 0.00995 ETH$34.59 18182183 2023-09-21 5:30:11 460 days ago 1695274211 0.0199 ETH$69.18 18181856 2023-09-21 4:23:59 460 days ago 1695270239 0.7761 ETH$2,698.10 18181771 2023-09-21 4:06:59 460 days ago 1695269219 0.002985 ETH$10.38 18180931 2023-09-21 1:17:59 460 days ago 1695259079 0.0044775 ETH$15.57 18180604 2023-09-21 0:12:35 460 days ago 1695255155 0.076615 ETH$266.35 18168780 2023-09-19 8:30:47 462 days ago 1695112247 0.12150879 ETH$422.42 18168780 2023-09-19 8:30:47 462 days ago 1695112247 0.68854982 ETH$2,393.74 18107795 2023-09-10 18:34:47 471 days ago 1694370887 0.15858554 ETH$551.32 18059143 2023-09-03 23:08:35 477 days ago 1693782515 0.5131225 ETH$1,783.86 18059143 2023-09-03 23:08:35 477 days ago 1693782515 0.517 ETH$1,797.34 18015399 2023-08-28 20:03:59 484 days ago 1693253039 0.009925 ETH$34.50 18015399 2023-08-28 20:03:59 484 days ago 1693253039 0.01 ETH$34.76 17997161 2023-08-26 6:48:59 486 days ago 1693032539 0.00024159 ETH$0.84 17978604 2023-08-23 16:28:35 489 days ago 1692808115 0.017955 ETH$62.42 17973630 2023-08-22 23:47:35 489 days ago 1692748055 0.347375 ETH$1,207.65 Loading...LoadingThis contract contains unverified libraries: __CACHE_BREAKER__Contract Name:FeeRouter
Compiler Versionv0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.4; import "./interfaces/ISocketRegistry.sol"; import "./utils/Ownable.sol"; import "lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol"; import "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; contract FeeRouter is Ownable,ReentrancyGuard { using SafeERC20 for IERC20; /** * @notice Address used to identify if it is a native token transfer or not */ address private constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; /** * @notice variable for our registry contract, registry contract is responsible for redirecting to different bridges */ ISocketRegistry public immutable socket; // Errors error IntegratorIdAlreadyRegistered(); error TotalFeeAndPartsMismatch(); error IntegratorIdNotRegistered(); error FeeMisMatch(); error NativeTransferFailed(); error MsgValueMismatch(); // MAX value of totalFeeInBps. uint32 immutable PRECISION = 1000000; constructor(address _socketRegistry, address owner_) Ownable(owner_) { socket = ISocketRegistry(_socketRegistry); } // Function to receive Ether. msg.data must be empty receive() external payable {} // Events -------------------------------------------------------------------------------------------------------> /** * @notice Event emitted when an integrator registers their fee config */ event RegisterFee( uint16 integratorId, uint16 totalFeeInBps, uint16 part1, uint16 part2, uint16 part3, address feeTaker1, address feeTaker2, address feeTaker3 ); /** * @notice Event emitted when integrator fee config is updated */ event UpdateFee( uint16 integratorId, uint16 totalFeeInBps, uint16 part1, uint16 part2, uint16 part3, address feeTaker1, address feeTaker2, address feeTaker3 ); /** * @notice Event emitted when fee in tokens are claimed */ event ClaimFee( uint16 integratorId, address tokenAddress, uint256 amount, address feeTaker ); /** * @notice Event emitted when call registry is successful */ event BridgeSocket( uint16 integratorId, uint256 amount, address inputTokenAddress, uint256 toChainId, uint256 middlewareId, uint256 bridgeId, uint256 totalFee ); /** * @notice Container for Fee Request * @member integratorId Id of the integrator registered in the fee config * @member inputAmount amount sent to the fee router. * @member UserRequest request that is passed on to the registry */ struct FeeRequest { uint16 integratorId; uint256 inputAmount; ISocketRegistry.UserRequest userRequest; } /** * @notice Container for Fee Splits * @member feeTaker address of the entity who will claim the fee * @member partOfTotalFeesInBps part of total fees that the feeTaker can claim */ struct FeeSplits { address feeTaker; uint16 partOfTotalFeesInBps; } /** * @notice Mapping of valid integrators */ mapping(uint16 => bool) validIntegrators; /** * @notice Mapping of integrator Ids and the total fee that can be cut from the input amount */ mapping(uint16 => uint16) totalFeeMap; /** * @notice Mapping of integrator Ids and FeeSplits. FeeSplits is an array with the max size of 3 * The total fee can be at max split into 3 parts */ mapping(uint16 => FeeSplits[3]) feeSplitMap; /** * @notice Mapping of integratorId and the earned fee per token */ mapping(uint16 => mapping(address => uint256)) earnedTokenFeeMap; // CORE FUNCTIONS ------------------------------------------------------------------------------------------------------> /** * @notice Owner can register a fee config against an integratorId * @dev totalFeeInBps and the sum of feesplits should be exactly equal, feeSplits can have a max size of 3 * @param integratorId id of the integrator * @param totalFeeInBps totalFeeInBps, the max value can be 10000 * @param feeSplits array of FeeSplits */ function registerFeeConfig( uint16 integratorId, uint16 totalFeeInBps, FeeSplits[3] calldata feeSplits ) external onlyOwner { // Not checking for total fee in bps to be 0 as the total fee can be set to 0. if (validIntegrators[integratorId]) { revert IntegratorIdAlreadyRegistered(); } uint16 x = feeSplits[0].partOfTotalFeesInBps + feeSplits[1].partOfTotalFeesInBps + feeSplits[2].partOfTotalFeesInBps; if (x != totalFeeInBps) { revert TotalFeeAndPartsMismatch(); } totalFeeMap[integratorId] = totalFeeInBps; feeSplitMap[integratorId][0] = feeSplits[0]; feeSplitMap[integratorId][1] = feeSplits[1]; feeSplitMap[integratorId][2] = feeSplits[2]; validIntegrators[integratorId] = true; _emitRegisterFee(integratorId, totalFeeInBps, feeSplits); } /** * @notice Owner can update the fee config against an integratorId * @dev totalFeeInBps and the sum of feesplits should be exactly equal, feeSplits can have a max size of 3 * @param integratorId id of the integrator * @param totalFeeInBps totalFeeInBps, the max value can be 10000 * @param feeSplits array of FeeSplits */ function updateFeeConfig( uint16 integratorId, uint16 totalFeeInBps, FeeSplits[3] calldata feeSplits ) external onlyOwner { if (!validIntegrators[integratorId]) { revert IntegratorIdNotRegistered(); } uint16 x = feeSplits[0].partOfTotalFeesInBps + feeSplits[1].partOfTotalFeesInBps + feeSplits[2].partOfTotalFeesInBps; if (x != totalFeeInBps) { revert TotalFeeAndPartsMismatch(); } totalFeeMap[integratorId] = totalFeeInBps; feeSplitMap[integratorId][0] = feeSplits[0]; feeSplitMap[integratorId][1] = feeSplits[1]; feeSplitMap[integratorId][2] = feeSplits[2]; _emitUpdateFee(integratorId, totalFeeInBps, feeSplits); } /** * @notice Function that sends the claimed fee to the corresponding integrator config addresses * @dev native token address to be used to claim native token fee, if earned fee is 0, it will return * @param integratorId id of the integrator * @param tokenAddress address of the token to claim fee against */ function claimFee(uint16 integratorId, address tokenAddress) external nonReentrant { uint256 earnedFee = earnedTokenFeeMap[integratorId][tokenAddress]; FeeSplits[3] memory integratorFeeSplits = feeSplitMap[integratorId]; earnedTokenFeeMap[integratorId][tokenAddress] = 0; if (earnedFee == 0) { return; } for (uint8 i = 0; i < 3; i++) { _calculateAndClaimFee( integratorId, earnedFee, integratorFeeSplits[i].partOfTotalFeesInBps, totalFeeMap[integratorId], integratorFeeSplits[i].feeTaker, tokenAddress ); } } /** * @notice Function that calls the registry after verifying if the fee is correct * @dev userRequest amount should match the aount after deducting the fee from the input amount * @param _feeRequest feeRequest contains the integratorId, the input amount and the user request that is passed to socket registry */ function callRegistry(FeeRequest calldata _feeRequest) external payable nonReentrant { if (!validIntegrators[_feeRequest.integratorId]) { revert IntegratorIdNotRegistered(); } // Get approval and token addresses. ( address approvalAddress, address inputTokenAddress ) = _getApprovalAndInputTokenAddress(_feeRequest.userRequest); // Calculate Amount to Send to Registry. uint256 amountToBridge = _getAmountForRegistry( _feeRequest.integratorId, _feeRequest.inputAmount ); if (_feeRequest.userRequest.amount != amountToBridge) { revert FeeMisMatch(); } // Call Registry if (inputTokenAddress == NATIVE_TOKEN_ADDRESS) { if (msg.value != _feeRequest.inputAmount) revert MsgValueMismatch(); socket.outboundTransferTo{ value: msg.value - (_feeRequest.inputAmount - amountToBridge) }(_feeRequest.userRequest); } else { _getUserFundsToFeeRouter( msg.sender, _feeRequest.inputAmount, inputTokenAddress ); IERC20(inputTokenAddress).safeApprove( approvalAddress, amountToBridge ); socket.outboundTransferTo{value: msg.value}( _feeRequest.userRequest ); } // Update the earned fee for the token and integrator. _updateEarnedFee( _feeRequest.integratorId, inputTokenAddress, _feeRequest.inputAmount, amountToBridge ); // Emit Bridge Event _emitBridgeSocket(_feeRequest, inputTokenAddress, amountToBridge); } // INTERNAL UTILITY FUNCTION ------------------------------------------------------------------------------------------------------> /** * @notice function that sends the earned fee depending on the inputs * @dev tokens will not be transferred to zero addresses, earned fee against an integrator id is divided into the splits configured * @param integratorId id of the integrator * @param earnedFee amount of tokens earned as fee * @param part part of the amount that needs to be claimed in bps * @param total totalfee in bps * @param feeTaker address that the earned fee will be sent to after calculation * @param tokenAddress address of the token for claiming fee */ function _calculateAndClaimFee( uint16 integratorId, uint256 earnedFee, uint16 part, uint16 total, address feeTaker, address tokenAddress ) internal { if (feeTaker != address(0)) { uint256 amountToBeSent = (earnedFee * part) / total; emit ClaimFee(integratorId, tokenAddress, amountToBeSent, feeTaker); if (tokenAddress == NATIVE_TOKEN_ADDRESS) { (bool success, ) = payable(feeTaker).call{ value: amountToBeSent }(""); if (!success) revert NativeTransferFailed(); return; } IERC20(tokenAddress).safeTransfer(feeTaker, amountToBeSent); } } /** * @notice function that returns the approval address and the input token address * @dev approval address is needed to approve the bridge or middleware implementaton before calling socket registry * @dev input token address is needed to identify the token in which the fee is being deducted * @param userRequest socket registry's user request * @return (address, address) returns the approval address and the inputTokenAddress */ function _getApprovalAndInputTokenAddress( ISocketRegistry.UserRequest calldata userRequest ) internal view returns (address, address) { if (userRequest.middlewareRequest.id == 0) { (address routeAddress, , ) = socket.routes( userRequest.bridgeRequest.id ); return (routeAddress, userRequest.bridgeRequest.inputToken); } else { (address routeAddress, , ) = socket.routes( userRequest.middlewareRequest.id ); return (routeAddress, userRequest.middlewareRequest.inputToken); } } /** * @notice function that transfers amount from the user to this contract. * @param user address of the user who holds the tokens * @param amount amount of tokens to transfer * @param tokenAddress address of the token being bridged */ function _getUserFundsToFeeRouter( address user, uint256 amount, address tokenAddress ) internal { IERC20(tokenAddress).safeTransferFrom(user, address(this), amount); } /** * @notice function that returns an amount after deducting the fee * @param integratorId id of the integrator * @param amount input amount to this contract when calling the function callRegistry * @return uint256 returns the amount after deduciting the fee */ function _getAmountForRegistry(uint16 integratorId, uint256 amount) internal view returns (uint256) { return amount - ((amount * totalFeeMap[integratorId]) / PRECISION); } /** * @notice function that updated the earned fee against the integrator Id * @param integratorId id of the integrator * @param inputTokenAddress address of the token being bridged * @param amount input amount to this contract when calling the function callRegistry * @param registryAmount amount in user request that is passed on to registry */ function _updateEarnedFee( uint16 integratorId, address inputTokenAddress, uint256 amount, uint256 registryAmount ) internal { earnedTokenFeeMap[integratorId][inputTokenAddress] = earnedTokenFeeMap[integratorId][inputTokenAddress] + amount - registryAmount; } /** * @notice function that emits the event BridgeSocket */ function _emitBridgeSocket( FeeRequest calldata _feeRequest, address tokenAddress, uint256 registryAmount ) internal { emit BridgeSocket( _feeRequest.integratorId, _feeRequest.inputAmount, tokenAddress, _feeRequest.userRequest.toChainId, _feeRequest.userRequest.middlewareRequest.id, _feeRequest.userRequest.bridgeRequest.id, _feeRequest.inputAmount - registryAmount ); } /** * @notice function that emits the event UpdateFee */ function _emitUpdateFee( uint16 integratorId, uint16 totalFeeInBps, FeeSplits[3] calldata feeSplits ) internal { emit UpdateFee( integratorId, totalFeeInBps, feeSplits[0].partOfTotalFeesInBps, feeSplits[1].partOfTotalFeesInBps, feeSplits[2].partOfTotalFeesInBps, feeSplits[0].feeTaker, feeSplits[1].feeTaker, feeSplits[2].feeTaker ); } /** * @notice function that emits the event RegisterFee */ function _emitRegisterFee( uint16 integratorId, uint16 totalFeeInBps, FeeSplits[3] calldata feeSplits ) internal { emit RegisterFee( integratorId, totalFeeInBps, feeSplits[0].partOfTotalFeesInBps, feeSplits[1].partOfTotalFeesInBps, feeSplits[2].partOfTotalFeesInBps, feeSplits[0].feeTaker, feeSplits[1].feeTaker, feeSplits[2].feeTaker ); } // VIEW FUNCTIONS ---------------------------------------------------------------------------------------------------------> /** * @notice function that returns the amount in earned fee * @param integratorId id of the integrator * @param tokenAddress address of the token * @return uin256 */ function getEarnedFee(uint16 integratorId, address tokenAddress) public view returns (uint256) { return earnedTokenFeeMap[integratorId][tokenAddress]; } /** * @notice function that returns if the integrator id is valid or not * @param integratorId id of the integrator * @return bool */ function getValidIntegrator(uint16 integratorId) public view returns (bool) { return validIntegrators[integratorId]; } /** * @notice function that returns the total fee in bps registered against the integrator id * @param integratorId id of the integrator * @return uint16 */ function getTotalFeeInBps(uint16 integratorId) public view returns (uint16) { return totalFeeMap[integratorId]; } /** * @notice function that returns the FeeSplit array registered agains the integrator id * @param integratorId id of the integrator * @return feeSplits FeeSplits[3] - array of FeeSplits of size 3 */ function getFeeSplits(uint16 integratorId) public view returns (FeeSplits[3] memory feeSplits) { return feeSplitMap[integratorId]; } // RESCUE FUNCTIONS ------------------------------------------------------------------------------------------------------> /** * @notice rescue function for emeregencies * @dev can only be called by the owner, should only be called during emergencies only * @param userAddress address of the user receiving funds * @param token address of the token being rescued * @param amount amount to be sent to the user */ function rescueFunds( address token, address userAddress, uint256 amount ) external onlyOwner { IERC20(token).safeTransfer(userAddress, amount); } /** * @notice rescue function for emeregencies * @dev can only be called by the owner, should only be called during emergencies only * @param userAddress address of the user receiving funds * @param amount amount to be sent to the user */ function rescueNative(address payable userAddress, uint256 amount) external onlyOwner { userAddress.transfer(amount); } }
pragma solidity ^0.8.4; abstract contract ISocketRegistry { /** * @notice Container for Bridge Request * @member id denotes the underlying bridge to be used * @member optionalNativeAmount native token amount if not to be included in the value. * @member inputToken token being bridged * @member data this can be decoded to get extra data needed for different bridges */ struct BridgeRequest { uint256 id; uint256 optionalNativeAmount; address inputToken; bytes data; } /** * @notice Container for Middleware Request * @member id denotes the underlying middleware to be used * @member optionalNativeAmount native token amount if not to be included in the value. * @member inputToken token being sent to middleware, for example swaps * @member data this can be decoded to get extra data needed for different middlewares */ struct MiddlewareRequest { uint256 id; uint256 optionalNativeAmount; address inputToken; bytes data; } /** * @notice Container for User Request * @member receiverAddress address of the user receiving the bridged amount * @member toChainId id of the chain being bridged to * @member amount amount being bridged through registry * @member middlewareRequest * @member bridgeRequest */ struct UserRequest { address receiverAddress; uint256 toChainId; uint256 amount; MiddlewareRequest middlewareRequest; BridgeRequest bridgeRequest; } /** * @notice Container for Route Data * @dev middlwares and bridges are both added into the same routes * @member route address of the implementation contract fo a bride or middleware * @member isEnabled bool variable that denotes if the particular route is enabled or disabled * @member isMiddleware bool variable that denotes if the particular route is a middleware or not */ struct RouteData { address route; bool isEnabled; bool isMiddleware; } /** * @notice Resgistered Routes on the socket registry * @dev middlwares and bridges are both added into the same routes */ RouteData[] public routes; /** * @notice Function called in the socket registry for bridging */ function outboundTransferTo(UserRequest calldata _userRequest) external payable virtual; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.4; abstract contract Ownable { address private _owner; address private _nominee; event OwnerNominated(address indexed nominee); event OwnerClaimed(address indexed claimer); error OnlyOwner(); error OnlyNominee(); constructor(address owner_) { _claimOwner(owner_); } modifier onlyOwner() { if (msg.sender != _owner) { revert OnlyOwner(); } _; } function owner() public view returns (address) { return _owner; } function nominee() public view returns (address) { return _nominee; } function nominateOwner(address nominee_) external { if (msg.sender != _owner) { revert OnlyOwner(); } _nominee = nominee_; emit OwnerNominated(_nominee); } function claimOwner() external { if (msg.sender != _nominee) { revert OnlyNominee(); } _claimOwner(msg.sender); } function _claimOwner(address claimer_) internal { _owner = claimer_; _nominee = address(0); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": { "": { "__CACHE_BREAKER__": "0x0000000000000031363634323733303538383438" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[{"internalType":"address","name":"_socketRegistry","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FeeMisMatch","type":"error"},{"inputs":[],"name":"IntegratorIdAlreadyRegistered","type":"error"},{"inputs":[],"name":"IntegratorIdNotRegistered","type":"error"},{"inputs":[],"name":"MsgValueMismatch","type":"error"},{"inputs":[],"name":"NativeTransferFailed","type":"error"},{"inputs":[],"name":"OnlyNominee","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"TotalFeeAndPartsMismatch","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"integratorId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"inputTokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"toChainId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"middlewareId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bridgeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalFee","type":"uint256"}],"name":"BridgeSocket","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"integratorId","type":"uint16"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"feeTaker","type":"address"}],"name":"ClaimFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"}],"name":"OwnerClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nominee","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"integratorId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"totalFeeInBps","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part1","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part2","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part3","type":"uint16"},{"indexed":false,"internalType":"address","name":"feeTaker1","type":"address"},{"indexed":false,"internalType":"address","name":"feeTaker2","type":"address"},{"indexed":false,"internalType":"address","name":"feeTaker3","type":"address"}],"name":"RegisterFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"integratorId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"totalFeeInBps","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part1","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part2","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"part3","type":"uint16"},{"indexed":false,"internalType":"address","name":"feeTaker1","type":"address"},{"indexed":false,"internalType":"address","name":"feeTaker2","type":"address"},{"indexed":false,"internalType":"address","name":"feeTaker3","type":"address"}],"name":"UpdateFee","type":"event"},{"inputs":[{"components":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"uint256","name":"inputAmount","type":"uint256"},{"components":[{"internalType":"address","name":"receiverAddress","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"optionalNativeAmount","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ISocketRegistry.MiddlewareRequest","name":"middlewareRequest","type":"tuple"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"optionalNativeAmount","type":"uint256"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ISocketRegistry.BridgeRequest","name":"bridgeRequest","type":"tuple"}],"internalType":"struct ISocketRegistry.UserRequest","name":"userRequest","type":"tuple"}],"internalType":"struct FeeRouter.FeeRequest","name":"_feeRequest","type":"tuple"}],"name":"callRegistry","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"claimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getEarnedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"}],"name":"getFeeSplits","outputs":[{"components":[{"internalType":"address","name":"feeTaker","type":"address"},{"internalType":"uint16","name":"partOfTotalFeesInBps","type":"uint16"}],"internalType":"struct FeeRouter.FeeSplits[3]","name":"feeSplits","type":"tuple[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"}],"name":"getTotalFeeInBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"}],"name":"getValidIntegrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nominee_","type":"address"}],"name":"nominateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"uint16","name":"totalFeeInBps","type":"uint16"},{"components":[{"internalType":"address","name":"feeTaker","type":"address"},{"internalType":"uint16","name":"partOfTotalFeesInBps","type":"uint16"}],"internalType":"struct FeeRouter.FeeSplits[3]","name":"feeSplits","type":"tuple[3]"}],"name":"registerFeeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"socket","outputs":[{"internalType":"contract ISocketRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"integratorId","type":"uint16"},{"internalType":"uint16","name":"totalFeeInBps","type":"uint16"},{"components":[{"internalType":"address","name":"feeTaker","type":"address"},{"internalType":"uint16","name":"partOfTotalFeesInBps","type":"uint16"}],"internalType":"struct FeeRouter.FeeSplits[3]","name":"feeSplits","type":"tuple[3]"}],"name":"updateFeeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c0604052613d0960e61b60a0523480156200001a57600080fd5b506040516200250e3803806200250e8339810160408190526200003d916200009d565b600080546001600160a01b03199081166001600160a01b0384161790915560018054909116905550600160025560601b6001600160601b031916608052620000d5565b80516001600160a01b03811681146200009857600080fd5b919050565b60008060408385031215620000b157600080fd5b620000bc8362000080565b9150620000cc6020840162000080565b90509250929050565b60805160601c60a05160e01c6123f16200011d60003960006115590152600081816101c101528181610d9701528181610e7b0152818161136f015261146f01526123f16000f3fe6080604052600436106100ec5760003560e01c80635b94db271161008a5780638da5cb5b116100595780638da5cb5b146102ec578063ad3bd95d14610317578063afe315ee14610337578063c94288a21461039b57600080fd5b80635b94db27146102455780636ccae0541461026557806377001f83146102855780637d6167e8146102a557600080fd5b806322c8f6cd116100c657806322c8f6cd146101af5780632a4f1fbb146101e357806331efdc96146102035780633bd1adec1461023057600080fd5b8063050e56ea146100f85780631291f79d1461014157806320f99c0a1461016357600080fd5b366100f357005b600080fd5b34801561010457600080fd5b5061012c610113366004611da8565b61ffff1660009081526003602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561014d57600080fd5b5061016161015c366004611ca0565b6103ae565b005b34801561016f57600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b3480156101bb57600080fd5b5061018a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101ef57600080fd5b506101616101fe366004611dc5565b610447565b34801561020f57600080fd5b5061022361021e366004611da8565b6105db565b6040516101389190611f70565b34801561023c57600080fd5b50610161610675565b34801561025157600080fd5b50610161610260366004611c83565b6106fe565b34801561027157600080fd5b50610161610280366004611ccc565b6107be565b34801561029157600080fd5b506101616102a0366004611dfe565b610830565b3480156102b157600080fd5b506102d96102c0366004611da8565b61ffff9081166000908152600460205260409020541690565b60405161ffff9091168152602001610138565b3480156102f857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661018a565b34801561032357600080fd5b50610161610332366004611dfe565b610a4c565b34801561034357600080fd5b5061038d610352366004611dc5565b61ffff8216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205492915050565b604051908152602001610138565b6101616103a9366004611d6d565b610c26565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103ff576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610442573d6000803e3d6000fd5b505050565b61044f610f34565b61ffff8216600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684528252808320549383526005909152808220815160608101909252600383835b8282101561050057604080518082019091528483015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900461ffff166020808301919091529082526001909201910161049d565b50505061ffff8616600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152812055509050816105475750506105cd565b60005b60038160ff1610156105c9576105b78584848460ff1660038110610570576105706122b4565b6020908102919091015181015161ffff808b16600090815260049093526040909220549091168660ff8716600381106105ab576105ab6122b4565b60200201515189610fab565b806105c181612265565b91505061054a565b5050505b6105d76001600255565b5050565b6105e3611c35565b61ffff82166000908152600560205260408082208151606081019092529091600390835b8282101561066a57604080518082019091528483015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900461ffff1660208083019190915290825260019092019101610607565b505050509050919050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146106c6576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461074f576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080f576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61044273ffffffffffffffffffffffffffffffffffffffff8416838361114c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610881576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff831660009081526003602052604090205460ff16156108cf576040517f5771642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108e160c0830160a08401611da8565b6108f16080840160608501611da8565b6109016040850160208601611da8565b61090b919061216c565b610915919061216c565b90508261ffff168161ffff1614610958576040517f2ea1270e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001694881694909417909355600590522082906109ae82826122e3565b505061ffff841660009081526005602052604090819020908301906001016109d682826122e3565b505061ffff8416600090815260056020526040902060808301906002016109fd82826122e3565b505061ffff8416600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610a46848484611220565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a9d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff831660009081526003602052604090205460ff16610aea576040517f2849ec2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610afc60c0830160a08401611da8565b610b0c6080840160608501611da8565b610b1c6040850160208601611da8565b610b26919061216c565b610b30919061216c565b90508261ffff168161ffff1614610b73576040517f2ea1270e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169488169490941790935560059052208290610bc982826122e3565b505061ffff84166000908152600560205260409081902090830190600101610bf182826122e3565b505061ffff841660009081526005602052604090206080830190600201610c1882826122e3565b905050610a46848484611316565b610c2e610f34565b60036000610c3f6020840184611da8565b61ffff16815260208101919091526040016000205460ff16610c8d576040517f2849ec2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ca5610ca060408501856120fb565b611341565b90925090506000610cc6610cbc6020860186611da8565b856020013561153b565b905080610cd660408601866120fb565b6040013514610d11576040517f3b05b64a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610e345783602001353414610d80576040517fbc6f88c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a44bbb15610dca836020880135612222565b610dd49034612222565b610de160408801886120fb565b6040518363ffffffff1660e01b8152600401610dfd9190612018565b6000604051808303818588803b158015610e1657600080fd5b505af1158015610e2a573d6000803e3d6000fd5b5050505050610efd565b610e43338560200135846115a0565b610e6473ffffffffffffffffffffffffffffffffffffffff831684836115c2565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a44bbb1534610eae60408801886120fb565b6040518363ffffffff1660e01b8152600401610eca9190612018565b6000604051808303818588803b158015610ee357600080fd5b505af1158015610ef7573d6000803e3d6000fd5b50505050505b610f19610f0d6020860186611da8565b83866020013584611753565b610f248483836117df565b505050610f316001600255565b50565b600280541415610fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60028055565b73ffffffffffffffffffffffffffffffffffffffff8216156111445760008361ffff168561ffff1687610fde91906121e5565b610fe891906121aa565b6040805161ffff8a16815273ffffffffffffffffffffffffffffffffffffffff808616602083015291810183905290851660608201529091507f2ca7e603774a345d2661009d097610daffb2d91a47e69541066ddfe9221c51e89060800160405180910390a173ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156111215760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146110da576040519150601f19603f3d011682016040523d82523d6000602084013e6110df565b606091505b505090508061111a576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611144565b61114273ffffffffffffffffffffffffffffffffffffffff8316848361114c565b505b505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526104429084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526118bf565b7f6f8233416969476afceb725c919fe424faf367ed0a76e020fdf53369c4f1da9583838360005b60400201602001602081019061125d9190611da8565b61126d6080860160608701611da8565b61127d60c0870160a08801611da8565b61128a6020880188611c83565b61129a6060890160408a01611c83565b6112aa60a08a0160808b01611c83565b6040805161ffff998a16815297891660208901529588169587019590955292861660608601529416608084015273ffffffffffffffffffffffffffffffffffffffff93841660a0840152831660c08301529190911660e0820152610100015b60405180910390a1505050565b7fe6099dd217e540f806797781b59e4e804f78bc18220943c78d4ea9b68316e27c8383836000611247565b60008061135160608401846120c7565b3561145657600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663726f16d86113a160808701876120c7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681529035600482015260240160606040518083038186803b1580156113ef57600080fd5b505afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114279190611d0d565b5090915081905061143b60808601866120c7565b61144c906060810190604001611c83565b9250925050915091565b600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663726f16d86114a160608701876120c7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681529035600482015260240160606040518083038186803b1580156114ef57600080fd5b505afa158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190611d0d565b5090915081905061143b60608601866120c7565b61ffff808316600090815260046020526040812054909163ffffffff7f000000000000000000000000000000000000000000000000000000000000000016916115859116846121e5565b61158f91906121aa565b6115999083612222565b9392505050565b61044273ffffffffffffffffffffffffffffffffffffffff82168430856119cb565b80158061167157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561163757600080fd5b505afa15801561164b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166f9190611e4f565b155b6116fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610f9c565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526104429084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161119e565b61ffff8416600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548190611795908490612192565b61179f9190612222565b61ffff909416600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff909616835294905292909220929092555050565b7f0881410a322342e6e09eb472c7ab91907d7a31436d5816b8f349c30518c9dc9761180d6020850185611da8565b60208501358461182060408801886120fb565b6020013561183160408901896120fb565b61183f9060608101906120c7565b3561184d60408a018a6120fb565b61185b9060808101906120c7565b3561186a8860208c0135612222565b6040805161ffff9098168852602088019690965273ffffffffffffffffffffffffffffffffffffffff909416948601949094526060850191909152608084015260a083019190915260c082015260e001611309565b6000611921826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611a299092919063ffffffff16565b805190915015610442578080602001905181019061193f9190611d52565b610442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f9c565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a469085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161119e565b6060611a388484600085611a40565b949350505050565b606082471015611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610f9c565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611afb9190611f54565b60006040518083038185875af1925050503d8060008114611b38576040519150601f19603f3d011682016040523d82523d6000602084013e611b3d565b606091505b5091509150611b4e87838387611b59565b979650505050505050565b60608315611bec578251611be55773ffffffffffffffffffffffffffffffffffffffff85163b611be5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f9c565b5081611a38565b611a388383815115611c015781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c9190611fc7565b60405180606001604052806003905b6040805180820190915260008082526020820152815260200190600190039081611c445790505090565b80518015158114611c7e57600080fd5b919050565b600060208284031215611c9557600080fd5b813561159981612389565b60008060408385031215611cb357600080fd5b8235611cbe81612389565b946020939093013593505050565b600080600060608486031215611ce157600080fd5b8335611cec81612389565b92506020840135611cfc81612389565b929592945050506040919091013590565b600080600060608486031215611d2257600080fd5b8351611d2d81612389565b9250611d3b60208501611c6e565b9150611d4960408501611c6e565b90509250925092565b600060208284031215611d6457600080fd5b61159982611c6e565b600060208284031215611d7f57600080fd5b813567ffffffffffffffff811115611d9657600080fd5b82016060818503121561159957600080fd5b600060208284031215611dba57600080fd5b8135611599816123ab565b60008060408385031215611dd857600080fd5b8235611de3816123ab565b91506020830135611df381612389565b809150509250929050565b6000806000610100808587031215611e1557600080fd5b8435611e20816123ab565b93506020850135611e30816123ab565b9250848101861015611e4157600080fd5b506040840190509250925092565b600060208284031215611e6157600080fd5b5051919050565b803582526020810135602083015260006040820135611e8681612389565b73ffffffffffffffffffffffffffffffffffffffff1660408401526060820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611ed757600080fd5b8201803567ffffffffffffffff811115611ef057600080fd5b803603841315611eff57600080fd5b60806060860152806080860152806020830160a0870137600060a0828701015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168601019250505092915050565b60008251611f66818460208701612239565b9190910192915050565b60c08101818360005b6003811015611fbe578151805173ffffffffffffffffffffffffffffffffffffffff16845260209081015161ffff168185015260409093019290910190600101611f79565b50505092915050565b6020815260008251806020840152611fe6816040850160208701612239565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b602081526000823561202981612389565b73ffffffffffffffffffffffffffffffffffffffff81166020840152506020830135604083015260408301356060830152612067606084018461212f565b60a0608084015261207b60c0840182611e68565b905061208a608085018561212f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160a08501526120be8282611e68565b95945050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611f6657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112611f6657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261216357600080fd5b90910192915050565b600061ffff80831681851680830382111561218957612189612285565b01949350505050565b600082198211156121a5576121a5612285565b500190565b6000826121e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561221d5761221d612285565b500290565b60008282101561223457612234612285565b500390565b60005b8381101561225457818101518382015260200161223c565b83811115610a465750506000910152565b600060ff821660ff81141561227c5761227c612285565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81356122ee81612389565b73ffffffffffffffffffffffffffffffffffffffff811690508154817fffffffffffffffffffffffff00000000000000000000000000000000000000008216178355602084013561233e816123ab565b75ffff00000000000000000000000000000000000000008160a01b16837fffffffffffffffffffff000000000000000000000000000000000000000000008416171784555050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f3157600080fd5b61ffff81168114610f3157600080fdfea2646970667358221220bb31059d7cb4c0283df9324939a67a9a88e9ff819c1b04e31a147b688714dc3464736f6c63430008070033000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b00000000000000000000000005fd7d0d6b91cc4787bcb86ca47e0bd4ea0346d34Deployed Bytecode
0x6080604052600436106100ec5760003560e01c80635b94db271161008a5780638da5cb5b116100595780638da5cb5b146102ec578063ad3bd95d14610317578063afe315ee14610337578063c94288a21461039b57600080fd5b80635b94db27146102455780636ccae0541461026557806377001f83146102855780637d6167e8146102a557600080fd5b806322c8f6cd116100c657806322c8f6cd146101af5780632a4f1fbb146101e357806331efdc96146102035780633bd1adec1461023057600080fd5b8063050e56ea146100f85780631291f79d1461014157806320f99c0a1461016357600080fd5b366100f357005b600080fd5b34801561010457600080fd5b5061012c610113366004611da8565b61ffff1660009081526003602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561014d57600080fd5b5061016161015c366004611ca0565b6103ae565b005b34801561016f57600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b3480156101bb57600080fd5b5061018a7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b081565b3480156101ef57600080fd5b506101616101fe366004611dc5565b610447565b34801561020f57600080fd5b5061022361021e366004611da8565b6105db565b6040516101389190611f70565b34801561023c57600080fd5b50610161610675565b34801561025157600080fd5b50610161610260366004611c83565b6106fe565b34801561027157600080fd5b50610161610280366004611ccc565b6107be565b34801561029157600080fd5b506101616102a0366004611dfe565b610830565b3480156102b157600080fd5b506102d96102c0366004611da8565b61ffff9081166000908152600460205260409020541690565b60405161ffff9091168152602001610138565b3480156102f857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661018a565b34801561032357600080fd5b50610161610332366004611dfe565b610a4c565b34801561034357600080fd5b5061038d610352366004611dc5565b61ffff8216600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205492915050565b604051908152602001610138565b6101616103a9366004611d6d565b610c26565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103ff576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610442573d6000803e3d6000fd5b505050565b61044f610f34565b61ffff8216600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684528252808320549383526005909152808220815160608101909252600383835b8282101561050057604080518082019091528483015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900461ffff166020808301919091529082526001909201910161049d565b50505061ffff8616600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152812055509050816105475750506105cd565b60005b60038160ff1610156105c9576105b78584848460ff1660038110610570576105706122b4565b6020908102919091015181015161ffff808b16600090815260049093526040909220549091168660ff8716600381106105ab576105ab6122b4565b60200201515189610fab565b806105c181612265565b91505061054a565b5050505b6105d76001600255565b5050565b6105e3611c35565b61ffff82166000908152600560205260408082208151606081019092529091600390835b8282101561066a57604080518082019091528483015473ffffffffffffffffffffffffffffffffffffffff8116825274010000000000000000000000000000000000000000900461ffff1660208083019190915290825260019092019101610607565b505050509050919050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146106c6576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461074f576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080f576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61044273ffffffffffffffffffffffffffffffffffffffff8416838361114c565b60005473ffffffffffffffffffffffffffffffffffffffff163314610881576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff831660009081526003602052604090205460ff16156108cf576040517f5771642500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108e160c0830160a08401611da8565b6108f16080840160608501611da8565b6109016040850160208601611da8565b61090b919061216c565b610915919061216c565b90508261ffff168161ffff1614610958576040517f2ea1270e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001694881694909417909355600590522082906109ae82826122e3565b505061ffff841660009081526005602052604090819020908301906001016109d682826122e3565b505061ffff8416600090815260056020526040902060808301906002016109fd82826122e3565b505061ffff8416600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610a46848484611220565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a9d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff831660009081526003602052604090205460ff16610aea576040517f2849ec2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610afc60c0830160a08401611da8565b610b0c6080840160608501611da8565b610b1c6040850160208601611da8565b610b26919061216c565b610b30919061216c565b90508261ffff168161ffff1614610b73576040517f2ea1270e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff848116600090815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169488169490941790935560059052208290610bc982826122e3565b505061ffff84166000908152600560205260409081902090830190600101610bf182826122e3565b505061ffff841660009081526005602052604090206080830190600201610c1882826122e3565b905050610a46848484611316565b610c2e610f34565b60036000610c3f6020840184611da8565b61ffff16815260208101919091526040016000205460ff16610c8d576040517f2849ec2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ca5610ca060408501856120fb565b611341565b90925090506000610cc6610cbc6020860186611da8565b856020013561153b565b905080610cd660408601866120fb565b6040013514610d11576040517f3b05b64a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610e345783602001353414610d80576040517fbc6f88c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b01663a44bbb15610dca836020880135612222565b610dd49034612222565b610de160408801886120fb565b6040518363ffffffff1660e01b8152600401610dfd9190612018565b6000604051808303818588803b158015610e1657600080fd5b505af1158015610e2a573d6000803e3d6000fd5b5050505050610efd565b610e43338560200135846115a0565b610e6473ffffffffffffffffffffffffffffffffffffffff831684836115c2565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b01663a44bbb1534610eae60408801886120fb565b6040518363ffffffff1660e01b8152600401610eca9190612018565b6000604051808303818588803b158015610ee357600080fd5b505af1158015610ef7573d6000803e3d6000fd5b50505050505b610f19610f0d6020860186611da8565b83866020013584611753565b610f248483836117df565b505050610f316001600255565b50565b600280541415610fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60028055565b73ffffffffffffffffffffffffffffffffffffffff8216156111445760008361ffff168561ffff1687610fde91906121e5565b610fe891906121aa565b6040805161ffff8a16815273ffffffffffffffffffffffffffffffffffffffff808616602083015291810183905290851660608201529091507f2ca7e603774a345d2661009d097610daffb2d91a47e69541066ddfe9221c51e89060800160405180910390a173ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156111215760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146110da576040519150601f19603f3d011682016040523d82523d6000602084013e6110df565b606091505b505090508061111a576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050611144565b61114273ffffffffffffffffffffffffffffffffffffffff8316848361114c565b505b505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526104429084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526118bf565b7f6f8233416969476afceb725c919fe424faf367ed0a76e020fdf53369c4f1da9583838360005b60400201602001602081019061125d9190611da8565b61126d6080860160608701611da8565b61127d60c0870160a08801611da8565b61128a6020880188611c83565b61129a6060890160408a01611c83565b6112aa60a08a0160808b01611c83565b6040805161ffff998a16815297891660208901529588169587019590955292861660608601529416608084015273ffffffffffffffffffffffffffffffffffffffff93841660a0840152831660c08301529190911660e0820152610100015b60405180910390a1505050565b7fe6099dd217e540f806797781b59e4e804f78bc18220943c78d4ea9b68316e27c8383836000611247565b60008061135160608401846120c7565b3561145657600073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b01663726f16d86113a160808701876120c7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681529035600482015260240160606040518083038186803b1580156113ef57600080fd5b505afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114279190611d0d565b5090915081905061143b60808601866120c7565b61144c906060810190604001611c83565b9250925050915091565b600073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b01663726f16d86114a160608701876120c7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681529035600482015260240160606040518083038186803b1580156114ef57600080fd5b505afa158015611503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115279190611d0d565b5090915081905061143b60608601866120c7565b61ffff808316600090815260046020526040812054909163ffffffff7f00000000000000000000000000000000000000000000000000000000000f424016916115859116846121e5565b61158f91906121aa565b6115999083612222565b9392505050565b61044273ffffffffffffffffffffffffffffffffffffffff82168430856119cb565b80158061167157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561163757600080fd5b505afa15801561164b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166f9190611e4f565b155b6116fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610f9c565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526104429084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161119e565b61ffff8416600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548190611795908490612192565b61179f9190612222565b61ffff909416600090815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff909616835294905292909220929092555050565b7f0881410a322342e6e09eb472c7ab91907d7a31436d5816b8f349c30518c9dc9761180d6020850185611da8565b60208501358461182060408801886120fb565b6020013561183160408901896120fb565b61183f9060608101906120c7565b3561184d60408a018a6120fb565b61185b9060808101906120c7565b3561186a8860208c0135612222565b6040805161ffff9098168852602088019690965273ffffffffffffffffffffffffffffffffffffffff909416948601949094526060850191909152608084015260a083019190915260c082015260e001611309565b6000611921826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611a299092919063ffffffff16565b805190915015610442578080602001905181019061193f9190611d52565b610442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f9c565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a469085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161119e565b6060611a388484600085611a40565b949350505050565b606082471015611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610f9c565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611afb9190611f54565b60006040518083038185875af1925050503d8060008114611b38576040519150601f19603f3d011682016040523d82523d6000602084013e611b3d565b606091505b5091509150611b4e87838387611b59565b979650505050505050565b60608315611bec578251611be55773ffffffffffffffffffffffffffffffffffffffff85163b611be5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f9c565b5081611a38565b611a388383815115611c015781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c9190611fc7565b60405180606001604052806003905b6040805180820190915260008082526020820152815260200190600190039081611c445790505090565b80518015158114611c7e57600080fd5b919050565b600060208284031215611c9557600080fd5b813561159981612389565b60008060408385031215611cb357600080fd5b8235611cbe81612389565b946020939093013593505050565b600080600060608486031215611ce157600080fd5b8335611cec81612389565b92506020840135611cfc81612389565b929592945050506040919091013590565b600080600060608486031215611d2257600080fd5b8351611d2d81612389565b9250611d3b60208501611c6e565b9150611d4960408501611c6e565b90509250925092565b600060208284031215611d6457600080fd5b61159982611c6e565b600060208284031215611d7f57600080fd5b813567ffffffffffffffff811115611d9657600080fd5b82016060818503121561159957600080fd5b600060208284031215611dba57600080fd5b8135611599816123ab565b60008060408385031215611dd857600080fd5b8235611de3816123ab565b91506020830135611df381612389565b809150509250929050565b6000806000610100808587031215611e1557600080fd5b8435611e20816123ab565b93506020850135611e30816123ab565b9250848101861015611e4157600080fd5b506040840190509250925092565b600060208284031215611e6157600080fd5b5051919050565b803582526020810135602083015260006040820135611e8681612389565b73ffffffffffffffffffffffffffffffffffffffff1660408401526060820135368390037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611ed757600080fd5b8201803567ffffffffffffffff811115611ef057600080fd5b803603841315611eff57600080fd5b60806060860152806080860152806020830160a0870137600060a0828701015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168601019250505092915050565b60008251611f66818460208701612239565b9190910192915050565b60c08101818360005b6003811015611fbe578151805173ffffffffffffffffffffffffffffffffffffffff16845260209081015161ffff168185015260409093019290910190600101611f79565b50505092915050565b6020815260008251806020840152611fe6816040850160208701612239565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b602081526000823561202981612389565b73ffffffffffffffffffffffffffffffffffffffff81166020840152506020830135604083015260408301356060830152612067606084018461212f565b60a0608084015261207b60c0840182611e68565b905061208a608085018561212f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160a08501526120be8282611e68565b95945050505050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112611f6657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61833603018112611f6657600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261216357600080fd5b90910192915050565b600061ffff80831681851680830382111561218957612189612285565b01949350505050565b600082198211156121a5576121a5612285565b500190565b6000826121e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561221d5761221d612285565b500290565b60008282101561223457612234612285565b500390565b60005b8381101561225457818101518382015260200161223c565b83811115610a465750506000910152565b600060ff821660ff81141561227c5761227c612285565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81356122ee81612389565b73ffffffffffffffffffffffffffffffffffffffff811690508154817fffffffffffffffffffffffff00000000000000000000000000000000000000008216178355602084013561233e816123ab565b75ffff00000000000000000000000000000000000000008160a01b16837fffffffffffffffffffff000000000000000000000000000000000000000000008416171784555050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f3157600080fd5b61ffff81168114610f3157600080fdfea2646970667358221220bb31059d7cb4c0283df9324939a67a9a88e9ff819c1b04e31a147b688714dc3464736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b00000000000000000000000005fd7d0d6b91cc4787bcb86ca47e0bd4ea0346d34
-----Decoded View---------------
Arg [0] : _socketRegistry (address): 0xc30141B657f4216252dc59Af2e7CdB9D8792e1B0
Arg [1] : owner_ (address): 0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c30141b657f4216252dc59af2e7cdb9d8792e1b0
Arg [1] : 0000000000000000000000005fd7d0d6b91cc4787bcb86ca47e0bd4ea0346d34Deployed Bytecode Sourcemap
254:18012:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16294:158;;;;;;;;;;-1:-1:-1;16294:158:5;;;;;:::i;:::-;16415:30;;16388:4;16415:30;;;:16;:30;;;;;;;;;16294:158;;;;7404:14:8;;7397:22;7379:41;;7367:2;7352:18;16294:158:5;;;;;;;;18113:151;;;;;;;;;;-1:-1:-1;18113:151:5;;;;;:::i;:::-;;:::i;:::-;;583:81:7;;;;;;;;;;-1:-1:-1;649:8:7;;;;583:81;;;5446:42:8;5434:55;;;5416:74;;5404:2;5389:18;583:81:7;5270:226:8;677:39:5;;;;;;;;;;;;;;;6769:701;;;;;;;;;;-1:-1:-1;6769:701:5;;;;;:::i;:::-;;:::i;17023:172::-;;;;;;;;;;-1:-1:-1;17023:172:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;879:153:7:-;;;;;;;;;;;;;:::i;670:203::-;;;;;;;;;;-1:-1:-1;670:203:7;;;;;:::i;:::-;;:::i;17653:186:5:-;;;;;;;;;;-1:-1:-1;17653:186:5;;;;;:::i;:::-;;:::i;4358:921::-;;;;;;;;;;-1:-1:-1;4358:921:5;;;;;:::i;:::-;;:::i;16639:153::-;;;;;;;;;;-1:-1:-1;16639:153:5;;;;;:::i;:::-;16760:25;;;;16731:6;16760:25;;;:11;:25;;;;;;;;16639:153;;;;11330:6:8;11318:19;;;11300:38;;11288:2;11273:18;16639:153:5;11156:188:8;500:77:7;;;;;;;;;;-1:-1:-1;538:7:7;564:6;;;500:77;;5644:780:5;;;;;;;;;;-1:-1:-1;5644:780:5;;;;;:::i;:::-;;:::i;15938:192::-;;;;;;;;;;-1:-1:-1;15938:192:5;;;;;:::i;:::-;16078:31;;;16048:7;16078:31;;;:17;:31;;;;;;;;:45;;;;;;;;;;;15938:192;;;;;;;;13485:25:8;;;13473:2;13458:18;15938:192:5;13339:177:8;7814:1796:5;;;;;;:::i;:::-;;:::i;18113:151::-;426:6:7;;;;412:10;:20;408:69;;455:11;;;;;;;;;;;;;;408:69;18229:28:5::1;::::0;:20:::1;::::0;::::1;::::0;:28;::::1;;;::::0;18250:6;;18229:28:::1;::::0;;;18250:6;18229:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;18113:151:::0;;:::o;6769:701::-;2246:21:0;:19;:21::i;:::-;6882:31:5::1;::::0;::::1;6862:17;6882:31:::0;;;:17:::1;:31;::::0;;;;;;;:45:::1;::::0;::::1;::::0;;;;;;;;6979:25;;;:11:::1;:25:::0;;;;;;6937:67;;;;::::1;::::0;;;::::1;6862:17:::0;6937:67;::::1;;;;;;;;::::0;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;;;;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;;7014:31:5::1;::::0;::::1;7062:1;7014:31:::0;;;:17:::1;:31;::::0;;;;;;;:45:::1;::::0;::::1;::::0;;;;;;;:49;-1:-1:-1;6937:67:5;-1:-1:-1;7078:14:5;7074:51:::1;;7108:7;;;;7074:51;7139:7;7134:330;7156:1;7152;:5;;;7134:330;;;7178:275;7217:12;7247:9;7274:19;7294:1;7274:22;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;::::0;:43;::::1;::::0;7335:25:::1;::::0;;::::1;;::::0;;;:11:::1;:25:::0;;;;;;;;7274:43;;7335:25:::1;7378:19:::0;:22:::1;::::0;::::1;;::::0;::::1;;;;;:::i;:::-;;;;::::0;:31;7427:12;7178:21:::1;:275::i;:::-;7159:3:::0;::::1;::::0;::::1;:::i;:::-;;;;7134:330;;;;6852:618;;2277:1:0;2288:20:::0;1701:1;2790:7;:22;2610:209;2288:20;6769:701:5;;:::o;17023:172::-;17111:29;;:::i;:::-;17163:25;;;;;;;:11;:25;;;;;;17156:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17023:172;;;:::o;879:153:7:-;938:8;;;;924:10;:22;920:73;;969:13;;;;;;;;;;;;;;920:73;1096:6;:17;;;;;;1014:10;1096:17;;;;-1:-1:-1;1123:21:7;;;;;;;879:153::o;670:203::-;748:6;;;;734:10;:20;730:69;;777:11;;;;;;;;;;;;;;730:69;808:8;:19;;;;;;;;;;;;;842:24;;;;-1:-1:-1;;842:24:7;670:203;:::o;17653:186:5:-;426:6:7;;;;412:10;:20;408:69;;455:11;;;;;;;;;;;;;;408:69;17785:47:5::1;:26;::::0;::::1;17812:11:::0;17825:6;17785:26:::1;:47::i;4358:921::-:0;426:6:7;;;;412:10;:20;408:69;;455:11;;;;;;;;;;;;;;408:69;4611:30:5::1;::::0;::::1;;::::0;;;:16:::1;:30;::::0;;;;;::::1;;4607:99;;;4664:31;;;;;;;;;;;;;;4607:99;4716:8;4823:33;::::0;;;;;;::::1;:::i;:::-;4775;::::0;;;;;;::::1;:::i;:::-;4727;:12;:33:::0;;::::1;::::0;::::1;;:::i;:::-;:81;;;;:::i;:::-;:129;;;;:::i;:::-;4716:140;;4876:13;4871:18;;:1;:18;;;4867:82;;4912:26;;;;;;;;;;;;;;4867:82;4959:25;::::0;;::::1;;::::0;;;:11:::1;:25;::::0;;;;;;;:41;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;5010:11:::1;:25:::0;;;5041:9;;5010:43:::1;5041:9:::0;5010:25;:43:::1;:::i;:::-;-1:-1:-1::0;;5063:25:5::1;::::0;::::1;;::::0;;;:11:::1;:25;::::0;5094:12:::1;5063:25:::0;;;;5094:12;;::::1;::::0;5104:1:::1;5063:28;:43;5094:12:::0;5063:28;:43:::1;:::i;:::-;-1:-1:-1::0;;5116:25:5::1;::::0;::::1;;::::0;;;:11:::1;:25;::::0;5147:12:::1;5116:25:::0;;5147:12;;::::1;::::0;5157:1:::1;5116:28;:43;5147:12:::0;5116:28;:43:::1;:::i;:::-;-1:-1:-1::0;;5169:30:5::1;::::0;::::1;;::::0;;;:16:::1;:30;::::0;;;;:37;;;::::1;5202:4;5169:37;::::0;;5216:56:::1;5186:12:::0;5247:13;5262:9;5216:16:::1;:56::i;:::-;4510:769;4358:921:::0;;;:::o;5644:780::-;426:6:7;;;;412:10;:20;408:69;;455:11;;;;;;;;;;;;;;408:69;5809:30:5::1;::::0;::::1;;::::0;;;:16:::1;:30;::::0;;;;;::::1;;5804:96;;5862:27;;;;;;;;;;;;;;5804:96;5910:8;6017:33;::::0;;;;;;::::1;:::i;:::-;5969;::::0;;;;;;::::1;:::i;:::-;5921;:12;:33:::0;;::::1;::::0;::::1;;:::i;:::-;:81;;;;:::i;:::-;:129;;;;:::i;:::-;5910:140;;6070:13;6065:18;;:1;:18;;;6061:82;;6106:26;;;;;;;;;;;;;;6061:82;6153:25;::::0;;::::1;;::::0;;;:11:::1;:25;::::0;;;;;;;:41;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;6204:11:::1;:25:::0;;;6235:9;;6204:43:::1;6235:9:::0;6204:25;:43:::1;:::i;:::-;-1:-1:-1::0;;6257:25:5::1;::::0;::::1;;::::0;;;:11:::1;:25;::::0;6288:12:::1;6257:25:::0;;;;6288:12;;::::1;::::0;6298:1:::1;6257:28;:43;6288:12:::0;6257:28;:43:::1;:::i;:::-;-1:-1:-1::0;;6310:25:5::1;::::0;::::1;;::::0;;;:11:::1;:25;::::0;6341:12:::1;6310:25:::0;;6341:12;;::::1;::::0;6351:1:::1;6310:28;:43;6341:12:::0;6310:28;:43:::1;:::i;:::-;;;;6363:54;6378:12;6392:13;6407:9;6363:14;:54::i;7814:1796::-:0;2246:21:0;:19;:21::i;:::-;7914:16:5::1;:42;7931:24;;::::0;::::1;:11:::0;:24:::1;:::i;:::-;7914:42;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;7914:42:5;;::::1;;7909:108;;7979:27;;;;;;;;;;;;;;7909:108;8086:23;::::0;8161:57:::1;8194:23;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;8161:32;:57::i;:::-;8072:146:::0;;-1:-1:-1;8072:146:5;-1:-1:-1;8278:22:5::1;8303:106;8338:24;;::::0;::::1;:11:::0;:24:::1;:::i;:::-;8376:11;:23;;;8303:21;:106::i;:::-;8278:131:::0;-1:-1:-1;8278:131:5;8424:23:::1;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;:30;;;:48;8420:99;;8495:13;;;;;;;;;;;;;;8420:99;8558:41;::::0;::::1;491:42;8558:41;8554:711;;;8632:11;:23;;;8619:9;:36;8615:67;;8664:18;;;;;;;;;;;;;;8615:67;8696:25;:6;:25;;8759:40;8785:14:::0;8759:23:::1;::::0;::::1;;:40;:::i;:::-;8746:54;::::0;:9:::1;:54;:::i;:::-;8815:23;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;8696:143;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;8554:711;;;8870:142;8912:10;8940:11;:23;;;8981:17;8870:24;:142::i;:::-;9026:116;:37;::::0;::::1;9081:15:::0;9114:14;9026:37:::1;:116::i;:::-;9156:25;:6;:25;;9189:9;9217:23;;::::0;::::1;:11:::0;:23:::1;:::i;:::-;9156:98;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;8554:711;9338:160;9368:24;;::::0;::::1;:11:::0;:24:::1;:::i;:::-;9406:17;9437:11;:23;;;9474:14;9338:16;:160::i;:::-;9538:65;9556:11;9569:17;9588:14;9538:17;:65::i;:::-;7899:1711;;;2288:20:0::0;1701:1;2790:7;:22;2610:209;2288:20;7814:1796:5;:::o;2321:283:0:-;1744:1;2449:7;;:19;;2441:63;;;;;;;9511:2:8;2441:63:0;;;9493:21:8;9550:2;9530:18;;;9523:30;9589:33;9569:18;;;9562:61;9640:18;;2441:63:0;;;;;;;;;1744:1;2579:18;;2321:283::o;10339:754:5:-;10554:22;;;;10550:537;;10592:22;10638:5;10617:26;;10630:4;10618:16;;:9;:16;;;;:::i;:::-;10617:26;;;;:::i;:::-;10662:62;;;11608:6:8;11596:19;;11578:38;;11635:42;11713:15;;;11708:2;11693:18;;11686:43;11745:18;;;11738:34;;;11808:15;;;11803:2;11788:18;;11781:43;10592:51:5;;-1:-1:-1;10662:62:5;;11565:3:8;11550:19;10662:62:5;;;;;;;10742:36;;;491:42;10742:36;10738:266;;;10799:12;10825:8;10817:22;;10868:14;10817:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10798:106;;;10927:7;10922:43;;10943:22;;;;;;;;;;;;;;10922:43;10983:7;;;;10738:266;11017:59;:33;;;11051:8;11061:14;11017:33;:59::i;:::-;10578:509;10550:537;10339:754;;;;;;:::o;763:205:3:-;902:58;;6440:42:8;6428:55;;902:58:3;;;6410:74:8;6500:18;;;6493:34;;;875:86:3;;895:5;;925:23;;6383:18:8;;902:58:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;875:19;:86::i;15123:483:5:-;15279:320;15304:12;15330:13;15357:9;15367:1;15357:12;;;;:33;;;;;;;;;;:::i;:::-;15404;;;;;;;;:::i;:::-;15451;;;;;;;;:::i;:::-;15498:21;;;;:9;:21;:::i;:::-;15533;;;;:12;;;:21;:::i;:::-;15568;;;;:12;;;:21;:::i;:::-;15279:320;;;12178:6:8;12211:15;;;12193:34;;12263:15;;;12258:2;12243:18;;12236:43;12315:15;;;12295:18;;;12288:43;;;;12367:15;;;12362:2;12347:18;;12340:43;12420:15;;12414:3;12399:19;;12392:44;12455:42;12534:15;;;12528:3;12513:19;;12506:44;12587:15;;12581:3;12566:19;;12559:44;12640:15;;;;12634:3;12619:19;;12612:44;12155:3;12140:19;15279:320:5;;;;;;;;15123:483;;;:::o;14565:479::-;14719:318;14742:12;14768:13;14795:9;14805:1;14795:12;;11566:620;11695:7;;11727:29;;;;:11;:29;:::i;:::-;:32;11723:457;;11781:20;11809:13;:6;:13;;11840:25;;;;:11;:25;:::i;:::-;11809:73;;;;;;;;;;11840:28;;11809:73;;;13485:25:8;13458:18;;11809:73:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11780:102:5;;-1:-1:-1;11780:102:5;;-1:-1:-1;11918:25:5;;;;:11;:25;:::i;:::-;:36;;;;;;;;;:::i;:::-;11896:59;;;;;11566:620;;;:::o;11723:457::-;11987:20;12015:13;:6;:13;;12046:29;;;;:11;:29;:::i;:::-;12015:77;;;;;;;;;;12046:32;;12015:77;;;13485:25:8;13458:18;;12015:77:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11986:106:5;;-1:-1:-1;11986:106:5;;-1:-1:-1;12128:29:5;;;;:11;:29;:::i;12964:211::-;13129:25;;;;13079:7;13129:25;;;:11;:25;;;;;;13079:7;;13119:48;13158:9;13119:48;;13120:34;;13129:25;13120:6;:34;:::i;:::-;13119:48;;;;:::i;:::-;13109:59;;:6;:59;:::i;:::-;13102:66;12964:211;-1:-1:-1;;;12964:211:5:o;12458:208::-;12593:66;:37;;;12631:4;12645;12652:6;12593:37;:66::i;1475:603:3:-;1830:10;;;1829:62;;-1:-1:-1;1846:39:3;;;;;1870:4;1846:39;;;5736:34:8;1846:15:3;5806::8;;;5786:18;;;5779:43;1846:15:3;;;;;5648:18:8;;1846:39:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;1829:62;1808:163;;;;;;;9871:2:8;1808:163:3;;;9853:21:8;9910:2;9890:18;;;9883:30;9949:34;9929:18;;;9922:62;10020:24;10000:18;;;9993:52;10062:19;;1808:163:3;9669:418:8;1808:163:3;2008:62;;6440:42:8;6428:55;;2008:62:3;;;6410:74:8;6500:18;;;6493:34;;;1981:90:3;;2001:5;;2031:22;;6383:18:8;;2008:62:3;6236:297:8;13562:343:5;13798:31;;;;;;;:17;:31;;;;;;;;:50;;;;;;;;;;;13884:14;;13798:71;;13863:6;;13798:71;:::i;:::-;:100;;;;:::i;:::-;13733:31;;;;;;;;:17;:31;;;;;;;;:50;;;;;;;;;;;;;:165;;;;-1:-1:-1;;13562:343:5:o;13985:503::-;14145:336;14171:24;;;;:11;:24;:::i;:::-;14209:23;;;;14246:12;14272:23;;;;14209:11;14272:23;:::i;:::-;:33;;;14319:23;;;;:11;:23;:::i;:::-;:41;;;;;;;:::i;:::-;:44;14377:23;;;;:11;:23;:::i;:::-;:37;;;;;;;:::i;:::-;:40;14431;14457:14;14431:23;;;;:40;:::i;:::-;14145:336;;;13010:6:8;12998:19;;;12980:38;;13049:2;13034:18;;13027:34;;;;13109:42;13097:55;;;13077:18;;;13070:83;;;;13184:2;13169:18;;13162:34;;;;13227:3;13212:19;;13205:35;13271:3;13256:19;;13249:35;;;;13315:3;13300:19;;13293:35;12967:3;12952:19;14145:336:5;12667:667:8;3747:706:3;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;4192:27;;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:3;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;;;;9100:2:8;4351:85:3;;;9082:21:8;9139:2;9119:18;;;9112:30;9178:34;9158:18;;;9151:62;9249:12;9229:18;;;9222:40;9279:19;;4351:85:3;8898:406:8;974:241:3;1139:68;;6045:42:8;6114:15;;;1139:68:3;;;6096:34:8;6166:15;;6146:18;;;6139:43;6198:18;;;6191:34;;;1112:96:3;;1132:5;;1162:27;;6008:18:8;;1139:68:3;5833:398:8;3873:223:4;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;:::-;4030:59;3873:223;-1:-1:-1;;;;3873:223:4:o;4960:446::-;5125:12;5182:5;5157:21;:30;;5149:81;;;;;;;8335:2:8;5149:81:4;;;8317:21:8;8374:2;8354:18;;;8347:30;8413:34;8393:18;;;8386:62;8484:8;8464:18;;;8457:36;8510:19;;5149:81:4;8133:402:8;5149:81:4;5241:12;5255:23;5282:6;:11;;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:4:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:17;;7697:286;;1465:19;;;;7908:60;;;;;;;8742:2:8;7908:60:4;;;8724:21:8;8781:2;8761:18;;;8754:30;8820:31;8800:18;;;8793:59;8869:18;;7908:60:4;8540:353:8;7908:60:4;-1:-1:-1;8003:10:4;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:164:8:-;90:13;;139;;132:21;122:32;;112:60;;168:1;165;158:12;112:60;14:164;;;:::o;183:247::-;242:6;295:2;283:9;274:7;270:23;266:32;263:52;;;311:1;308;301:12;263:52;350:9;337:23;369:31;394:5;369:31;:::i;435:323::-;511:6;519;572:2;560:9;551:7;547:23;543:32;540:52;;;588:1;585;578:12;540:52;627:9;614:23;646:31;671:5;646:31;:::i;:::-;696:5;748:2;733:18;;;;720:32;;-1:-1:-1;;;435:323:8:o;763:456::-;840:6;848;856;909:2;897:9;888:7;884:23;880:32;877:52;;;925:1;922;915:12;877:52;964:9;951:23;983:31;1008:5;983:31;:::i;:::-;1033:5;-1:-1:-1;1090:2:8;1075:18;;1062:32;1103:33;1062:32;1103:33;:::i;:::-;763:456;;1155:7;;-1:-1:-1;;;1209:2:8;1194:18;;;;1181:32;;763:456::o;1224:409::-;1306:6;1314;1322;1375:2;1363:9;1354:7;1350:23;1346:32;1343:52;;;1391:1;1388;1381:12;1343:52;1423:9;1417:16;1442:31;1467:5;1442:31;:::i;:::-;1492:5;-1:-1:-1;1516:46:8;1558:2;1543:18;;1516:46;:::i;:::-;1506:56;;1581:46;1623:2;1612:9;1608:18;1581:46;:::i;:::-;1571:56;;1224:409;;;;;:::o;1638:202::-;1705:6;1758:2;1746:9;1737:7;1733:23;1729:32;1726:52;;;1774:1;1771;1764:12;1726:52;1797:37;1824:9;1797:37;:::i;1845:388::-;1933:6;1986:2;1974:9;1965:7;1961:23;1957:32;1954:52;;;2002:1;1999;1992:12;1954:52;2042:9;2029:23;2075:18;2067:6;2064:30;2061:50;;;2107:1;2104;2097:12;2061:50;2130:22;;2186:2;2168:16;;;2164:25;2161:45;;;2202:1;2199;2192:12;2238:245;2296:6;2349:2;2337:9;2328:7;2324:23;2320:32;2317:52;;;2365:1;2362;2355:12;2317:52;2404:9;2391:23;2423:30;2447:5;2423:30;:::i;2488:386::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2671:9;2658:23;2690:30;2714:5;2690:30;:::i;:::-;2739:5;-1:-1:-1;2796:2:8;2781:18;;2768:32;2809:33;2768:32;2809:33;:::i;:::-;2861:7;2851:17;;;2488:386;;;;;:::o;2879:573::-;3007:6;3015;3023;3054:3;3098:2;3086:9;3077:7;3073:23;3069:32;3066:52;;;3114:1;3111;3104:12;3066:52;3153:9;3140:23;3172:30;3196:5;3172:30;:::i;:::-;3221:5;-1:-1:-1;3278:2:8;3263:18;;3250:32;3291;3250;3291;:::i;:::-;3342:7;-1:-1:-1;3364:18:8;;;3361:31;-1:-1:-1;3358:51:8;;;3405:1;3402;3395:12;3358:51;;3443:2;3432:9;3428:18;3418:28;;2879:573;;;;;:::o;3457:184::-;3527:6;3580:2;3568:9;3559:7;3555:23;3551:32;3548:52;;;3596:1;3593;3586:12;3548:52;-1:-1:-1;3619:16:8;;3457:184;-1:-1:-1;3457:184:8:o;3646:1130::-;3754:5;3741:19;3736:3;3729:32;3817:4;3810:5;3806:16;3793:30;3786:4;3781:3;3777:14;3770:54;3711:3;3872:4;3865:5;3861:16;3848:30;3887:33;3912:7;3887:33;:::i;:::-;3965:42;3952:56;3945:4;3936:14;;3929:80;4068:4;4057:16;;4044:30;4125:14;4121:26;;;4149:66;4117:99;4093:124;;4083:152;;4231:1;4228;4221:12;4083:152;4259:30;;4312:21;;4356:18;4345:30;;4342:50;;;4388:1;4385;4378:12;4342:50;4435:6;4419:14;4415:27;4408:5;4404:39;4401:59;;;4456:1;4453;4446:12;4401:59;4492:4;4485;4480:3;4476:14;4469:28;4529:6;4522:4;4517:3;4513:14;4506:30;4593:6;4586:4;4577:7;4573:18;4567:3;4562;4558:13;4545:55;4644:1;4638:3;4629:6;4624:3;4620:16;4616:26;4609:37;4766:3;4696:66;4691:2;4683:6;4679:15;4675:88;4670:3;4666:98;4662:108;4655:115;;;;3646:1130;;;;:::o;4781:274::-;4910:3;4948:6;4942:13;4964:53;5010:6;5005:3;4998:4;4990:6;4986:17;4964:53;:::i;:::-;5033:16;;;;;4781:274;-1:-1:-1;;4781:274:8:o;6538:696::-;6770:3;6755:19;;6759:9;6851:6;6728:4;6885:343;6899:4;6896:1;6893:11;6885:343;;;6956:13;;6998:9;;7009:42;6994:58;6982:71;;7076:4;7124:11;;;7118:18;7138:6;7114:31;7100:12;;;7093:53;7175:4;7166:14;;;;7203:15;;;;6919:1;6912:9;6885:343;;;6889:3;;;6538:696;;;;:::o;7686:442::-;7835:2;7824:9;7817:21;7798:4;7867:6;7861:13;7910:6;7905:2;7894:9;7890:18;7883:34;7926:66;7985:6;7980:2;7969:9;7965:18;7960:2;7952:6;7948:15;7926:66;:::i;:::-;8044:2;8032:15;8049:66;8028:88;8013:104;;;;8119:2;8009:113;;7686:442;-1:-1:-1;;7686:442:8:o;10092:1059::-;10281:2;10270:9;10263:21;10244:4;10319:6;10306:20;10335:31;10360:5;10335:31;:::i;:::-;10413:42;10406:5;10402:54;10397:2;10386:9;10382:18;10375:82;;10518:2;10510:6;10506:15;10493:29;10488:2;10477:9;10473:18;10466:57;10584:2;10576:6;10572:15;10559:29;10554:2;10543:9;10539:18;10532:57;10618:70;10684:2;10676:6;10672:15;10664:6;10618:70;:::i;:::-;10725:4;10719:3;10708:9;10704:19;10697:33;10753:75;10823:3;10812:9;10808:19;10794:12;10753:75;:::i;:::-;10739:89;;10859:71;10925:3;10917:6;10913:16;10905:6;10859:71;:::i;:::-;10996:66;10984:9;10976:6;10972:22;10968:95;10961:4;10950:9;10946:20;10939:125;11081:64;11138:6;11122:14;11081:64;:::i;:::-;11073:72;10092:1059;-1:-1:-1;;;;;10092:1059:8:o;13521:389::-;13620:4;13678:11;13665:25;13768:66;13757:8;13741:14;13737:29;13733:102;13713:18;13709:127;13699:155;;13850:1;13847;13840:12;14313:387;14410:4;14468:11;14455:25;14558:66;14547:8;14531:14;14527:29;14523:102;14503:18;14499:127;14489:155;;14640:1;14637;14630:12;14705:357;14778:5;14837:3;14824:17;14919:66;14908:8;14892:14;14888:29;14884:102;14864:18;14860:127;14850:155;;15001:1;14998;14991:12;14850:155;15023:33;;;;14705:357;-1:-1:-1;;14705:357:8:o;15067:224::-;15106:3;15134:6;15167:2;15164:1;15160:10;15197:2;15194:1;15190:10;15228:3;15224:2;15220:12;15215:3;15212:21;15209:47;;;15236:18;;:::i;:::-;15272:13;;15067:224;-1:-1:-1;;;;15067:224:8:o;15296:128::-;15336:3;15367:1;15363:6;15360:1;15357:13;15354:39;;;15373:18;;:::i;:::-;-1:-1:-1;15409:9:8;;15296:128::o;15429:274::-;15469:1;15495;15485:189;;15530:77;15527:1;15520:88;15631:4;15628:1;15621:15;15659:4;15656:1;15649:15;15485:189;-1:-1:-1;15688:9:8;;15429:274::o;15708:228::-;15748:7;15874:1;15806:66;15802:74;15799:1;15796:81;15791:1;15784:9;15777:17;15773:105;15770:131;;;15881:18;;:::i;:::-;-1:-1:-1;15921:9:8;;15708:228::o;15941:125::-;15981:4;16009:1;16006;16003:8;16000:34;;;16014:18;;:::i;:::-;-1:-1:-1;16051:9:8;;15941:125::o;16071:258::-;16143:1;16153:113;16167:6;16164:1;16161:13;16153:113;;;16243:11;;;16237:18;16224:11;;;16217:39;16189:2;16182:10;16153:113;;;16284:6;16281:1;16278:13;16275:48;;;-1:-1:-1;;16319:1:8;16301:16;;16294:27;16071:258::o;16334:175::-;16371:3;16415:4;16408:5;16404:16;16444:4;16435:7;16432:17;16429:43;;;16452:18;;:::i;:::-;16501:1;16488:15;;16334:175;-1:-1:-1;;16334:175:8:o;16514:184::-;16566:77;16563:1;16556:88;16663:4;16660:1;16653:15;16687:4;16684:1;16677:15;16703:184;16755:77;16752:1;16745:88;16852:4;16849:1;16842:15;16876:4;16873:1;16866:15;16892:722;17059:5;17046:19;17074:33;17099:7;17074:33;:::i;:::-;17144:42;17135:7;17131:56;17116:71;;17212:4;17206:11;17319:7;17250:66;17246:2;17242:75;17239:88;17233:4;17226:102;17376:2;17369:5;17365:14;17352:28;17389:32;17413:7;17389:32;:::i;:::-;17559:46;17549:7;17544:3;17540:17;17536:70;17526:7;17457:66;17453:2;17449:75;17446:88;17443:164;17437:4;17430:178;;;;16892:722;;:::o;17619:154::-;17705:42;17698:5;17694:54;17687:5;17684:65;17674:93;;17763:1;17760;17753:12;17778:117;17863:6;17856:5;17852:18;17845:5;17842:29;17832:57;;17885:1;17882;17875:12
Swarm Source
ipfs://bb31059d7cb4c0283df9324939a67a9a88e9ff819c1b04e31a147b688714dc34
Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingMultichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value ETH Ether (ETH)33.49% $3,478.91 0.1933 $672.42 ETH 13.66% $1 273.6544 $274.2 ETH 9.39% $53.84 3.5 $188.45 ETH 6.17% $1.04 119.5194 $123.88 ETH 4.57% $14.46 6.3485 $91.8 ETH 4.50% $0.993235 90.9299 $90.31 ETH 3.43% $0.000023 2,995,368.232 $68.89 ETH 2.59% $0.517334 100.5673 $52.03 ETH 2.59% $1.95 26.6638 $51.99 ETH 1.73% $37.19 0.9334 $34.71 ETH 1.54% $4,111.65 0.00753727 $30.99 ETH 1.50% $0.226788 132.7736 $30.11 ETH 1.42% $0.99612 28.6415 $28.53 ETH 1.40% $1 28.1234 $28.12 ETH 1.38% $3,478.91 0.007946 $27.64 ETH 1.37% $376.24 0.0733 $27.57 ETH 1.12% $1 22.5 $22.55 ETH 0.95% $0.048963 387.75 $18.99 ETH 0.68% $1 13.515 $13.57 ETH 0.61% $0.59246 20.802 $12.32 ETH 0.46% $0.117445 79.399 $9.33 ETH 0.41% $0.617045 13.3244 $8.22 ETH 0.37% $0.584978 12.8495 $7.52 ETH 0.33% $1.57 4.2043 $6.6 ETH 0.28% $0.994871 5.6119 $5.58 ETH 0.25% $1.47 3.4721 $5.1 ETH 0.22% $20.31 0.2207 $4.48 ETH 0.22% $0.007959 549.3487 $4.37 ETH 0.19% $3.75 1 $3.75 ETH 0.17% $42.97 0.0802 $3.45 ETH 0.17% $0.535694 6.3116 $3.38 ETH 0.16% $0.873682 3.6896 $3.22 ETH 0.14% $25.23 0.114 $2.88 ETH 0.14% $0.056438 48.9434 $2.76 ETH 0.13% $0.980756 2.6074 $2.56 ETH 0.13% $0.464075 5.4236 $2.52 ETH 0.11% $4.32 0.5 $2.16 ETH 0.10% $3,829.29 0.00049837 $1.91 ETH 0.08% $3,409.03 0.0005 $1.7 ETH 0.08% $0.024375 69.5 $1.69 ETH 0.08% $276.31 0.00571372 $1.58 ETH 0.07% $0.019835 69.94 $1.39 ETH 0.07% $0.11789 11.7174 $1.38 ETH 0.07% $1.06 1.2696 $1.35 ETH 0.06% $2.29 0.5696 $1.3 ETH 0.06% $1.25 1.0187 $1.27 ETH 0.06% $0.998896 1.25 $1.25 ETH 0.06% $38.82 0.0288 $1.12 ETH 0.05% $0.661855 1.6472 $1.09 ETH 0.05% $2.69 0.3638 $0.9785 ETH 0.05% $0.001041 920.8561 $0.959 ETH 0.04% $0.006783 120.5773 $0.8179 ETH 0.04% $0.99048 0.7538 $0.7466 ETH 0.03% $20.98 0.0283 $0.5944 ETH 0.03% $0.01723 33.548 $0.578 ETH 0.03% $0.192973 2.817 $0.5436 ETH 0.03% $0.274776 1.9343 $0.5315 ETH 0.02% $0.642546 0.75 $0.4819 ETH 0.02% $3,463.47 0.00013589 $0.4706 ETH 0.02% $1.67 0.25 $0.4175 ETH 0.02% $0.995704 0.3536 $0.352 ETH 0.02% $0.014393 24.1016 $0.3468 ETH 0.02% $0.325423 1 $0.3254 ETH 0.01% $3.21 0.09 $0.2889 ETH 0.01% $0.218583 1.3214 $0.2888 ETH 0.01% $3.39 0.08 $0.2709 ETH 0.01% $0.01773 14.4801 $0.2567 ETH 0.01% $0.005647 43.9698 $0.2482 ETH 0.01% $0.293596 0.7584 $0.2226 ETH 0.01% $0.068443 3.1695 $0.2169 ETH 0.01% $86.24 0.002451 $0.2113 ETH <0.01% $0.020013 10 $0.2001 ETH <0.01% $0.000046 4,081.875 $0.1879 ETH <0.01% $0.000005 29,494.812 $0.1465 ETH <0.01% $0.000003 46,969.8607 $0.1458 ETH <0.01% $0.062747 2 $0.1254 ETH <0.01% $0.009871 11.7161 $0.1156 ETH <0.01% $0.486731 0.2067 $0.1006 BSC 0.63% $0.000016 804,828 $12.6 POL <0.01% $0.52151 0.006 $0.003129 Loading...Loading[ Download: CSV Export ][ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to VerbatimInvalidDeduplication (low-severity), FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity), SignedImmutables (very low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.