Crypto-Exchange-Binance-Spot-API

 view release on metacpan or  search on metacpan

lib/Crypto/Exchange/Binance/Spot/API.pm  view on Meta::CPAN

sub response_attr_pair {
    my ($self, $pair) = @_;
    my $bases = $self->base_currencies;

    return $bases->{$pair}
       || die "Pair [$pair] is not a support trading pair";
}

sub response_attr_timestamp {
    my ($self, $epoch) = @_;
    my $t = DateTime->from_epoch(epoch => $epoch / 1000);
    if (my $tz = $self->time_zone) {
        $t->set_time_zone($tz);
    }
    return sub {wantarray ? $t : "$t"};
}

sub response_attr_filled_time {
    return response_attr_timestamp(@_);
}

sub response_attr_last_updated {
    return response_attr_timestamp(@_);
}

sub set_prices {{
    request => {
        method => 'get',
        path   => '/api/v3/ticker/price',
        data   => {
            pair => {
                field_name => 'symbol',
                required   => 1,
            },
        },
        events => {
            keys => [ 'pair' ],
        },
    },
    response => {
        row => {
            pair       => 'symbol',
            last_price => 'price',
        },
    },
}}

sub set_balances {{
    request => {
        method => 'get',
        path   => '/api/v3/account',
        events => {
            keys => [ qw( timestamp signature ) ],
        },
    },
    response => {
        key  => 'balances',
        row  => {
            coin      => 'asset',
            available => 'free',
            in_order  => 'locked',
        },
        row_filter => sub {
            my ($self, $row) = @_;
            if ($row->{available} == 0 && $row->{in_order} == 0) {
                return 'next';
            }
        },
        array2hash => 'coin',
        post_row => sub {
            my ($self, $row, $rows) = @_;
            my $coin = $row->{coin};
            return if $coin =~ m/^LD/;
            my $earn = delete $rows->{"LD$coin"} || {available => 0};
            $rows->{$coin}{staking} = $earn->{available};
        },
    },
}}

sub set_list_open_orders {
    my ($self) = @_;

    my $spec = $self->set_list_all_orders;

    my $old_filter = $spec->{response}{row_filter} || sub {};

    $spec->{response}{row_filter} = sub {
        my ($self, $row) = @_;
        return $self->$old_filter($row)
            || $row->{status} eq 'FILLED' ? 'next' : '';
    };

    $spec->{response}{sort} = sub {
        my ($self, $a, $b) = @_;
        return ($a->{price} || 0) <=> ($b->{price} || 0);
    };

    return $spec;
}

sub set_list_filled_orders {
    my ($self) = @_;

    my $spec = $self->set_list_all_orders;

    my $old_filter = $spec->{response}{row_filter} || sub {};

    $spec->{response}{row}{filled_time} = delete $spec->{response}{row}{last_updated};

    $spec->{response}{row_filter} = sub {
        my ($self, $row) = @_;
        return $self->$old_filter($row)
            || $row->{status} ne 'FILLED' ? 'next' : '';
    };

    $spec->{response}{sort} = sub {
        my ($self, $a, $b) = @_;
        return $a->{filled_time}->().'' cmp $b->{filled_time}->().'';
    };

    return $spec;



( run in 2.034 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )