Web3py与0x API

发布于 2025-02-09 22:46:06 字数 3797 浏览 0 评论 0原文

我一直在尝试使用0x API对Ropsten进行交换以获取最佳报价,但是每次尝试执行交易交易时,交易失败都会失败而没有任何反馈(至少来自Etherscan),而批准性TX则可以通过。 我可能在这里缺少一些东西,但是我盲目地盯着我的代码。

import requests
import json
import time
from web3 import Web3

walletAddress = 'mywalletaddress'
wpk = 'myprivatekey'

# Setup Ropsten provider
w3 = Web3(Web3.HTTPProvider('https://ropsten.infura.io/v3/'))

# Get the nonce to prevent from sending the transaction twice
nonce = w3.eth.getTransactionCount(walletAddress)
print('Nonce:', nonce)

# Store the generic ERC20 abi for later use
ABI = json.load(open('abi.json'))

# ROPSTEN ADDRESSES
WETH = Web3.toChecksumAddress('0xc778417e063141139fce010982780140aa0cd5ab')
DAI = Web3.toChecksumAddress('0xad6d458402f60fd3bd25163575031acdce07538d')
USDC = Web3.toChecksumAddress('0x07865c6e87b9f70255377e024ace6630c1eaa37f')


def calcAmount(initialAmount, contractAddress):
    contract = w3.eth.contract(address=contractAddress, abi=ABI)
    decimals = contract.functions.decimals().call()
    amount = int(initialAmount * 10**decimals)
    return amount
    print(decimals, amount)


def getTokenSymbol(contractAddress):
    contract = w3.eth.contract(address=contractAddress, abi=ABI)
    tokenSymbol = contract.functions.symbol().call()
    return tokenSymbol
    print('Symbol:', tokenSymbol)


# Define query parameters
initialAmount = 100
slippage = '0.01'  # 0.01 = 1% slippage
sellAmount = calcAmount(initialAmount, USDC)
print('Sell:', sellAmount)


def approve(token, spenderAddress, walletAddress, wpk):

    token = Web3.toChecksumAddress(token)

    contract = w3.eth.contract(address=token, abi=ABI)

    spender = Web3.toChecksumAddress(spenderAddress)
    max_amount = Web3.toWei(2**64 - 1, 'ether')
    nonce = w3.eth.getTransactionCount(walletAddress)

    tx = contract.functions.approve(spender, max_amount).buildTransaction({
        'from': walletAddress,
        'nonce': nonce
    })

    signed_tx = w3.eth.account.signTransaction(tx, wpk)
    tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)

    print("Approve", w3.toHex(tx_hash))

    w3.eth.wait_for_transaction_receipt(tx_hash)


def getQuote(buyToken, slippage, sellToken, sellAmount):
    # Make the query https://ropsten.api.0x.org/
    query = 'https://ropsten.api.0x.org/swap/v1/quote?buyToken={}&slippage={}&sellToken={}&sellAmount={}'.format(buyToken, slippage, sellToken, sellAmount)
    # Get the query and store the response in data
    response = requests.get(query)
    data = response.json()
    # Print a prettiefied version of the response (optional)
    print(json.dumps(data, indent=2))
    # Convert the buyAmmount to integer
    buyAmount = int(data['buyAmount'])
    # Convert the buyAmount to a readable number
    finalPrice = calcAmount(buyAmount, buyToken)
    # Get the symbol of the 2 tokens
    buyTokenSymbol = getTokenSymbol(buyToken)
    sellTokenSymbol = getTokenSymbol(sellToken)
    print(sellTokenSymbol, '->', buyTokenSymbol)

    approve(data['sellTokenAddress'], data['allowanceTarget'], walletAddress, wpk)

    tx = {
        "from": walletAddress,
        "to": Web3.toChecksumAddress(data['to']),
        "data": data['data'],
        "value": 0,
        "gas": int(data['gas']),
        "gasPrice": int(data['gasPrice']),
        "nonce": nonce + 1,
        "chainId": data['chainId']
    }

    # sign the transaction
    signed_tx = w3.eth.account.sign_transaction(tx, wpk)
    #
    # send transaction
    tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
    #
    # get transaction hash
    print(w3.toHex(tx_hash))


# Use only for testing the query
getQuote(DAI, slippage, USDC, sellAmount)

如您所见,我正在尝试使用0x API将USDC转换为DAI。

生成的第一个TX已批准

我去过挖掘文档和读取我在Stackoverflow上可以找到的任何东西,没有任何运气。

任何帮助都非常感谢。

I have been trying to perform a swap on Ropsten using the 0x API to get the best quote but every time I try to perform a swap the transaction fails without any feedback(at least from Etherscan) while the approve tx goes through fine.
I am probably missing something here, but I'm getting blind to keep staring at my code.

