123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- <?php
- namespace Test\Unit;
- use InvalidArgumentException;
- use Test\TestCase;
- use Web3\Utils;
- use Web3\Contracts\Ethabi;
- use Web3\Contracts\Types\Address;
- use Web3\Contracts\Types\Boolean;
- use Web3\Contracts\Types\Bytes;
- use Web3\Contracts\Types\DynamicBytes;
- use Web3\Contracts\Types\Integer;
- use Web3\Contracts\Types\Str;
- use Web3\Contracts\Types\Uinteger;
- class EthabiTest extends TestCase
- {
- /**
- * abi
- *
- * @var \Web3\Contracts\Ethabi
- */
- protected $abi;
- /**
- * testJsonMethodString
- * from GameToken approve function
- *
- * @var string
- */
- protected $testJsonMethodString = '{
- "constant": false,
- "inputs": [
- {
- "name": "_spender",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "approve",
- "outputs": [
- {
- "name": "success",
- "type": "bool"
- }
- ],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function",
- "test": {
- "name": "testObject"
- }
- }';
- /**
- * encodingTests
- * from web3 abi.encodeParameter.js test
- * and web3 eth.abi.encodeParameters test
- * and web3 eth.abi.encodeParameter test
- *
- * @param array
- */
- protected $encodingTests = [
- [
- 'params' => [['uint256','string'], ['2345675643', 'Hello!%']],
- 'result' => '0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000'
- ], [
- 'params' => [['uint8[]','bytes32'], [['34','434'], '0x324567dfff']],
- 'result' => '0x0000000000000000000000000000000000000000000000000000000000000040324567dfff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000001b2'
- ], [
- 'params' => [['address','address','address', 'address'], ['0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1','','0x0', null]],
- 'result' => '0x00000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
- ], [
- 'params' => [['bool[2]', 'bool[3]'], [[true, false], [false, false, true]]],
- 'result' => '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001'
- ], [
- 'params' => [['int'], [1]],
- 'result' => '0x0000000000000000000000000000000000000000000000000000000000000001'
- ], [
- 'params' => [['int'], [16]],
- 'result' => '0x0000000000000000000000000000000000000000000000000000000000000010'
- ], [
- 'params' => [['int'], [-1]],
- 'result' => '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
- ], [
- 'params' => [['int256'], [1]],
- 'result' => '0x0000000000000000000000000000000000000000000000000000000000000001'
- ], [
- 'params' => [['int256'], [16]],
- 'result' => '0x0000000000000000000000000000000000000000000000000000000000000010'
- ], [
- 'params' => [['int256'], [-1]],
- 'result' => '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
- ], [
- 'params' => [['int[]'], [[3]]],
- 'result' => '0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003'
- ], [
- 'params' => [['int256[]'], [[3]]],
- 'result' => '0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003'
- ], [
- 'params' => [['int256[]'], [[1,2,3]]],
- 'result' => '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003'
- ], [
- 'params' => [['int[]','int[]'], [[1,2],[3,4]]],
- 'result' => '0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004'
- ]
- ];
- /**
- * decodingTests
- * from web3 abi.decodeParameter.js test
- * and web3 eth.abi.decodeParameters test
- * and web3 eth.abi.decodeParameter test
- *
- * @param array
- */
- protected $decodingTests = [
- [
- 'params' => [['uint256'], '0x0000000000000000000000000000000000000000000000000000000000000010'],
- 'result' => ['16']
- ], [
- 'params' => [['string'], '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000848656c6c6f212521000000000000000000000000000000000000000000000000'],
- 'result' => ['Hello!%!']
- ], [
- 'params' => [['uint256','string'], '0x000000000000000000000000000000000000000000000000000000008bd02b7b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000748656c6c6f212500000000000000000000000000000000000000000000000000'],
- 'result' => ['2345675643', 'Hello!%']
- ], [
- 'params' => [['string'], '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'],
- 'result' => ['']
- ], [
- 'params' => [['int256'], '0x0000000000000000000000000000000000000000000000000000000000000000'],
- 'result' => ['0']
- ], [
- 'params' => [['uint256'], '0x0000000000000000000000000000000000000000000000000000000000000000'],
- 'result' => ['0']
- ], [
- 'params' => [['address'], '0x0000000000000000000000000000000000000000000000000000000000000000'],
- 'result' => ['0x0000000000000000000000000000000000000000']
- ], [
- 'params' => [['bool'], '0x0000000000000000000000000000000000000000000000000000000000000000'],
- 'result' => [false]
- ], [
- 'params' => [['bytes'], '0x0000000000000000000000000000000000000000000000000000000000000000'],
- 'result' => ['0']
- ], [
- 'params' => [['bytes32'], '0x0000000000000000000000000000000000000000000000000000000000000000'],
- 'result' => ['0']
- ], [
- 'params' => [['bytes32'], '0xdf32340000000000000000000000000000000000000000000000000000000000'],
- 'result' => ['0xdf32340000000000000000000000000000000000000000000000000000000000']
- ], [
- 'params' => [['bytes32[]'], '0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002df32340000000000000000000000000000000000000000000000000000000000fdfd000000000000000000000000000000000000000000000000000000000000'],
- 'result' => ['0xdf32340000000000000000000000000000000000000000000000000000000000', '0xfdfd000000000000000000000000000000000000000000000000000000000000']
- ]
- ];
- /**
- * setUp
- *
- * @return void
- */
- public function setUp()
- {
- parent::setUp();
- // Error: Using $this when not in object context
- // $this->abi = new Ethabi([
- // 'address' => Address::class,
- // 'bool' => Boolean::class,
- // 'bytes' => Bytes::class,
- // 'int' => Integer::class,
- // 'string' => Str::class,
- // 'uint' => Uinteger::class,
- // ]);
- $this->abi = new Ethabi([
- 'address' => new Address,
- 'bool' => new Boolean,
- 'bytes' => new Bytes,
- 'dynamicBytes' => new DynamicBytes,
- 'int' => new Integer,
- 'string' => new Str,
- 'uint' => new Uinteger
- ]);
- }
- /**
- * testEncodeFunctionSignature
- *
- * @return void
- */
- public function testEncodeFunctionSignature()
- {
- $abi = $this->abi;
- $str = $abi->encodeFunctionSignature('baz(uint32,bool)');
- $this->assertEquals($str, '0xcdcd77c0');
- $json = json_decode($this->testJsonMethodString);
- $methodString = Utils::jsonMethodToString($json);
- $str = $abi->encodeFunctionSignature($methodString);
- $this->assertEquals($str, '0x095ea7b3');
- $str = $abi->encodeFunctionSignature('bar(bytes3[2])');
- $this->assertEquals($str, '0xfce353f6');
- $str = $abi->encodeFunctionSignature('sam(bytes,bool,uint256[])');
- $this->assertEquals($str, '0xa5643bf2');
- }
- /**
- * testEncodeEventSignature
- *
- * @return void
- */
- public function testEncodeEventSignature()
- {
- $abi = $this->abi;
- $str = $abi->encodeEventSignature('baz(uint32,bool)');
- $this->assertEquals($str, '0xcdcd77c0992ec5bbfc459984220f8c45084cc24d9b6efed1fae540db8de801d2');
- $json = json_decode($this->testJsonMethodString);
- $methodString = Utils::jsonMethodToString($json);
- $str = $abi->encodeEventSignature($methodString);
- $this->assertEquals($str, '0x095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba');
- }
- /**
- * testEncodeParameter
- *
- * @return void
- */
- public function testEncodeParameter()
- {
- $abi = $this->abi;
- $this->assertEquals('0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', $abi->encodeParameter('int256', '-1'));
- }
- /**
- * testEncodeParameters
- *
- * @return void
- */
- public function testEncodeParameters()
- {
- $abi = $this->abi;
- foreach ($this->encodingTests as $test) {
- $this->assertEquals($test['result'], $abi->encodeParameters($test['params'][0], $test['params'][1]));
- }
- }
- /**
- * testDecodeParameter
- *
- * @return void
- */
- public function testDecodeParameter()
- {
- $abi = $this->abi;
- $this->assertEquals('16', $abi->decodeParameter('uint256', '0x0000000000000000000000000000000000000000000000000000000000000010')->toString());
- $this->assertEquals('16', $abi->decodeParameter('uint256', '0x0000000000000000000000000000000000000000000000000000000000000010')->toString());
- }
- /**
- * testDecodeParameters
- *
- * @return void
- */
- public function testDecodeParameters()
- {
- $abi = $this->abi;
- foreach ($this->decodingTests as $test) {
- $decoded = $abi->decodeParameters($test['params'][0], $test['params'][1]);
- foreach ($decoded as $key => $decoding) {
- if (!is_array($decoding)) {
- $this->assertEquals($test['result'][$key], $decoding);
- } else {
- foreach ($test['result'] as $rKey => $expected) {
- $this->assertEquals($expected, $decoding[$rKey]);
- }
- }
- }
- }
- }
- /**
- * testIssue71
- * test 33 bytes and 128 bytes string, see: https://github.com/sc0Vu/web3.php/issues/71
- * string generated from: https://www.lipsum.com/
- *
- * @return void
- */
- public function testIssue71()
- {
- $abi = $this->abi;
- $specialString = 'Lorem ipsum dolor sit amet metus.';
- $encodedString = $abi->encodeParameter('string', $specialString);
- $this->assertEquals($specialString, $abi->decodeParameter('string', $encodedString));
- $specialString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce pulvinar quam felis, suscipit posuere neque aliquam in cras amet.';
- $encodedString = $abi->encodeParameter('string', $specialString);
- $this->assertEquals($specialString, $abi->decodeParameter('string', $encodedString));
- }
- }
|