Skip to content

Commit 420e008

Browse files
authored
feat: add token approve builder (#180)
1 parent 3c842d1 commit 420e008

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

crypto/enums/abi_function.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ class AbiFunction(Enum):
1010
VALIDATOR_RESIGNATION = 'resignValidator'
1111
UPDATE_VALIDATOR = 'updateValidator'
1212
TRANSFER = 'transfer'
13+
APPROVE = 'approve'
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from crypto.enums.abi_function import AbiFunction
2+
from crypto.enums.contract_abi_type import ContractAbiType
3+
from crypto.transactions.builder.abstract_transaction_builder import (
4+
AbstractTransactionBuilder,
5+
)
6+
from crypto.transactions.types.evm_call import EvmCall
7+
from crypto.utils.abi_encoder import AbiEncoder
8+
from crypto.utils.transaction_utils import TransactionUtils
9+
10+
11+
class TokenApproveBuilder(AbstractTransactionBuilder):
12+
def contract_address(self, address):
13+
self.transaction.data['to'] = address
14+
return self
15+
16+
def spender(self, address, amount):
17+
encoder = AbiEncoder(ContractAbiType.TOKEN)
18+
payload = encoder.encode_function_call(
19+
AbiFunction.APPROVE.value, [address, amount]
20+
)
21+
self.transaction.data['data'] = TransactionUtils.parse_hex_from_str(
22+
payload
23+
)
24+
return self
25+
26+
def get_transaction_instance(self, data):
27+
return EvmCall(data)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"data": {
3+
"value": "0",
4+
"senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
5+
"gasPrice": "5000000000",
6+
"gasLimit": "21000",
7+
"nonce": "1",
8+
"data": "095ea7b30000000000000000000000006f0182a0cc707b055322ccf6d4cb6a5aff1aeb220000000000000000000000000000000000000000000000000000000000000000",
9+
"to": "0x6F0182a0cc707b055322CcF6d4CB6a5Aff1aEb22",
10+
"v": 0,
11+
"r": "f9120b04d549fe3ac691d8ce0cb26a7f104f0686d03434d47528894c0cad1eea",
12+
"s": "3a8960d16a4903b52045b1b40b0f81912bc834985fbd80dc75bf7e60b07bb3e1",
13+
"hash": "2472dc84d8d4b6fb1d843b1417a14ae8de1865bd86f9cd8b444b7c4ff7c6f28c"
14+
},
15+
"serialized": "f8ab0185012a05f200825208946f0182a0cc707b055322ccf6d4cb6a5aff1aeb2280b844095ea7b30000000000000000000000006f0182a0cc707b055322ccf6d4cb6a5aff1aeb220000000000000000000000000000000000000000000000000000000000000000825c6ba0f9120b04d549fe3ac691d8ce0cb26a7f104f0686d03434d47528894c0cad1eeaa03a8960d16a4903b52045b1b40b0f81912bc834985fbd80dc75bf7e60b07bb3e1"
16+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from crypto.transactions.builder.token_approve_builder import (
2+
TokenApproveBuilder,
3+
)
4+
5+
6+
def test_token_approve_transaction(passphrase, load_transaction_fixture):
7+
fixture = load_transaction_fixture('transactions/token-approve')
8+
9+
builder = (
10+
TokenApproveBuilder
11+
.new()
12+
.spender(fixture['data']['to'], int(fixture['data']['value']))
13+
.to(fixture['data']['to'])
14+
.nonce(fixture['data']['nonce'])
15+
.gas_price(fixture['data']['gasPrice'])
16+
.gas_limit(fixture['data']['gasLimit'])
17+
.sign(passphrase)
18+
)
19+
20+
assert builder.transaction.data['gasPrice'] == int(
21+
fixture['data']['gasPrice']
22+
)
23+
assert builder.transaction.data['gasLimit'] == int(
24+
fixture['data']['gasLimit']
25+
)
26+
assert builder.transaction.data['nonce'] == fixture['data']['nonce']
27+
assert builder.transaction.data['to'].lower() == (
28+
fixture['data']['to'].lower()
29+
)
30+
assert builder.transaction.data['v'] == fixture['data']['v']
31+
assert builder.transaction.data['r'] == fixture['data']['r']
32+
assert builder.transaction.data['s'] == fixture['data']['s']
33+
assert builder.transaction.data['hash'] == fixture['data']['hash']
34+
35+
assert builder.verify()
36+
37+
38+
def test_token_approve_serialization(passphrase, load_transaction_fixture):
39+
fixture = load_transaction_fixture('transactions/token-approve')
40+
41+
builder = (
42+
TokenApproveBuilder
43+
.new()
44+
.spender(fixture['data']['to'], int(fixture['data']['value']))
45+
.to(fixture['data']['to'])
46+
.nonce(fixture['data']['nonce'])
47+
.gas_price(fixture['data']['gasPrice'])
48+
.gas_limit(fixture['data']['gasLimit'])
49+
.sign(passphrase)
50+
)
51+
52+
serialized = builder.transaction.serialize().hex()
53+
assert serialized == fixture['serialized']

0 commit comments

Comments
 (0)