如题,我写了个python脚本想自动化创建代币和验证代币智能合约代码,在脚本post合约代码数据验证bsc智能合约代码时,返回状态码200,但是浏览器查看该合约,并未进行验证。请大佬们帮忙看下怎么回事?
# 发布智能合约到链上并验证合约代码
def DeployContract():
# 1.读取智能合约代码,从智能合约代码中提取solidity版本
# 2.替换合约名称,代币名称,代币数量
# 3.编译智能合约
# 4.部署智能合约到链上
# 5.验证合约代码
# 6.获取部署成功的合约地址
PRIVATE_KEY = 'eewqrewqrewq'
# 1.读取智能合约代码,从智能合约代码中提取solidity版本
with open(f"../AAA_Contract/314_contract.sol", 'r') as f:
src = f.readlines()
print(src, type(src))
Version = '0.8.19'
print(Version)
# 2.替换合约名称,代币名称,代币数量
with open("../AAA_Contract/314_contract.sol", 'r') as f:
contract_code = f.read()
print(contract_code, type(contract_code))
TokenName = "sss314"
TokenSymbol = "sss314"
TokenTotalSupply = "38880000000"
contract_name = "sss_314"
# 正则表达式匹配合约名称
contract_name_pattern = r'(?<=contract )\w+(?= is Context, IERC20, IERC20Metadata, Ownable, IEERC314)'
# 替换合约名称
contract_code = re.sub(contract_name_pattern, contract_name, contract_code)
# 正则表达式匹配 _name, _symbol 和 totalSupply_ 变量的赋值
name_pattern = r'(_name\s*=\s*")[^"]*(";)'
symbol_pattern = r'(_symbol\s*=\s*")[^"]*(";)'
total_supply_pattern = r'(uint256\s+totalSupply_\s*=\s*)\d+'
# 替换变量值
contract_code = re.sub(name_pattern, r'\g<1>' + TokenName + r'\2', contract_code)
contract_code = re.sub(symbol_pattern, r'\g<1>' + TokenSymbol + r'\2', contract_code)
contract_code = re.sub(total_supply_pattern, r'\g<1>' + TokenTotalSupply, contract_code)
print(contract_code, type(contract_code))
# 将修改后的合约代码存储为新文件
with open(f"../AAA_Contract/{TokenName}.sol", 'w', encoding='utf-8') as f:
f.write(contract_code)
# 3.编译智能合约获取bytecode
install_solc(Version) # 选择编译器版本
compiled_sol = compile_standard(
{
"language": "Solidity",
"sources": {f"{TokenName}.sol": {"content": contract_code}},
"settings": {
"outputSelection": {
"*": {"*": ["abi", "metadata", "evm.bytecode", "evm.sourceMap"]}
}
},
},
solc_version=Version,
)
bytecode = compiled_sol["contracts"][f"{TokenName}.sol"][contract_name]["evm"]["bytecode"]["object"]
print(bytecode)
# 获取合约ABI
abi = compiled_sol["contracts"][f"{TokenName}.sol"][contract_name]["abi"]
# 4.部署智能合约
web3.eth.default_account = web3.eth.account.privateKeyToAccount(PRIVATE_KEY).address
DeployContractNow = web3.eth.contract(abi=abi, bytecode=bytecode)
# 构建交易
transaction = DeployContractNow.constructor().build_transaction({
'chainId': 97,
'gas': 5000000,
'gasPrice': web3.to_wei('5', 'gwei'),
'nonce': web3.eth.get_transaction_count(web3.eth.default_account),
})
# 签署交易
signed_txn = web3.eth.account.sign_transaction(transaction, private_key=PRIVATE_KEY)
# 发送交易
tx_hash = web3.eth.send_raw_transaction(signed_txn.rawTransaction)
tx_receipt = web3.eth.wait_for_transaction_receipt(tx_hash)
# 获取已发布合约的地址
contract_address = tx_receipt.contractAddress
print(contract_address)
# 5.验证合约代码
BSCScanApi = 'sdfds'
BSCScanURL = 'https://api-testnet.bscscan.com/api'
data = {
'apikey': BSCScanApi,
'module': 'contract',
'action': 'verifysourcecode',
'contractaddress': contract_address,
'sourceCode': contract_code,
'codeformat': 'solidity-single-file',
'contractname': f"{TokenName}",
'compilerversion': "0.8.19+commit.7dd6d404",
'optimizationUsed': 0,
'runs': 200,
'licenseType': '0',
'evmversion': '',
}
result = requests.post(BSCScanURL, data=data)
print(result.status_code)
贴上bsc官方API的文档和截图
API文档链接:https://docs.bscscan.com/api-endpoints/contracts
/////////////////////////////////////分割线/////////////////////////////////////
尝试部署后,合约可以部署成功,但是验证代码时总是验证不了,返回状态码200: https://testnet.bscscan.com/address/0x80A6F648E3B240F682c67C9904062C544f6B38B1
改下 然后再打印一下 result 的数据看下有没有具体的提示
BSCScanApi = 'sdfds'
BSCScanURL = 'https://api-testnet.bscscan.com/api'
data = {
'contractname': contract_name,
'compilerversion': "v0.8.19+commit.7dd6d404",
'optimizationUsed': '0',
'runs': '200',
}
response = requests.post(BSCScanURL, data=data)
if response.status_code == 200:
result = response.json()
if result['status'] == '1':
print("Verification request successful:", result['result'])
return result['result']
else:
print("Verification request failed:", result['message'], result['result'])
else:
print("HTTP request failed with status code:", response.status_code)
# Deploy and verify the contract
deploy_contract()