Finance-Crypto-Exchange-Kraken
view release on metacpan or search on metacpan
lib/Finance/Crypto/Exchange/Kraken.pm view on Meta::CPAN
sub _build_ua {
my $self = shift;
my $ua = LWP::UserAgent->new(
agent => sprintf("%s/%s", __PACKAGE__, $VERSION),
timeout => 10,
protocols_allowed => ['https'],
max_redirect => 0,
ssl_opts => { verify_hostname => 1 },
);
return $ua;
}
has _uri => (
is => 'ro',
isa => Uri,
coerce => 1,
default => 'https://api.kraken.com',
init_arg => 'base_uri',
);
has key => (
is => 'ro',
isa => 'Str',
predicate => 'has_key',
);
has secret => (
is => 'ro',
isa => 'Str',
predicate => 'has_secret',
);
has _nonce => (
is => 'ro',
isa => 'Str',
predicate => 'has_nonce',
init_arg => 'nonce'
);
sub nonce {
my $self = shift;
return $self->_nonce if $self->has_nonce;
return gettimeofday() * 100000;
}
sub call {
my ($self, $req) = @_;
foreach (qw(Content-Type Content-Length)) {
$req->headers->remove_header($_);
}
$req->headers->header(Accept => 'application/json');
my $response = $self->ua->request($req);
if ($response->is_success) {
my $data;
try {
$data = decode_json($response->decoded_content);
}
catch {
die "Unable to decode JSON from Kraken!", $/;
};
if (@{$data->{error}}) {
if (@{$data->{error}} > 1) {
die "Multiple errors occurred: " .
join($/, @{$data->{error}})
, $/;
}
else {
die $data->{error}[0], $/;
}
}
return $data->{result};
}
die "Error calling Kraken: " . $response->status_line, $/;
}
around 'BUILDARGS' => sub {
my ($orig, $class, %args) = @_;
if (my $secret = delete $args{secret}) {
$args{secret} = decode_base64url($secret);
}
return $class->$orig(%args);
};
sub supported_methods {
my $self = shift;
my @forbidden = qw(
call
meta
new
nonce
supported_methods
);
push(@forbidden, $self->meta->get_attribute_list);
my @list = grep { $_ =~ /^[a-z]/ && $_ !~ /^has_/ }
$self->meta->get_method_list;
return sort { $a cmp $b } array_minus(@list, @forbidden);
}
with qw(
Finance::Crypto::Exchange::Kraken::REST::Public
Finance::Crypto::Exchange::Kraken::REST::Private
);
__PACKAGE__->meta->make_immutable;
__END__
=pod
=encoding UTF-8
( run in 0.381 second using v1.01-cache-2.11-cpan-5b529ec07f3 )