2017-04-11 02:25:53 +03:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
2017-10-16 16:30:13 +03:00
< title > {{.Network}}: Authenticated Faucet< / title >
2017-04-11 02:25:53 +03:00
< link href = "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel = "stylesheet" / >
< link href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel = "stylesheet" / >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" > < / script >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery-noty/2.4.1/packaged/jquery.noty.packaged.min.js" > < / script >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" > < / script >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.0/moment.min.js" > < / script >
< style >
.vertical-center {
min-height: 100%;
min-height: 100vh;
display: flex;
align-items: center;
}
.progress {
position: relative;
}
.progress span {
position: absolute;
display: block;
width: 100%;
color: white;
}
pre {
padding: 6px;
margin: 0;
}
< / style >
< / head >
< body >
< div class = "vertical-center" >
< div class = "container" >
< div class = "row" style = "margin-bottom: 16px;" >
< div class = "col-lg-12" >
2017-10-16 16:30:13 +03:00
< h1 style = "text-align: center;" > < i class = "fa fa-bath" aria-hidden = "true" > < / i > {{.Network}} Authenticated Faucet< / h1 >
2017-04-11 02:25:53 +03:00
< / div >
< / div >
< div class = "row" >
< div class = "col-lg-8 col-lg-offset-2" >
< div class = "input-group" >
2017-10-16 16:30:13 +03:00
< input id = "gist" type = "text" class = "form-control" placeholder = "Social network URL containing your Ethereum address..." >
2017-04-11 02:25:53 +03:00
< span class = "input-group-btn" >
2017-05-02 13:52:51 +03:00
< button class = "btn btn-default dropdown-toggle" type = "button" data-toggle = "dropdown" aria-haspopup = "true" aria-expanded = "false" > Give me Ether < i class = "fa fa-caret-down" aria-hidden = "true" > < / i > < / button >
< ul class = "dropdown-menu dropdown-menu-right" > {{range $idx, $amount := .Amounts}}
< li > < a style = "text-align: center;" onclick = "tier={{$idx}}; {{if $.Recaptcha}}grecaptcha.execute(){{else}}submit({{$idx}}){{end}}" > {{$amount}} / {{index $.Periods $idx}}< / a > < / li > {{end}}
< / ul >
2017-04-11 02:25:53 +03:00
< / span >
2017-04-16 19:49:40 +03:00
< / div > {{if .Recaptcha}}
< div class = "g-recaptcha" data-sitekey = "{{.Recaptcha}}" data-callback = "submit" data-size = "invisible" > < / div > {{end}}
2017-04-11 02:25:53 +03:00
< / div >
< / div >
< div class = "row" style = "margin-top: 32px;" >
< div class = "col-lg-6 col-lg-offset-3" >
< div class = "panel panel-small panel-default" >
< div class = "panel-body" style = "padding: 0; overflow: auto; max-height: 300px;" >
< table id = "requests" class = "table table-condensed" style = "margin: 0;" > < / table >
< / div >
< div class = "panel-footer" >
< table style = "width: 100%" > < tr >
< td style = "text-align: center;" > < i class = "fa fa-rss" aria-hidden = "true" > < / i > < span id = "peers" > < / span > peers< / td >
< td style = "text-align: center;" > < i class = "fa fa-database" aria-hidden = "true" > < / i > < span id = "block" > < / span > blocks< / td >
< td style = "text-align: center;" > < i class = "fa fa-heartbeat" aria-hidden = "true" > < / i > < span id = "funds" > < / span > Ethers< / td >
< td style = "text-align: center;" > < i class = "fa fa-university" aria-hidden = "true" > < / i > < span id = "funded" > < / span > funded< / td >
< / tr > < / table >
< / div >
< / div >
< / div >
< / div >
< div class = "row" style = "margin-top: 32px;" >
< div class = "col-lg-12" >
< h3 > How does this work?< / h3 >
2017-10-16 16:30:13 +03:00
< p > This Ether faucet is running on the {{.Network}} network. To prevent malicious actors from exhausting all available funds or accumulating enough Ether to mount long running spam attacks, requests are tied to certain common 3rd party accounts. Anyone having a GitHub, Twitter, Google+ or Facebook account may request funds within the permitted limits.< / p >
< dl class = "dl-horizontal" >
< dt style = "width: auto; margin-left: 40px;" > < i class = "fa fa-github-alt" aria-hidden = "true" style = "font-size: 36px;" > < / i > < / dt >
< dd style = "margin-left: 88px; margin-bottom: 10px;" > < / i > To request funds via GitHub, create a < a href = "https://gist.github.com/" target = "_about:blank" > gist< / a > with your Ethereum address embedded into the content (the file name doesn't matter).< br / > Copy-paste the gists URL into the above input box and fire away!< / dd >
< dt style = "width: auto; margin-left: 40px;" > < i class = "fa fa-twitter" aria-hidden = "true" style = "font-size: 36px;" > < / i > < / dt >
< dd style = "margin-left: 88px; margin-bottom: 10px;" > < / i > To request funds via Twitter, make a < a href = "https://twitter.com/intent/tweet?text=Requesting%20faucet%20funds%20into%200x0000000000000000000000000000000000000000%20on%20the%20%23{{.Network}}%20%23Ethereum%20test%20network." target = "_about:blank" > tweet< / a > with your Ethereum address pasted into the contents (surrounding text doesn't matter).< br / > Copy-paste the < a href = "https://support.twitter.com/articles/80586" target = "_about:blank" > tweets URL< / a > into the above input box and fire away!< / dd >
< dt style = "width: auto; margin-left: 40px;" > < i class = "fa fa-google-plus-official" aria-hidden = "true" style = "font-size: 36px;" > < / i > < / dt >
< dd style = "margin-left: 88px; margin-bottom: 10px;" > < / i > To request funds via Google Plus, publish a new < strong > public< / strong > post with your Ethereum address embedded into the content (surrounding text doesn't matter).< br / > Copy-paste the posts URL into the above input box and fire away!< / dd >
< dt style = "width: auto; margin-left: 40px;" > < i class = "fa fa-facebook" aria-hidden = "true" style = "font-size: 36px;" > < / i > < / dt >
< dd style = "margin-left: 88px; margin-bottom: 10px;" > < / i > To request funds via Facebook, publish a new < strong > public< / strong > post with your Ethereum address embedded into the content (surrounding text doesn't matter).< br / > Copy-paste the < a href = "https://www.facebook.com/help/community/question/?id=282662498552845" target = "_about:blank" > posts URL< / a > into the above input box and fire away!< / dd >
< / dl >
< p > You can track the current pending requests below the input field to see how much you have to wait until your turn comes.< / p >
2017-05-02 13:52:51 +03:00
{{if .Recaptcha}}< em > The faucet is running invisible reCaptcha protection against bots.< / em > {{end}}
2017-04-11 02:25:53 +03:00
< / div >
< / div >
< / div >
< / div >
< script >
// Global variables to hold the current status of the faucet
var attempt = 0;
var server;
2017-05-02 13:52:51 +03:00
var tier = 0;
2017-04-11 02:25:53 +03:00
// Define the function that submits a gist url to the server
2017-04-16 19:49:40 +03:00
var submit = function({{if .Recaptcha}}captcha{{end}}) {
2017-05-02 13:52:51 +03:00
server.send(JSON.stringify({url: $("#gist")[0].value, tier: tier{{if .Recaptcha}}, captcha: captcha{{end}}}));{{if .Recaptcha}}
2017-04-16 19:49:40 +03:00
grecaptcha.reset();{{end}}
2017-04-11 02:25:53 +03:00
};
// Define a method to reconnect upon server loss
var reconnect = function() {
if (attempt % 2 == 0) {
server = new WebSocket("wss://" + location.host + "/api");
} else {
server = new WebSocket("ws://" + location.host + "/api");
}
attempt++;
server.onmessage = function(event) {
var msg = JSON.parse(event.data);
if (msg === null) {
return;
}
if (msg.funds !== undefined) {
$("#funds").text(msg.funds);
}
if (msg.funded !== undefined) {
$("#funded").text(msg.funded);
}
if (msg.peers !== undefined) {
$("#peers").text(msg.peers);
}
if (msg.number !== undefined) {
$("#block").text(parseInt(msg.number, 16));
}
if (msg.error !== undefined) {
noty({layout: 'topCenter', text: msg.error, type: 'error'});
}
if (msg.success !== undefined) {
noty({layout: 'topCenter', text: msg.success, type: 'success'});
}
if (msg.requests !== undefined & & msg.requests !== null) {
var content = "";
for (var i=0; i< msg.requests.length ; i + + ) {
2017-10-16 16:30:13 +03:00
content += "< tr > < td > < div style = \"background: url ( ' " + msg . requests [ i ] . avatar + " ' ) ; background-size: cover ; width:32px ; height: 32px ; border-radius: 4px ; \ " > < / div > < / td > < td > < pre > " + msg.requests[i].account + "< / pre > < / td > < td style = \"width: 100 % ; text-align: center ; vertical-align: middle ; \ " > " + moment.duration(moment(msg.requests[i].time).unix()-moment().unix(), 'seconds').humanize(true) + "< / td > < / tr > ";
2017-04-11 02:25:53 +03:00
}
$("#requests").html("< tbody > " + content + "< / tbody > ");
}
}
server.onclose = function() { setTimeout(reconnect, 3000); };
}
// Establish a websocket connection to the API server
reconnect();
2017-04-16 19:49:40 +03:00
< / script > {{if .Recaptcha}}
< script src = "https://www.google.com/recaptcha/api.js" async defer > < / script > {{end}}
2017-04-11 02:25:53 +03:00
< / body >
< / html >