Skip to content
This repository was archived by the owner on Jul 25, 2020. It is now read-only.

Commit 434a3f2

Browse files
committed
Initial Commit.
0 parents  commit 434a3f2

File tree

12 files changed

+1405
-0
lines changed

12 files changed

+1405
-0
lines changed

.gitignore

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
8+
# Runtime data
9+
pids
10+
*.pid
11+
*.seed
12+
*.pid.lock
13+
14+
# Directory for instrumented libs generated by jscoverage/JSCover
15+
lib-cov
16+
17+
# Coverage directory used by tools like istanbul
18+
coverage
19+
20+
# nyc test coverage
21+
.nyc_output
22+
23+
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
24+
.grunt
25+
26+
# Bower dependency directory (https://bower.io/)
27+
bower_components
28+
29+
# node-waf configuration
30+
.lock-wscript
31+
32+
# Compiled binary addons (https://nodejs.org/api/addons.html)
33+
build/Release
34+
35+
# Dependency directories
36+
node_modules/
37+
jspm_packages/
38+
39+
# TypeScript v1 declaration files
40+
typings/
41+
42+
# Optional npm cache directory
43+
.npm
44+
45+
# Optional eslint cache
46+
.eslintcache
47+
48+
# Optional REPL history
49+
.node_repl_history
50+
51+
# Output of 'npm pack'
52+
*.tgz
53+
54+
# Yarn Integrity file
55+
.yarn-integrity
56+
57+
# dotenv environment variables file
58+
.env
59+
60+
# parcel-bundler cache (https://parceljs.org/)
61+
.cache
62+
63+
# next.js build output
64+
.next
65+
66+
# nuxt.js build output
67+
.nuxt
68+
69+
# vuepress build output
70+
.vuepress/dist
71+
72+
# Serverless directories
73+
.serverless
74+
75+
.vscode

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# A faucet for osmose devnet
2+
3+
## Installation
4+
Be sure that NodeJs is installed (version > 8.x.x).
5+
Clone the repository
6+
`npm install`
7+
8+
## Start the faucet
9+
`node main.js`
10+
11+
## Access the faucet
12+
Open a browser and enter http://localhost:8080 in url navbar

config.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"faucetWallet" : ""
3+
}

lib/dbclient.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
var MongoClient = require('mongodb').MongoClient;
2+
var url = "mongodb://localhost:27017/osmose_faucet";
3+
4+
module.exports = {
5+
CheckAddressInDatabase: async function (address) {
6+
let addressFound = await new Promise(function(resolve, reject) {
7+
MongoClient.connect(url, {}, function(err, db) {
8+
if (err)
9+
throw err;
10+
11+
db.collection("addresses").find({address: address}, {sort: {time: -1}, limit: 1}, function (error, results) {
12+
if (error) {
13+
db.close();
14+
reject(error);
15+
}
16+
17+
results.toArray().then(function (value) {
18+
db.close();
19+
resolve(value[0]);
20+
});
21+
});
22+
});
23+
});
24+
25+
if(!addressFound || addressFound.time.getTime() + 24 * 60 * 60000 < new Date().getTime())
26+
return true;
27+
else
28+
return false;
29+
},
30+
AddAddressToDatabase: function (address) {
31+
MongoClient.connect(url, {}, function(err, db) {
32+
if (err)
33+
throw err;
34+
35+
let addressItem = { address: address, time: new Date() };
36+
db.collection("addresses").insert(addressItem, null, function (error, results) {
37+
if (error)
38+
throw error;
39+
});
40+
41+
db.close();
42+
});
43+
},
44+
CanSend: async function() {
45+
let addressFound = await new Promise(function(resolve, reject) {
46+
MongoClient.connect(url, {}, function(err, db) {
47+
if (err)
48+
throw err;
49+
50+
db.collection("addresses").find({}, {sort: {time: -1}, limit: 1}, function (error, results) {
51+
if (error) {
52+
db.close();
53+
reject(error);
54+
}
55+
56+
results.toArray().then(function (value) {
57+
db.close();
58+
resolve(value[0]);
59+
});
60+
});
61+
});
62+
});
63+
64+
if(!addressFound || addressFound.time.getTime() + 30000 < new Date().getTime())
65+
return true;
66+
else
67+
return false;
68+
}
69+
};

lib/osmose.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
var arkjs = require("arkjs");
2+
var fs = require('fs');
3+
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
4+
5+
module.exports = {
6+
CheckAddress: function (address) {
7+
return arkjs.crypto.validateAddress(address, 115);
8+
},
9+
SendOSM: function (address) {
10+
let wallet = JSON.parse(fs.readFileSync('config.json', 'utf8')).faucetWallet;
11+
let nethash = "fa976091894eee4cad258bdae4e3323d0768c4f8610e471237408ac4aa0a92d0";
12+
let sender = arkjs.crypto.getKeys(wallet);
13+
let amountSatoshi = 1000 * Math.pow(10, 8);
14+
15+
let transaction = arkjs.transaction.createTransaction(address, amountSatoshi, "Courtesy of our faucet", sender, undefined, 115);
16+
17+
let transactions = {
18+
transactions: [transaction]
19+
}
20+
21+
let http = new XMLHttpRequest();
22+
let url = 'http://blockchain.osmose.world:4100/peer/transactions';
23+
http.open('POST', url, true);
24+
http.setRequestHeader("nethash", nethash);
25+
http.setRequestHeader("version", "1.6.0");
26+
http.setRequestHeader("port", "1");
27+
28+
//Send the proper header information along with the request
29+
http.setRequestHeader("Content-Type", "application/json");
30+
31+
http.onreadystatechange = function () {
32+
if (http.readyState === 4 && http.status === 200) {
33+
console.log(new Date() + " | 1000 OSM sent from : " + arkjs.crypto.getAddress(sender.publicKey, 115) + " --> " + address);
34+
}
35+
};
36+
37+
http.send(JSON.stringify(transactions));
38+
}
39+
};

main.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
var express = require('express');
2+
var bodyParser = require('body-parser');
3+
var osmose = require('./lib/osmose');
4+
var dbclient = require('./lib/dbclient');
5+
6+
var app = express();
7+
app.use(express.static('public'));
8+
app.use( bodyParser.json() );
9+
app.use(bodyParser.urlencoded({
10+
extended: true
11+
}));
12+
13+
app.get('/', function(req, res) {
14+
let param = {
15+
formData: {
16+
addressError: false,
17+
delayError: false,
18+
delayAddressError: false,
19+
success: false
20+
}
21+
};
22+
23+
res.render('index.ejs', param);
24+
});
25+
26+
app.post('/', async function(req, res) {
27+
let address = req.body.address;
28+
let param = {
29+
formData: {
30+
addressError: !osmose.CheckAddress(address),
31+
delayError: false,
32+
delayAddressError: false,
33+
success: false
34+
}
35+
};
36+
37+
if(!param.formData.addressError) {
38+
if(await dbclient.CheckAddressInDatabase(address)) {
39+
if(await dbclient.CanSend()) {
40+
osmose.SendOSM(address);
41+
dbclient.AddAddressToDatabase(address);
42+
param.formData.success = true;
43+
}
44+
else {
45+
param.formData.delayError = true;
46+
}
47+
}
48+
else
49+
param.formData.delayAddressError = true;
50+
}
51+
52+
res.render('index.ejs', param);
53+
});
54+
55+
app.listen(8080);

0 commit comments

Comments
 (0)