-
Notifications
You must be signed in to change notification settings - Fork 37
/
esdtHelpers.ts
74 lines (63 loc) · 3.13 KB
/
esdtHelpers.ts
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import {ScArgumentsParser} from "./scArgumentsParser";
import {ErrInvalidEsdtTransferDataField} from "./errors";
import BigNumber from "bignumber.js";
import {ESDT_TRANSFER_FUNCTION_NAME, ESDT_TRANSFER_GAS_LIMIT, ESDT_TRANSFER_VALUE} from "./constants";
/**
* This class exposes static methods that are useful for parsing ESDT transfer transactions
*/
export class EsdtHelpers {
/**
* This function will return the token identifier and the amount from a given data field for an ESDT transfer, or
* an exception if something went wrong
* @param dataField this field represents the data filed to extract esdt transfer data from
* @throws ErrInvalidEsdtTransferDataField this function throws an ErrInvalidEsdtTransferDataField if the provided data field isn't meant to be an ESDT transfer
* @return {tokenIdentifier, amount} this function returns a pair of token identifier and amount to transfer
*/
public static extractFieldsFromEsdtTransferDataField(dataField: string): { tokenIdentifier: string, amount: string } {
if (!dataField.startsWith(ESDT_TRANSFER_FUNCTION_NAME + "@")) {
throw new ErrInvalidEsdtTransferDataField();
}
let {args} = ScArgumentsParser.parseSmartContractCallDataField(dataField);
if (args.length != 2) {
throw new ErrInvalidEsdtTransferDataField();
}
let tokenIdentifier = args[0];
let amount = new BigNumber(args[1], 16).toString(10);
return {
tokenIdentifier: tokenIdentifier,
amount: amount
};
}
/**
* This function checks if the data field represents a valid ESDT transfer call
* @param dataField this field represents the string to be checked if it would trigger an ESDT transfer call
* @return true if the provided data field is meant to be an ESDT transfer
*/
public static isEsdtTransferTransaction(dataField: string): Boolean {
if (!dataField.startsWith(ESDT_TRANSFER_FUNCTION_NAME + "@")) {
return false;
}
let args: string[];
try {
args = ScArgumentsParser.parseSmartContractCallDataField(dataField).args;
} catch (e) {
return false;
}
return args.length === 2;
}
/**
* getTxFieldsForEsdtTransfer returns the needed value, gasLimit and data field (in string format) for sending an amount of ESDT token
* @param tokenIdentifier this field represents the identifier of the token to transfer
* @param amount this field represents the denominated amount of the token to send
* @return {value, gasLimit, data} this function returns the value, the gas limit and the data field to use
*/
public static getTxFieldsForEsdtTransfer(tokenIdentifier: string, amount: string): { value: string, gasLimit: number, data: string } {
const encodedAmount = new BigNumber(amount, 10).toString(16);
const txDataField = [ESDT_TRANSFER_FUNCTION_NAME, tokenIdentifier, encodedAmount].join("@");
return {
value: ESDT_TRANSFER_VALUE,
gasLimit: ESDT_TRANSFER_GAS_LIMIT,
data: txDataField
};
}
}