Spaces:
Sleeping
Sleeping
| # EthPen.com | |
| # 导入运行代码所需要的库 | |
| import streamlit as st # streamlit app | |
| from web3 import Web3 # 与以太坊交互的库 | |
| import hashlib # 用于数据哈希 | |
| import re # 用于正则表达式 | |
| import time # 用于时间相关 | |
| # 许可使用开关 | |
| approved_use = False | |
| # 检查 ETH 地址是否有效 | |
| def is_valid_eth_address(address): | |
| if re.match("^0x[0-9a-fA-F]{40}$", address): | |
| return True | |
| return False | |
| # 检查 Ethereum 私钥是否有效 | |
| def is_valid_eth_private_key(private_key): | |
| if re.match("^[0-9a-fA-F]{64}$", private_key): | |
| return True | |
| return False | |
| # 验证输入的铭文文本是否含有空格和换行符,而且字母全部为小写 | |
| def validate_input(data_str): | |
| if re.search(r'[A-Z\s\n]', data_str): # 查找大写字母、空格或换行符 | |
| return False | |
| return True | |
| # 把文字转换成 16 进制 | |
| def text_to_hex(text): | |
| return ''.join(format(byte, '02x') for byte in text.encode('utf-8')) | |
| # 使用sha256算法计算哈希 | |
| def sha256(input_string): | |
| sha256 = hashlib.sha256() | |
| sha256.update(input_string.encode('utf-8')) | |
| return sha256.hexdigest() | |
| # 发送自己到自己 0ETH 的交易 | |
| def send_transaction(w3, account_address, private_key, chain_id, gas_price, input_data, current_nonce): | |
| # 设置交易的相关信息 | |
| tx = { | |
| 'chainId': chain_id, # 网络 ID | |
| # 'gas': 25000, # 原始的固定 gas 值 | |
| 'gasPrice': gas_price, # gas 的价格 | |
| 'nonce': current_nonce, | |
| 'to': account_address, # 接收地址为自己 | |
| 'value': 0, # 金额为 0ETH | |
| 'data': text_to_hex(input_data), # 铭文内容 | |
| } | |
| # 估算交易所需的 gas | |
| tx['gas'] = w3.eth.estimate_gas(tx) | |
| # 用私钥签名这个交易 | |
| signed_tx = w3.eth.account.sign_transaction(tx, private_key) | |
| # 发送签名后的交易并获取交易哈希 | |
| tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) | |
| # 打印结果信息 | |
| st.toast(f'{input_data}', icon='✅') | |
| # 返回铭文还有交易哈希 | |
| return input_data, tx_hash.hex() | |
| # 网页前端显示 | |
| st.set_page_config(page_title="EthPen - 批量 Mint $pols", page_icon="🪙", layout='centered', initial_sidebar_state='auto') | |
| # 网页标题 | |
| st.subheader(r'🪙 :rainbow[EthPen - 批量 Mint $pols]', anchor=False, divider='rainbow') | |
| # 提醒 | |
| st.markdown('### 在开始使用前,请仔细阅读相关说明,并在确认无误后打上 ✅。感谢您的理解与配合。') | |
| st.markdown('''- 我们已将网站代码完全开源。您可以访问并仔细阅读此页面的源码:[3_🪙_ 批量题写代币铭文.py](https://huggingface.co/spaces/Ethscriptions/POLS/tree/main) | |
| - 如果你对此代码存有疑虑,建议你利用如 [OpenAI - ChetGPT](https://chat.openai.com/)、[Google - Bard](https://bard.google.com/)、[Anthropic - Claude](https://claude.ai/)、[抖音 - 豆包](https://www.doubao.com/)、[百度 - 文心一言](https://yiyan.baidu.com/)、[阿里 - 通义千问](https://qianwen.aliyun.com/) 等知名 AI 平台进行问询,这可以帮助你判断代码是否含有恶意内容。 | |
| - 复制我们的代码,你同样可以在 [HuggingFace](https://HuggingFace.co) 上搭建专属于你的域名铭文批量题写工具。 | |
| - 请务必确保你正在访问的是 **[EthPen.com](https://ethpen.com)** 网站。我们保证站内代码不包含窃取私钥或其他恶意行为,你可以安心使用。 | |
| - 在使用过程中,请按照提示准确地填写信息,这样可以确保程序的顺畅运行。 | |
| - 为了安全起见,我们建议您使用备用账号(小号)并确保账号中不存放大额资金。 | |
| - 首次使用时,我们建议您先使用小号少量操作。确认一切无误后,再大批量账户使用。 | |
| - 若您在使用过程中遇到问题,请及时向我们反馈。我们明白程序可能存在不完善之处,并且我们的能力也有限。真心希望得到各位程序员大佬的指导和交流。 | |
| ''',) | |
| approved = st.checkbox('我已经详细阅读上述内容,并且清楚了解本网站无泄漏私钥的风险。',) | |
| if approved: | |
| approved_use = True | |
| else: | |
| approved_use = False | |
| if approved_use: | |
| st.markdown('## 批量题写 $pols 代币') | |
| # 这里配置 Ethereum PRC URL,如果你没有,请到 infura.io 或者 alchemy.com 申请一个免费的 API | |
| token_eth_prc_url = st.text_input( | |
| f'**Polygon PRC 链接**:选填,你可以去 [infura.io](https://app.infura.io/) 或者 [alchemy.com](https://alchemy.com/) 免费申请一个', | |
| f'https://polygon-mainnet.g.alchemy.com/v2/UNAiPmma0H0vPaeimRGnIYJmJu0iAHkr') | |
| w3 = Web3(Web3.HTTPProvider(f'{token_eth_prc_url}')) | |
| # 初始化当前账户索引为 0 | |
| current_account_index = 0 | |
| # 收集和显示所有交易的结果 | |
| transaction_results = [] | |
| # 创建账户列表 | |
| accounts = [] | |
| # 使用字典来跟踪每个地址的nonce | |
| nonces = {} | |
| account_address = st.text_input('填写你的 **ETH 地址**:') | |
| private_key = st.text_input('填写你的 **ETH 地址对应的私钥**:', type="password") | |
| if account_address and private_key: # 如果地址和私钥有内容 | |
| if is_valid_eth_address(account_address) and is_valid_eth_private_key(private_key): # 验证地址和私钥 | |
| current_nonce = w3.eth.get_transaction_count(account_address) # 获取地址的 nonce | |
| nonces[account_address] = current_nonce # 记录地址的 nonce | |
| accounts.append((account_address.strip(), private_key.strip())) # 保存地址和私钥还有 nonce | |
| else: | |
| st.error("地址或私钥无效,请检查!") | |
| st.stop() | |
| # 配置铭文文本 | |
| input_data = st.text_input('填写需要题写代币铭文文本', 'data:,{"p":"prc-20","op":"mint","tick":"pols","amt":"100000000"}') | |
| token_amount = st.number_input('填写需要题写代币铭文数量(张)', min_value=1, value=100, step=1) | |
| # 判断铭文文本里是否包含空格、换行符,而且所有的字母都必须为小写。 | |
| if not validate_input(f'{input_data}'): | |
| st.warning("**请注意**:通常代币铭文文本里不能包含空格、换行符,而且所有的字母都必须为小写。") | |
| sleep_3s = st.toggle('每次完成交易后暂停 3 秒') | |
| # 每次交易成功后暂停 3 秒 | |
| if sleep_3s: | |
| sleep_3s = True | |
| else: | |
| sleep_3s = False | |
| # 点击发送交易开始 | |
| if st.button(f'开始**发送交易**'): | |
| st.toast(f'开始任务,需要题写的铭文总量为:{token_amount}', icon='😎') | |
| # 对代币铭文 id 进行循环 | |
| for the_id in range(token_amount): | |
| # 使用当前账户发送交易,获取当前账户的 nonce | |
| address, key = accounts[current_account_index] | |
| # 获取 gas | |
| gas_price = w3.eth.gas_price | |
| # 这里是未开检查后直接发送交易 | |
| # 使用 current_nonce 发送交易 | |
| data, tx_hash = send_transaction(w3, address, key, 137, gas_price, input_data, nonces[address]) | |
| # 记录最后输出的结果 | |
| transaction_results.append(f"Transaction Hash: https://polygonscan.com/tx/{tx_hash}") | |
| # 交易成功后,手动增加 nonce 值 | |
| nonces[address] += 1 | |
| # 更新当前账户索引,确保索引始终在账户列表的范围内 | |
| current_account_index = (current_account_index + 1) % len(accounts) | |
| # 暂停 3 秒 | |
| if sleep_3s: | |
| time.sleep(3) # 暂停三秒 | |
| st.toast(f'所有任务已经完成。', icon='🎉') | |
| # 庆祝动画 | |
| st.balloons() | |
| # 显示所有交易的结果 | |
| st.code('\n'.join(transaction_results)) | |
| else: | |
| st.error('# 阅读并打勾 ✅ 后方可使用。') | |