import requests
import json
import time
from web3 import Web3

walletAddress = 'mywalletaddress'
wpk = 'myprivatekey'

# Setup Ropsten provider
w3 = Web3(Web3.HTTPProvider('https://ropsten.infura.io/v3/'))

# Get the nonce to prevent from sending the transaction twice
nonce = w3.eth.getTransactionCount(walletAddress)
print('Nonce:', nonce)

# Store the generic ERC20 abi for later use
ABI = json.load(open('abi.json'))

# ROPSTEN ADDRESSES
WETH = Web3.toChecksumAddress('0xc778417e063141139fce010982780140aa0cd5ab')
DAI = Web3.toChecksumAddress('0xad6d458402f60fd3bd25163575031acdce07538d')
USDC = Web3.toChecksumAddress('0x07865c6e87b9f70255377e024ace6630c1eaa37f')


def calcAmount(initialAmount, contractAddress):
    contract = w3.eth.contract(address=contractAddress, abi=ABI)
    decimals = contract.functions.decimals().call()
    amount = int(initialAmount * 10**decimals)
    return amount
    print(decimals, amount)


def getTokenSymbol(contractAddress):
    contract = w3.eth.contract(address=contractAddress, abi=ABI)
    tokenSymbol = contract.functions.symbol().call()
    return tokenSymbol
    print('Symbol:', tokenSymbol)


# Define query parameters
initialAmount = 100
slippage = '0.01'  # 0.01 = 1% slippage
sellAmount = calcAmount(initialAmount, USDC)
print('Sell:', sellAmount)


def approve(token, spenderAddress, walletAddress, wpk):

    token = Web3.toChecksumAddress(token)

    contract = w3.eth.contract(address=token, abi=ABI)

    spender = Web3.toChecksumAddress(spenderAddress)
    max_amount = Web3.toWei(2**64 - 1, 'ether')
    nonce = w3.eth.getTransactionCount(walletAddress)

    tx = contract.functions.approve(spender, max_amount).buildTransaction({
        'from': walletAddress,
        'nonce': nonce
    })

    signed_tx = w3.eth.account.signTransaction(tx, wpk)
    tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)

    print("Approve", w3.toHex(tx_hash))

    w3.eth.wait_for_transaction_receipt(tx_hash)


def getQuote(buyToken, slippage, sellToken, sellAmount):
    # Make the query https://ropsten.api.0x.org/
    query = 'https://ropsten.api.0x.org/swap/v1/quote?buyToken={}&slippage={}&sellToken={}&sellAmount={}'.format(buyToken, slippage, sellToken, sellAmount)
    # Get the query and store the response in data
    response = requests.get(query)
    data = response.json()
    # Print a prettiefied version of the response (optional)
    print(json.dumps(data, indent=2))
    # Convert the buyAmmount to integer
    buyAmount = int(data['buyAmount'])
    # Convert the buyAmount to a readable number
    finalPrice = calcAmount(buyAmount, buyToken)
    # Get the symbol of the 2 tokens
    buyTokenSymbol = getTokenSymbol(buyToken)
    sellTokenSymbol = getTokenSymbol(sellToken)
    print(sellTokenSymbol, '->', buyTokenSymbol)

    approve(data['sellTokenAddress'], data['allowanceTarget'], walletAddress, wpk)

    tx = {
        "from": walletAddress,
        "to": Web3.toChecksumAddress(data['to']),
        "data": data['data'],
        "value": 0,
        "gas": int(data['gas']),
        "gasPrice": int(data['gasPrice']),
        "nonce": nonce + 1,
        "chainId": data['chainId']
    }

    # sign the transaction
    signed_tx = w3.eth.account.sign_transaction(tx, wpk)
    #
    # send transaction
    tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction)
    #
    # get transaction hash
    print(w3.toHex(tx_hash))


# Use only for testing the query
getQuote(DAI, slippage, USDC, sellAmount)

As you can see I am trying to swap USDC for DAI using the 0x API.

The first tx generated is approved
Etherscan approval tx

But the actual swap fails without any feedback
Etherscan swap tx

I honestly don't know what to try anymore...I've been digging both documentation and reading anything I could find on Stackoverflow without any luck.

Any help is greatly appreciate.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月下客 2025-02-16 22:46:06

气体限制& TXN的用法:134,523 | 132,823(98.74%)

IM 99,9%确保是因为您的汽油用完了,尝试增加它

Gas Limit & Usage by Txn: 134,523 | 132,823 (98.74%)

Im 99,9% sure it is because ur running out of gas, try to increase it

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文