WalletTest.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <?php
  2. use GuzzleHttp\Client;
  3. use GuzzleHttp\Handler\MockHandler;
  4. use GuzzleHttp\HandlerStack;
  5. use GuzzleHttp\Psr7\Response;
  6. use mattvb91\TronTrx\Account;
  7. use mattvb91\TronTrx\Address;
  8. use mattvb91\TronTrx\Api;
  9. use mattvb91\TronTrx\Block;
  10. use mattvb91\TronTrx\Exceptions\TronErrorException;
  11. use mattvb91\TronTrx\Transaction;
  12. use PHPUnit\Framework\TestCase;
  13. class WalletTest extends TestCase
  14. {
  15. private $_api;
  16. const TEST_INSTANTIATE_AMMOUNT_SUN = 10000001;
  17. const TEST_TRANSACTION_AMOUNT = 1000000;
  18. public function __construct(?string $name = null, array $data = [], string $dataName = '')
  19. {
  20. parent::__construct($name, $data, $dataName);
  21. $this->_api = new Api(new Client([
  22. 'base_uri' => 'https://api.shasta.trongrid.io',
  23. ]));
  24. }
  25. /**
  26. * @covers \mattvb91\TronTrx\Wallet::__construct
  27. * @covers \mattvb91\TronTrx\Address::__construct
  28. * @covers \mattvb91\TronTrx\Wallet::generateAddress
  29. * @covers \mattvb91\TronTrx\Wallet::genKeyPair
  30. */
  31. public function testGenerateAddress()
  32. {
  33. $wallet = new mattvb91\TronTrx\Wallet($this->_api);
  34. $address = $wallet->generateAddress();
  35. $this->assertInstanceOf(Address::class, $address);
  36. return $address;
  37. }
  38. /**
  39. * @covers \mattvb91\TronTrx\Wallet::validateAddress
  40. * @covers \mattvb91\TronTrx\Address::isValid
  41. */
  42. public function testValidatingAddress()
  43. {
  44. $wallet = new mattvb91\TronTrx\Wallet($this->_api);
  45. $address = new Address('test', '', '');
  46. $this->assertFalse($address->isValid());
  47. $address = new Address('1234567890123456789012345678901221', '', '');
  48. $this->assertFalse($address->isValid());
  49. $this->assertFalse($wallet->validateAddress($address));
  50. for ($i = 0; $i < 3; $i++) {
  51. $address = $wallet->generateAddress();
  52. $this->assertEquals($wallet->validateAddress($address), $address->isValid());
  53. }
  54. }
  55. /**
  56. * @depends testGenerateAddress
  57. */
  58. public function testSignatureHexSigning(Address $address)
  59. {
  60. $wallet = new mattvb91\TronTrx\Wallet($this->_api);
  61. $toHex = $wallet->toHex($address->address);
  62. $this->assertEquals($address->hexAddress, $toHex);
  63. $this->assertEquals($address->address, $wallet->hexString2Address($toHex));
  64. }
  65. /**
  66. * @covers \mattvb91\TronTrx\Wallet::easyTransferByPrivate
  67. * @return Address
  68. */
  69. public function testEasyTransferByPrivateThrowsException()
  70. {
  71. $this->expectException(Exception::class);
  72. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  73. $address = $wallet->generateAddress();
  74. $this->assertTrue($wallet->easyTransferByPrivate(
  75. 'PRIVATE',
  76. $address,
  77. 1
  78. ));
  79. }
  80. /**
  81. * @covers \mattvb91\TronTrx\Wallet::getAccount
  82. * @covers \mattvb91\TronTrx\Account::__construct
  83. */
  84. public function testGetAccount()
  85. {
  86. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  87. $address = $wallet->generateAddress();
  88. $this->instantiateAddress($address);
  89. $account = $wallet->getAccount($address);
  90. $this->assertInstanceOf(Account::class, $account);
  91. return $account;
  92. }
  93. /**
  94. * @covers \mattvb91\TronTrx\Wallet::getAccount
  95. */
  96. public function testGetAccountReturnsNullOnFail()
  97. {
  98. // Create a mock and queue two responses.
  99. $mock = new MockHandler([
  100. new Response(200, [], json_encode([])),
  101. ]);
  102. $handler = HandlerStack::create($mock);
  103. $client = new Client(['handler' => $handler]);
  104. $api = new Api($client);
  105. $wallet = new \mattvb91\TronTrx\Wallet($api);
  106. $address = new Address('NOT_VALID', '', $wallet->toHex('NOT_VALID'));
  107. $this->assertNull($wallet->getAccount($address));
  108. }
  109. /**
  110. * @covers \mattvb91\TronTrx\Wallet::createTransaction
  111. * @covers \mattvb91\TronTrx\Transaction::__construct
  112. */
  113. public function testCreateTransaction()
  114. {
  115. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  116. $toAddress = $wallet->generateAddress();
  117. $fromAddress = $wallet->generateAddress();
  118. $this->instantiateAddress($fromAddress);
  119. $transaction = $wallet->createTransaction($toAddress, $fromAddress, self::TEST_TRANSACTION_AMOUNT);
  120. $this->assertInstanceOf(Transaction::class, $transaction);
  121. return ['transaction' => $transaction, 'address' => $fromAddress];
  122. }
  123. /**
  124. * @covers \mattvb91\TronTrx\Wallet::signTransaction
  125. * @depends testCreateTransaction
  126. */
  127. public function testSignTransaction(array $input)
  128. {
  129. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  130. /** @var Transaction $transaction */
  131. $transaction = $input['transaction'];
  132. $wallet->signTransaction($transaction, $input['address']->privateKey);
  133. $this->assertTrue($transaction->isSigned());
  134. return $transaction;
  135. }
  136. /**
  137. * @covers \mattvb91\TronTrx\Wallet::broadcastTransaction
  138. */
  139. public function testBroadcastTransactionFailsWhenNotSigned()
  140. {
  141. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  142. $this->expectException(\Exception::class);
  143. $wallet->broadcastTransaction(new Transaction('', new stdClass()));
  144. }
  145. /**
  146. * @covers \mattvb91\TronTrx\Wallet::broadcastTransaction
  147. * @covers \mattvb91\TronTrx\Wallet::getTransactionById
  148. * @depends testSignTransaction
  149. */
  150. public function testBroadcastTransaction(Transaction $transaction)
  151. {
  152. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  153. $hexAddress = $transaction->raw_data->contract[0]->parameter->value->owner_address;
  154. $address = new Address($wallet->fromHex($hexAddress), '', $hexAddress);
  155. $beforeTransactionAccunt = $wallet->getAccount($address);
  156. $this->assertNotNull($beforeTransactionAccunt);
  157. $this->assertTrue($wallet->broadcastTransaction($transaction));
  158. $this->assertEquals($transaction->txID, $wallet->getTransactionById($transaction->txID)->txID);
  159. echo 'Success test transaction' . PHP_EOL;
  160. echo 'From Address: https://explorer.shasta.trongrid.io/address/' . $address->address . PHP_EOL;
  161. echo 'Transaction: https://explorer.shasta.trongrid.io/transaction/' . $transaction->txID . PHP_EOL;
  162. }
  163. /**
  164. * @covers \mattvb91\TronTrx\Wallet::getAccountNet
  165. */
  166. public function testGetAccountNet()
  167. {
  168. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  169. $netAccountTest = $wallet->generateAddress();
  170. $this->instantiateAddress($netAccountTest);
  171. $response = $wallet->getAccountNet($netAccountTest);
  172. $this->assertArrayHasKey('freeNetLimit', $response);
  173. $this->assertArrayHasKey('TotalNetLimit', $response);
  174. }
  175. /**
  176. * @depends testGetAccount
  177. * @covers \mattvb91\TronTrx\Wallet::getAccountNet
  178. */
  179. public function testGetAccountNetMock(Account $account)
  180. {
  181. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  182. $this->assertNull($wallet->getAccountNet($account->address));
  183. // Create a mock and queue two responses.
  184. $mock = new MockHandler([
  185. new Response(200, [], json_encode([
  186. 'freeNetLimit' => 5000,
  187. 'TotalNetLimit' => 43200000000,
  188. 'TotalNetWeight' => 5989300712,
  189. ])),
  190. ]);
  191. $handler = HandlerStack::create($mock);
  192. $client = new Client(['handler' => $handler]);
  193. $api = new Api($client);
  194. $wallet = new \mattvb91\TronTrx\Wallet($api);
  195. $this->assertNotEmpty($wallet->getAccountNet($account->address));
  196. }
  197. /**
  198. * @covers \mattvb91\TronTrx\Wallet::getNowBlock
  199. */
  200. public function testNowBlock()
  201. {
  202. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  203. $block = $wallet->getNowBlock();
  204. $this->assertInstanceOf(\mattvb91\TronTrx\Block::class, $block);
  205. return $block;
  206. }
  207. /**
  208. * @covers \mattvb91\TronTrx\Wallet::getBlockById
  209. * @depends testNowBlock
  210. */
  211. public function testBlockById(Block $block)
  212. {
  213. $wallet = new \mattvb91\TronTrx\Wallet($this->_api);
  214. $blockById = $wallet->getBlockById($block->blockID);
  215. $this->assertEquals($block, $blockById);
  216. $this->expectException(TronErrorException::class);
  217. $wallet->getBlockById('InvalidBlockId');
  218. }
  219. public function testFreezeBalance()
  220. {
  221. //Freeze balance of 2, then check accountnet for bandwidth.
  222. // $wallet->freezeBalance($address, 1000001, 1);
  223. // $wallet->getAccountNet($address);
  224. $this->markTestSkipped();
  225. }
  226. /**
  227. * @param Address $fromAddress
  228. */
  229. private function instantiateAddress(Address $fromAddress)
  230. {
  231. $this->assertEquals(200, $this->_api->getClient()->post('https://www.trongrid.io/shasta/submit', [
  232. 'form_params' => [
  233. 'value' => $fromAddress->address,
  234. ],
  235. ])->getStatusCode());
  236. }
  237. }