approveTokenAndCallContractOffChain method
Future<Map<String, dynamic>>
approveTokenAndCallContractOffChain(
- String walletAddress,
- String tokenAddress,
- String contractAddress,
- String data, {
- String? network = "fuse",
- num? tokensAmount,
- BigInt? amountInWei,
- Map? transactionBody,
- Map? txMetadata,
})
Implementation
Future<Map<String, dynamic>> approveTokenAndCallContractOffChain(
String walletAddress,
String tokenAddress,
String contractAddress,
String data, {
String? network = "fuse",
num? tokensAmount,
BigInt? amountInWei,
Map? transactionBody,
Map? txMetadata,
}) async {
EthereumAddress wallet = EthereumAddress.fromHex(walletAddress);
EthereumAddress token = EthereumAddress.fromHex(tokenAddress);
EthereumAddress contract = EthereumAddress.fromHex(contractAddress);
String encodedApproveTokenAndCallContractData;
String nonce = await getNonceForRelay();
DeployedContract TransferManagerContract =
await _contract('TransferManager', _transferManagerContractAddress);
if (tokensAmount != null) {
dynamic tokenDetails = await getTokenDetails(tokenAddress);
int tokenDecimals = int.parse(tokenDetails["decimals"].toString());
Decimal tokensAmountDecimal = Decimal.parse(tokensAmount.toString());
Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString());
BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString());
Uint8List approveTokenAndCallContractData =
TransferManagerContract.function('approveTokenAndCallContract')
.encodeCall([
wallet,
token,
contract,
amount,
HEX.decode(data),
]);
encodedApproveTokenAndCallContractData =
'0x' + HEX.encode(approveTokenAndCallContractData);
} else {
Uint8List approveTokenAndCallContractData =
TransferManagerContract.function('approveTokenAndCallContract')
.encodeCall([
wallet,
token,
contract,
amountInWei,
HEX.decode(data),
]);
encodedApproveTokenAndCallContractData =
'0x' + HEX.encode(approveTokenAndCallContractData);
}
String signature = await signOffChain(
_transferManagerContractAddress,
walletAddress,
BigInt.from(0),
encodedApproveTokenAndCallContractData,
nonce,
BigInt.from(0),
BigInt.from(_defaultGasLimit),
);
return {
"walletAddress": walletAddress,
"methodData": encodedApproveTokenAndCallContractData,
"communityAddress": _defaultCommunityContractAddress,
"nonce": nonce,
"network": network,
"methodName": "approveTokenAndCallContract",
"gasPrice": 0,
"gasLimit": _defaultGasLimit,
"signature": signature,
"walletModule": "TransferManager",
'transactionBody': transactionBody,
"txMetadata": txMetadata,
};
}