| import requests |
| from web3 import Web3 |
| from typing import Dict, Any |
|
|
| class TokenApprovalHelper: |
| def __init__(self, web3: Web3, private_key: str): |
| self.web3 = web3 |
| self.private_key = private_key |
|
|
| def approve_token(self, erc20_contract_address: str, exchange_proxy_address: str, sell_amount: str, eth_address: str) -> Dict[str, Any]: |
| """ |
| Approves the 0x Exchange Proxy contract to spend the specified amount of the ERC-20 token. |
| |
| Args: |
| erc20_contract_address (str): The address of the ERC-20 token contract. |
| exchange_proxy_address (str): The address of the 0x Exchange Proxy contract. |
| sell_amount (str): The amount of the token to approve. |
| eth_address (str): Your Ethereum address. |
| |
| Returns: |
| dict: The transaction receipt of the approval transaction. |
| |
| Example: |
| >>> approve_token('0xTokenAddress', '0xProxyAddress', '1000000000000000000', '0xYourAddress') |
| """ |
| erc20_abi = [ |
| { |
| "constant": False, |
| "inputs": [ |
| { |
| "name": "_spender", |
| "type": "address" |
| }, |
| { |
| "name": "_value", |
| "type": "uint256" |
| } |
| ], |
| "name": "approve", |
| "outputs": [ |
| { |
| "name": "", |
| "type": "bool" |
| } |
| ], |
| "type": "function" |
| } |
| ] |
| erc20_contract = self.web3.eth.contract(address=erc20_contract_address, abi=erc20_abi) |
| approve_tx = erc20_contract.functions.approve( |
| exchange_proxy_address, |
| int(sell_amount) |
| ).buildTransaction({ |
| 'from': eth_address, |
| 'nonce': self.web3.eth.getTransactionCount(eth_address), |
| 'gas': 100000, |
| 'gasPrice': self.web3.toWei('20', 'gwei') |
| }) |
| signed_approve_tx = self.web3.eth.account.signTransaction(approve_tx, private_key=self.private_key) |
| tx_hash = self.web3.eth.sendRawTransaction(signed_approve_tx.rawTransaction) |
| return self.web3.eth.waitForTransactionReceipt(tx_hash) |
|
|