|
4 | 4 |
|
5 | 5 | use ArkEcosystem\Crypto\Enums\ContractAbiType; |
6 | 6 | use ArkEcosystem\Crypto\Utils\AbiDecoder; |
| 7 | +use kornrunner\Keccak; |
7 | 8 |
|
8 | 9 | it('should decode vote payload', function () { |
9 | 10 | $decoder = new AbiDecoder(); |
|
373 | 374 |
|
374 | 375 | $decoder->decodeError('123456'); |
375 | 376 | })->throws(Exception::class, 'Function selector not found in ABI: 123456'); |
| 377 | + |
| 378 | +test('should precompute selector maps for custom abi items', function () { |
| 379 | + $decoder = new AbiDecoder(ContractAbiType::CUSTOM, dirname(__DIR__, 2).'/fixtures/mock-abi-selectors.json'); |
| 380 | + |
| 381 | + $reflector = new ReflectionObject($decoder); |
| 382 | + $functions = $reflector->getProperty('functionSelectorMap'); |
| 383 | + $errors = $reflector->getProperty('errorSelectorMap'); |
| 384 | + $functions->setAccessible(true); |
| 385 | + $errors->setAccessible(true); |
| 386 | + |
| 387 | + $functionSelector = substr(Keccak::hash('transfer(address,uint256)', 256), 0, 8); |
| 388 | + $errorSelector = substr(Keccak::hash('InsufficientBalance(uint256,uint256)', 256), 0, 8); |
| 389 | + |
| 390 | + $functionMap = $functions->getValue($decoder); |
| 391 | + $errorMap = $errors->getValue($decoder); |
| 392 | + |
| 393 | + expect($functionMap)->toHaveKey($functionSelector); |
| 394 | + expect($functionMap[$functionSelector]['name'])->toBe('transfer'); |
| 395 | + expect($errorMap)->toHaveKey($errorSelector); |
| 396 | + expect($errorMap[$errorSelector]['name'])->toBe('InsufficientBalance'); |
| 397 | +}); |
| 398 | + |
| 399 | +test('should decode function and error payloads using custom selector maps', function () { |
| 400 | + $decoder = new AbiDecoder(ContractAbiType::CUSTOM, dirname(__DIR__, 2).'/fixtures/mock-abi-selectors.json'); |
| 401 | + |
| 402 | + $functionSelector = substr(Keccak::hash('transfer(address,uint256)', 256), 0, 8); |
| 403 | + $errorSelector = substr(Keccak::hash('InsufficientBalance(uint256,uint256)', 256), 0, 8); |
| 404 | + |
| 405 | + $to = 'b693449adda7efc015d87944eae8b7c37eb1690a'; |
| 406 | + $amount = str_pad(dechex(7), 64, '0', STR_PAD_LEFT); |
| 407 | + $data = '0x'.$functionSelector.str_pad($to, 64, '0', STR_PAD_LEFT).$amount; |
| 408 | + $decoded = $decoder->decodeFunctionData($data); |
| 409 | + $abiError = $decoder->decodeError('0x'.$errorSelector); |
| 410 | + |
| 411 | + expect($decoded)->toBe([ |
| 412 | + 'functionName' => 'transfer', |
| 413 | + 'args' => ['0xb693449AdDa7EFc015D87944EAE8b7C37EB1690A', '7'], |
| 414 | + ]); |
| 415 | + expect($abiError)->toBe('InsufficientBalance'); |
| 416 | +}); |
0 commit comments