File Coverage

blib/lib/Blockchain/Contract/Solidity/ABI/Decoder.pm
Criterion Covered Total %
statement 41 41 100.0
branch 1 2 50.0
condition 2 4 50.0
subroutine 12 12 100.0
pod 2 3 66.6
total 58 62 93.5


line stmt bran cond sub pod time code
1             package Blockchain::Contract::Solidity::ABI::Decoder;
2              
3 1     1   65769 use v5.26;
  1         21  
4 1     1   8 use strict;
  1         2  
  1         31  
5 1     1   5 use warnings;
  1         2  
  1         24  
6 1     1   435 no indirect;
  1         1097  
  1         5  
7              
8 1     1   57 use Carp;
  1         2  
  1         78  
9              
10 1     1   428 use Blockchain::Contract::Solidity::ABI::Type;
  1         4  
  1         54  
11 1     1   445 use Blockchain::Contract::Solidity::ABI::Type::Tuple;
  1         3  
  1         419  
12              
13             sub new {
14 1     1 0 98 my ($class, %params) = @_;
15              
16 1         3 my $self = {};
17 1         3 bless $self, $class;
18 1         4 return $self;
19             }
20              
21             sub _instances {
22 15     15   29 my $self = shift;
23 15   100     83 return $self->{instances} //= [];
24             }
25              
26             sub append {
27 8     8 1 16939 my ($self, $param) = @_;
28              
29 8         24 push $self->_instances->@*, Blockchain::Contract::Solidity::ABI::Type::new_type(signature => $param);
30 8         41 return $self;
31             }
32              
33             sub decode {
34 7     7 1 23 my ($self, $hex_data) = @_;
35              
36 7 50 0     58 croak 'Invalid hexadecimal value ' . $hex_data // 'undef'
37             unless $hex_data =~ /^(?:0x|0X)?([a-fA-F0-9]+)$/;
38              
39 7         26 my $hex = $1;
40 7         48 my @data = unpack("(A64)*", $hex);
41              
42 7         42 my $tuple = Blockchain::Contract::Solidity::ABI::Type::Tuple->new;
43 7         19 $tuple->{instances} = $self->_instances;
44 7         17 $tuple->{data} = \@data;
45 7         19 my $data = $tuple->decode;
46              
47 7         25 $self->_clean;
48 7         81 return $data;
49             }
50              
51             sub _clean {
52 7     7   20 my $self = shift;
53 7         34 delete $self->{instances};
54             }
55              
56             1;
57              
58             __END__