├── .gitignore ├── README.md ├── abi ├── base_bridge.json ├── base_for_builders.json ├── nft.json └── onchain_summer_bridge.json ├── config.py ├── files ├── proxies.txt └── wallets.txt ├── main.py ├── requirements.txt ├── utils.py └── vars.py /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | 3 | .DS_Store 4 | 5 | /__pycache__ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Base bridge + mint 2 | 3 | - [Official bridge from Ethereum to Base](https://bridge.base.org) 4 | - [Bridge with mint.fun](https://mint.fun/base/0x00008453E27e8e88F305F13CF27c30D724fDd055) 5 | - [Bridge with Onchain Summer](https://onchainsummer.xyz/) 6 | - [Mint Base if for builders NFT](https://base.mirror.xyz/hwNwqXHVoLlO8s4DZppog4DfGvM34tigaDjOWuEJQfY#:~:text=Mint%20%E2%80%9CBase%20is%20for%20builders%E2%80%9D%20today) 7 | - [Mint Bridge to Base NFT](https://nft.coinbase.com/mint/bridgetobase) 8 | 9 | ### Follow: https://t.me/thelaziestcoder 10 | 11 | ### Settings 12 | `files/wallets.txt` - Wallets with private keys \ 13 | `files/proxies.txt` - Corresponding proxies for wallets \ 14 | `config.py` - Custom settings \ 15 | `vars.py` - Contracts info 16 | 17 | ### Run 18 | 19 | Installing all dependencies: \ 20 | `pip3 install -r requirements.txt` 21 | 22 | Run script: \ 23 | `python3 main.py` 24 | 25 | ### Results 26 | 27 | `results/` - Folder with results by datetime of run \ 28 | `logs/` - Folder with logs by datetime of run 29 | 30 | ### Donate :) 31 | 32 | TRC-20 - `TX7yeJVHwhNsNy4ksF1pFRFnunF1aFRmet` \ 33 | ERC-20 - `0x5aa3c82045f944f5afa477d3a1d0be3c96196319` 34 | -------------------------------------------------------------------------------- /abi/base_bridge.json: -------------------------------------------------------------------------------- 1 | [{"inputs":[{"internalType":"contract L2OutputOracle","name":"_l2Oracle","type":"address"},{"internalType":"address","name":"_guardian","type":"address"},{"internalType":"bool","name":"_paused","type":"bool"},{"internalType":"contract SystemConfig","name":"_config","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"opaqueData","type":"bytes"}],"name":"TransactionDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"withdrawalHash","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"WithdrawalFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"withdrawalHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"WithdrawalProven","type":"event"},{"inputs":[],"name":"GUARDIAN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"L2_ORACLE","outputs":[{"internalType":"contract L2OutputOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM_CONFIG","outputs":[{"internalType":"contract SystemConfig","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint64","name":"_gasLimit","type":"uint64"},{"internalType":"bool","name":"_isCreation","type":"bool"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"depositTransaction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"donateETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Types.WithdrawalTransaction","name":"_tx","type":"tuple"}],"name":"finalizeWithdrawalTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"finalizedWithdrawals","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_l2OutputIndex","type":"uint256"}],"name":"isOutputFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l2Sender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_byteCount","type":"uint64"}],"name":"minimumGasLimit","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"params","outputs":[{"internalType":"uint128","name":"prevBaseFee","type":"uint128"},{"internalType":"uint64","name":"prevBoughtGas","type":"uint64"},{"internalType":"uint64","name":"prevBlockNum","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct Types.WithdrawalTransaction","name":"_tx","type":"tuple"},{"internalType":"uint256","name":"_l2OutputIndex","type":"uint256"},{"components":[{"internalType":"bytes32","name":"version","type":"bytes32"},{"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"internalType":"bytes32","name":"messagePasserStorageRoot","type":"bytes32"},{"internalType":"bytes32","name":"latestBlockhash","type":"bytes32"}],"internalType":"struct Types.OutputRootProof","name":"_outputRootProof","type":"tuple"},{"internalType":"bytes[]","name":"_withdrawalProof","type":"bytes[]"}],"name":"proveWithdrawalTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"provenWithdrawals","outputs":[{"internalType":"bytes32","name":"outputRoot","type":"bytes32"},{"internalType":"uint128","name":"timestamp","type":"uint128"},{"internalType":"uint128","name":"l2OutputIndex","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}] -------------------------------------------------------------------------------- /abi/base_for_builders.json: -------------------------------------------------------------------------------- 1 | [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}] -------------------------------------------------------------------------------- /abi/nft.json: -------------------------------------------------------------------------------- 1 | [{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClaimableSupply","type":"uint256"},{"internalType":"uint256","name":"supplyClaimed","type":"uint256"},{"internalType":"uint256","name":"quantityLimitPerWallet","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"string","name":"metadata","type":"string"}],"indexed":false,"internalType":"struct IClaimCondition.ClaimCondition[]","name":"claimConditions","type":"tuple[]"},{"indexed":false,"internalType":"bool","name":"resetEligibility","type":"bool"}],"name":"ClaimConditionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"prevURI","type":"string"},{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRoyaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyBps","type":"uint256"}],"name":"DefaultRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"restriction","type":"bool"}],"name":"OperatorRestriction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"PrimarySaleRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"royaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyBps","type":"uint256"}],"name":"RoyaltyForToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"string","name":"imageURI","type":"string"},{"indexed":false,"internalType":"string","name":"animationURI","type":"string"}],"name":"SharedMetadataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"claimConditionIndex","type":"uint256"},{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"startTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantityClaimed","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"address","name":"_currency","type":"address"},{"internalType":"uint256","name":"_pricePerToken","type":"uint256"},{"components":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantityLimitPerWallet","type":"uint256"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"},{"internalType":"address","name":"currency","type":"address"}],"internalType":"struct IDrop.AllowlistProof","name":"_allowlistProof","type":"tuple"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimCondition","outputs":[{"internalType":"uint256","name":"currentStartId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721AUpgradeable.TokenOwnership","name":"ownership","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveClaimConditionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_conditionId","type":"uint256"}],"name":"getClaimConditionById","outputs":[{"components":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClaimableSupply","type":"uint256"},{"internalType":"uint256","name":"supplyClaimed","type":"uint256"},{"internalType":"uint256","name":"quantityLimitPerWallet","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"string","name":"metadata","type":"string"}],"internalType":"struct IClaimCondition.ClaimCondition","name":"condition","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultRoyaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"member","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRoyaltyInfoForToken","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_conditionId","type":"uint256"},{"internalType":"address","name":"_claimer","type":"address"}],"name":"getSupplyClaimedByWallet","outputs":[{"internalType":"uint256","name":"supplyClaimedByWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRoleWithSwitch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_defaultAdmin","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"address[]","name":"_trustedForwarders","type":"address[]"},{"internalType":"address","name":"_saleRecipient","type":"address"},{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint128","name":"_royaltyBps","type":"uint128"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenIdToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenIdToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorRestriction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primarySaleRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"maxClaimableSupply","type":"uint256"},{"internalType":"uint256","name":"supplyClaimed","type":"uint256"},{"internalType":"uint256","name":"quantityLimitPerWallet","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"string","name":"metadata","type":"string"}],"internalType":"struct IClaimCondition.ClaimCondition[]","name":"_conditions","type":"tuple[]"},{"internalType":"bool","name":"_resetClaimEligibility","type":"bool"}],"name":"setClaimConditions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint256","name":"_royaltyBps","type":"uint256"}],"name":"setDefaultRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_restriction","type":"bool"}],"name":"setOperatorRestriction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_saleRecipient","type":"address"}],"name":"setPrimarySaleRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_bps","type":"uint256"}],"name":"setRoyaltyInfoForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"imageURI","type":"string"},{"internalType":"string","name":"animationURI","type":"string"}],"internalType":"struct ISharedMetadata.SharedMetadataInfo","name":"_metadata","type":"tuple"}],"name":"setSharedMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharedMetadata","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"imageURI","type":"string"},{"internalType":"string","name":"animationURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_subscription","type":"address"}],"name":"subscribeToRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_conditionId","type":"uint256"},{"internalType":"address","name":"_claimer","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"address","name":"_currency","type":"address"},{"internalType":"uint256","name":"_pricePerToken","type":"uint256"},{"components":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantityLimitPerWallet","type":"uint256"},{"internalType":"uint256","name":"pricePerToken","type":"uint256"},{"internalType":"address","name":"currency","type":"address"}],"internalType":"struct IDrop.AllowlistProof","name":"_allowlistProof","type":"tuple"}],"name":"verifyClaim","outputs":[{"internalType":"bool","name":"isOverride","type":"bool"}],"stateMutability":"view","type":"function"}] -------------------------------------------------------------------------------- /abi/onchain_summer_bridge.json: -------------------------------------------------------------------------------- 1 | [{"inputs":[{"internalType":"address payable","name":"_messenger","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"localToken","type":"address"},{"indexed":true,"internalType":"address","name":"remoteToken","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ERC20BridgeFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"localToken","type":"address"},{"indexed":true,"internalType":"address","name":"remoteToken","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ERC20BridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"l2Token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ERC20DepositInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"l1Token","type":"address"},{"indexed":true,"internalType":"address","name":"l2Token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ERC20WithdrawalFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ETHBridgeFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ETHBridgeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ETHDepositInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"ETHWithdrawalFinalized","type":"event"},{"inputs":[],"name":"MESSENGER","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OTHER_BRIDGE","outputs":[{"internalType":"contract StandardBridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"bridgeERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"bridgeERC20To","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"bridgeETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"bridgeETHTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Token","type":"address"},{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"depositERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Token","type":"address"},{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"depositERC20To","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"depositETHTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_localToken","type":"address"},{"internalType":"address","name":"_remoteToken","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"finalizeBridgeERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"finalizeBridgeETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_l1Token","type":"address"},{"internalType":"address","name":"_l2Token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"finalizeERC20Withdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_extraData","type":"bytes"}],"name":"finalizeETHWithdrawal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"l2TokenBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"messenger","outputs":[{"internalType":"contract CrossDomainMessenger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}] -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | RPCs = { 2 | 'Ethereum': 'https://rpc.ankr.com/eth', 3 | 'Base': 'https://mainnet.base.org', 4 | } 5 | 6 | ############################################################################################################### 7 | 8 | # Время ожидания между выполнением разных акков рандомное в указанном диапазоне 9 | NEXT_ADDRESS_MIN_WAIT_TIME = 1 # В минутах 10 | NEXT_ADDRESS_MAX_WAIT_TIME = 2 # В минутах 11 | 12 | # Время ожидания между действиями одного аккаунта 13 | NEXT_TX_MIN_WAIT_TIME = 6 # В секундах 14 | NEXT_TX_MAX_WAIT_TIME = 12 # В секундах 15 | 16 | # Максимальное кол-во попыток сделать запрос/транзакцию если они фейлятся 17 | MAX_TRIES = 3 18 | 19 | ############################################################################################################### 20 | 21 | # Максимальный газ прайс в Gwei, при котором делать транзакции в Ethereum 22 | MAX_ETH_GAS_PRICE = 20 23 | 24 | # Сколько секунд ждать до следующей проверки газ прайса 25 | WAIT_GAS_TIME = 10 26 | # Сколько всего секунд ждать лучшего газ прайса, 27 | # если за это время газ прайс не понизится до нужного значения, будет ошибка 28 | TOTAL_WAIT_GAS_TIME = 3600 29 | 30 | ############################################################################################################### 31 | 32 | # Использовать Max base fee и Priority fee 0.005 для транзакций в Base 33 | BASE_LOW_GAS = True 34 | 35 | ############################################################################################################### 36 | 37 | # Адреса NFT, которые минтить 38 | MINT_ADDRESSES = [ 39 | '0x1FC10ef15E041C5D3C54042e52EB0C54CB9b710c', # Base is for builders 40 | '0xEa2a41c02fA86A4901826615F9796e603C6a4491', # Bridge to Base 41 | ] 42 | 43 | # Можно бриджить с помощью минта Bridge Pass NFT на mint.fun 44 | # По сути бридж 0.001 ETH + 1 NFT на Base 45 | BRIDGE_WITH_MINT_FUN = False 46 | 47 | # Можно бриджить через onchainsummer.xyz 48 | BRIDGE_WITH_ONCHAIN_SUMMER = True 49 | 50 | # Сколько бриджить эфира в Base. Выбирается рандомное значение в диапазоне 51 | BRIDGE_AMOUNT = (0.0012, 0.002) 52 | 53 | # Сколько максимум ждать бриджа. Баланс проверяется каждые 20 секунд 54 | BRIDGE_WAIT_TIME = 300 55 | -------------------------------------------------------------------------------- /files/proxies.txt: -------------------------------------------------------------------------------- 1 | user1:pass1@ip1:port1 2 | user2:pass2@ip2:port2 3 | 4 | or empty file -------------------------------------------------------------------------------- /files/wallets.txt: -------------------------------------------------------------------------------- 1 | address1;private_key1 or private_key1 2 | address2;private_key2 or private_key2 -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import csv 3 | import random 4 | import time 5 | import colorama 6 | import web3.exceptions 7 | 8 | from termcolor import cprint 9 | from enum import Enum 10 | from pathlib import Path 11 | from datetime import datetime 12 | from loguru import logger 13 | from eth_account.account import Account 14 | from eth_account.messages import encode_defunct 15 | 16 | from utils import * 17 | from config import * 18 | from vars import * 19 | 20 | 21 | colorama.init() 22 | logger.remove() 23 | logger.add(sys.stdout, level='INFO') 24 | 25 | date_path = datetime.now().strftime('%d-%m-%Y-%H-%M-%S') 26 | results_path = 'results/' + date_path 27 | logs_root = 'logs/' 28 | logs_path = logs_root + date_path 29 | Path(results_path).mkdir(parents=True, exist_ok=True) 30 | Path(logs_path).mkdir(parents=True, exist_ok=True) 31 | 32 | 33 | def decimal_to_int(d, n): 34 | return int(d * (10 ** n)) 35 | 36 | 37 | def int_to_decimal(i, n): 38 | return i / (10 ** n) 39 | 40 | 41 | def readable_amount_int(i, n, d=2): 42 | return round(int_to_decimal(i, n), d) 43 | 44 | 45 | def wait_next_tx(x=1.0): 46 | time.sleep(random.uniform(NEXT_TX_MIN_WAIT_TIME, NEXT_TX_MAX_WAIT_TIME) * x) 47 | 48 | 49 | def _delay(r, *args, **kwargs): 50 | time.sleep(random.uniform(1, 2)) 51 | 52 | 53 | class RunnerException(Exception): 54 | 55 | def __init__(self, message, caused=None): 56 | super().__init__() 57 | self.message = message 58 | self.caused = caused 59 | 60 | def __str__(self): 61 | if self.caused: 62 | return self.message + ": " + str(self.caused) 63 | return self.message 64 | 65 | 66 | class PendingException(Exception): 67 | 68 | def __init__(self, chain, tx_hash, action): 69 | super().__init__() 70 | self.chain = chain 71 | self.tx_hash = tx_hash 72 | self.action = action 73 | 74 | def __str__(self): 75 | return f'{self.action}, chain = {self.chain}, tx_hash = {self.tx_hash.hex()}' 76 | 77 | def get_tx_hash(self): 78 | return self.tx_hash.hex() 79 | 80 | 81 | def runner_func(msg): 82 | def decorator(func): 83 | @retry(tries=MAX_TRIES, delay=1.5, backoff=2, jitter=(0, 1), exceptions=RunnerException) 84 | def wrapper(*args, **kwargs): 85 | try: 86 | return func(*args, **kwargs) 87 | except (PendingException, InsufficientFundsException): 88 | raise 89 | except Exception as e: 90 | raise RunnerException(msg, e) 91 | 92 | return wrapper 93 | 94 | return decorator 95 | 96 | 97 | class Status(Enum): 98 | ALREADY = 1 99 | PENDING = 2 100 | SUCCESS = 3 101 | FAILED = 4 102 | 103 | 104 | class Runner: 105 | 106 | def __init__(self, private_key, proxy): 107 | if proxy is not None and len(proxy) > 4 and proxy[:4] != 'http': 108 | proxy = 'http://' + proxy 109 | self.proxy = proxy 110 | 111 | self.w3s = {chain: get_w3(chain, proxy=self.proxy) for chain in INVOLVED_CHAINS} 112 | 113 | self.private_key = private_key 114 | self.address = Account().from_key(private_key).address 115 | 116 | def w3(self, chain): 117 | return self.w3s[chain] 118 | 119 | def tx_verification(self, chain, tx_hash, action=None): 120 | action_print = action + ' - ' if action else '' 121 | logger.info(f'{action_print}Tx was sent') 122 | try: 123 | transaction_data = self.w3(chain).eth.wait_for_transaction_receipt(tx_hash) 124 | status = transaction_data.get('status') 125 | if status is not None and status == 1: 126 | logger.info(f'{action_print}Successful tx: {SCANS[chain]}/tx/{tx_hash.hex()}') 127 | else: 128 | raise RunnerException(f'{action_print}Tx status = {status}, chain = {chain}, tx_hash = {tx_hash.hex()}') 129 | except web3.exceptions.TimeExhausted: 130 | logger.info(f'{action_print} Tx in pending: {SCANS[chain]}/tx/{tx_hash.hex()}') 131 | raise PendingException(chain, tx_hash, action_print[:-3]) 132 | 133 | def get_native_balance(self, chain): 134 | return self.w3(chain).eth.get_balance(self.address) 135 | 136 | def build_and_send_tx(self, w3, func, action, value=0): 137 | return build_and_send_tx(w3, self.address, self.private_key, func, value, self.tx_verification, action) 138 | 139 | @classmethod 140 | def wait_for_eth_gas_price(cls, w3): 141 | t = 0 142 | while w3.eth.gas_price > Web3.to_wei(MAX_ETH_GAS_PRICE, 'gwei'): 143 | gas_price = int_to_decimal(w3.eth.gas_price, 9) 144 | gas_price = round(gas_price, 2) 145 | logger.info(f'Gas price is too high - {gas_price}. Waiting for {WAIT_GAS_TIME}s') 146 | t += WAIT_GAS_TIME 147 | if t >= TOTAL_WAIT_GAS_TIME: 148 | break 149 | time.sleep(WAIT_GAS_TIME) 150 | 151 | if w3.eth.gas_price > Web3.to_wei(MAX_ETH_GAS_PRICE, 'gwei'): 152 | raise RunnerException('Gas price is too high') 153 | 154 | def wait_for_bridge(self, init_balance): 155 | t = 0 156 | while init_balance >= self.get_native_balance('Base') and t < BRIDGE_WAIT_TIME: 157 | t += 20 158 | logger.info('Assets not bridged') 159 | time.sleep(20) 160 | 161 | if init_balance >= self.get_native_balance('Base'): 162 | raise RunnerException('Bridge takes too long') 163 | 164 | logger.info('Assets bridged successfully') 165 | 166 | @runner_func('Onchain Summer Bridge') 167 | def onchain_summer_bridge(self): 168 | w3 = self.w3('Ethereum') 169 | 170 | contract = w3.eth.contract(ONCHAIN_SUMMER_BRIDGE_ADDRESS, abi=ONCHAIN_SUMMER_BRIDGE_ABI) 171 | 172 | amount = random.uniform(BRIDGE_AMOUNT[0], BRIDGE_AMOUNT[1]) 173 | amount = round(amount, random.randint(4, 6)) 174 | value = Web3.to_wei(amount, 'ether') 175 | 176 | self.wait_for_eth_gas_price(w3) 177 | 178 | self.build_and_send_tx( 179 | w3, 180 | contract.functions.depositETH(BASE_ONCHAIN_SUMMER_BRIDGE_GAS_LIMIT, b''), 181 | value=value, 182 | action='Onchain Summer Bridge' 183 | ) 184 | 185 | return Status.SUCCESS 186 | 187 | @runner_func('Bridge') 188 | def official_bridge(self): 189 | w3 = self.w3('Ethereum') 190 | 191 | contract = w3.eth.contract(BASE_BRIDGE_ADDRESS, abi=BASE_BRIDGE_ABI) 192 | 193 | if BRIDGE_WITH_MINT_FUN: 194 | recipient = MINT_FUN_BRIDGE_PASS_ADDRESS 195 | gas_limit = BASE_MINT_FUN_BRIDGE_GAS_LIMIT 196 | data = '0x8c874ebd0021fb3f' 197 | value = Web3.to_wei(0.001, 'ether') 198 | action = 'Bridge with mint.fun' 199 | else: 200 | recipient = self.address 201 | gas_limit = BASE_BRIDGE_GAS_LIMIT 202 | data = '0x01' 203 | amount = random.uniform(BRIDGE_AMOUNT[0], BRIDGE_AMOUNT[1]) 204 | amount = round(amount, random.randint(4, 6)) 205 | value = Web3.to_wei(amount, 'ether') 206 | action = 'Official bridge' 207 | 208 | self.wait_for_eth_gas_price(w3) 209 | 210 | self.build_and_send_tx( 211 | w3, 212 | contract.functions.depositTransaction(recipient, value, gas_limit, False, to_bytes(data)), 213 | value=value, 214 | action=action 215 | ) 216 | 217 | return Status.SUCCESS 218 | 219 | def bridge(self): 220 | return self.onchain_summer_bridge() if BRIDGE_WITH_ONCHAIN_SUMMER else self.official_bridge() 221 | 222 | @runner_func('Mint Base if for builders') 223 | def mint_base_for_builders(self, w3): 224 | contract = w3.eth.contract(BASE_FOR_BUILDERS_ADDRESS, abi=BASE_FOR_BUILDERS_ABI) 225 | 226 | if contract.functions.balanceOf(self.address).call() > 0: 227 | return Status.ALREADY 228 | 229 | message = encode_defunct(text='all your base are belong to you.') 230 | signature = w3.eth.account.sign_message(message, private_key=self.private_key).signature.hex() 231 | 232 | self.build_and_send_tx( 233 | w3, 234 | contract.functions.mint(to_bytes(signature)), 235 | action='Mint Base is for builders', 236 | ) 237 | 238 | return Status.SUCCESS 239 | 240 | @runner_func('Mint NFT') 241 | def mint_nft(self, w3, nft_address): 242 | contract = w3.eth.contract(nft_address, abi=BASE_NFT_ABI) 243 | 244 | if contract.functions.balanceOf(self.address).call() > 0: 245 | return Status.ALREADY 246 | 247 | args = (self.address, 1, NATIVE_TOKEN_ADDRESS, 0, ([], 2 ** 256 - 1, 0, NATIVE_TOKEN_ADDRESS), b'') 248 | 249 | self.build_and_send_tx( 250 | w3, 251 | contract.functions.claim(*args), 252 | action='Mint NFT', 253 | ) 254 | 255 | return Status.SUCCESS 256 | 257 | def _mint(self, nft_address): 258 | w3 = self.w3('Base') 259 | 260 | def mint_func(): 261 | if nft_address == BASE_FOR_BUILDERS_ADDRESS: 262 | return self.mint_base_for_builders(w3) 263 | else: 264 | return self.mint_nft(w3, nft_address) 265 | 266 | try: 267 | return mint_func() 268 | except InsufficientFundsException: 269 | logger.info(f'Insufficient funds on Base. Let\'s bridge') 270 | init_balance = self.get_native_balance('Base') 271 | self.bridge() 272 | self.wait_for_bridge(init_balance) 273 | wait_next_tx() 274 | return mint_func() 275 | 276 | def mint(self, nft_address): 277 | try: 278 | return self._mint(nft_address) 279 | except PendingException: 280 | return Status.PENDING 281 | 282 | 283 | def get_nft_name(w3, nft_address): 284 | return w3.eth.contract(nft_address, abi=BASE_NFT_ABI).functions.name().call() 285 | 286 | 287 | def wait_next_run(idx, runs_count): 288 | wait = random.randint( 289 | int(NEXT_ADDRESS_MIN_WAIT_TIME * 60), 290 | int(NEXT_ADDRESS_MAX_WAIT_TIME * 60) 291 | ) 292 | 293 | done_msg = f'Done: {idx}/{runs_count}' 294 | waiting_msg = 'Waiting for next run for {:.2f} minutes'.format(wait / 60) 295 | 296 | cprint('\n#########################################\n#', 'cyan', end='') 297 | cprint(done_msg.center(39), 'magenta', end='') 298 | cprint('#\n#########################################', 'cyan', end='') 299 | 300 | cprint('\n# ', 'cyan', end='') 301 | cprint(waiting_msg, 'magenta', end='') 302 | cprint(' #\n#########################################\n', 'cyan') 303 | 304 | time.sleep(wait) 305 | 306 | 307 | def main(): 308 | random.seed(int(datetime.now().timestamp())) 309 | 310 | if BRIDGE_WITH_MINT_FUN and BRIDGE_WITH_ONCHAIN_SUMMER: 311 | logger.error("Can\'t bridge with mint fun and with onchain summer. Choose only one") 312 | exit(0) 313 | 314 | with open('files/wallets.txt', 'r', encoding='utf-8') as file: 315 | wallets = file.read().splitlines() 316 | with open('files/proxies.txt', 'r', encoding='utf-8') as file: 317 | proxies = file.read().splitlines() 318 | 319 | if len(proxies) == 0: 320 | proxies = [None] * len(wallets) 321 | if len(proxies) != len(wallets): 322 | cprint('Proxies count doesn\'t match wallets count. Add proxies or leave proxies file empty', 'red') 323 | return 324 | 325 | queue = list(zip(wallets, proxies)) 326 | 327 | idx, runs_count = 0, len(queue) 328 | 329 | stats = {} 330 | base_w3 = get_w3('Base') 331 | 332 | mint_addresses = [Web3.to_checksum_address(addr) for addr in MINT_ADDRESSES] 333 | 334 | try: 335 | mint_names = {addr: get_nft_name(base_w3, addr) for addr in mint_addresses} 336 | except Exception as e: 337 | logger.error(f'Can\'t get nft names: {str(e)}') 338 | exit(0) 339 | 340 | for wallet, proxy in queue: 341 | if wallet.find(';') == -1: 342 | key = wallet 343 | else: 344 | key = wallet.split(';')[1] 345 | 346 | address = Account().from_key(key).address 347 | stats[address] = set() 348 | 349 | random.shuffle(queue) 350 | 351 | while len(queue) != 0: 352 | 353 | if idx != 0: 354 | wait_next_run(idx, runs_count) 355 | 356 | account = queue.pop(0) 357 | 358 | wallet, proxy = account 359 | 360 | if wallet.find(';') == -1: 361 | key = wallet 362 | else: 363 | key = wallet.split(';')[1] 364 | 365 | address = Account().from_key(key).address 366 | logger.info(address) 367 | 368 | try: 369 | runner = Runner(key, proxy) 370 | except Exception as e: 371 | logger.error(f'Failed to init: {str(e)}', color='red') 372 | continue 373 | 374 | random.shuffle(mint_addresses) 375 | 376 | for nft_address in mint_addresses: 377 | name = mint_names[nft_address] 378 | logger.info(f'{name}: Starting mint') 379 | try: 380 | status = runner.mint(nft_address) 381 | if status == Status.SUCCESS: 382 | logger.info(f'{name}: Successfully minted') 383 | elif status == Status.ALREADY: 384 | logger.info(f'{name}: Was already minted') 385 | elif status == Status.PENDING: 386 | logger.info(f'{name}: Mint tx in pending') 387 | stats[address].add(name) 388 | wait_next_tx() 389 | except Exception as e: 390 | logger.error(f'{name}: Mint failed - {str(e)}') 391 | 392 | with open(f'{results_path}/report.csv', 'w', encoding='utf-8', newline='') as file: 393 | writer = csv.writer(file) 394 | header = ['Address'] + [mint_names[name] for name in mint_names] 395 | csv_data = [header] 396 | for addr in stats: 397 | row = [addr] 398 | for name in mint_names: 399 | row.append(mint_names[name] in stats[addr]) 400 | csv_data.append(row) 401 | writer.writerows(csv_data) 402 | 403 | idx += 1 404 | 405 | cprint('\n#########################################\n#', 'cyan', end='') 406 | cprint(f'Finished'.center(39), 'magenta', end='') 407 | cprint('#\n#########################################', 'cyan') 408 | 409 | 410 | if __name__ == '__main__': 411 | cprint('###############################################################', 'cyan') 412 | cprint('#################', 'cyan', end='') 413 | cprint(' https://t.me/thelaziestcoder ', 'magenta', end='') 414 | cprint('################', 'cyan') 415 | cprint('#################', 'cyan', end='') 416 | cprint(' https://t.me/thelaziestcoder ', 'magenta', end='') 417 | cprint('################', 'cyan') 418 | cprint('#################', 'cyan', end='') 419 | cprint(' https://t.me/thelaziestcoder ', 'magenta', end='') 420 | cprint('################', 'cyan') 421 | cprint('###############################################################\n', 'cyan') 422 | 423 | main() 424 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | colorama==0.4.6 2 | eth_account==0.9.0 3 | loguru==0.7.0 4 | requests==2.31.0 5 | retry==0.9.2 6 | termcolor==2.3.0 7 | web3==6.0.0 8 | -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from retry import retry 3 | from web3 import Web3 4 | from config import RPCs, BASE_LOW_GAS, MAX_TRIES 5 | from vars import CHAIN_NAMES, EIP1559_CHAINS 6 | 7 | 8 | def get_coin_price(coin, currency): 9 | resp = requests.get( 10 | f'https://api.coingecko.com/api/v3/coins/{coin}?localization=false&tickers=false&market_data=true&community_data=false&developer_data=false&sparkline=false') 11 | return float(resp.json()['market_data']['current_price'][currency]) 12 | 13 | 14 | class Web3WithChain(Web3): 15 | 16 | current_chain_id: int 17 | 18 | def __init__(self, *args, **kwargs): 19 | super().__init__(*args, **kwargs) 20 | current_chain_id = self.eth.chain_id 21 | self.current_chain_id = current_chain_id 22 | 23 | 24 | @retry(tries=MAX_TRIES, delay=1.5, backoff=2, jitter=(0, 1)) 25 | def get_w3(chain, proxy=None): 26 | req_args = {} if proxy is None or proxy == '' else { 27 | 'proxies': {'https': proxy, 'http': proxy}, 28 | } 29 | return Web3WithChain(Web3.HTTPProvider(RPCs[chain], request_kwargs=req_args)) 30 | 31 | 32 | def get_chain(w3): 33 | return CHAIN_NAMES[w3.current_chain_id] 34 | 35 | 36 | def to_bytes(hex_str): 37 | return Web3.to_bytes(hexstr=hex_str) 38 | 39 | 40 | class InsufficientFundsException(Exception): 41 | 42 | def __init__(self, prefix=''): 43 | super().__init__(prefix + 'Insufficient funds') 44 | 45 | 46 | def send_tx(w3, private_key, tx, verify_func, action): 47 | try: 48 | estimate = w3.eth.estimate_gas(tx) 49 | tx['gas'] = int(estimate * 1.2) 50 | 51 | signed_tx = w3.eth.account.sign_transaction(tx, private_key) 52 | tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) 53 | verify_func(get_chain(w3), tx_hash, action=action) 54 | 55 | return tx_hash 56 | except Exception as e: 57 | if 'insufficient funds' in str(e) or 'gas required exceeds allowance' in str(e): 58 | raise InsufficientFundsException() 59 | raise e 60 | 61 | 62 | def build_and_send_tx(w3, address, private_key, func, value, verify_func, action): 63 | tx_data = { 64 | 'from': address, 65 | 'nonce': w3.eth.get_transaction_count(address), 66 | 'value': value, 67 | } 68 | 69 | gas_price = w3.eth.gas_price 70 | chain = get_chain(w3) 71 | 72 | max_priority_fee, max_fee_per_gas = None, None 73 | if chain in EIP1559_CHAINS: 74 | if chain == 'Base' and BASE_LOW_GAS: 75 | max_priority_fee, max_fee_per_gas = 5000000, 5000000 76 | else: 77 | max_priority_fee = w3.eth.max_priority_fee 78 | max_fee_per_gas = max_priority_fee + int(w3.eth.get_block("latest")["baseFeePerGas"] * 1.2) 79 | 80 | if max_priority_fee and max_fee_per_gas: 81 | tx_data['maxPriorityFeePerGas'] = max_priority_fee 82 | tx_data['maxFeePerGas'] = max_fee_per_gas 83 | else: 84 | tx_data['gasPrice'] = gas_price 85 | 86 | try: 87 | tx = func.build_transaction(tx_data) 88 | except Exception as e: 89 | if 'insufficient funds' in str(e) or 'gas required exceeds allowance' in str(e): 90 | raise InsufficientFundsException() 91 | raise e 92 | 93 | return send_tx(w3, private_key, tx, verify_func, action) 94 | -------------------------------------------------------------------------------- /vars.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | 4 | INVOLVED_CHAINS = ['Ethereum', 'Base'] 5 | 6 | SCANS = { 7 | 'Ethereum': 'https://etherscan.io', 8 | 'Optimism': 'https://optimistic.etherscan.io', 9 | 'BSC': 'https://bscscan.com', 10 | 'Gnosis': 'https://gnosisscan.io', 11 | 'Polygon': 'https://polygonscan.com', 12 | 'Fantom': 'https://ftmscan.com', 13 | 'Arbitrum': 'https://arbiscan.io', 14 | 'Avalanche': 'https://snowtrace.io', 15 | 'zkSync': 'https://explorer.zksync.io', 16 | 'zkEVM': 'https://zkevm.polygonscan.com', 17 | 'Zora': 'https://explorer.zora.energy', 18 | 'Base': 'https://basescan.org', 19 | } 20 | 21 | CHAIN_IDS = { 22 | 'Ethereum': 1, 23 | 'Optimism': 10, 24 | 'BSC': 56, 25 | 'Gnosis': 100, 26 | 'Polygon': 137, 27 | 'Fantom': 250, 28 | 'Arbitrum': 42161, 29 | 'Avalanche': 43114, 30 | 'zkSync': 324, 31 | 'zkEVM': 1101, 32 | 'Zora': 7777777, 33 | 'Base': 8453, 34 | } 35 | 36 | CHAIN_NAMES = { 37 | 1: 'Ethereum', 38 | 10: 'Optimism', 39 | 56: 'BSC', 40 | 100: 'Gnosis', 41 | 137: 'Polygon', 42 | 250: 'Fantom', 43 | 42161: 'Arbitrum', 44 | 43114: 'Avalanche', 45 | 1313161554: 'Aurora', 46 | 324: 'zkSync', 47 | 1101: 'zkEVM', 48 | 7777777: 'Zora', 49 | 8453: 'Base', 50 | } 51 | 52 | EIP1559_CHAINS = ['Ethereum', 'Base'] 53 | 54 | NATIVE_TOKEN_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE' 55 | 56 | NATIVE_DECIMALS = 18 57 | 58 | BASE_BRIDGE_GAS_LIMIT = 100000 59 | BASE_MINT_FUN_BRIDGE_GAS_LIMIT = 222000 60 | BASE_ONCHAIN_SUMMER_BRIDGE_GAS_LIMIT = 200000 61 | 62 | MINT_FUN_BRIDGE_PASS_ADDRESS = '0x00008453E27e8e88F305F13CF27c30D724fDd055' 63 | 64 | ONCHAIN_SUMMER_BRIDGE_ADDRESS = '0x3154Cf16ccdb4C6d922629664174b904d80F2C35' 65 | ONCHAIN_SUMMER_BRIDGE_ABI = json.load(open('abi/onchain_summer_bridge.json')) 66 | 67 | BASE_BRIDGE_ADDRESS = '0x49048044D57e1C92A77f79988d21Fa8fAF74E97e' 68 | BASE_BRIDGE_ABI = json.load(open('abi/base_bridge.json')) 69 | 70 | BASE_FOR_BUILDERS_ADDRESS = '0x1FC10ef15E041C5D3C54042e52EB0C54CB9b710c' 71 | BASE_FOR_BUILDERS_ABI = json.load(open('abi/base_for_builders.json')) 72 | 73 | BASE_NFT_ABI = json.load(open('abi/nft.json')) 74 | --------------------------------------------------------------------------------