Skip to content

Commit

Permalink
#49 draft implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
fsw committed May 12, 2020
1 parent 36ac3da commit 53e7aaa
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 16 deletions.
84 changes: 69 additions & 15 deletions www/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -1016,6 +1016,7 @@ var app = {

if ('amount' in args && args.amount){
document.getElementById('sendCoinAmount').value = parseFloat(args.amount);
document.getElementById('sendCoinAmount').readOnly = true;
app.coinUpdateValue('sendCoin', app.sendWallet.handler);
app.sendCoinValidateAmount('sendCoin');
}
Expand Down Expand Up @@ -1057,28 +1058,81 @@ var app = {
var kp = e.split('=', 2);
if (kp.length>1) args[kp[0]] = decodeURIComponent(kp[1]);
});
if ('r' in args) {
app.alertInfo('BIP72 address found. quering for payment details...');
if (args.coin && 'r' in args) {
app.alertInfo('bitpay BIP72 address found. quering details...');
var supportedBitpayCoins = {
'bitcoin': 'BTC',
'ethereum': 'ETH'
};
if (!supportedBitpayCoins.hasOwnProperty(args.coin)) {
app.alertError(args.coin + ' BIP72 payments are not yet supported. sorry.');
return;
}

var oReq = new XMLHttpRequest();
oReq.open("GET", args.r);
oReq.open("POST", args.r);
oReq.addEventListener("load", function(){
var paymentRequest = JSON.parse(this.responseText);
//console.log(paymentRequest);
var coin = 'unknown';
if (paymentRequest.currency == 'BTC' && paymentRequest.network == 'main') coin = 'bitcoin';
if (paymentRequest.currency == 'BTC' && paymentRequest.network == 'test') coin = 'bitcoin-test';
if (paymentRequest.currency == 'BCH' && paymentRequest.network == 'main') coin = 'bitcoin-cash';

if (paymentRequest.outputs.length != 1) {
app.alertError('payment requests with multiple outputs are not supported. sorry.');
} else {
callback(paymentRequest.outputs[0].address, {'coin': coin, 'amount': paymentRequest.outputs[0].amount / 100000000});

var timeLeftMs = new Date(paymentRequest.expires) - new Date(); //paymentRequest.time
var timeLeft = Math.floor(timeLeftMs / 1000);
app.alertInfo('memo: ' + paymentRequest.memo);
app.alertInfo(timeLeft + ' seconds left.');

var coinCode = 'unknown';
//TODO: ERC20 payments
var validCombinations = [
//args.coin, chain, currency, network, real-coin
['bitcoin', 'BTC', 'BTC', 'test', 'BTC.TST'],
['bitcoin', 'BTC', 'BTC', 'main', 'BTC'],
['ethereum', 'ETH', 'ETH', 'test', 'ETH.TST2'],
['ethereum', 'ETH', 'ETH', 'main', 'ETH']
];
for (var i in validCombinations) {
if ((args.coin == validCombinations[i][0]) &&
(paymentRequest.chain == validCombinations[i][1]) &&
(!paymentRequest.currency || (paymentRequest.currency == validCombinations[i][2])) &&
(paymentRequest.network == validCombinations[i][3])) {
coinCode = validCombinations[i][4];
}
}
console.log(paymentRequest, coinCode);
if (!(coinCode in app.wallets)) {
app.alertError('unknown coin');
return;
}
if (args.coin == 'bitcoin') {
if (paymentRequest.instructions.length != 1 || paymentRequest.instructions[0].outputs.length) {
app.alertError('payment requests with multiple outputs are not supported. sorry.');
} else {
var systemValue = paymentRequest.instructions[0].outputs[0].amount;
callback(paymentRequest.instructions[0].outputs[0].address, {
'coinCode': coinCode,
'amount': app.wallets[coinCode].handler.systemValueToFloatValue(systemValue),
'systemAmount': systemValue
});
}
} else if (args.coin == 'ethereum') {
if (paymentRequest.instructions.length != 1) {
app.alertError('payment requests with multiple instructions are not supported. sorry.');
} else {
var systemValue = paymentRequest.instructions[0].value.toString();
callback(paymentRequest.instructions[0].to, {
'coinCode': coinCode,
'amount': app.wallets[coinCode].handler.systemValueToFloatValue(systemValue),
'systemAmount': systemValue
});
}
}
});
oReq.setRequestHeader('Accept', 'application/payment-request');
oReq.setRequestHeader('x-paypro-version', '2');
//oReq.setRequestHeader('Accept', 'application/payment-request');
//oReq.setRequestHeader('Accept', 'application/bitcoin-paymentrequest');
oReq.send();
oReq.setRequestHeader('Content-Type', 'application/payment-request');
oReq.send(JSON.stringify({
'chain': supportedBitpayCoins[args.coin]
}));

} else {
callback(addr, args);
}
Expand Down
1 change: 1 addition & 0 deletions www/js/coin.apis.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
var allCoinApis = {
'BTC.TST': BtcTestHandler,
'ETH.TST': EthTestHandler,
'ETH.TST2': EthKovanTestHandler,
'LTC': LtcHandler,
'DOGE': DogeHandler,
'BTC': BtcHandler,
Expand Down
29 changes: 28 additions & 1 deletion www/js/coin.apis.web3js.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ var Web3JsBaseHandler = {
}
return this.provider;
},
getKovanTestnetProvider: function(){
if (typeof this.provider == 'undefined') {
return new Web3(new Web3.providers.HttpProvider("https://kovan.infura.io/v3/" + config.infuraKey));
}
return this.provider;
},
newRandomPrivateKey: function() {
return this._getProvider().eth.accounts.create().privateKey;
},
Expand Down Expand Up @@ -134,7 +140,7 @@ var EthTestHandler = ExtendObject(Web3JsBaseHandler, {
name: "ethereum-test",
code: "ETH.TST",
icon: "eth.test",
longname: "Ethereum Testnet",
longname: "Ethereum Ropsten Testnet",
testCoin: true,
description:
"Robsten is an ethereum testing network.",
Expand All @@ -149,6 +155,27 @@ var EthTestHandler = ExtendObject(Web3JsBaseHandler, {
}
});

var EthKovanTestHandler = ExtendObject(Web3JsBaseHandler, {

_getProvider: Web3JsBaseHandler.getKovanTestnetProvider,
name: "ethereum-test2",
code: "ETH.TST2",
icon: "eth.test",
longname: "Ethereum Kovan Testnet",
testCoin: true,
description:
"Kovan is an ethereum testing network.",
links: {
"Kovan Etherscan" : "https://kovan.etherscan.io/"
},
explorerLinkAddr: function(addr) {
return 'https://kovan.etherscan.io/address/' + addr;
},
explorerLinkTx: function(tx) {
return 'https://kovan.etherscan.io/tx/' + tx;
}
});

var EthHandler = ExtendObject(Web3JsBaseHandler, {
_getProvider: Web3JsBaseHandler.getMainnetProvider,
name: "ethereum",
Expand Down

0 comments on commit 53e7aaa

Please sign in to comment.