0

みなさん、こんばんは、できるだけ明確にしようと思います。私は web3.py を使用して s**tcoins の価格を取得しようとしていましたが、多くの問題を解決した後、私が尋ねた質問に行き詰まっています。

tokenAddres = '0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82' #Cake
tokenAddres = Web3.toChecksumAddress(tokenAddres)
bnbPrice = calcBNBPrice()
print(f'current BNB price: {bnbPrice}')
priceInBnb = calcSell(1, tokenAddres)
print(f'SHIT_TOKEN VALUE IN BNB : {priceInBnb} | Just convert it to USD ')
print(f'SHIT_TOKEN VALUE IN USD: {priceInBnb * bnbPrice}')

calcsell 関数は、トークンの値を BNB で返す関数でなければなりません

def calcSell(tokenToSell, tokenAddress):
    BNBTokenAddress = Web3.toChecksumAddress("0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c")  # BNB
    amountOut = None

    tokenRouter = web3.eth.contract(address=Web3.toChecksumAddress(tokenAddress), abi=tokenAbi)
    tokenDecimals = tokenRouter.functions.decimals().call()
    tokenToSell = setDecimals(tokenToSell, tokenDecimals) # Set token a correct number of 0s
    
    router = web3.eth.contract(address=Web3.toChecksumAddress(pancakeSwapContract), abi=pancakeSwapAbi)
    amountIn = web3.toWei(tokenToSell, 'ether')
    amountOut = router.functions.getAmountsOut(amountIn, [tokenAddress, BNBTokenAddress]).call()
    amountOut = web3.fromWei(amountOut[1], 'ether')

    return amountOut

私が得る値は次の
とおりです。USD SHIT_TOKEN VALUE IN USD に変換するだけ
です: 340708627.4489159379891912819

正しいものは次のとおりです
。SHIT_TOKEN VALUE IN BNB : 0.048846069961106416 | USD SHIT_TOKEN VALUE IN USD に変換するだけ
です: 16.98585439310707

推測はありますか?ご不明な点がございましたら、お気軽にお問い合わせください。

4

3 に答える 3

0

あなたの質問がより具体的であることを願っています.PancakeSwapを使用して価格を決定しています. しかし、あなたの質問はそれについてまったく言及していません。

とにかく、web3.py を使用して PancakeSwap から価格見積もりを取得する 2 つの方法を知っています。

  1. 彼らの APIを使用します。
import requests

def calcSell(tokenAddress):
    apiURL = "https://api.pancakeswap.info/api/v2/tokens/"
    response = requests.get(url = apiURL + tokenAddress)
    price = extractPriceFromRaw(response)
    return price

def extractPriceFromRaw(response):
    jsonRaw = response.json()
    price = jsonRaw['data']['price']
    return price

CAKE = '0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82'
print(calcSell(KRW))

  1. スマート コントラクトの .getAmountsOut() 関数を直接使用する。あなたがやろうとしていること。
from web3 import Web3

def calcSell(tokenAddress):
    routerContract = web3.eth.contract(address=routerPCS, abi=pancakeSwapAbi)
    oneToken = web3.toWei(1, 'Ether')
    price = routerContract.functions.getAmountsOut(oneToken, [tokenAddress, BUSD]).call()
    normalizedPrice = web3.fromWei(price[1], 'Ether')
    return normalizedPrice

web3 = Web3(Web3.HTTPProvider('https://bsc-dataseed1.binance.org:443'))
routerPCS = '0x10ED43C718714eb63d5aA57B78B54704E256024E'
BUSD = '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56'
CAKE = '0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82'
print(calcSell(CAKE))

私はあなたのコードをデバッグしようとはしませんでしたが、あなたの問題はtokenToSell、単純に 1 Ether に等しくするのではなく、値を拷問する方法にあると思います。tokenToSell = web3.toWei(1, 'Ether')

于 2021-09-19T19:17:02.370 に答える