Skip to content

Instantly share code, notes, and snippets.

@mrgulshanyadav
Last active August 17, 2021 18:31
Show Gist options
  • Save mrgulshanyadav/434bdaa2a5f9cd3ca665270a5985a455 to your computer and use it in GitHub Desktop.
Save mrgulshanyadav/434bdaa2a5f9cd3ca665270a5985a455 to your computer and use it in GitHub Desktop.
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