如何用Python正确与NFT合约交互完成X2Y2全量授权?
解决X2Y2挂单前的NFT授权问题
首先明确:ERC721的setApprovalForAll函数本身不需要传入你的钱包地址,因为合约会通过以太坊交易的msg.sender自动获取发起授权的账户(也就是你的钱包地址)。你当前的代码只是创建了函数调用对象,但没有签名和发送交易,这是核心问题。
正确的授权步骤(Python示例)
- 先确认X2Y2的ERC721 Delegate合约地址(比如以太坊主网的地址是
0x74312363e45DCaBA76c59ec49a7Aa8A65a67EeD3,请以X2Y2官方文档为准) - 完整的授权代码需要包含交易签名和发送流程,示例如下:
from web3 import Web3 # 初始化Web3连接 w3 = Web3(Web3.HTTPProvider(node_url, request_kwargs={"proxies": proxy})) # 你的钱包信息 private_key = "你的钱包私钥" wallet_address = "你的钱包地址" # NFT合约配置 nft_contract_addr = "0x705B9DBD0D5607BEAFe12E2fB74d64268d3bA35F" nft_abi = 你的NFT合约ABI # X2Y2授权目标合约地址 x2y2_delegate_addr = "X2Y2的ERC721 Delegate合约地址" # 获取NFT合约实例 nft_contract = w3.eth.contract(address=nft_contract_addr, abi=nft_abi) # 构建交易基础参数 nonce = w3.eth.get_transaction_count(wallet_address) gas_price = w3.eth.gas_price gas_limit = 100000 # 授权交易的gas上限,该值足够覆盖操作消耗 # 组装授权交易 tx = nft_contract.functions.setApprovalForAll(x2y2_delegate_addr, True).build_transaction({ "chainId": w3.eth.chain_id, "from": wallet_address, "nonce": nonce, "gasPrice": gas_price, "gas": gas_limit }) # 私钥签名交易 signed_tx = w3.eth.account.sign_transaction(tx, private_key=private_key) # 发送交易到链上 tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) # 等待交易确认 tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) print(f"授权成功,交易哈希: {tx_hash.hex()}")
关键说明
setApprovalForAll的两个参数:第一个是被授权的合约地址(X2Y2的Delegate合约),第二个是授权开关(True表示允许该合约转移你所有的该类NFT)- 你的钱包地址是通过交易签名来确认的,合约执行时
msg.sender就是你的地址,所以函数不需要额外传入你的地址 - 必须完成交易发送并等待链上确认,授权才会生效,之后才能正常使用X2Y2 API创建挂单
内容的提问来源于stack exchange,提问作者对亮星
相关产品推荐
相关产品推荐

