我正试图通过Sushi交换来编程地使用RouteProcessor智能契约。在这里,您可以看到合同https://etherscan.io/address/0xF70c086618dcf2b1A461311275e00D6B722ef914。我收集了所有参数的信息,但找不到关于如何确定路由参数的任何描述。那么你是如何生成路由的呢?
谢谢你的帮助。
这是我试图运行的代码,用于交换仲裁Nova链中的ETH -> ARB。
from eth_abi import encode
from web3 import Web3
arbitrum_nova_rpc_url = 'https://nova.arbitrum.io/rpc'
wallet_address = '<your address here>'
route_processor_abi = '[{"inputs":[{"internalType":"address","name":"_bentoBox","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"bentoBox","outputs":[{"internalType":"contract IBentoBoxMinimal","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"route","type":"bytes"}],"name":"processRoute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"transferValueTo","type":"address"},{"internalType":"uint256","name":"amountValueTransfer","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"route","type":"bytes"}],"name":"transferValueAndprocessRoute","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]'
route_processor_arbitrum_nova_address = '0xaB235da7f52d35fb4551AfBa11BFB56e18774A65'
# Generate route here
arbitrum_nova_ether_address = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'
arbitrum_nova_weth_address = '0x722E8BdD2ce80A4422E880164f2079488e115365'
arbitrum_nova_arbitrum_address = '0xf823C3cD3CeBE0a1fA952ba88Dc9EEf8e0Bf46AD'
byte_ether_address = encode(['address'], [web3.to_checksum_address(arbitrum_nova_ether_address)])
byte_weth_address = encode(['address'], [web3.to_checksum_address(arbitrum_nova_weth_address)])
byte_arb_address = encode(['address'], [web3.to_checksum_address(arbitrum_nova_arbitrum_address)])
route = byte_ether_address + byte_weth_address + byte_arb_address
web3 = Web3(Web3.HTTPProvider(arbitrum_nova_rpc_url))
contract = web3.eth.contract(
address=route_processor_arbitrum_nova_address,
abi=route_processor_abi
)
tx = contract.functions.processRoute(
web3.to_checksum_address(arbitrum_nova_ether_address), # token in
web3.to_wei(0.0001, 'ether'), # amount in
web3.to_checksum_address(arbitrum_nova_arbitrum_address), # token out
0, # amount out min
web3.to_checksum_address(address), # to address
route # route
)
tx.build_transaction({
"nonce": web3.eth.get_transaction_count(address),
"value": 0
})发布于 2023-04-15 01:15:59
route参数应该是编码要交换的令牌路径的bytes值。
就像您想要将以太交换为ARBITRUM,并且路径包括首先将Ether转换为WETH,然后将WETH转换为ARBITRUM,route类似于下面的示例
from eth_abi import encode_single
eth_address = web3.to_checksum_address(arbitrum_nova_ether_address)
weth_address = web3.to_checksum_address(arbitrum_nova_weth_address)
arb_address = web3.to_checksum_address(arbitrum_nova_arbitrum_address)
encoded_eth = encode_single('address', eth_address)
encoded_weth = encode_single('address', weth_address)
encoded_arb = encode_single('address', arb_address)您只需将编码的令牌addresses连接起来,形成route参数:route = encoded_eth + encoded_weth + encoded_arb,然后将这个route参数传递给processRoute()
https://ethereum.stackexchange.com/questions/148976
复制相似问题