Spaces:
Sleeping
Sleeping
Ethscriptions
commited on
Commit
·
9c1300a
1
Parent(s):
5f3f581
Upload 19 files
Browse files- .gitattributes +3 -0
- data/all_ethscription.db +3 -0
- data/batch_contract_abi.json +1 -0
- data/batch_orders.db +3 -0
- data/config.ini +6 -0
- data/etch_Hyppocritez_data.pkl +3 -0
- data/etch_eths_data.pkl +3 -0
- data/etch_market_data.pkl +3 -0
- data/etch_mfpurrs_data.pkl +3 -0
- data/eths_data.db +0 -0
- data/ethscriptions_data.db +3 -0
- data/huggingface_name_code.py +275 -0
- data/huggingface_token_code.py +259 -0
- data/name_set.db +3 -0
- data/push_messages.db +0 -0
- data/python_name_code.py +201 -0
- data/python_token_code.py +189 -0
- data/single_contract_abi.json +1 -0
- data/single_contract_old_abi.json +1 -0
- data/single_orders.db +3 -0
.gitattributes
CHANGED
@@ -35,3 +35,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
data/ethscriptions_data.db filter=lfs diff=lfs merge=lfs -text
|
37 |
data/name_set.db filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
data/ethscriptions_data.db filter=lfs diff=lfs merge=lfs -text
|
37 |
data/name_set.db filter=lfs diff=lfs merge=lfs -text
|
38 |
+
data/all_ethscription.db filter=lfs diff=lfs merge=lfs -text
|
39 |
+
data/batch_orders.db filter=lfs diff=lfs merge=lfs -text
|
40 |
+
data/single_orders.db filter=lfs diff=lfs merge=lfs -text
|
data/all_ethscription.db
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:67274e2a00e6865914d96d40c1fe52aeed2ff25f67c67d55522f02386ed19a49
|
3 |
+
size 160747520
|
data/batch_contract_abi.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint16","name":"protocolFeeDiscounted","type":"uint16"},{"internalType":"uint16","name":"creatorFee","type":"uint16"},{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OrderTypes.EthscriptionOrder[]","name":"orders","type":"tuple[]"}],"name":"batchBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"}],"name":"setMarketAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
|
data/batch_orders.db
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9ec0e667c51c93735f26f70c59a815c73178e374314e203f80d86c8825f32cbf
|
3 |
+
size 1986560
|
data/config.ini
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[data_thread_start_state]
|
2 |
+
state = 0
|
3 |
+
|
4 |
+
[push_thread_start_state]
|
5 |
+
state = 0
|
6 |
+
|
data/etch_Hyppocritez_data.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:ae6a7a8cf1e3a6113ee5197a59875b6b7b537c76f9a2681f9b6cf244331e2536
|
3 |
+
size 109264
|
data/etch_eths_data.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:f00ab3ed2784cfaef643d0fb2f4be9a7d7c42933972e06f1250eeb5fcb01d1c4
|
3 |
+
size 237288
|
data/etch_market_data.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1d01632273fd5a4fecccd94fe0219498226ddf50b89d238adc9551f2f210dd9a
|
3 |
+
size 560821
|
data/etch_mfpurrs_data.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:38fb5e3804a2281e7e604129b022ec384e57ffceedb95504d0c942dd9c6ce453
|
3 |
+
size 128839
|
data/eths_data.db
ADDED
Binary file (8.19 kB). View file
|
|
data/ethscriptions_data.db
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:6e464c4e181d724772bec04112165b50c750236f9873fb318b0552d3db96d3fe
|
3 |
+
size 413016064
|
data/huggingface_name_code.py
ADDED
@@ -0,0 +1,275 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# EthPen.com
|
2 |
+
# 最后更新日期:2023 年 9 月 5 日
|
3 |
+
|
4 |
+
|
5 |
+
# 导入运行代码所需要的库
|
6 |
+
import streamlit as st # streamlit app
|
7 |
+
from web3 import Web3 # 与以太坊交互的库
|
8 |
+
import hashlib # 用于数据哈希
|
9 |
+
import requests # 用于发送网络请求
|
10 |
+
import re # 用于正则表达式
|
11 |
+
import time # 用于时间相关
|
12 |
+
import os # 用于操作系统文件
|
13 |
+
|
14 |
+
|
15 |
+
# 许可使用开关
|
16 |
+
approved_use = False
|
17 |
+
|
18 |
+
|
19 |
+
# 检查 ETH 地址是否有效
|
20 |
+
def is_valid_eth_address(address):
|
21 |
+
if re.match("^0x[0-9a-fA-F]{40}$", address):
|
22 |
+
return True
|
23 |
+
return False
|
24 |
+
|
25 |
+
|
26 |
+
# 检查 Ethereum 私钥是否有效
|
27 |
+
def is_valid_eth_private_key(private_key):
|
28 |
+
if re.match("^[0-9a-fA-F]{64}$", private_key):
|
29 |
+
return True
|
30 |
+
return False
|
31 |
+
|
32 |
+
|
33 |
+
# 验证输入的铭文文本是否含有空格和换行符,而且字母全部为小写
|
34 |
+
def validate_input(data_str):
|
35 |
+
if re.search(r'[A-Z\s\n]', data_str): # 查找大写字母、空格或换行符
|
36 |
+
return False
|
37 |
+
return True
|
38 |
+
|
39 |
+
|
40 |
+
# 分隔文本函数
|
41 |
+
def split_and_append(ethscriptions_str, name_selected_option):
|
42 |
+
separators = [' ', '\n', ',']
|
43 |
+
split_texts = [ethscriptions_str] # 初始时只有一个完整文本
|
44 |
+
|
45 |
+
for sep in separators:
|
46 |
+
pieces = []
|
47 |
+
for text in split_texts:
|
48 |
+
pieces.extend(text.split(sep))
|
49 |
+
split_texts = pieces
|
50 |
+
|
51 |
+
# 移除空字符串
|
52 |
+
split_texts = [text.strip() + name_selected_option for text in split_texts if text.strip() != '']
|
53 |
+
|
54 |
+
return split_texts
|
55 |
+
|
56 |
+
|
57 |
+
# 把文字转换成 16 进制
|
58 |
+
def text_to_hex(text):
|
59 |
+
return ''.join(format(byte, '02x') for byte in text.encode('utf-8'))
|
60 |
+
|
61 |
+
|
62 |
+
# 使用sha256算法计算哈希
|
63 |
+
def sha256(input_string):
|
64 |
+
sha256 = hashlib.sha256()
|
65 |
+
sha256.update(input_string.encode('utf-8'))
|
66 |
+
return sha256.hexdigest()
|
67 |
+
|
68 |
+
|
69 |
+
# 使用 Ethscriptions API(主网)检查某个铭文是否已题写
|
70 |
+
def check_content_exists(sha):
|
71 |
+
# 定义请求的网址
|
72 |
+
endpoint = f"/ethscriptions/exists/{sha}"
|
73 |
+
response = requests.get('https://mainnet-api.ethscriptions.com/api' + endpoint)
|
74 |
+
# 如果返回状态码是200,说明请求成功,然后返回结果(Ture or False)
|
75 |
+
if response.status_code == 200:
|
76 |
+
return response.json()['result']
|
77 |
+
|
78 |
+
|
79 |
+
# 发送自己到自己 0ETH 的交易
|
80 |
+
def send_transaction(w3, account_address, private_key, chain_id, gas_price, input_data, current_nonce):
|
81 |
+
|
82 |
+
# 设置交易的相关信息
|
83 |
+
tx = {
|
84 |
+
'chainId': chain_id, # 网络 ID
|
85 |
+
'gas': 25000, # 如果交易 gas 过低,可适当调高
|
86 |
+
'gasPrice': gas_price, # gas 的价格
|
87 |
+
'nonce': current_nonce,
|
88 |
+
'to': account_address, # 接收地址为自己
|
89 |
+
'value': 0, # 金额为 0ETH
|
90 |
+
'data': text_to_hex(input_data), # 铭文内容
|
91 |
+
}
|
92 |
+
|
93 |
+
# 用私钥签名这个交易
|
94 |
+
signed_tx = w3.eth.account.sign_transaction(tx, private_key)
|
95 |
+
# 发送签名后的交易并获取交易哈希
|
96 |
+
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
|
97 |
+
# 打印结果信息
|
98 |
+
st.toast(f'{input_data}', icon='✅')
|
99 |
+
# 返回铭文还有交易哈希
|
100 |
+
return input_data, tx_hash.hex()
|
101 |
+
|
102 |
+
|
103 |
+
# 网页前端显示
|
104 |
+
st.set_page_config(page_title="EthPen - 批量题写域名铭文", page_icon="🆔", layout='centered', initial_sidebar_state='auto')
|
105 |
+
|
106 |
+
# 网页标题
|
107 |
+
st.subheader(r'🆔 :rainbow[EthPen - 域名铭文批量题写]', anchor=False, divider='rainbow')
|
108 |
+
|
109 |
+
# 提醒
|
110 |
+
st.markdown('### 在开始使用前,请仔细阅读相关说明,并在确认无误后打上 ✅。感谢您的理解与配合。')
|
111 |
+
|
112 |
+
open_source = st.checkbox('我们已将网站代码完全开源。您可以访问并仔细阅读此页面的源码:[2_🆔_批量题写域名铭文.py](https://huggingface.co/spaces/Ethscriptions/eths/tree/main/pages)',)
|
113 |
+
|
114 |
+
ask_ai = st.checkbox('如果你对此代码存有疑虑,建议你利用如 [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 平台进行问询,这可以帮助你判断代码是否含有恶意内容。',)
|
115 |
+
|
116 |
+
huggingface = st.checkbox('复制我们的代码,你同样可以在 [HuggingFace](https://HuggingFace.co) 上搭建专属于你的域名铭文批量题写工具。',)
|
117 |
+
|
118 |
+
site = st.checkbox('请务必确保你正在访问的是 **[EthPen.com](https://ethpen.com)** 网站。我们保证站内代码不包含窃取私钥或其他恶意行为,你可以安心使用。',)
|
119 |
+
|
120 |
+
use = st.checkbox('在使用过程中,请按照提示准确地填写信息,这样可以确保程序的顺畅运行。',)
|
121 |
+
|
122 |
+
wallet = st.checkbox('为了安全起见,我们建议您使用备用账号(小号)并确保账号中不存放大额资金。',)
|
123 |
+
|
124 |
+
test = st.checkbox('首次使用时,我们建议您先在测试网络中操作。确认一切无误后,再切换至主网络��用。',)
|
125 |
+
|
126 |
+
feedback = st.checkbox('若您在使用过程中遇到问题,请及时向我们反馈。我们明白程序可能存在不完善之处,并且我们的能力也有限。真心希望得到各位程序员大佬的指导和交流。',)
|
127 |
+
|
128 |
+
if open_source and ask_ai and huggingface and site and use and wallet and test and feedback:
|
129 |
+
approved_use = True
|
130 |
+
else:
|
131 |
+
approved_use = False
|
132 |
+
|
133 |
+
if approved_use:
|
134 |
+
|
135 |
+
st.markdown('## 批量题写域名铭文')
|
136 |
+
|
137 |
+
# 连接的网络 ID。比如说,1 代表主网络,5 代表 Goerli 测试网络,11155111 代表 Sepolia 测试网络,如果你不放心,可以先用测试网试试。
|
138 |
+
net_options = {
|
139 |
+
'1': 'Mainnet',
|
140 |
+
'5': 'Goerli',
|
141 |
+
'11155111': 'Sepolia'
|
142 |
+
}
|
143 |
+
selected_option = st.selectbox(
|
144 |
+
'**网络 ID**',
|
145 |
+
list(net_options.keys()),
|
146 |
+
format_func=lambda x: f"{x} ({net_options[x]})"
|
147 |
+
)
|
148 |
+
chain_id = int(selected_option)
|
149 |
+
|
150 |
+
# 这里配置 Ethereum PRC URL,如果你没有,请到 infura.io 或者 alchemy.com 申请一个免费的 API
|
151 |
+
token_eth_prc_url = st.text_input(
|
152 |
+
f'**Ethereum PRC 链接**:选填,你可以去 [infura.io](https://app.infura.io/) 或者 [alchemy.com](https://alchemy.com/) 免费申请一个',
|
153 |
+
f'https://{net_options[str(chain_id)]}.infura.io/v3/eab7f935b9af45e1a54f7d7ed06c5206')
|
154 |
+
w3 = Web3(Web3.HTTPProvider(f'{token_eth_prc_url}'))
|
155 |
+
# 初始化当前账户索引为 0
|
156 |
+
current_account_index = 0
|
157 |
+
# 收集和显示所有交易的结果
|
158 |
+
transaction_results = []
|
159 |
+
# 创建账户列表
|
160 |
+
accounts = []
|
161 |
+
# 使用字典来跟踪每个地址的nonce
|
162 |
+
nonces = {}
|
163 |
+
|
164 |
+
# 启用多账户操作
|
165 |
+
multipl_accounts = st.toggle('启用**多账户**操作')
|
166 |
+
if multipl_accounts:
|
167 |
+
# 多账户的文本框
|
168 |
+
account_list = st.text_area(f'输入多个 **ETH 地址及其对应的私钥**,用英文逗号分隔(,),如下:地址,私钥')
|
169 |
+
if account_list: # 如果账户列表有内容
|
170 |
+
for line in account_list.split('\n'): # 根据换行符划分账户
|
171 |
+
if ',' in line: # 检查是否包含逗号
|
172 |
+
address, key = line.split(',') # 分开地址和私钥
|
173 |
+
if is_valid_eth_address(address) and is_valid_eth_private_key(key): # 验证地址和私钥
|
174 |
+
current_nonce = w3.eth.get_transaction_count(address) # 获取地址的 nonce
|
175 |
+
nonces[address] = current_nonce # 记录地址的 nonce
|
176 |
+
accounts.append((address.strip(), key.strip())) # 保存地址和私钥还有 nonce
|
177 |
+
else:
|
178 |
+
st.error(f"地址 {address} 或私钥 {key} 无效,请检查!")
|
179 |
+
st.stop()
|
180 |
+
else:
|
181 |
+
st.error(f"输入格式错误,请确保每行包含一个地址和一个私钥,并使用英文逗号分隔(,)。错误行:**{line}**")
|
182 |
+
st.stop()
|
183 |
+
else:
|
184 |
+
account_address = st.text_input('填写你的 **ETH 地址**:')
|
185 |
+
private_key = st.text_input('填写你的 **ETH 地址对应的私钥**:', type="password")
|
186 |
+
if account_address and private_key: # 如果地址和私钥有内容
|
187 |
+
if is_valid_eth_address(account_address) and is_valid_eth_private_key(private_key): # 验证地址和私钥
|
188 |
+
current_nonce = w3.eth.get_transaction_count(account_address) # 获取地址的 nonce
|
189 |
+
nonces[account_address] = current_nonce # 记录地址的 nonce
|
190 |
+
accounts.append((account_address.strip(), private_key.strip())) # 保存地址和私钥还有 nonce
|
191 |
+
else:
|
192 |
+
st.error("地址或私钥无效,请检查!")
|
193 |
+
st.stop()
|
194 |
+
|
195 |
+
# 配置铭文文本
|
196 |
+
ethscriptions_str = st.text_area(f'输入**多个域名铭文或其他**,可以用`空格`、`换行符`、`英文逗号(,)`分开,不要带 `data:,` 前缀,不要带`域名后缀`:')
|
197 |
+
|
198 |
+
name_selected_option = st.radio("选择域名后缀:", ['🎨 自定义', '🆔.eths', '🆔.eth', '🌲.tree', '🦛.honk', '🔄.etch', '🌐.com'], index=1, horizontal=True)
|
199 |
+
if name_selected_option == '🎨 自定义':
|
200 |
+
name_selected_option = st.text_input('输入**域名后缀**:')
|
201 |
+
|
202 |
+
# 以空格、换行符、英文逗号分隔文本并加上后缀
|
203 |
+
ethscription_list = split_and_append(ethscriptions_str, name_selected_option)
|
204 |
+
|
205 |
+
# 判断铭文文本里是否包含空格、换行符,而且所有的字母都必须为小写。
|
206 |
+
if not validate_input(''.join(ethscription_list)):
|
207 |
+
st.warning("**请注意**:通常代币铭文文本里不能包含空格、换行符,而且所有的字母都必须为小写。")
|
208 |
+
|
209 |
+
token_check = st.toggle('题写前**检查是否被题写** `主网` `查重`')
|
210 |
+
# 题写铭文之前检查该铭文有没有被题写
|
211 |
+
if token_check:
|
212 |
+
token_check = True
|
213 |
+
else:
|
214 |
+
token_check = False
|
215 |
+
sleep_3s = st.toggle('每次完成交易后暂停 3 秒')
|
216 |
+
# 每次交易成功后暂停 3 秒
|
217 |
+
if sleep_3s:
|
218 |
+
sleep_3s = True
|
219 |
+
else:
|
220 |
+
sleep_3s = False
|
221 |
+
|
222 |
+
# 点击发送交易开始
|
223 |
+
if st.button(f'开始**发送交易**'):
|
224 |
+
if not accounts or not ethscriptions_str or not name_selected_option: # 检查是否留空
|
225 |
+
st.error(f'请正确谨慎地填写内容,每一项都**不应留空**。')
|
226 |
+
st.stop()
|
227 |
+
else:
|
228 |
+
st.toast('看起来你输入的内容均无没有问题!', icon='🥳')
|
229 |
+
|
230 |
+
st.toast(f'开始任务,需要题写的铭文总量为:{len(ethscription_list)}', icon='😎')
|
231 |
+
|
232 |
+
# 对代币铭文 id 进行循环
|
233 |
+
for name_str in ethscription_list:
|
234 |
+
# 使用当前账户发送交易,获取当前账户的 nonce
|
235 |
+
address, key = accounts[current_account_index]
|
236 |
+
# 获取 gas
|
237 |
+
gas_price = w3.eth.gas_price
|
238 |
+
# 得到完整的铭文文本
|
239 |
+
if not name_str.startswith('data:,'):
|
240 |
+
input_data = f'data:,{name_str}'
|
241 |
+
|
242 |
+
# 根据是否检查的开关进行
|
243 |
+
if token_check:
|
244 |
+
# 这里是开了检查后请求 Ethscriptions API
|
245 |
+
if check_content_exists(sha256(input_data)):
|
246 |
+
# 返回数据为 Ture,说明该铭文已经被题写,打印信息
|
247 |
+
st.toast(f'{input_data} 已经被题写!', icon='☹️')
|
248 |
+
else:
|
249 |
+
# 返回数据为 False,说明该铭文还没被题写,发送交易
|
250 |
+
# 使用 current_nonce 发送交易
|
251 |
+
data, tx_hash = send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
|
252 |
+
# 记录最后输出的结果
|
253 |
+
transaction_results.append(f"{address} | {data} | Transaction Hash: {tx_hash}")
|
254 |
+
# 交易成功后,手动增加 nonce 值
|
255 |
+
nonces[address] += 1
|
256 |
+
else:
|
257 |
+
# 这里是未开检查后直接发送交易
|
258 |
+
# 使用 current_nonce 发送交易
|
259 |
+
data, tx_hash = send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
|
260 |
+
# 记录最后输出的结果
|
261 |
+
transaction_results.append(f"{address} | {data} | Transaction Hash: {tx_hash}")
|
262 |
+
# 交易成功后,手动增加 nonce 值
|
263 |
+
nonces[address] += 1
|
264 |
+
# 更新当前账户索引,确保索引始终在账户列表的范围内
|
265 |
+
current_account_index = (current_account_index + 1) % len(accounts)
|
266 |
+
# 暂停 3 秒
|
267 |
+
if sleep_3s:
|
268 |
+
time.sleep(3) # 暂停三秒
|
269 |
+
st.toast(f'所有任务已经完成。', icon='🎉')
|
270 |
+
# 庆祝动画
|
271 |
+
st.balloons()
|
272 |
+
# 显示所有交易的结果
|
273 |
+
st.code('\n'.join(transaction_results))
|
274 |
+
else:
|
275 |
+
st.error('# 阅读并打勾 ✅ 后方可使用。')
|
data/huggingface_token_code.py
ADDED
@@ -0,0 +1,259 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# EthPen.com
|
2 |
+
# 最后更新日期:2023 年 9 月 5 日
|
3 |
+
|
4 |
+
|
5 |
+
# 导入运行代码所需要的库
|
6 |
+
import streamlit as st # streamlit app
|
7 |
+
from web3 import Web3 # 与以太坊交互的库
|
8 |
+
import hashlib # 用于数据哈希
|
9 |
+
import requests # 用于发送网络请求
|
10 |
+
import re # 用于正则表达式
|
11 |
+
import time # 用于时间相关
|
12 |
+
import os # 用于操作系统文件
|
13 |
+
|
14 |
+
|
15 |
+
# 许可使用开关
|
16 |
+
approved_use = False
|
17 |
+
|
18 |
+
|
19 |
+
# 检查 ETH 地址是否有效
|
20 |
+
def is_valid_eth_address(address):
|
21 |
+
if re.match("^0x[0-9a-fA-F]{40}$", address):
|
22 |
+
return True
|
23 |
+
return False
|
24 |
+
|
25 |
+
|
26 |
+
# 检查 Ethereum 私钥是否有效
|
27 |
+
def is_valid_eth_private_key(private_key):
|
28 |
+
if re.match("^[0-9a-fA-F]{64}$", private_key):
|
29 |
+
return True
|
30 |
+
return False
|
31 |
+
|
32 |
+
|
33 |
+
# 验证输入的铭文文本是否含有空格和换行符,而且字母全部为小写
|
34 |
+
def validate_input(data_str):
|
35 |
+
if re.search(r'[A-Z\s\n]', data_str): # 查找大写字母、空格或换行符
|
36 |
+
return False
|
37 |
+
return True
|
38 |
+
|
39 |
+
|
40 |
+
# 把文字转换成 16 进制
|
41 |
+
def text_to_hex(text):
|
42 |
+
return ''.join(format(byte, '02x') for byte in text.encode('utf-8'))
|
43 |
+
|
44 |
+
|
45 |
+
# 使用sha256算法计算哈希
|
46 |
+
def sha256(input_string):
|
47 |
+
sha256 = hashlib.sha256()
|
48 |
+
sha256.update(input_string.encode('utf-8'))
|
49 |
+
return sha256.hexdigest()
|
50 |
+
|
51 |
+
|
52 |
+
# 使用 Ethscriptions API(主网)检查某个铭文是否已题写
|
53 |
+
def check_content_exists(sha):
|
54 |
+
# 定义请求的网址
|
55 |
+
endpoint = f"/ethscriptions/exists/{sha}"
|
56 |
+
response = requests.get('https://mainnet-api.ethscriptions.com/api' + endpoint)
|
57 |
+
# 如果返回状态码是200,说明请求成功,然后返回结果(Ture or False)
|
58 |
+
if response.status_code == 200:
|
59 |
+
return response.json()['result']
|
60 |
+
|
61 |
+
|
62 |
+
# 发送自己到自己 0ETH 的交易
|
63 |
+
def send_transaction(w3, account_address, private_key, chain_id, gas_price, input_data, current_nonce):
|
64 |
+
|
65 |
+
# 设置交易的相关信息
|
66 |
+
tx = {
|
67 |
+
'chainId': chain_id, # 网络 ID
|
68 |
+
'gas': 25000, # 如果交易 gas 过低,可适当调高
|
69 |
+
'gasPrice': gas_price, # gas 的价格
|
70 |
+
'nonce': current_nonce,
|
71 |
+
'to': account_address, # 接收地址为自己
|
72 |
+
'value': 0, # 金额为 0ETH
|
73 |
+
'data': text_to_hex(input_data), # 铭文内容
|
74 |
+
}
|
75 |
+
|
76 |
+
# 用私钥签名这个交易
|
77 |
+
signed_tx = w3.eth.account.sign_transaction(tx, private_key)
|
78 |
+
# 发送签名后的交易并获取交易哈希
|
79 |
+
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
|
80 |
+
# 打印结果信息
|
81 |
+
st.toast(f'{input_data}', icon='✅')
|
82 |
+
# 返回铭文还有交易哈希
|
83 |
+
return input_data, tx_hash.hex()
|
84 |
+
|
85 |
+
|
86 |
+
# 网页前端显示
|
87 |
+
st.set_page_config(page_title="EthPen - 批量题写代币铭文", page_icon="🪙", layout='centered', initial_sidebar_state='auto')
|
88 |
+
|
89 |
+
# 网页标题
|
90 |
+
st.subheader(r'🪙 :rainbow[EthPen - 代币铭文批量题写]', anchor=False, divider='rainbow')
|
91 |
+
|
92 |
+
# 提醒
|
93 |
+
st.markdown('### 在开始使用前,请仔细阅读相关说明,并在确认无误后打上 ✅。感谢您的理解与配合。')
|
94 |
+
|
95 |
+
open_source = st.checkbox('我们已将网站代码完全开源。您可以访问并仔细阅读此页面的源码:[3_🪙_ 批量题写代币铭文.py](https://huggingface.co/spaces/Ethscriptions/eths/tree/main/pages)',)
|
96 |
+
|
97 |
+
ask_ai = st.checkbox('如果你对此代码存有疑虑,建议你利用如 [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 平台进行问询,这可以帮助你判断代码是否含有恶意内容。',)
|
98 |
+
|
99 |
+
huggingface = st.checkbox('复制我们的代码,你同样可以在 [HuggingFace](https://HuggingFace.co) 上搭建专属于你的域名铭文批量题写工具。',)
|
100 |
+
|
101 |
+
site = st.checkbox('请务必确保你正在访问的是 **[EthPen.com](https://ethpen.com)** 网站。我们保证站内代码不包含窃取私钥或其他恶意行为,你可以安心使用。',)
|
102 |
+
|
103 |
+
use = st.checkbox('在使用过程中,请按照提示准确地填写信息,这样可以确保程序的顺畅运行。',)
|
104 |
+
|
105 |
+
wallet = st.checkbox('为了安全起见,我们建议您使用备用账号(小号)并确保账号中不存放大额资金。',)
|
106 |
+
|
107 |
+
test = st.checkbox('首次使用时,我们建议您先在测试网络中操作。确认一切无误后,再切换至主网络使用。',)
|
108 |
+
|
109 |
+
feedback = st.checkbox('若您在使用过程中遇到问题,请及时向我们反馈。我们明白程序可能存在不完善之处,并且我们的能力也有限。真心希望得到各位程序员大佬的指导和交流。',)
|
110 |
+
|
111 |
+
if open_source and ask_ai and huggingface and site and use and wallet and test and feedback:
|
112 |
+
approved_use = True
|
113 |
+
else:
|
114 |
+
approved_use = False
|
115 |
+
|
116 |
+
if approved_use:
|
117 |
+
|
118 |
+
st.markdown('## 批量题写代币铭文')
|
119 |
+
|
120 |
+
# 连接的网络 ID。比如说,1 代表 Mainnet,5 代表 Goerli 测试网络,11155111 代表 Sepolia 测试网络,如果你不放心,可以先用测试网试试。
|
121 |
+
net_options = {
|
122 |
+
'1': 'Mainnet',
|
123 |
+
'5': 'Goerli',
|
124 |
+
'11155111': 'Sepolia'
|
125 |
+
}
|
126 |
+
selected_option = st.selectbox(
|
127 |
+
'**网络 ID**',
|
128 |
+
list(net_options.keys()),
|
129 |
+
format_func=lambda x: f"{x} ({net_options[x]})"
|
130 |
+
)
|
131 |
+
chain_id = int(selected_option)
|
132 |
+
|
133 |
+
# 这里配置 Ethereum PRC URL,如果你没有,请到 infura.io 或者 alchemy.com 申请一个免费的 API
|
134 |
+
token_eth_prc_url = st.text_input(
|
135 |
+
f'**Ethereum PRC 链接**:选填,你可以去 [infura.io](https://app.infura.io/) 或者 [alchemy.com](https://alchemy.com/) 免费申请一个',
|
136 |
+
f'https://{net_options[str(chain_id)]}.infura.io/v3/eab7f935b9af45e1a54f7d7ed06c5206')
|
137 |
+
w3 = Web3(Web3.HTTPProvider(f'{token_eth_prc_url}'))
|
138 |
+
|
139 |
+
# 初始化当前账户索引为 0
|
140 |
+
current_account_index = 0
|
141 |
+
# 收集和显示所有交易的结果
|
142 |
+
transaction_results = []
|
143 |
+
# 创建账户列表
|
144 |
+
accounts = []
|
145 |
+
# 使用字典来跟踪每个地址的nonce
|
146 |
+
nonces = {}
|
147 |
+
|
148 |
+
# 启用多账户操作
|
149 |
+
multipl_accounts = st.toggle('启用**多账户**操作')
|
150 |
+
if multipl_accounts:
|
151 |
+
# 多账户的文本框
|
152 |
+
account_list = st.text_area(f'输入多个 **ETH 地址及其对应的私钥**,用英文逗号分隔(,),如下:地址,私钥')
|
153 |
+
if account_list: # 如果账户列表有内容
|
154 |
+
for line in account_list.split('\n'): # 根据换行符划分账户
|
155 |
+
if ',' in line: # 检查是否包含逗号
|
156 |
+
address, key = line.split(',') # 分开地址和私钥
|
157 |
+
if is_valid_eth_address(address) and is_valid_eth_private_key(key): # 验证地址和私钥
|
158 |
+
current_nonce = w3.eth.get_transaction_count(address) # 获取地址的 nonce
|
159 |
+
nonces[address] = current_nonce # 记录地址的 nonce
|
160 |
+
accounts.append((address.strip(), key.strip())) # 保存地址和私钥还有 nonce
|
161 |
+
else:
|
162 |
+
st.error(f"地址 {address} 或私钥 {key} 无效,请检查!")
|
163 |
+
st.stop()
|
164 |
+
else:
|
165 |
+
st.error(f"输入格式错误,请确保每行包含一个地址和一个私钥,并使用英文逗号分隔(,)。错误行:**{line}**")
|
166 |
+
st.stop()
|
167 |
+
else:
|
168 |
+
account_address = st.text_input('填写你的 **ETH 地址**:')
|
169 |
+
private_key = st.text_input('填写你的 **ETH 地址对应的私钥**:', type="password")
|
170 |
+
if account_address and private_key: # 如果地址和私钥有内容
|
171 |
+
if is_valid_eth_address(account_address) and is_valid_eth_private_key(private_key): # 验证地址和私钥
|
172 |
+
current_nonce = w3.eth.get_transaction_count(account_address) # 获取地址的 nonce
|
173 |
+
nonces[account_address] = current_nonce # 记录地址的 nonce
|
174 |
+
accounts.append((account_address.strip(), private_key.strip())) # 保存地址和私钥还有 nonce
|
175 |
+
else:
|
176 |
+
st.error("地址或私钥无效,请检查!")
|
177 |
+
st.stop()
|
178 |
+
|
179 |
+
# 配置铭文文本
|
180 |
+
token_protocol = st.text_input('填写需要题写代币铭文协议 **Protocol(p)**:', 'erc-20')
|
181 |
+
token_operation = st.text_input('填写需要题写代币铭文操作 **Operation(op)**:', 'mint')
|
182 |
+
token_ticker = st.text_input('填写需要题写代币铭文简称 **Ticker(tick)**:')
|
183 |
+
token_min_id = st.number_input('填写需要题写代币铭文范围的**最小 ID(id)**:', min_value=1, value=1, step=1)
|
184 |
+
token_max_id = st.number_input('填写需要题写代币铭文范围的**最大 ID(id)**:', value=21000, step=1)
|
185 |
+
token_amount = st.number_input('填写需要题写代币铭文数量 **Amount(amt)**:', min_value=1, value=1000, step=1)
|
186 |
+
st.markdown('###### 预览代币铭文:')
|
187 |
+
st.code(
|
188 |
+
f'data:,{{"p":"{token_protocol}","op":"{token_operation}","tick":"{token_ticker}","id":"{token_min_id}","amt":"{token_amount}"}}',
|
189 |
+
language="json", line_numbers=False)
|
190 |
+
# 判断铭文文本里是否包含空格、换行符,而且所有的字母都必须为小写。
|
191 |
+
if not validate_input(
|
192 |
+
f'data:,{{"p":"{token_protocol}","op":"{token_operation}","tick":"{token_ticker}","id":"{token_min_id}","amt":"{token_amount}"}}'):
|
193 |
+
st.warning("**请注意**:通常代币铭文文本里不能包含空格、换行符,而且所有的字母都必须为小写。")
|
194 |
+
|
195 |
+
token_check = st.toggle('题写前**检查是否被题写** `主网` `查重`')
|
196 |
+
# 题写铭文之前检查该铭文有没有被题写
|
197 |
+
if token_check:
|
198 |
+
token_check = True
|
199 |
+
else:
|
200 |
+
token_check = False
|
201 |
+
sleep_3s = st.toggle('每次完成交易后暂停 3 秒')
|
202 |
+
# 每次交易成功后暂停 3 秒
|
203 |
+
if sleep_3s:
|
204 |
+
sleep_3s = True
|
205 |
+
else:
|
206 |
+
sleep_3s = False
|
207 |
+
|
208 |
+
# 点击发送交易开始
|
209 |
+
if st.button(f'开始**发送交易**'):
|
210 |
+
if not accounts or not token_protocol or not token_operation or not token_ticker: # 检查是否留空
|
211 |
+
st.error(f'请正确谨慎地填写内容,每一项都**不应留空**。')
|
212 |
+
st.stop()
|
213 |
+
else:
|
214 |
+
st.toast('看起来你输入的内容均无没有问题!', icon='🥳')
|
215 |
+
|
216 |
+
st.toast(f'开始任务,需要题写的铭文总量为:{token_max_id - token_min_id + 1}', icon='😎')
|
217 |
+
|
218 |
+
# 对代币铭文 id 进行循环
|
219 |
+
for the_id in range(token_min_id, token_max_id + 1):
|
220 |
+
# 使用当前账户发送交易,获取当前账户的 nonce
|
221 |
+
address, key = accounts[current_account_index]
|
222 |
+
# 得到完整的铭文文本
|
223 |
+
input_data = f'data:,{{"p":"{token_protocol}","op":"{token_operation}","tick":"{token_ticker}","id":"{the_id}","amt":"{token_amount}"}}'
|
224 |
+
# 获取 gas
|
225 |
+
gas_price = w3.eth.gas_price
|
226 |
+
# 根据是否检查的开关进行
|
227 |
+
if token_check:
|
228 |
+
# 这里是开了检查后请求 Ethscriptions API
|
229 |
+
if check_content_exists(sha256(input_data)):
|
230 |
+
# 返回数据为 Ture,说明该铭文已经被题写,打印信息
|
231 |
+
st.toast(f'{input_data} 已经被题写!', icon='☹️')
|
232 |
+
else:
|
233 |
+
# 返回数据为 False,说明该铭文还没被题写,发送交易
|
234 |
+
# 使用 current_nonce 发送交易
|
235 |
+
data, tx_hash = send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
|
236 |
+
# 记录最后输出的结果
|
237 |
+
transaction_results.append(f"{address} | {data} | Transaction Hash: {tx_hash}")
|
238 |
+
# 交易成功后,手动增加 nonce 值
|
239 |
+
nonces[address] += 1
|
240 |
+
else:
|
241 |
+
# 这里是未开检查后直接发送交易
|
242 |
+
# 使用 current_nonce 发送交易
|
243 |
+
data, tx_hash = send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
|
244 |
+
# 记录最后输出的结果
|
245 |
+
transaction_results.append(f"{address} | {data} | Transaction Hash: {tx_hash}")
|
246 |
+
# 交易成功后,手动增加 nonce 值
|
247 |
+
nonces[address] += 1
|
248 |
+
# 更新当前账户索引,确保索引始终在账户列表的范围内
|
249 |
+
current_account_index = (current_account_index + 1) % len(accounts)
|
250 |
+
# 暂停 3 秒
|
251 |
+
if sleep_3s:
|
252 |
+
time.sleep(3) # 暂停三秒
|
253 |
+
st.toast(f'所有任务已经完成。', icon='🎉')
|
254 |
+
# 庆祝动画
|
255 |
+
st.balloons()
|
256 |
+
# 显示所有交易的结果
|
257 |
+
st.code('\n'.join(transaction_results))
|
258 |
+
else:
|
259 |
+
st.error('# 阅读并打勾 ✅ 后方可使用。')
|
data/name_set.db
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:7c6df1a5d9ca13bfbbf154928baf0602f1103010dcbfb6601d3c511eff1fece7
|
3 |
+
size 2383872
|
data/push_messages.db
ADDED
Binary file (8.19 kB). View file
|
|
data/python_name_code.py
ADDED
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# EthPen.com
|
2 |
+
# 最后更新日期:2023 年 8 月 18 日
|
3 |
+
|
4 |
+
# 在开始使用前,请仔细阅读相关说明。感谢您的理解与配合。
|
5 |
+
# 我们已将网站代码完全开源。您可以访问并仔细阅读此页面的源码:[2_🆔_批量题写域名铭文.py](https://huggingface.co/spaces/Ethscriptions/eths/tree/main/pages)
|
6 |
+
# 如果你对此代码存有疑虑,建议你利用如 [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 平台进行问询,这可以帮助你判断代码是否含有恶意内容。
|
7 |
+
# 复制我们的代码,你同样可以在 [HuggingFace](https://HuggingFace.co) 上搭建专属于你的域名铭文批量题写工具。
|
8 |
+
# 请务必确保你正在访问的是 [EthPen.com](https://ethpen.com) 网站。我们保证站内代码不包含窃取私钥或其他恶意行为,你可以安心使用。
|
9 |
+
# 在使用过程中,请按照提示准确地填写信息,这样可以确保程序的顺畅运行。
|
10 |
+
# 为了安全起见,我们建议您使用备用账号(小号)并确保账号中不存放大额资金。
|
11 |
+
# 首次使用时,我们建议您先在测试网络中操作。确认一切无误后,再切换至主网络使用。
|
12 |
+
# 若您在使用过程中遇到问题,请及时向我们反馈。我们明白程序可能存在不完善之处,并且我们的能力也有限。真心希望得到各位程序员大佬的指导和交流。
|
13 |
+
|
14 |
+
# 导入运行代码所需要的库
|
15 |
+
from web3 import Web3 # 与以太坊交互的库,安装的命令是 pip install web3
|
16 |
+
import hashlib # 用于数据哈希,安装的命令是 pip install hashlib
|
17 |
+
import requests # 用于发送网络请求,安装的命令是 pip install requests
|
18 |
+
import re # 用于正则表达式
|
19 |
+
import time # 用于时间相关
|
20 |
+
|
21 |
+
# ---------- 以下是基础配置 ----------
|
22 |
+
|
23 |
+
# 填写你的多个 ETH 地址及私钥,建议填写新建的钱包,用英文逗号分隔(,),如下:地址,私钥。
|
24 |
+
accounts_str = '''
|
25 |
+
账户1,私钥1
|
26 |
+
账户2,私钥2
|
27 |
+
账户3,私钥3
|
28 |
+
'''
|
29 |
+
|
30 |
+
# 需要题写的铭文内容,在三个单引号内输入多个域名铭文,可以用空格、换行符、英文逗号(,)分开,不要带 data:, 开头
|
31 |
+
# 不要带 data:, 开头
|
32 |
+
# 不要带 data:, 开头
|
33 |
+
ethscription = '''
|
34 |
+
123
|
35 |
+
abcedfg
|
36 |
+
xyz 987
|
37 |
+
哈哈哈 你好
|
38 |
+
👋 😊
|
39 |
+
ethpen.com
|
40 |
+
'''
|
41 |
+
# 你希望添加的后缀
|
42 |
+
suffix = '.eths'
|
43 |
+
# 以空格、换行符、英文逗号分隔文本,并加上后缀
|
44 |
+
ethscription_list = [item.strip() + suffix for item in re.split(r'[\s,]+', ethscription) if item]
|
45 |
+
|
46 |
+
# 决定是否在题写铭文之前检查该铭文有没有被题写过,如果需要检查就填写 Ture 如果不需要就填 False
|
47 |
+
check = False
|
48 |
+
|
49 |
+
# 每次交易成功后暂停 N 秒,0 为不暂停
|
50 |
+
sleep_sec = 0
|
51 |
+
|
52 |
+
# 这里配置 Ethereum PRC URL,如果你没有,请到 infura.io 或者 alchemy.com 申请一个免费的 API
|
53 |
+
w3 = Web3(Web3.HTTPProvider('https://sepolia.infura.io/v3/eab7f935b9af45e1a54f7d7ed06c5206'))
|
54 |
+
|
55 |
+
# 连接的网络 ID。比如说,1 代表 Mainnet,5 代表 Goerli 测试网络,11155111 代表 Sepolia 测试网络,如果你不放心,可以先用测试网试试。
|
56 |
+
chain_id = 11155111
|
57 |
+
|
58 |
+
# ---------- 以上是基础配置 ----------
|
59 |
+
|
60 |
+
|
61 |
+
# 检查 ETH 地址是否有效
|
62 |
+
def is_valid_eth_address(address):
|
63 |
+
if re.match("^0x[0-9a-fA-F]{40}$", address):
|
64 |
+
return True
|
65 |
+
return False
|
66 |
+
|
67 |
+
|
68 |
+
# 检查 Ethereum 私钥是否有效
|
69 |
+
def is_valid_eth_private_key(private_key):
|
70 |
+
if re.match("^[0-9a-fA-F]{64}$", private_key):
|
71 |
+
return True
|
72 |
+
return False
|
73 |
+
|
74 |
+
|
75 |
+
# 验证输入的铭文文本是否含有空格和换行符,而且字母全部为小写
|
76 |
+
def validate_input(data_str):
|
77 |
+
if re.search(r'[A-Z\s\n]', data_str): # 查找大写字母、空格或换行符
|
78 |
+
return False
|
79 |
+
return True
|
80 |
+
|
81 |
+
|
82 |
+
# 把文字转换成 16 进制
|
83 |
+
def text_to_hex(text):
|
84 |
+
return ''.join(format(ord(char), '02x') for char in text)
|
85 |
+
|
86 |
+
|
87 |
+
# 使用sha256算法计算哈希
|
88 |
+
def sha256(input_string):
|
89 |
+
sha256 = hashlib.sha256()
|
90 |
+
sha256.update(input_string.encode('utf-8'))
|
91 |
+
return sha256.hexdigest()
|
92 |
+
|
93 |
+
|
94 |
+
# 使用 Ethscriptions API(主网)检查某个铭文是否已存在
|
95 |
+
def check_content_exists(sha):
|
96 |
+
# 定义请求的网址
|
97 |
+
endpoint = f"/ethscriptions/exists/{sha}"
|
98 |
+
response = requests.get('https://mainnet-api.ethscriptions.com/api' + endpoint)
|
99 |
+
# 如果返回状态码是200,说明请求成功,然后返回结果(Ture or False)
|
100 |
+
if response.status_code == 200:
|
101 |
+
return response.json()['result']
|
102 |
+
|
103 |
+
|
104 |
+
# 发送自己到自己 0ETH 的交易
|
105 |
+
def send_transaction(w3, account_address, private_key, chain_id, gas_price, input_data, current_nonce):
|
106 |
+
|
107 |
+
# 设置交易的相关信息
|
108 |
+
tx = {
|
109 |
+
'chainId': chain_id, # 网络 ID
|
110 |
+
'gas': 25000, # 如果交易 gas 过低,可适当调高
|
111 |
+
'gasPrice': gas_price, # gas 的价格
|
112 |
+
'nonce': current_nonce, # 账户的交易数
|
113 |
+
'to': account_address, # 接收地址为自己
|
114 |
+
'value': 0, # 金额为 0ETH
|
115 |
+
'data': text_to_hex(input_data), # 铭文内容
|
116 |
+
}
|
117 |
+
|
118 |
+
# 用私钥签名这个交易
|
119 |
+
signed_tx = w3.eth.account.sign_transaction(tx, private_key)
|
120 |
+
# 发送签名后的交易并获取交易哈希
|
121 |
+
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
|
122 |
+
# 打印结果信息
|
123 |
+
print(f'{account_address} | {input_data} | Transaction Hash: {tx_hash.hex()}')
|
124 |
+
|
125 |
+
|
126 |
+
# 初始化当前账户索引为 0
|
127 |
+
current_account_index = 0
|
128 |
+
# 创建账户列表
|
129 |
+
accounts = []
|
130 |
+
# 使用字典来跟踪每个地址的nonce
|
131 |
+
nonces = {}
|
132 |
+
|
133 |
+
|
134 |
+
if accounts_str: # 如果账户列表有内容
|
135 |
+
for line in accounts_str.strip().split('\n'): # 先去掉首尾的空白,然后根据换行符划分账户
|
136 |
+
if ',' in line: # 检查是否包含逗号
|
137 |
+
address, key = line.split(',') # 分开地址和私钥
|
138 |
+
if is_valid_eth_address(address) and is_valid_eth_private_key(key): # 验证地址和私钥
|
139 |
+
current_nonce = w3.eth.get_transaction_count(address) # 获取地址的 nonce
|
140 |
+
nonces[address] = current_nonce # 记录地址的 nonce
|
141 |
+
accounts.append((address.strip(), key.strip())) # 保存地址和私钥还有 nonce
|
142 |
+
else:
|
143 |
+
print(f"地址 {address} 或私钥 {key} 无效,请检查!")
|
144 |
+
exit()
|
145 |
+
else:
|
146 |
+
print(f"输入格式错误,请确保每行包含一个地址和一个私钥,并使用英文逗号分隔(,)。错误行:**{line}**")
|
147 |
+
exit()
|
148 |
+
|
149 |
+
# 判断铭文文本里是否包含空格、换行符,而且所有的字母都必须为小写。
|
150 |
+
if not validate_input(ethscription):
|
151 |
+
print("请注意:通常代币铭文文本里不能包含空格、换行符,而且所有的字母都必须为小写。")
|
152 |
+
|
153 |
+
# 检查是否留空
|
154 |
+
if not accounts or not ethscription:
|
155 |
+
print('请正确谨慎地填写内容,每一项都不应留空。')
|
156 |
+
exit()
|
157 |
+
else:
|
158 |
+
print('看起来你输入的内容均无没有问题!')
|
159 |
+
|
160 |
+
# 认真检查铭文内容,如果发现错误,输入 1 结束
|
161 |
+
for i in ethscription_list:
|
162 |
+
print(f'\033[44m{i}\033[m')
|
163 |
+
if input('请预览铭文,输入任意内容继续,输入 1 退出程序:') == '1':
|
164 |
+
exit()
|
165 |
+
print(f'开始任务,需要题写的铭文总量为:{len(ethscription_list)}')
|
166 |
+
|
167 |
+
# 对代币铭文 id 进行循环
|
168 |
+
for name_str in ethscription_list:
|
169 |
+
# 使用当前账户发送交易
|
170 |
+
address, key = accounts[current_account_index]
|
171 |
+
# 得到完整的铭文文本
|
172 |
+
if not name_str.startswith('data:,'):
|
173 |
+
input_data = f'data:,{name_str}'
|
174 |
+
else:
|
175 |
+
input_data = name_str
|
176 |
+
# 获取 gas
|
177 |
+
gas_price = w3.eth.gas_price
|
178 |
+
# 根据是否检查的开关进行
|
179 |
+
if check:
|
180 |
+
# 这里是开了检查后请求 Ethscriptions API
|
181 |
+
if check_content_exists(sha256(input_data)):
|
182 |
+
# 返回数据为 Ture,说明该铭文已经被题写,打印信息
|
183 |
+
print(f'{input_data} 已经被题写!')
|
184 |
+
else:
|
185 |
+
# 返回数据为 False,说明该铭文还没被题写,发送交易
|
186 |
+
# 使用 current_nonce 发送交易
|
187 |
+
send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
|
188 |
+
# 交易成功后,手动增加 nonce 值
|
189 |
+
nonces[address] += 1
|
190 |
+
else:
|
191 |
+
# 这里是未开检查后直接发送交易
|
192 |
+
# 使用 current_nonce 发送交易
|
193 |
+
send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
|
194 |
+
# 交易成功后,手动增加 nonce 值
|
195 |
+
nonces[address] += 1
|
196 |
+
# 更新当前账户索引,确保索引始终在账户列表的范围内
|
197 |
+
current_account_index = (current_account_index + 1) % len(accounts)
|
198 |
+
# 暂停 sleep_sec 秒
|
199 |
+
time.sleep(sleep_sec)
|
200 |
+
|
201 |
+
print(f'所有任务已经完成。')
|
data/python_token_code.py
ADDED
@@ -0,0 +1,189 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# EthPen.com
|
2 |
+
# 最后更新日期:2023 年 8 月 18 日
|
3 |
+
|
4 |
+
# 在开始使用前,请仔细阅读相关说明。感谢您的理解与配合。
|
5 |
+
# 我们已将网站代码完全开源。您可以访问并仔细阅读此页面的源码:[3_🪙_ 批量题写代币铭文.py](https://huggingface.co/spaces/Ethscriptions/eths/tree/main/pages)
|
6 |
+
# 如果你对此代码存有疑虑,建议你利用如 [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 平台进行问询,这可以帮助你判断代码是否含有恶意内容。
|
7 |
+
# 复制我们的代码,你同样可以在 [HuggingFace](https://HuggingFace.co) 上搭建专属于你的域名铭文批量题写工具。
|
8 |
+
# 请务必确保你正在访问的是 [EthPen.com](https://ethpen.com) 网站。我们保证站内代码不包含窃取私钥或其他恶意行为,你可以安心使用。
|
9 |
+
# 在使用过程中,请按照提示准确地填写信息,这样可以确保程序的顺畅运行。
|
10 |
+
# 为了安全起见,我们建议您使用备用账号(小号)并确保账号中不存放大额资金。
|
11 |
+
# 首次使用时,我们建议您先在测试网络中操作。确认一切无误后,再切换至主网络使用。
|
12 |
+
# 若您在使用过程中遇到问题,请及时向我们反馈。我们明白程序可能存在不完善之处,并且我们的能力也有限。真心希望得到各位程序员大佬的指导和交流。
|
13 |
+
|
14 |
+
|
15 |
+
# 导入运行代码所需要的库
|
16 |
+
from web3 import Web3 # 与以太坊交互的库,安装的命令是 pip install web3
|
17 |
+
import hashlib # 用于数据哈希,安装的命令是 pip install hashlib
|
18 |
+
import requests # 用于发送网络请求,安装的命令是 pip install requests
|
19 |
+
import re # 用于正则表达式
|
20 |
+
import time # 用于时间相关
|
21 |
+
|
22 |
+
# ---------- 以下是基础配置 ----------
|
23 |
+
|
24 |
+
# 填写你的多个 ETH 地址及私钥,建议填写新建的钱包,用英文逗号分隔(,),如下:地址,私钥。
|
25 |
+
accounts_str = '''
|
26 |
+
账户1,私钥1
|
27 |
+
账户2,私钥2
|
28 |
+
账户3,私钥3
|
29 |
+
'''
|
30 |
+
|
31 |
+
# 需要题写的代币铭文内容,变动的部分文本如 id 请用 "@#" 代替,例如:'data:,{"p":"erc-20","op":"mint","tick":"eths","id":"@#","amt":"1000"}'
|
32 |
+
ethscription = 'data:,{"p":"erc-20","op":"mint","tick":"eths","id":"@#","amt":"1000"}'
|
33 |
+
|
34 |
+
# 设置代币铭文 id 的起始和结束范围
|
35 |
+
min_id = 100 # 开始的整数
|
36 |
+
max_id = 888 # 结束的整数
|
37 |
+
|
38 |
+
# 决定是否在题写铭文之前检查该铭文有没有被题写过,如果需要检查就填写 Ture 如果不需要就填 False
|
39 |
+
check = False
|
40 |
+
|
41 |
+
# 每次交易成功后暂停 N 秒,0 为不暂停
|
42 |
+
sleep_sec = 0
|
43 |
+
|
44 |
+
# 这里配置 Ethereum PRC URL,如果你没有,请到 infura.io 或者 alchemy.com 申请一个免费的 API
|
45 |
+
w3 = Web3(Web3.HTTPProvider('https://sepolia.infura.io/v3/eab7f935b9af45e1a54f7d7ed06c5206'))
|
46 |
+
|
47 |
+
# 连接的网络 ID。比如说,1 代表 Mainnet,5 代表 Goerli 测试网络,11155111 代表 Sepolia 测试网络,如果你不放心,可以先用测试网试试。
|
48 |
+
chain_id = 11155111
|
49 |
+
|
50 |
+
# ---------- 以上是基础配置 ----------
|
51 |
+
|
52 |
+
|
53 |
+
# 检查 ETH 地址是否有效
|
54 |
+
def is_valid_eth_address(address):
|
55 |
+
if re.match("^0x[0-9a-fA-F]{40}$", address):
|
56 |
+
return True
|
57 |
+
return False
|
58 |
+
|
59 |
+
|
60 |
+
# 检查 Ethereum 私钥是否有效
|
61 |
+
def is_valid_eth_private_key(private_key):
|
62 |
+
if re.match("^[0-9a-fA-F]{64}$", private_key):
|
63 |
+
return True
|
64 |
+
return False
|
65 |
+
|
66 |
+
|
67 |
+
# 验证输入的铭文文本是否含有空格和换行符,而且字母全部为小写
|
68 |
+
def validate_input(data_str):
|
69 |
+
if re.search(r'[A-Z\s\n]', data_str): # 查找大写字母、空格或换行符
|
70 |
+
return False
|
71 |
+
return True
|
72 |
+
|
73 |
+
|
74 |
+
# 把文字转换成 16 进制
|
75 |
+
def text_to_hex(text):
|
76 |
+
return ''.join(format(ord(char), '02x') for char in text)
|
77 |
+
|
78 |
+
|
79 |
+
# 使用sha256算法计算哈希
|
80 |
+
def sha256(input_string):
|
81 |
+
sha256 = hashlib.sha256()
|
82 |
+
sha256.update(input_string.encode('utf-8'))
|
83 |
+
return sha256.hexdigest()
|
84 |
+
|
85 |
+
|
86 |
+
# 使用 Ethscriptions API(主网)检查某个铭文是否已题写
|
87 |
+
def check_content_exists(sha):
|
88 |
+
# 定义请求的网址
|
89 |
+
endpoint = f"/ethscriptions/exists/{sha}"
|
90 |
+
response = requests.get('https://mainnet-api.ethscriptions.com/api' + endpoint)
|
91 |
+
# 如果返回状态码是200,说明请求成功,然后返回结果(Ture or False)
|
92 |
+
if response.status_code == 200:
|
93 |
+
return response.json()['result']
|
94 |
+
|
95 |
+
|
96 |
+
# 发送自己到自己 0ETH 的交易
|
97 |
+
def send_transaction(w3, account_address, private_key, chain_id, gas_price, input_data, current_nonce):
|
98 |
+
|
99 |
+
# 设置交易的相关信息
|
100 |
+
tx = {
|
101 |
+
'chainId': chain_id, # 网络 ID
|
102 |
+
'gas': 25000, # 如果交易 gas 过低,可适当调高
|
103 |
+
'gasPrice': gas_price, # gas 的价格
|
104 |
+
'nonce': current_nonce, # 账户的交易数
|
105 |
+
'to': account_address, # 接收地址为自己
|
106 |
+
'value': 0, # 金额为 0ETH
|
107 |
+
'data': text_to_hex(input_data), # 铭文内容
|
108 |
+
}
|
109 |
+
|
110 |
+
# 用私钥签名这个交易
|
111 |
+
signed_tx = w3.eth.account.sign_transaction(tx, private_key)
|
112 |
+
# 发送签名后的交易并获取交易哈希
|
113 |
+
tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
|
114 |
+
# 打印结果信息
|
115 |
+
print(f'{account_address} | {input_data} | Transaction Hash: {tx_hash.hex()}')
|
116 |
+
|
117 |
+
|
118 |
+
# 初始化当前账户索引为 0
|
119 |
+
current_account_index = 0
|
120 |
+
# 创建账户列表
|
121 |
+
accounts = []
|
122 |
+
# 使用字典来跟踪每个地址的nonce
|
123 |
+
nonces = {}
|
124 |
+
|
125 |
+
|
126 |
+
if accounts_str: # 如果账户列表有内容
|
127 |
+
for line in accounts_str.strip().split('\n'): # 先去掉首尾的空白,然后根据换行符划分账户
|
128 |
+
if ',' in line: # 检查是否包含逗号
|
129 |
+
address, key = line.split(',') # 分开地址和私钥
|
130 |
+
if is_valid_eth_address(address) and is_valid_eth_private_key(key): # 验证地址和私钥
|
131 |
+
current_nonce = w3.eth.get_transaction_count(address) # 获取地址的 nonce
|
132 |
+
nonces[address] = current_nonce # 记录地址的 nonce
|
133 |
+
accounts.append((address.strip(), key.strip())) # 保存地址和私钥还有 nonce
|
134 |
+
else:
|
135 |
+
print(f"地址 {address} 或私钥 {key} 无效,请检查!")
|
136 |
+
exit()
|
137 |
+
else:
|
138 |
+
print(f"输入格式错误,请确保每行包含一个地址和一个私钥,并使用英文逗号分隔(,)。错误行:**{line}**")
|
139 |
+
exit()
|
140 |
+
|
141 |
+
# 判断铭文文本里是否包含空格、换行符,而且所有的字母都必须为小写。
|
142 |
+
if not validate_input(ethscription):
|
143 |
+
print("请注意:通常代币铭文文本里不能包含空格、换行符,而且所有的字母都必须为小写。")
|
144 |
+
|
145 |
+
# 检查是否留空
|
146 |
+
if not accounts or not ethscription:
|
147 |
+
print('请正确谨慎地填写内容,每一项都不应留空。')
|
148 |
+
exit()
|
149 |
+
else:
|
150 |
+
print('看起来你输入的内容均无没有问题!')
|
151 |
+
|
152 |
+
# 认真检查铭文内容,如果发现错误,输入 1 结束
|
153 |
+
print(f'铭文文本:\033[44m{ethscription}\033[m,题写 id 范围为:{min_id} - {max_id}。')
|
154 |
+
if input('请预览铭文,输入任意内容继续,输入 1 退出程序:') == '1':
|
155 |
+
exit()
|
156 |
+
print(f'开始任务,需要题写的铭文总量为:{max_id - min_id + 1}')
|
157 |
+
|
158 |
+
# 对代币铭文 id 进行循环
|
159 |
+
for the_id in range(min_id, max_id + 1):
|
160 |
+
# 使用当前账户发送交易
|
161 |
+
address, key = accounts[current_account_index]
|
162 |
+
# 得到完整的铭文文本
|
163 |
+
input_data = ethscription.replace('@#', str(the_id))
|
164 |
+
# 获取 gas
|
165 |
+
gas_price = w3.eth.gas_price
|
166 |
+
# 根据是否检查的开关进行
|
167 |
+
if check:
|
168 |
+
# 这里是开了检查后请求 Ethscriptions API
|
169 |
+
if check_content_exists(sha256(input_data)):
|
170 |
+
# 返回数据为 Ture,说明该铭文已经被题写,打印信息
|
171 |
+
print(f'{input_data} 已经被题写!')
|
172 |
+
else:
|
173 |
+
# 返回数据为 False,说明该铭文还没被题写,发送交易
|
174 |
+
# 使用 current_nonce 发送交易
|
175 |
+
send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
|
176 |
+
# 交易成功后,手动增加 nonce 值
|
177 |
+
nonces[address] += 1
|
178 |
+
else:
|
179 |
+
# 这里是未开检查后直接发送交易
|
180 |
+
# 使用 current_nonce 发送交易
|
181 |
+
send_transaction(w3, address, key, chain_id, gas_price, input_data, nonces[address])
|
182 |
+
# 交易成功后,手动增加 nonce 值
|
183 |
+
nonces[address] += 1
|
184 |
+
# 更新当前账户索引,确保索引始终在账户列表的范围内
|
185 |
+
current_account_index = (current_account_index + 1) % len(accounts)
|
186 |
+
# 暂停 sleep_sec 秒
|
187 |
+
time.sleep(sleep_sec)
|
188 |
+
|
189 |
+
print(f'所有任务已经完成。')
|
data/single_contract_abi.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
[{"inputs":[],"name":"CurrencyInvalid","type":"error"},{"inputs":[],"name":"ETHTransferFailed","type":"error"},{"inputs":[],"name":"EmptyOrderCancelList","type":"error"},{"inputs":[],"name":"EthscriptionInvalid","type":"error"},{"inputs":[],"name":"ExpiredSignature","type":"error"},{"inputs":[],"name":"InsufficientConfirmations","type":"error"},{"inputs":[],"name":"MsgValueInvalid","type":"error"},{"inputs":[],"name":"NoncesInvalid","type":"error"},{"inputs":[],"name":"OrderExpired","type":"error"},{"inputs":[],"name":"OrderNonceTooLow","type":"error"},{"inputs":[],"name":"SignatureInvalid","type":"error"},{"inputs":[],"name":"SignerInvalid","type":"error"},{"inputs":[],"name":"TrustedSignatureInvalid","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"newMinNonce","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"CancelAllOrders","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"orderNonces","type":"uint256[]"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"CancelMultipleOrders","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"EthscriptionDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"orderNonce","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"endTime","type":"uint64"}],"name":"EthscriptionOrderExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"EthscriptionWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint96","name":"creatorFeeBps","type":"uint96"}],"name":"NewCreatorFeeBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currencyManager","type":"address"}],"name":"NewCurrencyManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint96","name":"protocolFeeBps","type":"uint96"}],"name":"NewProtocolFeeBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"protocolFeeRecipient","type":"address"}],"name":"NewProtocolFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"trustedVerifier","type":"address"}],"name":"NewTrustedVerifier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"ethscriptions_protocol_TransferEthscriptionForPreviousOwner","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"cancelAllOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"orderNonces","type":"uint256[]"}],"name":"cancelMultipleMakerOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creatorFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyManager","outputs":[{"internalType":"contract ICurrencyManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint16","name":"protocolFeeDiscounted","type":"uint16"},{"internalType":"uint16","name":"creatorFee","type":"uint16"},{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OrderTypes.EthscriptionOrder","name":"order","type":"tuple"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"executeEthscriptionOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"orderNonce","type":"uint256"}],"name":"isUserOrderNonceExecutedOrCancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"protocolFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_protocolFeeBps","type":"uint16"}],"name":"updateProtocolFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedVerifier","type":"address"}],"name":"updateTrustedVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userMinOrderNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"internalType":"uint64","name":"expiration","type":"uint64"},{"internalType":"bytes","name":"trustedSign","type":"bytes"}],"name":"withdrawEthscription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawUnexpectedERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
|
data/single_contract_old_abi.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
[{"inputs":[],"name":"CurrencyInvalid","type":"error"},{"inputs":[],"name":"ETHTransferFailed","type":"error"},{"inputs":[],"name":"EmptyOrderCancelList","type":"error"},{"inputs":[],"name":"EthscriptionInvalid","type":"error"},{"inputs":[],"name":"ExpiredSignature","type":"error"},{"inputs":[],"name":"InsufficientConfirmations","type":"error"},{"inputs":[],"name":"MsgValueInvalid","type":"error"},{"inputs":[],"name":"NoncesInvalid","type":"error"},{"inputs":[],"name":"OrderExpired","type":"error"},{"inputs":[],"name":"OrderNonceTooLow","type":"error"},{"inputs":[],"name":"SignatureInvalid","type":"error"},{"inputs":[],"name":"SignerInvalid","type":"error"},{"inputs":[],"name":"TrustedSignatureInvalid","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"newMinNonce","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"CancelAllOrders","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"orderNonces","type":"uint256[]"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"CancelMultipleOrders","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"EthscriptionDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"orderHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"orderNonce","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"endTime","type":"uint64"}],"name":"EthscriptionOrderExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"EthscriptionWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint96","name":"creatorFeeBps","type":"uint96"}],"name":"NewCreatorFeeBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currencyManager","type":"address"}],"name":"NewCurrencyManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint96","name":"protocolFeeBps","type":"uint96"}],"name":"NewProtocolFeeBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"protocolFeeRecipient","type":"address"}],"name":"NewProtocolFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"trustedVerifier","type":"address"}],"name":"NewTrustedVerifier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"ethscriptions_protocol_TransferEthscriptionForPreviousOwner","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"cancelAllOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"orderNonces","type":"uint256[]"}],"name":"cancelMultipleMakerOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"creatorFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currencyManager","outputs":[{"internalType":"contract ICurrencyManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"currency","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint16","name":"protocolFeeDiscounted","type":"uint16"},{"internalType":"uint16","name":"creatorFee","type":"uint16"},{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OrderTypes.EthscriptionOrder","name":"order","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"executeEthscriptionOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"orderNonce","type":"uint256"}],"name":"isUserOrderNonceExecutedOrCancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"protocolFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_protocolFeeBps","type":"uint16"}],"name":"updateProtocolFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedVerifier","type":"address"}],"name":"updateTrustedVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userMinOrderNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"ethscriptionId","type":"bytes32"},{"internalType":"uint64","name":"expiration","type":"uint64"},{"internalType":"bytes","name":"trustedSign","type":"bytes"}],"name":"withdrawEthscription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawUnexpectedERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
|
data/single_orders.db
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:d44c87eaf5f8e4400fdd6f5848202776b97913da899677c8d372aeae8b5f6f69
|
3 |
+
size 23277568
|