Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
9b58df3
handle hex2bin exception instead of relying on returning false
alexbarnsley Jun 11, 2025
fcb9b68
remove legacy message public key formatting & handling
alexbarnsley Jun 11, 2025
70877d2
test: remaining utils coverage
alexbarnsley Jun 11, 2025
df46cb1
style: resolve style guide violations
alexbarnsley Jun 11, 2025
a9bd031
Merge remote-tracking branch 'origin/feat/mainsail' into test/remaini…
alexbarnsley Jun 16, 2025
6ae540a
remove string check for writing uint256
alexbarnsley Jun 16, 2025
45225ca
remove unused network method
alexbarnsley Jun 16, 2025
56e7519
bytebuffer tests
alexbarnsley Jun 16, 2025
8a6efa7
address validation tests
alexbarnsley Jun 16, 2025
92c7918
deserializer tests
alexbarnsley Jun 16, 2025
588afe6
abi function enum tests
alexbarnsley Jun 16, 2025
c238821
add coverage to tests
alexbarnsley Jun 16, 2025
a83bc22
add phpunit xml
alexbarnsley Jun 16, 2025
c3fa41d
remove missing folder
alexbarnsley Jun 16, 2025
0f55d84
style: resolve style guide violations
alexbarnsley Jun 16, 2025
d8a9888
set minimum coverage
alexbarnsley Jun 16, 2025
156c82b
Merge remote-tracking branch 'origin/feat/mainsail' into refactor/rem…
alexbarnsley Mar 4, 2026
d6e2cc6
missing coverage
alexbarnsley Mar 4, 2026
ff7b010
style: resolve style guide violations
alexbarnsley Mar 4, 2026
ccbdbed
Update tests/Unit/Identities/AddressTest.php
alexbarnsley Mar 5, 2026
17f898c
Update tests/Unit/Enums/AbiFunctionTest.php
alexbarnsley Mar 5, 2026
f61c9c6
style: resolve style guide violations
alexbarnsley Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
"vendor/bin/php-cs-fixer fix"
],
"test": [
"./vendor/bin/pest --coverage --min=96 --coverage-html=.coverage --coverage-clover=coverage.xml"
"./vendor/bin/pest --coverage --min=100 --coverage-html=.coverage --coverage-clover=coverage.xml"
]
},
"minimum-stability": "dev",
Expand Down
14 changes: 8 additions & 6 deletions phpunit.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true" cacheDirectory=".phpunit.cache">
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
cacheDirectory=".phpunit.cache"
>
<testsuites>
<testsuite name="Analysis">
<directory suffix="Test.php">./tests/Analysis</directory>
</testsuite>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
<testsuite name="Test Suite">
<directory suffix="Test.php">./tests</directory>
</testsuite>
</testsuites>
<source>
Expand Down
2 changes: 1 addition & 1 deletion src/ByteBuffer/Concerns/Writes/UnsignedInteger.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public function writeUInt64(int $value, int $offset = 0): self
public function writeUInt256($value, int $offset = 0): self
{
// Convert the value to a GMP object for handling large numbers
if (is_numeric($value) || is_string($value)) {
if (is_numeric($value)) {
$gmpValue = gmp_init($value);
} elseif ($value instanceof \GMP) {
$gmpValue = $value;
Expand Down
10 changes: 1 addition & 9 deletions src/Networks/AbstractNetwork.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,9 @@ abstract class AbstractNetwork extends Network implements NetworkInterface
* @see Network::$base58PrefixMap
*/
protected $base58PrefixMap = [
self::BASE58_WIF => 'aa', // 170
self::BASE58_WIF => 'aa', // 170
];

/**
* {@inheritdoc}
*/
public static function __callStatic(string $method, array $args)
{
return static::factory()->{$method}(...$args);
}

/**
* Create a new network instance.
*
Expand Down
7 changes: 7 additions & 0 deletions tests/Unit/ByteBuffer/ByteBufferTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,13 @@
expect($buffer->internalSize())->toBe(4 + 11);
});

it('should fill the buffer starting from a different start point', function () {
$buffer = ByteBuffer::new('hello');
$buffer->fill(11, 4);

expect($buffer->internalSize())->toBe(4 + 11);
});

it('should flip the buffer contents', function () {
$buffer = ByteBuffer::new('Hello World');
$buffer->flip();
Expand Down
10 changes: 10 additions & 0 deletions tests/Unit/ByteBuffer/Concerns/Reads/UnsignedIntegerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,13 @@

expect($buffer->readULong())->toBe(64);
});

test('it should read uint256', function () {
// 256-bit unsigned integer (32 bytes)
$value = '1157920892373161954235709850086879078532699846656405640323232344'; // max uint256
$buffer = ByteBuffer::new(0);
$buffer->writeUInt256($value);
$buffer->position(0);

expect($buffer->readUInt256())->toBe($value);
});
32 changes: 32 additions & 0 deletions tests/Unit/ByteBuffer/Concerns/Writes/UnsignedIntegerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,35 @@

expect($buffer->internalSize())->toBe(8);
});

test('it should write uint256', function () {
// 256-bit unsigned integer (32 bytes)
$value = '1157920892373161954235709850086879078532699846656405640323232344'; // max uint256
$buffer = ByteBuffer::new(0);
$buffer->writeUInt256($value);

expect($buffer->internalSize())->toBe(32);
});

test('it should write uint256 gmp value', function () {
// 256-bit unsigned integer (32 bytes)
$value = gmp_init('1157920892373161954235709850086879078532699846656405640323232344'); // max uint256
$buffer = ByteBuffer::new(0);
$buffer->writeUInt256($value);

expect($buffer->internalSize())->toBe(32);
});

test('it should throw exception when writing invalid uint256', function () {
// 256-bit unsigned integer (32 bytes)
$value = 'asd';
$buffer = ByteBuffer::new(0);
$buffer->writeUInt256($value);
})->throws(InvalidArgumentException::class, 'The value must be a numeric string, integer, or GMP object.');

test('it should throw exception when writing uint256 which is too long', function () {
// 256-bit unsigned integer (32 bytes)
$value = '1157920892373161954235709850086879078532699846656405640323232344444411579208923731619542357098500868790785326998466564056403232323444444';
$buffer = ByteBuffer::new(0);
$buffer->writeUInt256($value);
})->throws(InvalidArgumentException::class, 'The value must fit into 256 bits.');
24 changes: 24 additions & 0 deletions tests/Unit/Enums/AbiFunctionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

declare(strict_types=1);

use ArkEcosystem\Crypto\Enums\AbiFunction;
use ArkEcosystem\Crypto\Transactions\Types\Multipayment;
use ArkEcosystem\Crypto\Transactions\Types\Unvote;
use ArkEcosystem\Crypto\Transactions\Types\UsernameRegistration;
use ArkEcosystem\Crypto\Transactions\Types\UsernameResignation;
use ArkEcosystem\Crypto\Transactions\Types\ValidatorRegistration;
use ArkEcosystem\Crypto\Transactions\Types\ValidatorResignation;
use ArkEcosystem\Crypto\Transactions\Types\Vote;

it('should get transaction class', function ($type, $class) {
expect(constant(AbiFunction::class.'::'.$type)->transactionClass())->toEqual($class);
})->with([
'Vote' => ['VOTE', Vote::class],
'Unvote' => ['UNVOTE', Unvote::class],
'ValidatorRegistration' => ['VALIDATOR_REGISTRATION', ValidatorRegistration::class],
'ValidatorResignation' => ['VALIDATOR_RESIGNATION', ValidatorResignation::class],
'UsernameRegistration' => ['USERNAME_REGISTRATION', UsernameRegistration::class],
'UsernameResignation' => ['USERNAME_RESIGNATION', UsernameResignation::class],
'Multipayment' => ['MULTIPAYMENT', Multipayment::class],
]);
14 changes: 14 additions & 0 deletions tests/Unit/Identities/AddressTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,17 @@

expect($actual)->toBe($fixture['data']['address']);
});

it('should validate an address', function () {
$fixture = $this->getFixture('identity');

$actual = Address::validate($fixture['data']['address']);

expect($actual)->toBeTrue();
});

it('should return false for an invalid address', function () {
$actual = Address::validate('invalid-address');

expect($actual)->toBeFalse();
});
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@
expect((string) $builder)->toBe($builder->toJson());
});

it('should set value on the transaction', function () {
$builder = ValidatorRegistrationBuilder::new()
->value(UnitConverter::parseUnits(10, 'ark'));

expect((string) $builder->transaction->data['value'])->toBe('10000000000000000000');
});

it('should convert to an array', function () {
$fixture = $this->getTransactionFixture('evm_call', 'unvote');

Expand Down
43 changes: 43 additions & 0 deletions tests/Unit/Transactions/DeserializerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

declare(strict_types=1);

use ArkEcosystem\Crypto\Transactions\Deserializer;
use ArkEcosystem\Crypto\Transactions\Types\EvmCall;
use ArkEcosystem\Crypto\Transactions\Types\Multipayment;
use ArkEcosystem\Crypto\Transactions\Types\Transfer;
Expand Down Expand Up @@ -88,3 +89,45 @@

expect($transaction)->toBeInstanceOf(Multipayment::class);
});

it('should use ByteBuffer::fromHex when there is no null-byte in the string', function () {
// The string does not contain a null-byte
$hexString = 'abcdef1234567890';
$deserializer = new Deserializer($hexString);

// Use reflection to access the private buffer property
$reflection = new ReflectionClass($deserializer);
$bufferProperty = $reflection->getProperty('buffer');
$bufferProperty->setAccessible(true);
$buffer = $bufferProperty->getValue($deserializer);

// The buffer should be an instance of ByteBuffer
expect($buffer)->toBeInstanceOf(ArkEcosystem\Crypto\ByteBuffer\ByteBuffer::class);

// The buffer should contain the hex string (converted to binary)
expect($buffer->toString('hex'))->toContain($hexString);
});

it('should use ByteBuffer::fromBinary when there is a null-byte in the string', function () {
// The string contains a null-byte
$binaryString = "abc\0def"; // hex: 61626300646566
$hexString = '61626300646566';
$deserializer = new Deserializer($binaryString);

// Use reflection to access the private buffer property
$reflection = new ReflectionClass($deserializer);
$bufferProperty = $reflection->getProperty('buffer');
$bufferProperty->setAccessible(true);
$buffer = $bufferProperty->getValue($deserializer);

// The buffer should be an instance of ByteBuffer
expect($buffer)->toBeInstanceOf(ArkEcosystem\Crypto\ByteBuffer\ByteBuffer::class);

// The buffer should contain the binary string
expect($buffer->toString('hex'))->toBe($hexString);
});

it('should return null if no data value in transaction data', function () {
expect(Deserializer::decodePayload([]))->toBeNull();
expect(Deserializer::decodePayload(['data' => '']))->toBeNull();
});
18 changes: 18 additions & 0 deletions tests/Unit/Utils/AbiEncoderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,24 @@ function testPrivateMethod(string $methodName, &$object): ReflectionMethod
testPrivateMethod('encodeTuple', $object)->invokeArgs($object, [$tuple, $param]);
})->throws(Exception::class, 'Tuple value missing component: from');

it('should error when encoding a tuple with unnamed component', function () {
$tuple = [
'from' => '0xb693449AdDa7EFc015D87944EAE8b7C37EB1690A',
];

$param = [
'name' => 'recipients',
'type' => 'address',
'components' => [
[
'type' => 'address',
],
],
];

testPrivateMethod('encodeTuple', $object)->invokeArgs($object, [$tuple, $param]);
})->throws(Exception::class, 'Tuple component missing name');

it('should error for missing function name when preparing function data', function () {
$param = [
...json_decode(file_get_contents(dirname(dirname(dirname(__DIR__))).'/src/Utils/Abi/json/Abi.Consensus.json'), true),
Expand Down
3 changes: 2 additions & 1 deletion tests/Unit/Utils/TransactionUtilsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
it('should handle string data starting with 0x', function () {
$fixture = $this->getTransactionFixture('evm_call', 'username-resignation');

$fixture['data']['nonce'] = '0x'.dechex((int) $fixture['data']['nonce']);
$fixture['data']['gasPrice'] = '0x'.dechex((int) $fixture['data']['gasPrice']);
$fixture['data']['nonce'] = '0x'.dechex((int) $fixture['data']['nonce']);

$transaction = TransactionUtils::toBuffer($fixture['data']);

Expand Down
Loading