chatgpt
# -*-coding: utf-8 -*- from web3 import Web3 from Coin_Project.web3py_project.securamoney.my_eth_utils import PayEthOrToken,load_config import json import warnings warnings.filterwarnings("ignore") if __name__ == '__main__': #http://proxysg.huawei.com ''' proxies ={"http":"http://w00355909:password@proxy.huawei.com:8080", "https":"http://w00355909:password@proxy.huawei.com:8080"} ''' min_eth = 0.001 total_index = 20 private_key = '7cbe4f543f383732597e22626a4180179b3deb0a63b08cfb707b90aca71f35a6' random_address = '0xcf3c3a593feb7d09fcc401deda4e008f3936e6cd' staking_address = '0xb34f1ea629D90c6F51dF337eb28E533d399D2948' attach_address = '0x1B69eA08fFaf27893f77e9731FC158c40a903201' network = 'Goerli' config = load_config(network) # 网络 pre = { 'fun_name': 'claimRewards', # 函数名 'abi_name': '', # abi文件名 'contract_address': '', # 合约地址 'rpc': config['rpc'], 'explorer': config['explorer'], 'project_name': 'securamoney' } p = PayEthOrToken(**pre) p.update_account_key(private_key) if __name__ == '__main__': ''' 先获取所需要的key列表 1.获得random 合同对象 2.查询index最大值到1信息 ''' with open("tuple.json", 'r') as f: tuple_abi = f.read() tuple_contract = p.get_contract_abi(p.web3.toChecksumAddress('0x047486453fa504bcdc2a7ca42f33ae1568f1b28b'),tuple_abi) params = ( "0x0a6f760bF754F6837227cdC8EDc044531BEC1ddB", # params.nft "0xde8dC1B14B300D114346ca7EA1bFEc025FE62097", # params.bondingCurve "0x0000000000000000000000000000000000000000", # params.assetRecipient "0x808c399B37Dd2e138132eE840B779a03CDBbe883", # params.receiver 1, # params.poolType 0, # params.delta 0, # params.fee 1000000000000000, # params.spotPrice b'\x00', # params.props b'\x00', # params.state 10000, # params.royaltyNumerator "0x21c5b5717cCFe16F036718795Ba8C5376AFcC44b", # params.royaltyRecipientFallback [3529] # params.initialNFTIDs ) tnx = tuple_contract.functions.createPoolETH(params) print(tnx)
To call the function createPoolETH
using web3py, you can follow these steps:
- Import the necessary modules and connect to a web3 provider.
from web3 import Web3, HTTPProvider w3 = Web3(HTTPProvider('<your_rpc_provider>'))
- Load the contract ABI and set the contract address
abi = <your_contract_abi> contract_address = <your_contract_address> my_contract = w3.eth.contract(address=contract_address, abi=abi)
- Prepare the function parameters as a Python list or tuple
params = [ <params.nft>, <params.bondingCurve>, <params.assetRecipient>, <params.receiver>, <params.poolType>, <params.delta>, <params.fee>, <params.spotPrice>, <params.props>, <params.state>, <params.royaltyNumerator>, <params.royaltyRecipientFallback>, <params.initialNFTIDs> ]
- Call the function with the prepared parameters and include the
from
andvalue
options if required.
tx_hash = my_contract.functions.createPoolETH(*params).transact({'from': <sender_address>, 'value': <value_in_wei>})
- Wait for the transaction to be mined and retrieve the function return values using the transaction hash
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash) pool_address = tx_receipt['contractAddress'] tokenId = my_contract.events.Deposit.createFilter(fromBlock=tx_receipt.blockNumber).get_all_entries()[0]['args']['tokenId']
Note that you will need to substitute <your_rpc_provider>
, <your_contract_abi>
, <your_contract_address>
, <sender_address>
, and <value_in_wei>
with the appropriate values for your specific environment and use case.
以下是使用web3py调用该ABI函数的步骤:
- 导入必要的模块并连接到web3提供者。
from web3 import Web3, HTTPProvider w3 = Web3(HTTPProvider('<your_rpc_provider>'))
- 加载合约ABI并设置合约地址。
abi = <your_contract_abi> contract_address = <your_contract_address> my_contract = w3.eth.contract(address=contract_address, abi=abi)
- 将函数参数准备为Python列表或元组。
params = [ <params.nft>, <params.bondingCurve>, <params.assetRecipient>, <params.receiver>, <params.poolType>, <params.delta>, <params.fee>, <params.spotPrice>, <params.props>, <params.state>, <params.royaltyNumerator>, <params.royaltyRecipientFallback>, <params.initialNFTIDs> ]
- 使用准备好的参数调用函数,并在必要时包括
from
和value
选项。
tx_hash = my_contract.functions.createPoolETH(*params).transact({'from': <sender_address>, 'value': <value_in_wei>})
- 等待交易被挖掘并使用交易哈希检索函数返回值。
tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash) pool_address = tx_receipt['contractAddress'] tokenId = my_contract.events.Deposit.createFilter(fromBlock=tx_receipt.blockNumber).get_all_entries()[0]['args']['tokenId']
请注意,您需要将<your_rpc_provider>
,<your_contract_abi>
,<your_contract_address>
,<sender_address>
和<value_in_wei>
替换为适用于您特定环境和用例的正确值。
在Python中处理包含自定义类型的ABI需要进行一些额外的步骤。具体来说,您需要使用 web3.datastructures.TypedDict
将结构体类与ABI进行映射。
以下是具体的步骤:
- 首先将结构体定义为命名元组或类。在这种情况下,我们可以使用命名元组。例如:
from typing import NamedTuple class CreateETHPoolParams(NamedTuple): nft: str bondingCurve: str assetRecipient: str receiver: str poolType: int delta: int fee: int spotPrice: int props: bytes state: bytes royaltyNumerator: int royaltyRecipientFallback: str initialNFTIDs: List[int]
- 将结构体定义从Python类型映射到web3可识别的ABI类型。例如:
from web3.datastructures import TypedDict create_eth_pool_params_type = TypedDict({ 'nft': 'address', 'bondingCurve': 'address', 'assetRecipient': 'address', 'receiver': 'address', 'poolType': 'uint8', 'delta': 'uint128', 'fee': 'uint24', 'spotPrice': 'uint128', 'props': 'bytes', 'state': 'bytes', 'royaltyNumerator': 'uint24', 'royaltyRecipientFallback': 'address', 'initialNFTIDs': 'uint256[]' })
- 在调用函数时将结构体实例转换为web3可识别的ABI参数。在使用TOTP库等方式获得的回调验证码的场合,您可以将其放置在
props
字段中。例如:def call_create_pool_eth(*args: Any) -> Tuple: create_pool_params = CreateETHPoolParams( nft=args[0], bondingCurve=args[1], assetRecipient=args[2], receiver=args[3], poolType=args[4], delta=args[5], fee=args[6], spotPrice=args[7], props=bytes([int(args[8])]), state=b'', royaltyNumerator=args[9], royaltyRecipientFallback=args[10], initialNFTIDs=args[11] ) params = [ create_pool_params, ] tx_hash = my_contract.functions.createPoolETH(*params).transact({ "from": account.address, "value": value, "nonce": nonce_manager.get_next_nonce() }) tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash) pool_address = tx_receipt["contractAddress"] token_id = my_contract.events.Deposit.createFilter(fromBlock=tx_receipt.blockNumber).get_all_entries()[0]["args"]["tokenId"] return pool_address, token_id
请注意,这里提供的示例假定有一些辅助实用程序来管理以太坊账户、获取正确的交易费用等。因此,您需要将代码适应您的用例和环境。
如果您不想将结构体类与ABI进行映射,您也可以直接将参数按照顺序打包成列表或元组,并将其作为my_contract.functions.createPoolETH
函数的参数传递。
在这种情况下,您可以按照下面的代码进行调用:
params = [<params.nft>, <params.bondingCurve>, <params.assetRecipient>, <params.receiver>, <params.poolType>, <params.delta>, <params.fee>, <params.spotPrice>, <params.props>, <params.state>, <params.royaltyNumerator>, <params.royaltyRecipientFallback>, <params.initialNFTIDs>] tx_hash = my_contract.functions.createPoolETH(*params).transact({'from': <your_sender_address>, 'value': <your_value_in_wei>})
请注意,将参数按照顺序打包并直接传递给合同函数是可行的方法。但是在这种情况下,您需要确保参数的顺序、数量和类型正确,以便合同函数可以正确地解析它们。另外,如果ABI中的结构体定义中发生更改,您需要相应地更新您的代码。
当您使用以下ABI函数时,可以使用以下代码将参数拼接在一起:
params = ( "0x0a6f760bF754F6837227cdC8EDc044531BEC1ddB", # params.nft "0xde8dC1B14B300D114346ca7EA1bFEc025FE62097", # params.bondingCurve "0x0000000000000000000000000000000000000000", # params.assetRecipient "0x808c399B37Dd2e138132eE840B779a03CDBbe883", # params.receiver 1, # params.poolType 0, # params.delta 0, # params.fee 1000000000000000, # params.spotPrice b'\x00', # params.props b'\x00', # params.state 10000, # params.royaltyNumerator "0x21c5b5717cCFe16F036718795Ba8C5376AFcC44b", # params.royaltyRecipientFallback [3529] # params.initialNFTIDs )
请注意,这里第十个和第十一个参数(b'\x00' 和b'\x00')是 bytes 类型,其它的参数类型都是数字或字符串类型。但实际应用中要根据情况来确认每个参数的限制和数据类型,并根据其构建正确的类型和值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix