287 lines
7.5 KiB
Perl
Executable File
287 lines
7.5 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
#
|
|
# Script Written by Hansen33
|
|
# Discord: hansen33#2541
|
|
#
|
|
# Let's have some fun and register some more names.
|
|
#
|
|
# Dero name service
|
|
# https://docs.dero.io/rtd_pages/dev_dvm.html#nameservice
|
|
|
|
# Check if name is registered
|
|
# curl http://127.0.0.1:40402/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"nametoaddress","params":{"name":"TESTUSERNAME" }}' -H 'Content-Type: application/json'
|
|
|
|
# Register
|
|
# curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"scinvoke","params":{"scid":"0000000000000000000000000000000000000000000000000000000000000001","ringsize":2, "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"Register"}, {"name":"name","datatype":"S","value":"TESTUSERNAME" }] }}' -H 'Content-Type: application/json'
|
|
|
|
$|=1;
|
|
|
|
|
|
use warnings;
|
|
use strict;
|
|
|
|
use utf8::all;
|
|
use JSON;
|
|
use Data::Dumper;
|
|
use WWW::Curl::Easy;
|
|
|
|
# options
|
|
use Getopt::Long;
|
|
my ($name,$debug);
|
|
my %options;
|
|
GetOptions(
|
|
'daemon-rpc=s' => \$options{'daemon-rpc'},
|
|
'wallet-rpc=s' => \$options{'wallet-rpc'},
|
|
'register+' => \$options{'register'},
|
|
'name=s' => \$name,
|
|
'check-list=s' => \$options{'list'},
|
|
'help+' => \$options{'help'},
|
|
'debug+' => \$debug,
|
|
);
|
|
|
|
my $daemon = 'https://dero-node.mysrv.cloud';
|
|
$daemon = $options{'daemon-rpc'} if $options{'daemon-rpc'};
|
|
|
|
my $wallet_rpc = '127.0.0.1:10103';
|
|
$wallet_rpc = $options{'wallet-rpc'} if $options{'wallet-rpc'};
|
|
|
|
print "Dero Name Service Cli Tool - register name to wallet\n";
|
|
|
|
sub usage {
|
|
|
|
print "usage: $0 --name <name> [--register] [--list <path>] [--daemon-rpc] [--wallet-rpc]\n";
|
|
print "\t--name name to check or register\n";
|
|
print "\t--register will attempt to register name to your wallet\n";
|
|
print "\t--check-list Check file with list of names - list can not be used with --register\n";
|
|
print "\t--daemon-rpc Specify URL for daemon if you don't want to use https://dero-node.mysrv.cloud/\n";
|
|
print "\t This is just to check if the name is registered already\n";
|
|
print "\t--wallet-rpc Specify wallet RPC if other than 127.0.0.1:10103 (local wallet)\n";
|
|
print "\t--debug Show debug information\n";
|
|
|
|
exit;
|
|
}
|
|
|
|
usage() if $options{'help'};
|
|
|
|
my @check_list;
|
|
|
|
push @check_list, $name if defined $name;
|
|
|
|
if ($options{'list'}) {
|
|
# Building list
|
|
if (-f $options{'list'}) {
|
|
open my $FILE, '<', $options{'list'} or die ("Failed to open file list for reading....");
|
|
while (my $line = <$FILE>) {
|
|
chomp $line;
|
|
push @check_list, $line;
|
|
}
|
|
|
|
} else {
|
|
usage();
|
|
}
|
|
}
|
|
|
|
|
|
foreach my $check_name (@check_list) {
|
|
|
|
if (length $check_name < 6 or length $check_name >= 64) {
|
|
print "Name: ($check_name) not compatible, need to longer than 6 charaters and shorter than 64\n";
|
|
next;
|
|
}
|
|
|
|
my $check = check_name($check_name);
|
|
|
|
if (defined $check and $check->{'status'} eq 'OK') {
|
|
printf "Name: (%s) is taken by this address (%s)\n", $check->{'name'}, $check->{'address'};
|
|
} else {
|
|
if ($options{'register'}) {
|
|
printf "Name: (%s) is AVAILABLE - and will be registered in a little while\n", $check_name;
|
|
register_name($check_name);
|
|
} else {
|
|
printf "Name: (%s) is AVAILABLE to register\n", $check_name;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub register_name {
|
|
|
|
my $name = shift;
|
|
|
|
my $max_wait = 120;
|
|
usage() if $options{'list'};
|
|
|
|
printf "Checking wallet RPC (%s)\n", $wallet_rpc;
|
|
my $count = 0;
|
|
while (not defined check_wallet_rpc() and $count < $max_wait) {
|
|
|
|
print "Please start wallet with --rpc-server option\n" if $count == 0;
|
|
|
|
printf "\rWaiting [%d/%d]... ", $count, $max_wait;
|
|
sleep 1;
|
|
|
|
$count++;
|
|
}
|
|
|
|
if (check_wallet_rpc()) {
|
|
printf "Wallet connected (%s)\n", $wallet_rpc;
|
|
|
|
my $reg;
|
|
my $reg_count = 0;
|
|
while ((not defined $reg or not exists $reg->{'result'}) and $reg_count < 3) {
|
|
$reg = register($name);
|
|
|
|
if (defined $reg and $reg->{'result'}) {
|
|
printf "Name: (%s) registered on the DERO Stargate with TX ID (%s)\n", $name, $reg->{'result'}->{'txid'};
|
|
} else {
|
|
printf "Error, something went wrong! log saved -> (%s.log)\n", $0;
|
|
open my $FILE, '>>', sprintf '%s.log', $0 or die "Faile to open logfile for writing";
|
|
print $FILE Dumper($reg);
|
|
close $FILE;
|
|
}
|
|
$reg_count++;
|
|
}
|
|
|
|
if (not defined $reg or not exists $reg->{'result'}) {
|
|
print "Failed to register, please check log file..\n";
|
|
print Dumper($reg);
|
|
exit 1;
|
|
}
|
|
|
|
my $reg_check;
|
|
$count = 0;
|
|
while (not defined $reg_check) {
|
|
my $reg_check = check_name($name);
|
|
|
|
if (defined $reg_check and $reg_check->{'status'} eq 'OK') {
|
|
printf "\rName: (%s) is now registered to this address (%s)\nCongratulations your name was successfully registered!\n", $reg_check->{'name'}, $reg_check->{'address'};
|
|
last;
|
|
} else {
|
|
printf "\rWaiting for registration to complete [%d/%d]... ", $count, $max_wait;
|
|
}
|
|
die "Something went wrong, it took too long to register!..\n" if $count > $max_wait;
|
|
sleep 1;
|
|
$count++;
|
|
}
|
|
|
|
} else {
|
|
print "Failed to connect with your wallet, please check your settings!\n";
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub register {
|
|
|
|
my $name = shift;
|
|
|
|
# Register
|
|
# curl http://127.0.0.1:40403/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"scinvoke","params":{"scid":"0000000000000000000000000000000000000000000000000000000000000001","ringsize":2, "sc_rpc":[{"name":"entrypoint","datatype":"S","value":"Register"}, {"name":"name","datatype":"S","value":"TESTUSERNAME" }] }}' -H 'Content-Type: application/json'
|
|
|
|
my $data = {
|
|
'jsonrpc' => '2.0',
|
|
'id' => 0,
|
|
'method' => 'scinvoke',
|
|
'params' => {
|
|
'scid' => '0000000000000000000000000000000000000000000000000000000000000001',
|
|
'ringsize' => 2,
|
|
'sc_rpc' => [
|
|
{
|
|
'name' => 'entrypoint',
|
|
'datatype' => 'S',
|
|
'value' => 'Register',
|
|
},
|
|
{
|
|
'name' => 'name',
|
|
'datatype' => 'S',
|
|
'value' => $name,
|
|
}
|
|
],
|
|
},
|
|
};
|
|
|
|
my $url = sprintf 'http://%s/json_rpc', $wallet_rpc;
|
|
|
|
my $status = decode_json( post_url($url, $data) );
|
|
|
|
print Dumper($status) if $debug;
|
|
|
|
return $status;
|
|
|
|
}
|
|
|
|
sub check_wallet_rpc {
|
|
|
|
my ($ip,$port) = split /:/, $wallet_rpc;
|
|
|
|
my $cmd = sprintf 'timeout 1 /usr/bin/nc -z %s %d', $ip, $port;
|
|
system "$cmd >/dev/null 2>&1";
|
|
if ( $? == 0 ) {
|
|
return 1;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
sub check_name {
|
|
|
|
my $name = shift;
|
|
|
|
# Check if name is registered
|
|
# curl http://127.0.0.1:40402/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"nametoaddress","params":{"name":"TESTUSERNAME" }}' -H 'Content-Type: application/json'
|
|
|
|
my $data = {
|
|
'jsonrpc' => '2.0',
|
|
'id' => 0,
|
|
'method' => 'nametoaddress',
|
|
'params' => {
|
|
'name' => $name,
|
|
},
|
|
};
|
|
|
|
my $url = sprintf '%s/json_rpc', $daemon;
|
|
|
|
|
|
my $response = decode_json( post_url($url, $data) );
|
|
|
|
print Dumper($response) if $debug;
|
|
|
|
return $response->{'result'} if defined $response and exists $response->{'result'};
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sub post_url {
|
|
|
|
|
|
my $url = shift;
|
|
my $data = shift;
|
|
|
|
print Dumper($data) if $debug;
|
|
|
|
my $response_data;
|
|
|
|
|
|
my $curl = WWW::Curl::Easy->new();
|
|
$curl->setopt( CURLOPT_URL, $url );
|
|
|
|
$curl->setopt( CURLOPT_POSTFIELDS, encode_json($data) );
|
|
$curl->setopt( CURLOPT_HTTPHEADER, [ 'Content-Type: application/json' ]);
|
|
$curl->setopt( CURLOPT_FOLLOWLOCATION, 1);
|
|
$curl->setopt( CURLOPT_WRITEDATA, \$response_data );
|
|
|
|
my $return_code = $curl->perform();
|
|
my $response_code = $curl->getinfo(CURLINFO_RESPONSE_CODE);
|
|
|
|
# If curl fails to get the URL - report the error and exit
|
|
if ( $return_code != 0 ) {
|
|
die "Failed to contact RPC API : $url";
|
|
}
|
|
|
|
return $response_data;
|
|
|
|
}
|
|
|