Last active
August 17, 2021 18:31
-
-
Save mrgulshanyadav/434bdaa2a5f9cd3ca665270a5985a455 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:async'; | |
import 'dart:convert'; | |
import 'dart:io'; | |
import 'dart:typed_data'; | |
import 'package:bitcoin_flutter/bitcoin_flutter.dart'; | |
import 'package:bitcoin_flutter/bitcoin_flutter.dart' as bitf; | |
import 'package:flutter/cupertino.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:flutter/services.dart'; | |
import 'package:http/http.dart' as http; | |
import 'package:shared_preferences/shared_preferences.dart'; | |
import 'package:flutter_dotenv/flutter_dotenv.dart'; | |
import 'package:versacoin/Utils.dart'; | |
// import 'package:bitbox/bitbox.dart' as Bitbox; | |
import 'package:web3dart/web3dart.dart'; | |
import 'package:web3dart/web3dart.dart' as w3d; | |
import 'package:convert/convert.dart'; | |
class API extends ChangeNotifier { | |
// ParaSwap | |
Future<dynamic> paraSwapGetTokens() async { | |
var res = await http.get(Uri.parse("https://apiv4.paraswap.io/v2/tokens/3"), | |
headers: { | |
'Content-Type': 'application/json', | |
},).catchError((onError) { | |
print("paraSwapGetTokens response >> failure: " + onError.toString()); | |
}); | |
print("paraSwapGetTokens response >> " + res.body); | |
if (res.statusCode == 200) { | |
return jsonDecode(res.body); | |
} else { | |
// Fluttertoast.showToast(toastLength: Toast.LENGTH_LONG, msg: jsonDecode(res.body)["responseMsg"]); | |
return jsonDecode(res.body); | |
} | |
} | |
Future<dynamic> paraSwapGetPairPrice(String ethAddress, String toTokenAddress, String fromTokenAddress, String amountInWei) async { | |
print("amountInWei: $amountInWei"); | |
var res = await http.get(Uri.parse("https://apiv4.paraswap.io/v2/prices?" | |
"userAddress=$ethAddress" | |
"&from=$fromTokenAddress" | |
"&to=$toTokenAddress" | |
"&amount=$amountInWei" | |
"&side=SELL" | |
"&network=3"), | |
headers: { | |
'Content-Type': 'application/json', | |
},).catchError((onError) { | |
print("paraSwapGetPairPrice response >> failure: " + onError.toString()); | |
}); | |
print("paraSwapGetPairPrice response >> " + res.body); | |
if (res.statusCode == 200) { | |
return jsonDecode(res.body); | |
} else { | |
// Fluttertoast.showToast(toastLength: Toast.LENGTH_LONG, msg: jsonDecode(res.body)["responseMsg"]); | |
return jsonDecode(res.body); | |
} | |
} | |
Future<dynamic> paraSwapBuildTransaction(String privateKey, int toDecimals, int fromDecimals, String ethAddress, dynamic priceRouteJson, String toTokenAddress, String fromTokenAddress, String topriceWithSlippage, String fromAmountInWei) async { | |
var approveRes = await paraSwapApproveTransaction(privateKey, ethAddress, toTokenAddress, fromTokenAddress, topriceWithSlippage, fromAmountInWei); | |
print("approveRes: $approveRes"); | |
var body = json.encode({ | |
"toDecimals": toDecimals, | |
"fromDecimals": fromDecimals, | |
"referrer": 'chucknorris', | |
"userAddress": ethAddress, | |
"destAmount": topriceWithSlippage, | |
"srcAmount": fromAmountInWei, | |
"destToken": toTokenAddress, | |
"srcToken": fromTokenAddress, | |
"priceRoute": priceRouteJson, | |
}); | |
print("body: $body"); | |
var res = await http.post(Uri.parse("https://apiv4.paraswap.io/v2/transactions/3"), | |
headers: { | |
'Content-Type': 'application/json', | |
}, body: body).catchError((onError) { | |
print("paraSwapBuildTransaction response >> failure: " + onError.toString()); | |
}); | |
print("paraSwapBuildTransaction response >> " + res.body); | |
if (res.statusCode == 200) { | |
return jsonDecode(res.body); | |
} else { | |
// Fluttertoast.showToast(toastLength: Toast.LENGTH_LONG, msg: jsonDecode(res.body)["responseMsg"]); | |
return jsonDecode(res.body); | |
} | |
} | |
Future<dynamic> paraSwapApproveTransaction(String privateKey, String ethAddress, String toTokenAddress, String fromTokenAddress, String topriceWithSlippage, String fromAmountInWei) async { | |
http.Client httpClient = http.Client(); | |
// Web3Client ethClient = Web3Client('https://mainnet.infura.io/v3/976f66afa6ee4b25ac3b40bbdb17dc47', httpClient); | |
Web3Client ethClient = Web3Client('https://ropsten.infura.io/v3/976f66afa6ee4b25ac3b40bbdb17dc47', httpClient); | |
// var res = await submit(ethClient, privateKey, 'transferFrom', [EthereumAddress.fromHex(toTokenAddress), EthereumAddress.fromHex(ethAddress), EthereumAddress.fromHex(ethAddress), BigInt.from(num.parse(topriceWithSlippage))]); | |
// return res; | |
var allowAndApproveRes = await allowAndApprove(ethClient, privateKey, ethAddress, toTokenAddress, fromTokenAddress, topriceWithSlippage, fromAmountInWei); | |
print('allowAndApproveRes: $allowAndApproveRes'); | |
return allowAndApproveRes; | |
} | |
Future<DeployedContract> loadContract(String contractAddress) async { | |
String abiCode = await rootBundle.loadString("assets/erc20.json"); | |
final contract = DeployedContract(ContractAbi.fromJson(abiCode, "ERC20"), EthereumAddress.fromHex(contractAddress)); | |
return contract; | |
} | |
Future<List<dynamic>> query(Web3Client ethClient, String tokenAddress, String functionName, List<dynamic> args) async { | |
DeployedContract contract = await loadContract(tokenAddress); | |
final ethFunction = contract.function(functionName); | |
final data = await ethClient.call(contract: contract, function: ethFunction, params: args); | |
return data; | |
} | |
Future<String> submit(Web3Client ethClient, String privateKey, String tokenAddress, String functionName, List<dynamic> args) async { | |
EthPrivateKey credentials = EthPrivateKey.fromHex(privateKey); | |
DeployedContract contract = await loadContract(tokenAddress); | |
final ethFunction = contract.function(functionName); | |
var result = await ethClient.sendTransaction( | |
credentials, | |
w3d.Transaction.callContract( | |
contract: contract, | |
function: ethFunction, | |
parameters: args, | |
), | |
); | |
return result; | |
} | |
Future<dynamic> allowAndApprove(Web3Client ethClient, String privateKey, String ethAddress, String toTokenAddress, String fromTokenAddress, String topriceWithSlippage, String fromAmountInWei) async { | |
try { | |
// String AUGUSTUS_SPENDER = '0xb70Bc06D2c9Bf03b3373799606dc7d39346c06B3'; //from augustus.getTokenTransferProxy() | |
String AUGUSTUS_SPENDER = '0xDb28dc14E5Eb60559844F6f900d23Dce35FcaE33'; // ropsten. | |
BigInt srcAmount = BigInt.parse(fromAmountInWei); | |
BigInt balance = BigInt.parse((await query(ethClient, fromTokenAddress, 'balanceOf', [EthereumAddress.fromHex(ethAddress)])).toString().replaceAll("[", "").replaceAll("]", "")); | |
if (balance<srcAmount) { | |
return '$balance isLessThan srcAmount $srcAmount'; | |
} | |
print('balance: '+ balance.toString()); | |
print('srcAmount: '+ srcAmount.toString()); | |
if (fromTokenAddress != "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") { | |
BigInt allowance = BigInt.parse((await query(ethClient, fromTokenAddress, 'allowance', [EthereumAddress.fromHex(ethAddress), EthereumAddress.fromHex(AUGUSTUS_SPENDER)])).toString().replaceAll("[", "").replaceAll("]", "")); | |
print('allowance: '+ allowance.toString()); | |
if (allowance<srcAmount) { | |
print('Approval needed, allowance = '+ allowance.toString()); | |
var res = await submit(ethClient, privateKey, fromTokenAddress, 'approve', [EthereumAddress.fromHex(AUGUSTUS_SPENDER), srcAmount]);//Can also approve ps.approve(from.address, srcAmount) but it has to be called on each tx | |
print('approved: $res'); | |
} | |
} | |
return 'allowance & approval done'; | |
} catch (error) { | |
print('error'+ error.toString()); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment