0%

eth | approve

approve 函数是给某一个地址赋予对另一个账户的该币种进行转账的权利。

我由于需要在 dex swap 进行交易,所以,我需要对币种进行赋予权限。

在这里我会以 pancakeswap 为例。

赋予权限是,把该币种的权限赋予给 pancakeswaprouter 合约中。

从上面的链接我们可以看出,是使用币种合约,对 pancakeswaprouter 使用 approve 赋予能使用的该币种数量的权限。

也就是,调用该币种的 approve 合约方法。

这里不再解释过多,而是,直接上代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 脚本独立运行
# 该脚本主要是对地址进行权限赋予,也就是 approve
from web3 import Web3
import time
from config.config import dex_key_secret
from service.database import DataBase

BSC_BUSD = """[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"_decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
"""

pancake = Web3.toChecksumAddress("0x10ed43c718714eb63d5aa57b78b54704e256024e")

wallet_address = dex_key_secret.get("address")
wallet_private = dex_key_secret.get("private")

w3 = Web3(Web3.HTTPProvider("https://bsc-dataseed1.binance.org"))


def get_coin_contract():
# 获得币种的 contract 地址


def get_coin_contract_web3(coin_contract):
contract_coin = w3.eth.contract(
address=Web3.toChecksumAddress(coin_contract), abi=BSC_BUSD)
return contract_coin

def check_approve(contract_coin):
return contract_coin.functions.allowance(Web3.toChecksumAddress(wallet_address), pancake).call()

def approve(contract_coin):
tx_dic = contract_coin.functions.approve(pancake,
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff).buildTransaction(
{
'gas': 800000,
'gasPrice': w3.eth.gasPrice,
'nonce': w3.eth.getTransactionCount(wallet_address),
})
sign_tx = w3.eth.account.signTransaction(tx_dic, wallet_private)
txn_hash = w3.eth.sendRawTransaction(sign_tx.rawTransaction)
print(Web3.toHex(txn_hash))


if __name__ == '__main__':
configs = get_coin_contract()
for symbol, items in configs.items():
for item in items:
if item.platform == "PANCAKESWAPV2_BSC":
contract_coin = get_coin_contract_web3(item.from_contract)
if check_approve(contract_coin) == 0:
approve(contract_coin)
nonce = w3.eth.getTransactionCount(wallet_address)
while 1:
if w3.eth.getTransactionCount(wallet_address) != nonce:
break
time.sleep(5)

这里就是一下为什么用 BSC_BUSD 能够适应所有的币种。

因为 BSC_USD 是标准的 BEP20 abi,所有参考这个标准的,使用的都是一个 approve 方法,所以,这个 approve 是币种通用的。

另外,如何检测地址已经被 approve 了,可以使用 allowance 查看额度。

amt = contract.functions.allowance(acc.address, "0xXXXXXX").call()

具体用法查看上面的代码。

请我喝杯咖啡吧~