Skip to content

Commit 30cd89d

Browse files
committed
using api to get usd price instead of calling to blockchain
1 parent ac58753 commit 30cd89d

File tree

2 files changed

+41
-320
lines changed

2 files changed

+41
-320
lines changed

includes/class-woo-kyber-payment-gateway.php

Lines changed: 41 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22

33
require_once dirname(__DIR__, 1) . '/vendor/autoload.php';
44
use Web3\Utils;
5-
use Web3\Contract;
6-
use Web3\Providers\HttpProvider;
7-
use Web3\RequestManagers\HttpRequestManager;
85

96
if ( ! defined( 'ABSPATH' ) ) {
107
exit;
@@ -21,10 +18,6 @@
2118

2219
class WC_Kyber_Payment_Gateway extends WC_Payment_Gateway {
2320

24-
protected $dai = "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359";
25-
protected $eth = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
26-
protected $gwei = "1000000000000000000"; // gwei const
27-
protected $abi = '[{"constant":false,"inputs":[{"name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"enabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOperators","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"dest","type":"address"},{"name":"destAddress","type":"address"},{"name":"maxDestAmount","type":"uint256"},{"name":"minConversionRate","type":"uint256"},{"name":"walletId","type":"address"},{"name":"hint","type":"bytes"}],"name":"tradeWithHint","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"minConversionRate","type":"uint256"}],"name":"swapTokenToEther","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxGasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kyberNetworkContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"getUserCapInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"dest","type":"address"},{"name":"minConversionRate","type":"uint256"}],"name":"swapTokenToToken","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"minConversionRate","type":"uint256"}],"name":"swapEtherToToken","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAlerters","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcQty","type":"uint256"}],"name":"getExpectedRate","outputs":[{"name":"expectedRate","type":"uint256"},{"name":"slippageRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"},{"name":"token","type":"address"}],"name":"getUserCapInTokenWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_kyberNetworkContract","type":"address"}],"name":"setKyberNetworkContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"field","type":"bytes32"}],"name":"info","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"dest","type":"address"},{"name":"destAddress","type":"address"},{"name":"maxDestAmount","type":"uint256"},{"name":"minConversionRate","type":"uint256"},{"name":"walletId","type":"address"}],"name":"trade","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_admin","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"trader","type":"address"},{"indexed":false,"name":"src","type":"address"},{"indexed":false,"name":"dest","type":"address"},{"indexed":false,"name":"actualSrcAmount","type":"uint256"},{"indexed":false,"name":"actualDestAmount","type":"uint256"}],"name":"ExecuteTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newNetworkContract","type":"address"},{"indexed":false,"name":"oldNetworkContract","type":"address"}],"name":"KyberNetworkSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAdmin","type":"address"},{"indexed":false,"name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAlerter","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"AlerterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOperator","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"}]';
2821
protected $supported_tokens = array();
2922

3023
public function __construct() {
@@ -55,11 +48,6 @@ public function __construct() {
5548
$this->description .= sprintf( __(" TESTMODE is enabled. The payment by this method now will not be proceed.", "woocommerce-gateway-kyber") );
5649
}
5750

58-
$timeout = 30;
59-
$network_endpoint = sprintf("https://%s.infura.io", $this->network);
60-
$provider = new HttpProvider(new HttpRequestManager($network_endpoint, $timeout));
61-
$this->proxy_contract = new Contract($provider, $this->abi);
62-
6351
add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
6452
add_action( 'woocommerce_api_kyber_callback', array( $this, 'handle_kyber_callback' ) );
6553
add_action( 'woocommerce_order_details_after_order_table_items', array( $this, 'add_tx_hash_to_order' ) );
@@ -218,21 +206,48 @@ public function get_icon() {
218206
* @since 0.0.1
219207
*/
220208
public function get_list_token_supported() {
221-
$tracker_url = sprintf('https://tracker.kyber.network/api/tokens/supported?chain=%s', $this->get_option( 'network' ) );
209+
$network = $this->get_option('network');
210+
if ( $network == "ropsten" ) {
211+
$tracker_url = 'https://ropsten-api.kyber.network/currencies';
212+
} else {
213+
$tracker_url = 'https://api.kyber.network/currencies';
214+
}
222215
$response = wp_remote_get( $tracker_url );
223216

224217
$response_body= $response['body'];
225218
$data = json_decode( $response_body );
226219

227220
$result = array();
228-
for ( $index = 0; $index < count( $data); $index++ ) {
229-
$result[$data[$index]->symbol] = $data[$index]->symbol;
230-
$this->supported_tokens[$data[$index]->symbol] = $data[$index]->contractAddress;
221+
for ( $index = 0; $index < count( $data->data ); $index++ ) {
222+
$result[$data->data[$index]->symbol] = $data->data[$index]->symbol;
231223
}
232224

233225
return $result;
234226
}
235227

228+
public function get_token_rate( $token ) {
229+
$network = $this->get_option('network');
230+
if ( $network == "ropsten" ) {
231+
$tracker_url = 'https://ropsten-api.kyber.network/token_price?currency=USD';
232+
} else {
233+
$tracker_url = 'https://api.kyber.network/token_price?currency=USD';
234+
}
235+
$response = wp_remote_get( $tracker_url );
236+
237+
$response_body= $response['body'];
238+
$data = json_decode( $response_body );
239+
$rate = 0;
240+
241+
for ( $index = 0; $index < count( $data->data ); $index++ ) {
242+
if ( $data->data[$index]->symbol == $token ) {
243+
$rate = $data->data[$index]->price;
244+
break;
245+
}
246+
}
247+
248+
return $rate;
249+
}
250+
236251
/**
237252
* Override process_payment from WC_Payment_Gateway class
238253
*
@@ -564,21 +579,12 @@ public function payment_fields() {
564579
$total = $order->get_total();
565580
}
566581
$receiveToken = $this->get_option( "receive_token_symbol" );
567-
$receiveTokenAddress = $this->supported_tokens[$receiveToken];
568-
$dai = $this->supported_tokens["DAI"];
569-
570-
$functionName = "getExpectedRate";
571-
$src_qty = 1000000000000000000;
572-
$rate = 0;
573-
$this->proxy_contract->at("0x818E6FECD516Ecc3849DAf6845e3EC868087B755")->call($functionName, $dai, $receiveTokenAddress, $src_qty, function( $err, $result ) use (&$rate) {
574-
if ($err != null) {
575-
error_log( print_r( $err->getMessage(), 1 ) );
576-
}
577-
$expectedRate = strval($result['expectedRate']->value);
578-
$rate = bcdiv( $expectedRate, $this->gwei, 18);
579-
});
582+
$rate = $this->get_token_rate( $receiveToken );
580583

581-
$token_price = $rate * $total;
584+
$token_price = 0;
585+
if ( $rate != 0 ) {
586+
$token_price = $total / $rate;
587+
}
582588

583589
$token_price_html = sprintf('</br><p></p>
584590
<div class="kyber-cart-token-price">
@@ -602,22 +608,12 @@ public function payment_fields() {
602608
*/
603609
public function get_token_price( $order ) {
604610
$receiveToken = $this->get_option( "receive_token_symbol" );
605-
$receiveTokenAddress = $this->supported_tokens[$receiveToken];
606-
$dai = $this->supported_tokens["DAI"];
607-
608-
$functionName = "getExpectedRate";
609-
$src_qty = 1000000000000000000;
610-
$rate = 0;
611-
$this->proxy_contract->at("0x818E6FECD516Ecc3849DAf6845e3EC868087B755")->call($functionName, $dai, $receiveTokenAddress, $src_qty,
612-
function( $err, $result ) use (&$rate) {
613-
if ($err != null) {
614-
error_log( print_r( sprintf("get dai rate from blockchain failed: %s", $err->getMessage()), 1 ) );
615-
}
616-
$expectedRate = strval($result['expectedRate']->value);
617-
$rate = bcdiv( $expectedRate, $this->gwei, 18);
618-
});
611+
$rate = $this->get_token_rate( $receiveToken );
619612

620-
$token_price = $order->get_total() * $rate;
613+
$token_price = 0;
614+
if ( $rate != 0 ) {
615+
$token_price = $order->get_total() / $rate;
616+
}
621617
$order->add_meta_data( "token_price", $token_price, true );
622618

623619
return $token_price;

0 commit comments

Comments
 (0)