├── .gitignore ├── .idea └── workspace.xml ├── bscphp ├── demo │ └── BscTool.php └── src │ ├── Bep20.php │ ├── Bep721.php │ ├── Callback.php │ ├── Credential.php │ ├── Kit.php │ ├── NodeClient.php │ ├── SmartContract.php │ ├── Transactor.php │ └── helper.php ├── composer.json └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /bscphp/.git/ 2 | /bscphp/.idea/ 3 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {} 7 | -------------------------------------------------------------------------------- /bscphp/demo/BscTool.php: -------------------------------------------------------------------------------- 1 | get(BscNet::NOW_NET_REDIS_KEY); 85 | if (!$nowNet) { 86 | $nowNet = self::$_net; 87 | // $res = UserService::bscNet(); 88 | // if($res['code'] == 0){ 89 | // $nowNet = $res['data']; 90 | // $redis->set(BscNet::NOW_NET_REDIS_KEY,$nowNet,10 * 60); 91 | // }else{ 92 | // $nowNet = self::$_net; 93 | // } 94 | } 95 | // if(App::getConfig('bsc_net') != $nowNet){ 96 | // App::setConfig('bsc_net',$nowNet); 97 | // } 98 | return $nowNet; 99 | } 100 | 101 | /** 102 | * @param $str 103 | * @param bool $prefix 104 | * @return string 105 | */ 106 | public static function hex($str, $prefix = true) 107 | { 108 | $bn = gmp_init($str); 109 | $ret = gmp_strval($bn, 16); 110 | return $prefix ? '0x' . $ret : $ret; 111 | } 112 | 113 | public static function bn($n) 114 | { 115 | return new phpseclib\Math\BigInteger($n); 116 | } 117 | 118 | public static function hex2str($bn) 119 | { 120 | return gmp_strval(Utils::toBn($bn)->value); 121 | } 122 | 123 | /** 124 | * 查询交易状态 125 | * @author haiqing.lin 126 | * @date 2021/7/28 0028 127 | */ 128 | public static function transferState($txid, $timeOut = 60, $verify_net = '') 129 | { 130 | try { 131 | if ($verify_net) { 132 | $net = $verify_net; 133 | } else { 134 | $net = self::myNet(); 135 | } 136 | $c = NodeClient::create($net); 137 | $re = $c->waitForConfirmation($txid, $timeOut); 138 | if (!$re) { 139 | return $re; 140 | } 141 | return Common::object2array($re); 142 | } catch (Throwable $e) { 143 | if ($e->getMessage() == 'tx not confirmed yet.') { 144 | return false; 145 | } 146 | } 147 | } 148 | 149 | /** 150 | * 创建地址 151 | * @author haiqing.lin 152 | * @date 2021/7/28 0028 153 | */ 154 | public static function create() 155 | { 156 | $c = Credential::create(); 157 | 158 | $data['address'] = $c->getAddress(); 159 | $data['private_key'] = $c->getPrivateKey(); 160 | $data['public_key'] = $c->getPublicKey(); 161 | 162 | return $data; 163 | } 164 | 165 | 166 | 167 | /** 168 | * 转出 169 | * @param $alice_sk 转出人私钥 170 | * @param $toAddress 转出地址 171 | * @param $num 转出数量 172 | * @param $tokenAddr token地址 173 | * @return string 174 | * @throws Exception 175 | * @author haiqing.lin 176 | * @date 2021/7/28 0028 177 | */ 178 | public static function transfer($alice_sk, $toAddress, $num, $tokenAddr = '', $net = '') 179 | { 180 | if (!$alice_sk) { 181 | return BaseService::res('密钥缺失',1); 182 | } 183 | if (!$net) { 184 | $net = self::myNet(); 185 | } 186 | try { 187 | $kit = new Kit( 188 | NodeClient::create($net), 189 | Credential::fromKey($alice_sk) 190 | ); 191 | if ($tokenAddr) { 192 | $kit = $kit->bep20($tokenAddr); 193 | } 194 | //设置gas费倍数 1.5倍合适 195 | // $kit->setGrade(1); 196 | $res = $kit->transfer( 197 | $toAddress, 198 | self::hex($num) 199 | 200 | ); 201 | if(isset($res['param']['gasPrice'])){ 202 | $res['param']['gasPrice_10'] =bcdiv(EthTool::hex2str($res['param']['gasPrice']),pow(10, 18),18); 203 | } 204 | if(isset($res['param']['nonce'])){ 205 | $res['param']['nonce_10'] = EthTool::hex2str($res['param']['nonce']); 206 | } 207 | if(isset($res['param']['gasLimit'])){ 208 | if(!is_numeric($res['param']['gasLimit'])){ 209 | $res['param']['gasLimit_10'] = EthTool::hex2str($res['param']['gasLimit']); 210 | } 211 | } 212 | return BaseService::res($res); 213 | } catch (Throwable $e) { 214 | return BaseService::res($e->getMessage(), 1); 215 | // if ($e->getMessage() == 'invalid argument 0: json: cannot unmarshal hex string without 0x prefix into Go struct field TransactionArgs.chainId of type *hexutil.Big') { 216 | // return self::transfer($alice_sk, $recipient, $num, $tokenAddr); 217 | // } 218 | // return ['code' => 1, 'msg' => $e->getMessage()]; 219 | } 220 | } 221 | 222 | 223 | /** 224 | * 获取币种信息 225 | * @param $token 226 | * @return array 227 | */ 228 | public static function tokenInfo( $token = '0x0000000000000000000000000000000000000000') 229 | { 230 | 231 | try { 232 | $kit = new Kit( 233 | NodeClient::create(self::myNet()), 234 | Credential::fromKey(self::$_default_sk) 235 | ); 236 | $inst = $kit->bep20($token); 237 | 238 | $tokenInfo = [ 239 | 'name' => $inst->name(), 240 | 'symbol' => $inst->symbol(), 241 | 'decimals' => gmp_strval(Utils::toBn($inst->decimals())->value), 242 | 'totalSupply' => gmp_strval(Utils::toBn($inst->totalSupply())->value), 243 | ]; 244 | return BaseService::res($tokenInfo); 245 | } catch (Throwable $e) { 246 | return BaseService::res($e->getMessage(), 1); 247 | } 248 | // try { 249 | // $decimals = $inst->decimals(); 250 | // // var_dump($inst->name()); 251 | // // var_dump($inst->symbol()); 252 | // // var_dump($inst->decimals()); 253 | // $nonce = gmp_strval(Utils::toBn($inst->decimals())->value); 254 | // var_dump($nonce); 255 | // var_dump(gmp_strval(Utils::toBn($inst->totalSupply())->value)); 256 | // // $balance = $inst->balanceOf($erc20->getAccount("ETHEREUM-ADDRESS")); 257 | // // var_dump($balance); 258 | // // var_dump($inst->getScaledValue($balance)); 259 | 260 | // } catch (Throwable $e) { 261 | // sleep(1); 262 | // 263 | // } 264 | 265 | } 266 | 267 | /** 268 | * 根据区块号获取交易 269 | * @param $blockNumber 270 | * @return mixed 271 | */ 272 | public static function getBlockByNumber($blockNumber) 273 | { 274 | $tc = NodeClient::create(self::myNet()); 275 | return $tc->getBlockByNumber($blockNumber); 276 | } 277 | 278 | /** 279 | * 调用ETH方法 blockNumber 查询最新区块高度 280 | * @param $method 281 | * @return string 282 | */ 283 | public static function callEthMethod($method = 'blockNumber', $verify_net = '') 284 | { 285 | if ($verify_net) { 286 | $net = $verify_net; 287 | } else { 288 | $net = self::myNet(); 289 | } 290 | $tc = NodeClient::create($net); 291 | $res = $tc->callEthMethod($method); 292 | if ($method != 'blockNumber') { 293 | return $res; 294 | } 295 | return gmp_strval(Utils::toBn($res)->value); 296 | 297 | } 298 | 299 | /** 300 | * 获取余额 301 | * @param $alice_sk 302 | * @param string $tokenAddr 303 | * @return float|int 304 | * @author haiqing.lin 305 | * @date 2021/7/30 0030 306 | */ 307 | public static function balance($tokenAddr = '', $addr = '', $decimal = 0,$alice_sk = '') 308 | { 309 | if (!$alice_sk) { 310 | $alice_sk = self::$_default_sk; 311 | } 312 | try { 313 | $kit = new Kit( 314 | NodeClient::create(self::myNet()), 315 | Credential::fromKey($alice_sk) 316 | ); 317 | if ($addr) { 318 | $sender = $addr; 319 | } else { 320 | $sender = $kit->getSender(); 321 | } 322 | if ($tokenAddr) { 323 | $kit = $kit->bep20($tokenAddr); 324 | if (!$decimal) { 325 | $decimal = gmp_strval(Utils::toBn($kit->decimals())->value); 326 | } 327 | } 328 | $balance = (string)$kit->balanceOf($sender); 329 | 330 | return Common::myFloat(bcdiv($balance, pow(10,$decimal), $decimal)); 331 | // return round($balance / $decimal, 8); 332 | 333 | } catch (Throwable $e) { 334 | return ['err'=>$e->getMessage()]; 335 | sleep(1); 336 | return self::balance($alice_sk, $tokenAddr, $addr, $decimal); 337 | } 338 | 339 | } 340 | 341 | /** 342 | * 查询地址的交易记录 343 | * @param $address 344 | * @return array 345 | * @author haiqing.lin 346 | * @date 2021/8/1 347 | */ 348 | public static function getTxlist($address, $tokenAddr = '') 349 | { 350 | if ($tokenAddr) { 351 | $address = $tokenAddr; 352 | } 353 | // $url = 'https://api.bscscan.com/api?module=account&action=txlist&address='.$address. 354 | // '&startblock=0&endblock=99999999&page=1&offset=10000&sort=desc&apikey=YourApiKeyToken&token='; 355 | $url = 'https://api.polygonscan.com/api?module=account&action=txlist&address=' . $address . 356 | '&startblock=0&endblock=99999999&page=1&offset=10000&sort=desc&apikey=YourApiKeyToken&token='; 357 | $data = file_get_contents($url); 358 | $data = json_decode($data, true); 359 | if (strpos($data['message'], 'OK') !== false) { 360 | return array_column($data['result'], null, 'hash'); 361 | } 362 | return []; 363 | } 364 | 365 | 366 | /** 367 | * NFT项目扫块 368 | * @param string $type 369 | * @param string $begin 370 | * @param string $end 371 | * @return array|string 372 | */ 373 | public static function nftQueryGas($type = 'tool', $begin = 'latest', $end = 'latest', $net = '') 374 | { 375 | $contract = AppConfig::getConfig('contract', $type); 376 | $private_key = $contract['admin_private_key']; 377 | if (!$net) { 378 | $net = self::myNet(); 379 | } 380 | try { 381 | $kit = new Kit( 382 | NodeClient::create($net), 383 | Credential::fromKey($private_key) 384 | ); 385 | $contractAddress = $contract['token']; 386 | $kotAbi = $contract['abi']; 387 | $inst = $kit->bep20($contractAddress, $kotAbi); 388 | $re = $inst->queryEvents([], $begin, $end); 389 | return $re; 390 | } catch (Throwable $e) { 391 | if ($e->getMessage() == 'too many requests') { 392 | return self::nftQueryGas($type, $begin, $end); 393 | } 394 | return 'error:' . $e->getMessage(); 395 | } 396 | 397 | } 398 | 399 | public static function nonce($username, $verify_net = '') 400 | { 401 | if ($verify_net) { 402 | $net = $verify_net; 403 | } else { 404 | $net = self::myNet(); 405 | } 406 | $web3 = NodeClient::create($net); 407 | $cb = new Callback; 408 | $web3->eth->getTransactionCount($username, 'pending', $cb); 409 | return gmp_strval(Utils::toBn($cb->result)->value); 410 | } 411 | 412 | 413 | public static function gasPrice($verify_net = '') 414 | { 415 | if ($verify_net) { 416 | $net = $verify_net; 417 | } else { 418 | $net = self::myNet(); 419 | } 420 | $web3 = NodeClient::create($net); 421 | $cb = new Callback; 422 | $web3->eth->gasPrice($cb); 423 | $gas = gmp_strval(Utils::toBn($cb->result)->value); 424 | return $gas; 425 | } 426 | 427 | 428 | /** 429 | * nft项目通用调用 430 | * @param $name 431 | * @param ...$arg 432 | * @return array 433 | */ 434 | public static function nft($type, $name, ...$arg) 435 | { 436 | $verify_net = ''; 437 | 438 | if (is_array($type)) { 439 | $verify_net = $type['verify_net'] ?? ''; 440 | 441 | if (isset($type['private_key'])) { 442 | $private_key = $type['private_key']; 443 | } 444 | if (isset($type['value'])) { 445 | $value = $type['value']; 446 | } 447 | $type = $type['type']; 448 | } 449 | if ($verify_net) { 450 | $net = $verify_net; 451 | } else { 452 | $net = self::myNet(); 453 | } 454 | $contract = AppConfig::getConfig('contract', $type); 455 | if (!isset($private_key)) { 456 | $private_key = $contract['admin_private_key']; 457 | } 458 | 459 | try { 460 | $web3 = NodeClient::create($net); 461 | 462 | $kit = new Kit( 463 | $web3, 464 | Credential::fromKey($private_key) 465 | ); 466 | 467 | $contractAddress = $contract['token']; 468 | $abi = $contract['abi']; 469 | $inst = $kit->bep20($contractAddress, $abi); 470 | $cb = new Callback; 471 | $web3->eth->getTransactionCount($contract['admin_address'], 'pending', $cb); 472 | $nonce = gmp_strval(Utils::toBn($cb->result)->value); 473 | if ($verify_net) { 474 | $inst->setGasLimit(200000); 475 | $web3->eth->gasPrice($cb); 476 | $gas = gmp_strval(Utils::toBn($cb->result)->value); 477 | $gas = bcmul($gas, '1.5'); 478 | // $inst->setGasPrice(intval($gas)); 479 | if (isset($value)) { 480 | $inst->setValue($value); 481 | } 482 | 483 | } 484 | 485 | $re = $inst->$name(...$arg); 486 | return ['res' => $re, 'nonce' => $nonce ?? -1]; 487 | } catch (Throwable $e) { 488 | Helper::log($e, 'bsc_nft'); 489 | $return = [ 490 | 'err' => $e->getMessage(), 491 | 'msg' => $e 492 | ]; 493 | return $return; 494 | } 495 | 496 | } 497 | 498 | //兑换签名顺序 499 | //用户,tokenA,A量,当前合约地址,tokenB, B量,过期时间,当前nonce 500 | public static function swapSign($username, $tokenIn, $numIn, $tokenOut, $numOut, $outTime) 501 | { 502 | $type = 'swap_tool'; 503 | $res = self::getNonce($type, $username); 504 | if (is_array($res)) { 505 | return ['nonce' => -1]; 506 | } 507 | $contract = AppConfig::getConfig('contract', $type); 508 | $nonce = gmp_strval(Utils::toBn($res)->value); 509 | $sign = [ 510 | strtolower($username), 511 | Utils::stripZero(strtolower($tokenIn)), 512 | //$numIn, 513 | gmp_strval(Utils::toBn($numIn)->value), 514 | Utils::stripZero(strtolower($contract['token'])), 515 | Utils::stripZero(strtolower($tokenOut)), 516 | // $numOut, 517 | gmp_strval(Utils::toBn($numOut)->value), 518 | $outTime, 519 | gmp_strval(Utils::toBn($res)->value) 520 | ]; 521 | //$admin_private_key = SignKey::getPrivateKey($type); 522 | return self::getSign($sign, $contract['admin_private_key'], $nonce); 523 | 524 | 525 | } 526 | 527 | /** 528 | * * 合约扣币签名 529 | * 签名顺序说明 530 | * //-- 531 | * 1/当前合约地址 532 | * 2/发送者地址 533 | * 3/token地址 534 | * 4/token数量 535 | * 5/otype 536 | * 6/oid 537 | * 7/过期时间 538 | * 8/nonce 539 | * 方法 deposit(address _token, uint256 _amount, uint256 otype, uint256 oid, uint256 _deadline, uint8 v, bytes32 r, bytes32 s) 540 | * @param string $username 当前发交易地址 541 | * @param string $token token地址 542 | * @param $amount 转账的数量 543 | * @param int $otype 转账类型 544 | * @param int $oid 转账oid 545 | * @param int $outTime 过期时间 546 | * @return array 547 | */ 548 | public static function signDeduction(string $username, string $token, $amount, int $otype, int $oid, int $outTime): array 549 | { 550 | $type = 'deduction_tool'; 551 | $res = self::getNonce($type, $username); 552 | if (is_array($res)) { 553 | return ['nonce' => -1]; 554 | } 555 | $contract = AppConfig::getConfig('contract', $type); 556 | $nonce = gmp_strval(Utils::toBn($res)->value); 557 | $sign = [ 558 | strtolower($contract['token']), 559 | Utils::stripZero(strtolower($username)), 560 | Utils::stripZero(strtolower($token)), 561 | gmp_strval(Utils::toBn($amount)->value), 562 | $otype, 563 | $oid, 564 | $outTime, 565 | $nonce 566 | ]; 567 | return self::getSign($sign, $contract['admin_private_key'], $nonce); 568 | } 569 | 570 | 571 | /** 572 | * 合约提现转账签名 573 | * 签名参数顺序 574 | *_sender,//当前发交易地址 575 | *_tokenAddress,//token地址 576 | *address(this),//当前工具合约地址 577 | *_amount,//量 578 | *_deadline,//过期时间 579 | *nonces[_sender]//发交易地址的在当前合约的nonce 580 | * 581 | * 方法 withdraw(address tokenAddress, uint256 tokenAmount, uint256 _deadline, uint256 oid, uint8 v, bytes32 r, bytes32 s) 582 | * @param string $type 类型 583 | * @param string $username 当前发交易地址 584 | * @param string $token token地址 585 | * @param $amount //转账的数量 586 | * @param string $contract 当前工具合约地址 587 | * @param int $outTime 过期时间 当前时间戳加过期的时间秒 588 | * @param string $privateKey 管理员私钥 589 | * @return array 590 | */ 591 | public static function signWithdraw(string $type, string $username, string $token, $amount, string $contract, int $outTime, string $privateKey): array 592 | { 593 | $res = self::getNonce($type, $username); 594 | 595 | $nonce = gmp_strval(Utils::toBn($res)->value); 596 | $sign = [ 597 | strtolower($username), 598 | strtolower($token), 599 | Utils::stripZero(strtolower($contract)), 600 | gmp_strval(Utils::toBn($amount)->value), 601 | $outTime, 602 | $nonce 603 | ]; 604 | return self::getSign($sign, $privateKey, $nonce); 605 | } 606 | 607 | public static function getNonce($type, $username) 608 | { 609 | return self::nft($type, 'nonces', $username); 610 | } 611 | 612 | /** 613 | * 公共签名 614 | * @param array $arr 需签名的数组 615 | * @param string $privateKey 管理员私钥 616 | * @return array 617 | */ 618 | public static function getSign(array $arr, string $privateKey, $nonce): array 619 | { 620 | $paramHash = ''; 621 | foreach ($arr as $value) { 622 | if (!Utils::isAddress((string)$value)) { 623 | $value = Utils::toHex($value); 624 | $len = strlen($value); 625 | if ($len < 64) { 626 | for ($i = 0; $i < 64 - $len; $i++) { 627 | $value = '0' . $value; 628 | } 629 | } 630 | } 631 | $paramHash .= $value; 632 | } 633 | $paramHash = Utils::sha3($paramHash); 634 | $pre = "\x19Ethereum Signed Message:\n32"; 635 | $pre = Utils::toHex($pre, true); 636 | $value = $pre . Utils::stripZero($paramHash); 637 | $singStr = Utils::sha3($value);//keccak256 638 | $ec = new EC('secp256k1'); 639 | $key = $ec->keyFromPrivate($privateKey); 640 | $signre = $key->sign($singStr, ['canonical' => true]); 641 | $signature['r'] = '0x' . $signre->r->toString(16); 642 | $signature['s'] = '0x' . $signre->s->toString(16); 643 | $signature['v'] = $signre->recoveryParam + 27; 644 | $signature['nonce'] = $nonce; 645 | 646 | return $signature; 647 | } 648 | 649 | /** 650 | * _sender,//当前发交易地址 651 | * _tokenAddress,//token地址 652 | * address(this),//当前工具合约地址 653 | * _amount,//量 654 | * _deadline,//过期时间 655 | * nonces[_sender]//发交易地址的在当前合约的nonce 656 | */ 657 | public static function signLPWithdraw1($type, $username, $contract, $number, $ionz, $outTime) 658 | { 659 | $re = self::nft($type, 'nonces', $username); 660 | 661 | $sign = [ 662 | strtolower($username), 663 | Utils::stripZero(strtolower($contract)), 664 | strtolower($contract), 665 | gmp_strval(Utils::toBn($number)->value), 666 | 667 | gmp_strval(Utils::toBn($ionz)->value), 668 | $outTime, 669 | gmp_strval(Utils::toBn($re)->value) 670 | ]; 671 | //var_dump($sign); 672 | return self::getSignStr($sign); 673 | } 674 | //withdraw(uint256 amountA, uint256 amountB, uint256 _deadline, uint256 oid, uint8 v, bytes32 r, bytes32 s) 675 | //签名顺序说明 676 | //bytes32 message = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(_sender, amountA, address(this), amountB, _deadline, nonces[_sender]++)))); 677 | // 678 | //_sender, amountA, address(this), amountB, _deadline, nonces[_sender]++)))); 679 | //用户地址,LP数量,当前工具地址,收益金额,过期时间,nonces查询值 680 | public static function signLPWithdraw($type, $username, $number, $contract, $ionz, $outTime) 681 | { 682 | $re = self::nft($type, 'nonces', $username); 683 | 684 | $sign = [ 685 | strtolower($username), 686 | gmp_strval(Utils::toBn($number)->value), 687 | Utils::stripZero(strtolower($contract)), 688 | gmp_strval(Utils::toBn($ionz)->value), 689 | $outTime, 690 | gmp_strval(Utils::toBn($re)->value) 691 | ]; 692 | //var_dump($sign); 693 | return self::getSignStr($sign); 694 | } 695 | 696 | public static function getSignStr($arr) 697 | { 698 | $paramHash = ''; 699 | foreach ($arr as $value) { 700 | if (!Utils::isAddress((string)$value)) { 701 | $value = Utils::toHex($value); 702 | $len = strlen($value); 703 | if ($len < 64) { 704 | for ($i = 0; $i < 64 - $len; $i++) { 705 | $value = '0' . $value; 706 | } 707 | } 708 | } 709 | $paramHash .= $value; 710 | } 711 | $paramHash = Utils::sha3($paramHash); 712 | $pre = "\x19Ethereum Signed Message:\n32";//"\x19Ethereum Signed Message:\n32" 713 | $pre = Utils::toHex($pre, true); 714 | $value = $pre . Utils::stripZero($paramHash); 715 | $singStr = Utils::sha3($value);//keccak256 716 | $ec = new EC('secp256k1'); 717 | $key = $ec->keyFromPrivate(UserDepositLp::$private_key); 718 | $signre = $key->sign($singStr, ['canonical' => true]); 719 | $signature['r'] = '0x' . $signre->r->toString(16); 720 | $signature['s'] = '0x' . $signre->s->toString(16); 721 | $signature['v'] = $signre->recoveryParam + 27; 722 | return $signature; 723 | } 724 | 725 | 726 | public static function sign2($contract, $username, $nft_id, $cr, $outTime) 727 | { 728 | $re = self::nft('nft', 'nonces', 729 | $contract, 730 | $username); 731 | $sign = [ 732 | 'username' => strtolower($username), 733 | 'address' => Utils::stripZero(strtolower($contract)), 734 | 'nft_id' => $nft_id, 735 | 'cr' => $cr, 736 | 'outTime' => $outTime, 737 | 'nonces' => gmp_strval(Utils::toBn($re)->value) 738 | ]; 739 | 740 | $singStr = self::getSignStr2($sign); 741 | $ec = new EC('secp256k1'); 742 | $key = $ec->keyFromPrivate(NftPledge1::$private_key); 743 | $signre = $key->sign($singStr, ['canonical' => true]); 744 | $signature['r'] = '0x' . $signre->r->toString(16); 745 | $signature['s'] = '0x' . $signre->s->toString(16); 746 | $signature['v'] = $signre->recoveryParam + 27; 747 | return $signature; 748 | } 749 | 750 | public static function getSignStr2($arr) 751 | { 752 | $paramHash = ''; 753 | foreach ($arr as $k => $value) { 754 | if (!Utils::isAddress((string)$value)) { 755 | $value = Utils::toHex($value); 756 | $len = strlen($value); 757 | if ($len < 64) { 758 | for ($i = 0; $i < 64 - $len; $i++) { 759 | $value = '0' . $value; 760 | } 761 | } 762 | } 763 | $paramHash .= $value; 764 | } 765 | $paramHash = Utils::sha3($paramHash); 766 | $pre = "\x19Ethereum Signed Message:\n32"; 767 | $pre = Utils::toHex($pre, true); 768 | $value = $pre . Utils::stripZero($paramHash); 769 | return Utils::sha3($value);//keccak256 770 | } 771 | 772 | } 773 | -------------------------------------------------------------------------------- /bscphp/src/Bep20.php: -------------------------------------------------------------------------------- 1 | at($address); 14 | } 15 | 16 | function getTransferEvents ($from = [], $to = [], $fromBlock = 'latest', $toBlock = 'latest') { 17 | $toTopic = function ($addr) { 18 | $addr = preg_replace('/^0x/', '', $addr); 19 | return '0x' . str_pad($addr, 64, '0', STR_PAD_LEFT); 20 | }; 21 | $from = array_map($toTopic, $from); 22 | $to = array_map($toTopic, $to); 23 | return $this->queryEvents([EVENTSIG_TRANSFER, $from, $to], $fromBlock, $toBlock); 24 | } 25 | } -------------------------------------------------------------------------------- /bscphp/src/Bep721.php: -------------------------------------------------------------------------------- 1 | at($address); 13 | } 14 | function getTransferEvents($from=[], $to=[], $fromBlock='latest', $toBlock='latest'){ 15 | $toTopic = function($addr){ 16 | $addr = preg_replace('/^0x/', '', $addr); 17 | return '0x' . str_pad($addr, 64, '0', STR_PAD_LEFT); 18 | }; 19 | $from = array_map($toTopic, $from); 20 | $to = array_map($toTopic, $to); 21 | return $this->queryEvents([EVENTSIG_TRANSFER, $from, $to], $fromBlock, $toBlock); 22 | } 23 | } -------------------------------------------------------------------------------- /bscphp/src/Callback.php: -------------------------------------------------------------------------------- 1 | error = $error; 7 | if($error) throw $error; 8 | $this->result = $result; 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /bscphp/src/Credential.php: -------------------------------------------------------------------------------- 1 | keyPair = $keyPair; 13 | } 14 | 15 | public function getPublicKey() { 16 | return $this->keyPair->getPublic()->encode('hex'); 17 | } 18 | 19 | public function getPrivateKey() { 20 | return $this->keyPair->getPrivate()->toString(16,2); 21 | } 22 | 23 | public function getAddress() { 24 | $pubkey = $this->getPublicKey(); 25 | return "0x" . substr(Keccak::hash(substr(hex2bin($pubkey), 1), 256), 24); 26 | } 27 | 28 | public function signTransaction($raw){ 29 | $txreq = new Transaction($raw); 30 | $privateKey = $this->getPrivateKey(); 31 | $signed = '0x' . $txreq->sign($privateKey); 32 | return $signed; 33 | } 34 | 35 | public static function create(){ 36 | $ec = new EC('secp256k1'); 37 | $keyPair = $ec->genKeyPair(); 38 | return new self($keyPair); 39 | } 40 | 41 | public static function fromKey($privateKey){ 42 | $ec = new EC('secp256k1'); 43 | $keyPair = $ec->keyFromPrivate($privateKey); 44 | return new self($keyPair); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /bscphp/src/Kit.php: -------------------------------------------------------------------------------- 1 | client = $client; 13 | $this->credential = $credential; 14 | 15 | $this->transactor = new Transactor($client, $credential); 16 | } 17 | 18 | function getSender(){ 19 | return $this->credential->getAddress(); 20 | } 21 | 22 | function balanceOf($addr){ 23 | return $this->client->getBalance($addr); 24 | } 25 | 26 | function transfer($to, $value){ 27 | $tx = [ 28 | 'to' => $to, 29 | 'value' => $value 30 | ]; 31 | return $this->transactor->transact($tx); 32 | } 33 | function transferParam($to, $value,$param){ 34 | $tx = [ 35 | 'to' => $to, 36 | 'value' => $value 37 | ]; 38 | $tx = array_merge($tx,$param); 39 | return $this->transactor->transactParam($tx); 40 | } 41 | 42 | //abi, bytecode, args... 43 | function deployContract(){ 44 | $args = func_get_args(); 45 | if(count($args) < 2) { 46 | throw new Exception('no enough deploy parameters'); 47 | } 48 | $abi = array_shift($args); 49 | $bytecode = array_shift($args); 50 | $contract = new SmartContract($this->client, $this->credential, $abi); 51 | $contract->bytecode($bytecode); 52 | return $contract->instantiate(...$args); 53 | } 54 | 55 | function waitForConfirmation($txid, $timeout = 300){ 56 | return $this->client->waitForConfirmation($txid, $timeout); 57 | } 58 | 59 | function bep20($addr,$abi=null){ 60 | return new Bep20($this->client, $this->credential, $addr,$abi); 61 | } 62 | function bep721($addr,$abi=null){ 63 | return new Bep721($this->client, $this->credential, $addr,$abi); 64 | } 65 | 66 | 67 | } -------------------------------------------------------------------------------- /bscphp/src/NodeClient.php: -------------------------------------------------------------------------------- 1 | getEth()->getBalance($addr, $cb); 85 | 86 | return $cb->result; 87 | } 88 | 89 | function broadcast($rawtx) 90 | { 91 | $cb = new Callback; 92 | $this->getEth()->sendRawTransaction($rawtx, $cb); 93 | 94 | return $cb->result; 95 | } 96 | 97 | function getReceipt($txid) 98 | { 99 | $cb = new Callback; 100 | $this->getEth()->getTransactionReceipt($txid, $cb); 101 | 102 | return $cb->result; 103 | } 104 | 105 | function waitForConfirmation($txid, $timeout = 300) 106 | { 107 | $expire = time() + $timeout; 108 | while (time() < $expire) { 109 | try { 110 | $receipt = $this->getReceipt($txid); 111 | if (!is_null($receipt)) return $receipt; 112 | sleep(2); 113 | } catch (Exception $e) { 114 | 115 | } 116 | } 117 | return false; 118 | } 119 | 120 | function getBlockByNumber($blockNumber) 121 | { 122 | $cb = new Callback; 123 | $number = $this->hex($blockNumber); 124 | $this->getEth()->getBlockByNumber($number, true, $cb); 125 | 126 | return $cb->result; 127 | } 128 | 129 | /** 130 | * 调用ETH方法 无参数查询方法 131 | * @param $method 132 | * @return mixed 133 | */ 134 | public function callEthMethod($method) 135 | { 136 | $cb = new Callback; 137 | $this->getEth()->$method($cb); 138 | 139 | return $cb->result; 140 | } 141 | 142 | function hex($str, $prefix=true){ 143 | $bn = gmp_init($str); 144 | $ret = gmp_strval($bn, 16); 145 | return $prefix ? '0x' . $ret : $ret; 146 | } 147 | 148 | function bn($n){ 149 | return new phpseclib\Math\BigInteger($n); 150 | } 151 | 152 | } 153 | -------------------------------------------------------------------------------- /bscphp/src/SmartContract.php: -------------------------------------------------------------------------------- 1 | provider, $abi); 27 | $this->web3 = $web3; 28 | $this->credential = $credential; 29 | 30 | foreach ($this->events as $name => $event) { 31 | $sig = $this->ethabi->encodeEventSignature($event); 32 | $this->eventSignatures[$sig] = $event; 33 | } 34 | foreach ($this->functions as $function) { 35 | if ($function['stateMutability'] == 'view') { 36 | $this->viewMethods[] = $function['name']; 37 | } else { 38 | $this->txMethods[] = $function['name']; 39 | } 40 | } 41 | } 42 | 43 | public function setGrade ($num = 1) { 44 | $this->grade = $num; 45 | return $this; 46 | } 47 | public function setGasPrice ($price) { 48 | if (!$price) { 49 | unset($this->gasPrice); 50 | } else { 51 | $this->gasPrice = $price; 52 | } 53 | return $this; 54 | } 55 | 56 | public function setGasLimit ($limit) { 57 | if (!$limit) { 58 | unset($this->gasLimit); 59 | } else { 60 | $this->gasLimit = $limit; 61 | } 62 | return $this; 63 | } 64 | public function setNonce($nonce){ 65 | if(!$nonce){ 66 | unset($this->nonce); 67 | }else{ 68 | $this->nonce = $nonce; 69 | } 70 | return $this; 71 | } 72 | public function setValue ($value) { 73 | if (!$value) { 74 | unset($this->value); 75 | } else { 76 | $this->value = $value; 77 | } 78 | return $this; 79 | } 80 | 81 | public function setCredential ($credential) { 82 | $this->credential = $credential; 83 | return $this; 84 | } 85 | 86 | protected function transact ($tx) { 87 | if (!isset($this->credential)) { 88 | throw new \Exception('credential not set'); 89 | } 90 | $transactor = new Transactor($this->web3, $this->credential); 91 | $tx['to'] = $this->getToAddress(); 92 | $transactor->setGrade($this->grade); 93 | return $transactor->transact($tx); 94 | } 95 | 96 | 97 | protected function isTxMethod ($name) { 98 | return in_array($name, $this->txMethods); 99 | } 100 | 101 | protected function isViewMethod ($name) { 102 | return in_array($name, $this->viewMethods); 103 | } 104 | 105 | public function instantiate () { 106 | $args = func_get_args(); 107 | 108 | $data = $this->getData(...$args); 109 | $tx = [ 110 | 'data' => '0x' . $data 111 | ]; 112 | return $this->transact($tx); 113 | } 114 | 115 | public function __call ($name, $args) { 116 | 117 | if ($this->isTxMethod($name)) { 118 | $data = $this->getData($name, ...$args); 119 | $tx = [ 120 | 'data' => '0x' . $data 121 | ]; 122 | if (isset($this->gasPrice) && $this->gasPrice) { 123 | $tx['gasPrice'] = $this->gasPrice; 124 | } 125 | if (isset($this->gasLimit) && $this->gasLimit) { 126 | $tx['gasLimit'] = $this->gasLimit; 127 | } 128 | if (isset($this->nonce) && $this->nonce) { 129 | $tx['nonce'] = $this->nonce; 130 | } 131 | //传不上? 132 | if (isset($this->value) && $this->value) { 133 | $tx['value'] = $this->value; 134 | } 135 | 136 | return $this->transact($tx); 137 | } 138 | if ($this->isViewMethod($name)) { 139 | $cb = new Callback; 140 | $args[] = $cb; 141 | $this->call($name, ...$args); 142 | $values = array_values($cb->result); 143 | return count($values) > 1 ? $values : $values[0]; 144 | } 145 | throw new Exception('method not supported'); 146 | } 147 | 148 | public function queryEvents ($topics = [], $fromBlock = 'latest', $toBlock = 'latest') { 149 | if (is_numeric($fromBlock)) { 150 | $fromBlock = Utils::toHex($fromBlock, true); 151 | } 152 | if (is_numeric($toBlock)) { 153 | $toBlock = Utils::toHex($toBlock, true); 154 | } 155 | $filter = [ 156 | 'fromBlock' => $fromBlock, 157 | 'toBlock' => $toBlock, 158 | 'address' => $this->getToAddress(), 159 | 'topics' => $topics 160 | ]; 161 | $cb = new Callback; 162 | $this->web3->eth->getLogs($filter, $cb); 163 | $decodedEvents = []; 164 | foreach ($cb->result as $log) { 165 | if (!array_key_exists($log->topics[0], $this->eventSignatures)) { 166 | $msg = sprintf("unknown event: %s, skip", $log->topics[0]); 167 | echo $msg . PHP_EOL; 168 | continue; 169 | } 170 | 171 | $eventAbi = $this->eventSignatures[$log->topics[0]]; 172 | 173 | $types = []; 174 | $names = []; 175 | for ($i = 0; $i < count($eventAbi['inputs']); $i++) { 176 | $types[] = $eventAbi['inputs'][$i]['type']; 177 | $names[] = $eventAbi['inputs'][$i]['name']; 178 | } 179 | $params = ''; 180 | for ($i = 1; $i < count($log->topics); $i++) { 181 | $params = $params . Utils::stripZero($log->topics[$i]); 182 | } 183 | $params = $params . Utils::stripZero($log->data); 184 | //echo $eventAbi['name'] . ' => ' . $params . PHP_EOL; 185 | $decodedParams = $this->ethabi->decodeParameters($types, $params); 186 | 187 | $decodedEvent = (object)[ 188 | 'blockHash' => $log->blockHash, 189 | 'blockNumber' => $log->blockNumber, 190 | 'transactionHash' => $log->transactionHash, 191 | 'removed' => $log->removed, 192 | 'address' => $log->address, 193 | 'name' => $eventAbi['name'], 194 | 'params' => [] 195 | ]; 196 | for ($i = 0; $i < count($names); $i++) { 197 | $decodedEvent->params[$names[$i]] = $decodedParams[$i]; 198 | } 199 | $decodedEvents[] = $decodedEvent; 200 | } 201 | 202 | return $decodedEvents; 203 | } 204 | 205 | } -------------------------------------------------------------------------------- /bscphp/src/Transactor.php: -------------------------------------------------------------------------------- 1 | web3 = $web3; 22 | $this->credential = $credential; 23 | } 24 | 25 | 26 | public function setGasPrice ($price = null) { 27 | $this->gasPrice = $price; 28 | return $this; 29 | } 30 | 31 | 32 | public function setGrade ($num = 1) { 33 | $this->grade = $num; 34 | return $this; 35 | } 36 | 37 | public function setGasLimit ($limit = null) { 38 | $this->gasLimit = $limit; 39 | return $this; 40 | } 41 | 42 | public function setValue ($value = null) { 43 | $this->value = $value; 44 | return $this; 45 | } 46 | 47 | public function setCredential ($credential) { 48 | $this->credential = $credential; 49 | return $this; 50 | } 51 | 52 | protected function netVersion () { 53 | $cb = new Callback; 54 | $this->web3->net->version($cb); 55 | return $cb->result; 56 | } 57 | 58 | protected function getTransactionCount ($address) { 59 | $cb = new Callback; 60 | $this->web3->eth->getTransactionCount($address, 'pending', $cb); 61 | if(!$cb->result->toHex()){ 62 | return '0x0'; 63 | } 64 | return '0x' . $cb->result->toHex(); 65 | } 66 | 67 | protected function estimateGasPrice () { 68 | $cb = new Callback; 69 | $this->web3->eth->gasPrice($cb); 70 | // echo 'estimateGasPrice'.PHP_EOL; 71 | // var_dump($cb->result); 72 | return '0x' . $cb->result->toHex(); 73 | } 74 | 75 | protected function estimateGasUsage ($tx) { 76 | //var_dump($tx); 77 | $cb = new Callback; 78 | // var_dump($this->web3->eth); 79 | $this->web3->eth->estimateGas($tx, $cb); 80 | // echo 'estimateGasUsage'.PHP_EOL; 81 | // var_dump($cb->result); 82 | return '0x' . $cb->result->toHex(); 83 | } 84 | 85 | /** 86 | * 将一个十进制小数(可以是 float 或者 string)转换为最简分数 87 | * 并返回一个 ['numerator' => x, 'denominator' => y] 的数组。 88 | * 89 | * @param float|string $decimal 小数,例如 2.75、"0.125"、"-3.5"、"4" 等 90 | * @return array{numerator: int, denominator: int} 91 | */ 92 | function decimalToFraction($decimal): array 93 | { 94 | // 1. 先把输入转成字符串,方便处理小数点 95 | $str = (string)$decimal; 96 | $sign = 1; 97 | if (strpos($str, '-') === 0) { 98 | $sign = -1; 99 | $str = substr($str, 1); 100 | } 101 | 102 | // 2. 如果没有小数点,直接返回整数 / 1 103 | if (strpos($str, '.') === false) { 104 | $num = (int)$str * $sign; 105 | return ['numerator' => $num, 'denominator' => 1]; 106 | } 107 | 108 | // 3. 分离整数部分和小数部分 109 | list($intPart, $decPart) = explode('.', $str, 2); 110 | $intPart = (int)$intPart; // 整数部分 111 | $decPart = rtrim($decPart, '0'); // 去掉小数部分末尾的“0”,避免 2.500 -> 25/10 可以先简化成 25/10 112 | 113 | // 如果小数部分全是 0,比如 “3.0”,rtrim 后可能变成空串,则可当作整数 114 | if ($decPart === '') { 115 | $num = ($intPart) * $sign; 116 | return ['numerator' => $num, 'denominator' => 1]; 117 | } 118 | 119 | // 4. 小数部分长度 120 | $decLen = strlen($decPart); 121 | 122 | // 5. 初步构造“去小数”后的分子和分母 123 | // 例如 “2.75” -> intPart=2, decPart="75", decLen=2 124 | // 去小数分子 = 2 * 100 + 75 = 275,分母 = 100 125 | $denominator = intval(str_repeat('1', $decLen)); // 例如 decLen=2 -> "11" 不行,正确的是 10^2 = 100 126 | // 但上面方式有误:str_repeat('1',2) = "11"。应该用 pow(10, decLen)。 127 | $denominator = (int)pow(10, $decLen); 128 | 129 | $integerTimesDen = $intPart * $denominator; 130 | $decimalAsInt = (int)$decPart; // 小数部分当作整数 131 | $numerator = $integerTimesDen + $decimalAsInt; 132 | 133 | // 6. 求最大公约数 134 | $gcd = function (int $a, int $b): int { 135 | // 经典欧几里得算法 136 | $a = abs($a); 137 | $b = abs($b); 138 | if ($b === 0) { 139 | return $a; 140 | } 141 | while ($b !== 0) { 142 | $t = $b; 143 | $b = $a % $b; 144 | $a = $t; 145 | } 146 | return $a; 147 | }; 148 | 149 | $commonDivisor = $gcd($numerator, $denominator); 150 | // 7. 约分 151 | $numeratorReduced = (int)(($numerator / $commonDivisor) * $sign); 152 | $denominatorReduced = (int)($denominator / $commonDivisor); 153 | 154 | return [ 155 | $numeratorReduced, 156 | $denominatorReduced 157 | ]; 158 | } 159 | 160 | function gmpMulAndHex(string $decStr): string 161 | { 162 | 163 | list($numerator, $denominator) = $this->decimalToFraction($this->grade); 164 | // 把乘 1.5 转成 “乘 3 再除 2” 165 | $g = gmp_init($decStr, 10); 166 | $g3 = gmp_mul($g, $numerator); 167 | $res = gmp_div_q($g3, (string)$denominator); // 商,向下取整 168 | return '0x' . strtoupper(gmp_strval($res, 16)); 169 | } 170 | 171 | public function transact ($tx) { 172 | 173 | if (!isset($this->credential)) { 174 | throw new Exception('credential not set'); 175 | } 176 | 177 | $from = $this->credential->getAddress(); 178 | 179 | $tx['from'] = $from; 180 | 181 | if (!isset($tx['nonce'])) { 182 | $tx['nonce'] = $this->getTransactionCount($from); 183 | } 184 | if (!isset($tx['chainId'])) { 185 | $chainId = $tx['chainId'] = $this->netVersion(); 186 | } 187 | if (!isset($tx['value'])) { 188 | if (isset($this->value)) { 189 | $tx['value'] = $this->value; 190 | } else { 191 | $tx['value'] = '0x0'; 192 | } 193 | } 194 | 195 | if (!isset($tx['gasPrice'])) { 196 | if (isset($this->gasPrice)) { 197 | $tx['gasPrice'] = $this->gasPrice; 198 | } else { 199 | $tx['gasPrice'] = $this->estimateGasPrice(); 200 | } 201 | } 202 | 203 | if (!isset($tx['gasLimit'])) { 204 | if (isset($this->gasLimit)) { 205 | $tx['gasLimit'] = $this->gasLimit; 206 | } else { 207 | $tx['chainId'] = Utils::toHex($tx['chainId'], 1); 208 | $tx['gasLimit'] = $this->estimateGasUsage($tx); 209 | } 210 | } 211 | 212 | if(isset($this->grade) && $this->grade != 1){ 213 | $price = $this->gmpMulAndHex(hexToDecimal($tx['gasPrice'])); 214 | $tx['gasPrice'] = $price; 215 | $gasLimit = $this->gmpMulAndHex(hexToDecimal($tx['gasLimit'])); 216 | $tx['gasLimit'] = $gasLimit; 217 | } 218 | 219 | $tx['chainId'] = $chainId; 220 | // var_dump(hexToDecimal($tx)); 221 | 222 | $stx = $this->credential->signTransaction($tx); 223 | $cb = new Callback; 224 | $this->web3->eth->sendRawTransaction($stx, $cb); 225 | $tx['grade'] = $this->grade; 226 | return ['tx_id'=>$cb->result,'param'=>$tx]; 227 | // return $cb->result; 228 | } 229 | 230 | } -------------------------------------------------------------------------------- /bscphp/src/helper.php: -------------------------------------------------------------------------------- 1 | =5.5", 34 | "symfony/polyfill-intl-idn": "^1.17" 35 | }, 36 | "require-dev": { 37 | "ext-curl": "*", 38 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", 39 | "psr/log": "^1.1" 40 | }, 41 | "suggest": { 42 | "psr/log": "Required for using the Log middleware" 43 | }, 44 | "type": "library", 45 | "extra": { 46 | "branch-alias": { 47 | "dev-master": "6.5-dev" 48 | } 49 | }, 50 | "autoload": { 51 | "files": [ 52 | "src/functions_include.php" 53 | ], 54 | "psr-4": { 55 | "GuzzleHttp\\": "src/" 56 | } 57 | }, 58 | "notification-url": "https://packagist.org/downloads/", 59 | "license": [ 60 | "MIT" 61 | ], 62 | "authors": [ 63 | { 64 | "name": "Graham Campbell", 65 | "email": "hello@gjcampbell.co.uk", 66 | "homepage": "https://github.com/GrahamCampbell" 67 | }, 68 | { 69 | "name": "Michael Dowling", 70 | "email": "mtdowling@gmail.com", 71 | "homepage": "https://github.com/mtdowling" 72 | }, 73 | { 74 | "name": "Jeremy Lindblom", 75 | "email": "jeremeamia@gmail.com", 76 | "homepage": "https://github.com/jeremeamia" 77 | }, 78 | { 79 | "name": "George Mponos", 80 | "email": "gmponos@gmail.com", 81 | "homepage": "https://github.com/gmponos" 82 | }, 83 | { 84 | "name": "Tobias Nyholm", 85 | "email": "tobias.nyholm@gmail.com", 86 | "homepage": "https://github.com/Nyholm" 87 | }, 88 | { 89 | "name": "Márk Sági-Kazár", 90 | "email": "mark.sagikazar@gmail.com", 91 | "homepage": "https://github.com/sagikazarmark" 92 | }, 93 | { 94 | "name": "Tobias Schultze", 95 | "email": "webmaster@tubo-world.de", 96 | "homepage": "https://github.com/Tobion" 97 | } 98 | ], 99 | "description": "Guzzle is a PHP HTTP client library", 100 | "homepage": "http://guzzlephp.org/", 101 | "keywords": [ 102 | "client", 103 | "curl", 104 | "framework", 105 | "http", 106 | "http client", 107 | "rest", 108 | "web service" 109 | ], 110 | "support": { 111 | "issues": "https://github.com/guzzle/guzzle/issues", 112 | "source": "https://github.com/guzzle/guzzle/tree/6.5.8" 113 | }, 114 | "funding": [ 115 | { 116 | "url": "https://github.com/GrahamCampbell", 117 | "type": "github" 118 | }, 119 | { 120 | "url": "https://github.com/Nyholm", 121 | "type": "github" 122 | }, 123 | { 124 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", 125 | "type": "tidelift" 126 | } 127 | ], 128 | "time": "2022-06-20T22:16:07+00:00" 129 | }, 130 | { 131 | "name": "guzzlehttp/promises", 132 | "version": "1.5.x-dev", 133 | "source": { 134 | "type": "git", 135 | "url": "https://github.com/guzzle/promises.git", 136 | "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e" 137 | }, 138 | "dist": { 139 | "type": "zip", 140 | "url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e", 141 | "reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e", 142 | "shasum": "", 143 | "mirrors": [ 144 | { 145 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 146 | "preferred": true 147 | } 148 | ] 149 | }, 150 | "require": { 151 | "php": ">=5.5" 152 | }, 153 | "require-dev": { 154 | "symfony/phpunit-bridge": "^4.4 || ^5.1" 155 | }, 156 | "default-branch": true, 157 | "type": "library", 158 | "autoload": { 159 | "files": [ 160 | "src/functions_include.php" 161 | ], 162 | "psr-4": { 163 | "GuzzleHttp\\Promise\\": "src/" 164 | } 165 | }, 166 | "notification-url": "https://packagist.org/downloads/", 167 | "license": [ 168 | "MIT" 169 | ], 170 | "authors": [ 171 | { 172 | "name": "Graham Campbell", 173 | "email": "hello@gjcampbell.co.uk", 174 | "homepage": "https://github.com/GrahamCampbell" 175 | }, 176 | { 177 | "name": "Michael Dowling", 178 | "email": "mtdowling@gmail.com", 179 | "homepage": "https://github.com/mtdowling" 180 | }, 181 | { 182 | "name": "Tobias Nyholm", 183 | "email": "tobias.nyholm@gmail.com", 184 | "homepage": "https://github.com/Nyholm" 185 | }, 186 | { 187 | "name": "Tobias Schultze", 188 | "email": "webmaster@tubo-world.de", 189 | "homepage": "https://github.com/Tobion" 190 | } 191 | ], 192 | "description": "Guzzle promises library", 193 | "keywords": [ 194 | "promise" 195 | ], 196 | "support": { 197 | "issues": "https://github.com/guzzle/promises/issues", 198 | "source": "https://github.com/guzzle/promises/tree/1.5.3" 199 | }, 200 | "funding": [ 201 | { 202 | "url": "https://github.com/GrahamCampbell", 203 | "type": "github" 204 | }, 205 | { 206 | "url": "https://github.com/Nyholm", 207 | "type": "github" 208 | }, 209 | { 210 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", 211 | "type": "tidelift" 212 | } 213 | ], 214 | "time": "2023-05-21T12:31:43+00:00" 215 | }, 216 | { 217 | "name": "guzzlehttp/psr7", 218 | "version": "1.9.x-dev", 219 | "source": { 220 | "type": "git", 221 | "url": "https://github.com/guzzle/psr7.git", 222 | "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" 223 | }, 224 | "dist": { 225 | "type": "zip", 226 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", 227 | "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", 228 | "shasum": "", 229 | "mirrors": [ 230 | { 231 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 232 | "preferred": true 233 | } 234 | ] 235 | }, 236 | "require": { 237 | "php": ">=5.4.0", 238 | "psr/http-message": "~1.0", 239 | "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" 240 | }, 241 | "provide": { 242 | "psr/http-message-implementation": "1.0" 243 | }, 244 | "require-dev": { 245 | "ext-zlib": "*", 246 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" 247 | }, 248 | "suggest": { 249 | "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" 250 | }, 251 | "type": "library", 252 | "autoload": { 253 | "files": [ 254 | "src/functions_include.php" 255 | ], 256 | "psr-4": { 257 | "GuzzleHttp\\Psr7\\": "src/" 258 | } 259 | }, 260 | "notification-url": "https://packagist.org/downloads/", 261 | "license": [ 262 | "MIT" 263 | ], 264 | "authors": [ 265 | { 266 | "name": "Graham Campbell", 267 | "email": "hello@gjcampbell.co.uk", 268 | "homepage": "https://github.com/GrahamCampbell" 269 | }, 270 | { 271 | "name": "Michael Dowling", 272 | "email": "mtdowling@gmail.com", 273 | "homepage": "https://github.com/mtdowling" 274 | }, 275 | { 276 | "name": "George Mponos", 277 | "email": "gmponos@gmail.com", 278 | "homepage": "https://github.com/gmponos" 279 | }, 280 | { 281 | "name": "Tobias Nyholm", 282 | "email": "tobias.nyholm@gmail.com", 283 | "homepage": "https://github.com/Nyholm" 284 | }, 285 | { 286 | "name": "Márk Sági-Kazár", 287 | "email": "mark.sagikazar@gmail.com", 288 | "homepage": "https://github.com/sagikazarmark" 289 | }, 290 | { 291 | "name": "Tobias Schultze", 292 | "email": "webmaster@tubo-world.de", 293 | "homepage": "https://github.com/Tobion" 294 | } 295 | ], 296 | "description": "PSR-7 message implementation that also provides common utility methods", 297 | "keywords": [ 298 | "http", 299 | "message", 300 | "psr-7", 301 | "request", 302 | "response", 303 | "stream", 304 | "uri", 305 | "url" 306 | ], 307 | "support": { 308 | "issues": "https://github.com/guzzle/psr7/issues", 309 | "source": "https://github.com/guzzle/psr7/tree/1.9" 310 | }, 311 | "funding": [ 312 | { 313 | "url": "https://github.com/GrahamCampbell", 314 | "type": "github" 315 | }, 316 | { 317 | "url": "https://github.com/Nyholm", 318 | "type": "github" 319 | }, 320 | { 321 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", 322 | "type": "tidelift" 323 | } 324 | ], 325 | "time": "2023-04-17T16:00:37+00:00" 326 | }, 327 | { 328 | "name": "kornrunner/keccak", 329 | "version": "1.1.0", 330 | "source": { 331 | "type": "git", 332 | "url": "https://github.com/kornrunner/php-keccak.git", 333 | "reference": "433749d28e117fb97baf9f2631b92b5d9ab3c890" 334 | }, 335 | "dist": { 336 | "type": "zip", 337 | "url": "https://api.github.com/repos/kornrunner/php-keccak/zipball/433749d28e117fb97baf9f2631b92b5d9ab3c890", 338 | "reference": "433749d28e117fb97baf9f2631b92b5d9ab3c890", 339 | "shasum": "", 340 | "mirrors": [ 341 | { 342 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 343 | "preferred": true 344 | } 345 | ] 346 | }, 347 | "require": { 348 | "php": ">=7.3", 349 | "symfony/polyfill-mbstring": "^1.8" 350 | }, 351 | "require-dev": { 352 | "phpunit/phpunit": "^8.2" 353 | }, 354 | "type": "library", 355 | "autoload": { 356 | "psr-4": { 357 | "kornrunner\\": "src" 358 | } 359 | }, 360 | "notification-url": "https://packagist.org/downloads/", 361 | "license": [ 362 | "MIT" 363 | ], 364 | "authors": [ 365 | { 366 | "name": "Boris Momcilovic", 367 | "homepage": "https://github.com/kornrunner/php-keccak" 368 | } 369 | ], 370 | "description": "Pure PHP implementation of Keccak", 371 | "keywords": [ 372 | "keccak", 373 | "sha-3", 374 | "sha3-256" 375 | ], 376 | "support": { 377 | "issues": "https://github.com/kornrunner/php-keccak/issues", 378 | "source": "https://github.com/kornrunner/php-keccak/tree/1.1.0" 379 | }, 380 | "time": "2020-12-07T15:40:44+00:00" 381 | }, 382 | { 383 | "name": "phpseclib/phpseclib", 384 | "version": "2.0.x-dev", 385 | "source": { 386 | "type": "git", 387 | "url": "https://github.com/phpseclib/phpseclib.git", 388 | "reference": "b7d7d90ee7df7f33a664b4aea32d50a305d35adb" 389 | }, 390 | "dist": { 391 | "type": "zip", 392 | "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/b7d7d90ee7df7f33a664b4aea32d50a305d35adb", 393 | "reference": "b7d7d90ee7df7f33a664b4aea32d50a305d35adb", 394 | "shasum": "", 395 | "mirrors": [ 396 | { 397 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 398 | "preferred": true 399 | } 400 | ] 401 | }, 402 | "require": { 403 | "php": ">=5.3.3" 404 | }, 405 | "require-dev": { 406 | "phing/phing": "~2.7", 407 | "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4", 408 | "squizlabs/php_codesniffer": "~2.0" 409 | }, 410 | "suggest": { 411 | "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", 412 | "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", 413 | "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", 414 | "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.", 415 | "ext-xml": "Install the XML extension to load XML formatted public keys." 416 | }, 417 | "type": "library", 418 | "autoload": { 419 | "files": [ 420 | "phpseclib/bootstrap.php" 421 | ], 422 | "psr-4": { 423 | "phpseclib\\": "phpseclib/" 424 | } 425 | }, 426 | "notification-url": "https://packagist.org/downloads/", 427 | "license": [ 428 | "MIT" 429 | ], 430 | "authors": [ 431 | { 432 | "name": "Jim Wigginton", 433 | "email": "terrafrost@php.net", 434 | "role": "Lead Developer" 435 | }, 436 | { 437 | "name": "Patrick Monnerat", 438 | "email": "pm@datasphere.ch", 439 | "role": "Developer" 440 | }, 441 | { 442 | "name": "Andreas Fischer", 443 | "email": "bantu@phpbb.com", 444 | "role": "Developer" 445 | }, 446 | { 447 | "name": "Hans-Jürgen Petrich", 448 | "email": "petrich@tronic-media.com", 449 | "role": "Developer" 450 | }, 451 | { 452 | "name": "Graham Campbell", 453 | "email": "graham@alt-three.com", 454 | "role": "Developer" 455 | } 456 | ], 457 | "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", 458 | "homepage": "http://phpseclib.sourceforge.net", 459 | "keywords": [ 460 | "BigInteger", 461 | "aes", 462 | "asn.1", 463 | "asn1", 464 | "blowfish", 465 | "crypto", 466 | "cryptography", 467 | "encryption", 468 | "rsa", 469 | "security", 470 | "sftp", 471 | "signature", 472 | "signing", 473 | "ssh", 474 | "twofish", 475 | "x.509", 476 | "x509" 477 | ], 478 | "support": { 479 | "issues": "https://github.com/phpseclib/phpseclib/issues", 480 | "source": "https://github.com/phpseclib/phpseclib/tree/2.0" 481 | }, 482 | "funding": [ 483 | { 484 | "url": "https://github.com/terrafrost", 485 | "type": "github" 486 | }, 487 | { 488 | "url": "https://www.patreon.com/phpseclib", 489 | "type": "patreon" 490 | }, 491 | { 492 | "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", 493 | "type": "tidelift" 494 | } 495 | ], 496 | "time": "2024-02-26T04:55:38+00:00" 497 | }, 498 | { 499 | "name": "psr/http-message", 500 | "version": "1.1", 501 | "source": { 502 | "type": "git", 503 | "url": "https://github.com/php-fig/http-message.git", 504 | "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" 505 | }, 506 | "dist": { 507 | "type": "zip", 508 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", 509 | "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", 510 | "shasum": "", 511 | "mirrors": [ 512 | { 513 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 514 | "preferred": true 515 | } 516 | ] 517 | }, 518 | "require": { 519 | "php": "^7.2 || ^8.0" 520 | }, 521 | "type": "library", 522 | "extra": { 523 | "branch-alias": { 524 | "dev-master": "1.1.x-dev" 525 | } 526 | }, 527 | "autoload": { 528 | "psr-4": { 529 | "Psr\\Http\\Message\\": "src/" 530 | } 531 | }, 532 | "notification-url": "https://packagist.org/downloads/", 533 | "license": [ 534 | "MIT" 535 | ], 536 | "authors": [ 537 | { 538 | "name": "PHP-FIG", 539 | "homepage": "http://www.php-fig.org/" 540 | } 541 | ], 542 | "description": "Common interface for HTTP messages", 543 | "homepage": "https://github.com/php-fig/http-message", 544 | "keywords": [ 545 | "http", 546 | "http-message", 547 | "psr", 548 | "psr-7", 549 | "request", 550 | "response" 551 | ], 552 | "support": { 553 | "source": "https://github.com/php-fig/http-message/tree/1.1" 554 | }, 555 | "time": "2023-04-04T09:50:52+00:00" 556 | }, 557 | { 558 | "name": "ralouphie/getallheaders", 559 | "version": "3.0.3", 560 | "source": { 561 | "type": "git", 562 | "url": "https://github.com/ralouphie/getallheaders.git", 563 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 564 | }, 565 | "dist": { 566 | "type": "zip", 567 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 568 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 569 | "shasum": "", 570 | "mirrors": [ 571 | { 572 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 573 | "preferred": true 574 | } 575 | ] 576 | }, 577 | "require": { 578 | "php": ">=5.6" 579 | }, 580 | "require-dev": { 581 | "php-coveralls/php-coveralls": "^2.1", 582 | "phpunit/phpunit": "^5 || ^6.5" 583 | }, 584 | "type": "library", 585 | "autoload": { 586 | "files": [ 587 | "src/getallheaders.php" 588 | ] 589 | }, 590 | "notification-url": "https://packagist.org/downloads/", 591 | "license": [ 592 | "MIT" 593 | ], 594 | "authors": [ 595 | { 596 | "name": "Ralph Khattar", 597 | "email": "ralph.khattar@gmail.com" 598 | } 599 | ], 600 | "description": "A polyfill for getallheaders.", 601 | "support": { 602 | "issues": "https://github.com/ralouphie/getallheaders/issues", 603 | "source": "https://github.com/ralouphie/getallheaders/tree/develop" 604 | }, 605 | "time": "2019-03-08T08:55:37+00:00" 606 | }, 607 | { 608 | "name": "sc0vu/web3.php", 609 | "version": "0.1.4", 610 | "source": { 611 | "type": "git", 612 | "url": "https://github.com/sc0Vu/web3.php.git", 613 | "reference": "1fb7762eb7763b0ccdbac1483819606e9edc6a49" 614 | }, 615 | "dist": { 616 | "type": "zip", 617 | "url": "https://api.github.com/repos/sc0Vu/web3.php/zipball/1fb7762eb7763b0ccdbac1483819606e9edc6a49", 618 | "reference": "1fb7762eb7763b0ccdbac1483819606e9edc6a49", 619 | "shasum": "", 620 | "mirrors": [ 621 | { 622 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 623 | "preferred": true 624 | } 625 | ] 626 | }, 627 | "require": { 628 | "guzzlehttp/guzzle": "~6.0", 629 | "kornrunner/keccak": "~1.0", 630 | "php": "^7.1", 631 | "phpseclib/phpseclib": "~2.0.11" 632 | }, 633 | "require-dev": { 634 | "phpunit/phpunit": "~6.0" 635 | }, 636 | "type": "library", 637 | "autoload": { 638 | "psr-4": { 639 | "Web3\\": "src/" 640 | } 641 | }, 642 | "notification-url": "https://packagist.org/downloads/", 643 | "license": [ 644 | "MIT" 645 | ], 646 | "authors": [ 647 | { 648 | "name": "sc0Vu", 649 | "email": "alk03073135@gmail.com" 650 | } 651 | ], 652 | "description": "Ethereum web3 interface.", 653 | "support": { 654 | "issues": "https://github.com/sc0Vu/web3.php/issues", 655 | "source": "https://github.com/sc0Vu/web3.php/tree/master" 656 | }, 657 | "time": "2018-06-24T14:45:20+00:00" 658 | }, 659 | { 660 | "name": "simplito/bigint-wrapper-php", 661 | "version": "1.0.0", 662 | "source": { 663 | "type": "git", 664 | "url": "https://github.com/simplito/bigint-wrapper-php.git", 665 | "reference": "cf21ec76d33f103add487b3eadbd9f5033a25930" 666 | }, 667 | "dist": { 668 | "type": "zip", 669 | "url": "https://api.github.com/repos/simplito/bigint-wrapper-php/zipball/cf21ec76d33f103add487b3eadbd9f5033a25930", 670 | "reference": "cf21ec76d33f103add487b3eadbd9f5033a25930", 671 | "shasum": "", 672 | "mirrors": [ 673 | { 674 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 675 | "preferred": true 676 | } 677 | ] 678 | }, 679 | "type": "library", 680 | "autoload": { 681 | "psr-4": { 682 | "BI\\": "lib/" 683 | } 684 | }, 685 | "notification-url": "https://packagist.org/downloads/", 686 | "license": [ 687 | "MIT" 688 | ], 689 | "authors": [ 690 | { 691 | "name": "Simplito Team", 692 | "email": "s.smyczynski@simplito.com", 693 | "homepage": "https://simplito.com" 694 | } 695 | ], 696 | "description": "Common interface for php_gmp and php_bcmath modules", 697 | "support": { 698 | "issues": "https://github.com/simplito/bigint-wrapper-php/issues", 699 | "source": "https://github.com/simplito/bigint-wrapper-php/tree/1.0.0" 700 | }, 701 | "time": "2018-02-27T12:38:08+00:00" 702 | }, 703 | { 704 | "name": "simplito/bn-php", 705 | "version": "1.1.3", 706 | "source": { 707 | "type": "git", 708 | "url": "https://github.com/simplito/bn-php.git", 709 | "reference": "189167f940cdb681288a967b0f4d66de81adcd97" 710 | }, 711 | "dist": { 712 | "type": "zip", 713 | "url": "https://api.github.com/repos/simplito/bn-php/zipball/189167f940cdb681288a967b0f4d66de81adcd97", 714 | "reference": "189167f940cdb681288a967b0f4d66de81adcd97", 715 | "shasum": "", 716 | "mirrors": [ 717 | { 718 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 719 | "preferred": true 720 | } 721 | ] 722 | }, 723 | "require": { 724 | "simplito/bigint-wrapper-php": "~1.0.0" 725 | }, 726 | "require-dev": { 727 | "phpunit/phpunit": "*" 728 | }, 729 | "type": "library", 730 | "autoload": { 731 | "psr-4": { 732 | "BN\\": "lib/" 733 | } 734 | }, 735 | "notification-url": "https://packagist.org/downloads/", 736 | "license": [ 737 | "MIT" 738 | ], 739 | "authors": [ 740 | { 741 | "name": "Simplito Team", 742 | "email": "s.smyczynski@simplito.com", 743 | "homepage": "https://simplito.com" 744 | } 745 | ], 746 | "description": "Big number implementation compatible with bn.js", 747 | "support": { 748 | "issues": "https://github.com/simplito/bn-php/issues", 749 | "source": "https://github.com/simplito/bn-php/tree/1.1.3" 750 | }, 751 | "time": "2022-08-12T18:58:14+00:00" 752 | }, 753 | { 754 | "name": "simplito/elliptic-php", 755 | "version": "1.0.12", 756 | "source": { 757 | "type": "git", 758 | "url": "https://github.com/simplito/elliptic-php.git", 759 | "reference": "be321666781be2be2c89c79c43ffcac834bc8868" 760 | }, 761 | "dist": { 762 | "type": "zip", 763 | "url": "https://api.github.com/repos/simplito/elliptic-php/zipball/be321666781be2be2c89c79c43ffcac834bc8868", 764 | "reference": "be321666781be2be2c89c79c43ffcac834bc8868", 765 | "shasum": "", 766 | "mirrors": [ 767 | { 768 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 769 | "preferred": true 770 | } 771 | ] 772 | }, 773 | "require": { 774 | "ext-gmp": "*", 775 | "simplito/bn-php": "~1.1.0" 776 | }, 777 | "require-dev": { 778 | "phpbench/phpbench": "@dev", 779 | "phpunit/phpunit": "*" 780 | }, 781 | "type": "library", 782 | "autoload": { 783 | "psr-4": { 784 | "Elliptic\\": "lib/" 785 | } 786 | }, 787 | "notification-url": "https://packagist.org/downloads/", 788 | "license": [ 789 | "MIT" 790 | ], 791 | "authors": [ 792 | { 793 | "name": "Simplito Team", 794 | "email": "s.smyczynski@simplito.com", 795 | "homepage": "https://simplito.com" 796 | } 797 | ], 798 | "description": "Fast elliptic curve cryptography", 799 | "homepage": "https://github.com/simplito/elliptic-php", 800 | "keywords": [ 801 | "Curve25519", 802 | "ECDSA", 803 | "Ed25519", 804 | "EdDSA", 805 | "cryptography", 806 | "curve", 807 | "curve25519-weier", 808 | "ecc", 809 | "ecdh", 810 | "elliptic", 811 | "nistp192", 812 | "nistp224", 813 | "nistp256", 814 | "nistp384", 815 | "nistp521", 816 | "secp256k1" 817 | ], 818 | "support": { 819 | "issues": "https://github.com/simplito/elliptic-php/issues", 820 | "source": "https://github.com/simplito/elliptic-php/tree/1.0.12" 821 | }, 822 | "time": "2024-01-09T14:57:04+00:00" 823 | }, 824 | { 825 | "name": "symfony/polyfill-intl-idn", 826 | "version": "1.x-dev", 827 | "source": { 828 | "type": "git", 829 | "url": "https://github.com/symfony/polyfill-intl-idn.git", 830 | "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" 831 | }, 832 | "dist": { 833 | "type": "zip", 834 | "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", 835 | "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", 836 | "shasum": "", 837 | "mirrors": [ 838 | { 839 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 840 | "preferred": true 841 | } 842 | ] 843 | }, 844 | "require": { 845 | "php": ">=7.1", 846 | "symfony/polyfill-intl-normalizer": "^1.10", 847 | "symfony/polyfill-php72": "^1.10" 848 | }, 849 | "suggest": { 850 | "ext-intl": "For best performance" 851 | }, 852 | "default-branch": true, 853 | "type": "library", 854 | "extra": { 855 | "thanks": { 856 | "name": "symfony/polyfill", 857 | "url": "https://github.com/symfony/polyfill" 858 | } 859 | }, 860 | "autoload": { 861 | "files": [ 862 | "bootstrap.php" 863 | ], 864 | "psr-4": { 865 | "Symfony\\Polyfill\\Intl\\Idn\\": "" 866 | } 867 | }, 868 | "notification-url": "https://packagist.org/downloads/", 869 | "license": [ 870 | "MIT" 871 | ], 872 | "authors": [ 873 | { 874 | "name": "Laurent Bassin", 875 | "email": "laurent@bassin.info" 876 | }, 877 | { 878 | "name": "Trevor Rowbotham", 879 | "email": "trevor.rowbotham@pm.me" 880 | }, 881 | { 882 | "name": "Symfony Community", 883 | "homepage": "https://symfony.com/contributors" 884 | } 885 | ], 886 | "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", 887 | "homepage": "https://symfony.com", 888 | "keywords": [ 889 | "compatibility", 890 | "idn", 891 | "intl", 892 | "polyfill", 893 | "portable", 894 | "shim" 895 | ], 896 | "support": { 897 | "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" 898 | }, 899 | "funding": [ 900 | { 901 | "url": "https://symfony.com/sponsor", 902 | "type": "custom" 903 | }, 904 | { 905 | "url": "https://github.com/fabpot", 906 | "type": "github" 907 | }, 908 | { 909 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 910 | "type": "tidelift" 911 | } 912 | ], 913 | "time": "2024-01-29T20:11:03+00:00" 914 | }, 915 | { 916 | "name": "symfony/polyfill-intl-normalizer", 917 | "version": "1.x-dev", 918 | "source": { 919 | "type": "git", 920 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 921 | "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" 922 | }, 923 | "dist": { 924 | "type": "zip", 925 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", 926 | "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", 927 | "shasum": "", 928 | "mirrors": [ 929 | { 930 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 931 | "preferred": true 932 | } 933 | ] 934 | }, 935 | "require": { 936 | "php": ">=7.1" 937 | }, 938 | "suggest": { 939 | "ext-intl": "For best performance" 940 | }, 941 | "default-branch": true, 942 | "type": "library", 943 | "extra": { 944 | "thanks": { 945 | "name": "symfony/polyfill", 946 | "url": "https://github.com/symfony/polyfill" 947 | } 948 | }, 949 | "autoload": { 950 | "files": [ 951 | "bootstrap.php" 952 | ], 953 | "psr-4": { 954 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 955 | }, 956 | "classmap": [ 957 | "Resources/stubs" 958 | ] 959 | }, 960 | "notification-url": "https://packagist.org/downloads/", 961 | "license": [ 962 | "MIT" 963 | ], 964 | "authors": [ 965 | { 966 | "name": "Nicolas Grekas", 967 | "email": "p@tchwork.com" 968 | }, 969 | { 970 | "name": "Symfony Community", 971 | "homepage": "https://symfony.com/contributors" 972 | } 973 | ], 974 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 975 | "homepage": "https://symfony.com", 976 | "keywords": [ 977 | "compatibility", 978 | "intl", 979 | "normalizer", 980 | "polyfill", 981 | "portable", 982 | "shim" 983 | ], 984 | "support": { 985 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" 986 | }, 987 | "funding": [ 988 | { 989 | "url": "https://symfony.com/sponsor", 990 | "type": "custom" 991 | }, 992 | { 993 | "url": "https://github.com/fabpot", 994 | "type": "github" 995 | }, 996 | { 997 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 998 | "type": "tidelift" 999 | } 1000 | ], 1001 | "time": "2024-01-29T20:11:03+00:00" 1002 | }, 1003 | { 1004 | "name": "symfony/polyfill-mbstring", 1005 | "version": "1.x-dev", 1006 | "source": { 1007 | "type": "git", 1008 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1009 | "reference": "e5e7ddb00b859dbdf5ad8f3bbe4cd29a3a37aa34" 1010 | }, 1011 | "dist": { 1012 | "type": "zip", 1013 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e5e7ddb00b859dbdf5ad8f3bbe4cd29a3a37aa34", 1014 | "reference": "e5e7ddb00b859dbdf5ad8f3bbe4cd29a3a37aa34", 1015 | "shasum": "", 1016 | "mirrors": [ 1017 | { 1018 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1019 | "preferred": true 1020 | } 1021 | ] 1022 | }, 1023 | "require": { 1024 | "php": ">=7.1" 1025 | }, 1026 | "provide": { 1027 | "ext-mbstring": "*" 1028 | }, 1029 | "suggest": { 1030 | "ext-mbstring": "For best performance" 1031 | }, 1032 | "default-branch": true, 1033 | "type": "library", 1034 | "extra": { 1035 | "thanks": { 1036 | "name": "symfony/polyfill", 1037 | "url": "https://github.com/symfony/polyfill" 1038 | } 1039 | }, 1040 | "autoload": { 1041 | "files": [ 1042 | "bootstrap.php" 1043 | ], 1044 | "psr-4": { 1045 | "Symfony\\Polyfill\\Mbstring\\": "" 1046 | } 1047 | }, 1048 | "notification-url": "https://packagist.org/downloads/", 1049 | "license": [ 1050 | "MIT" 1051 | ], 1052 | "authors": [ 1053 | { 1054 | "name": "Nicolas Grekas", 1055 | "email": "p@tchwork.com" 1056 | }, 1057 | { 1058 | "name": "Symfony Community", 1059 | "homepage": "https://symfony.com/contributors" 1060 | } 1061 | ], 1062 | "description": "Symfony polyfill for the Mbstring extension", 1063 | "homepage": "https://symfony.com", 1064 | "keywords": [ 1065 | "compatibility", 1066 | "mbstring", 1067 | "polyfill", 1068 | "portable", 1069 | "shim" 1070 | ], 1071 | "support": { 1072 | "source": "https://github.com/symfony/polyfill-mbstring/tree/1.x" 1073 | }, 1074 | "funding": [ 1075 | { 1076 | "url": "https://symfony.com/sponsor", 1077 | "type": "custom" 1078 | }, 1079 | { 1080 | "url": "https://github.com/fabpot", 1081 | "type": "github" 1082 | }, 1083 | { 1084 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1085 | "type": "tidelift" 1086 | } 1087 | ], 1088 | "time": "2024-03-14T13:49:05+00:00" 1089 | }, 1090 | { 1091 | "name": "symfony/polyfill-php72", 1092 | "version": "1.x-dev", 1093 | "source": { 1094 | "type": "git", 1095 | "url": "https://github.com/symfony/polyfill-php72.git", 1096 | "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" 1097 | }, 1098 | "dist": { 1099 | "type": "zip", 1100 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", 1101 | "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", 1102 | "shasum": "", 1103 | "mirrors": [ 1104 | { 1105 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1106 | "preferred": true 1107 | } 1108 | ] 1109 | }, 1110 | "require": { 1111 | "php": ">=7.1" 1112 | }, 1113 | "default-branch": true, 1114 | "type": "library", 1115 | "extra": { 1116 | "thanks": { 1117 | "name": "symfony/polyfill", 1118 | "url": "https://github.com/symfony/polyfill" 1119 | } 1120 | }, 1121 | "autoload": { 1122 | "files": [ 1123 | "bootstrap.php" 1124 | ], 1125 | "psr-4": { 1126 | "Symfony\\Polyfill\\Php72\\": "" 1127 | } 1128 | }, 1129 | "notification-url": "https://packagist.org/downloads/", 1130 | "license": [ 1131 | "MIT" 1132 | ], 1133 | "authors": [ 1134 | { 1135 | "name": "Nicolas Grekas", 1136 | "email": "p@tchwork.com" 1137 | }, 1138 | { 1139 | "name": "Symfony Community", 1140 | "homepage": "https://symfony.com/contributors" 1141 | } 1142 | ], 1143 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 1144 | "homepage": "https://symfony.com", 1145 | "keywords": [ 1146 | "compatibility", 1147 | "polyfill", 1148 | "portable", 1149 | "shim" 1150 | ], 1151 | "support": { 1152 | "source": "https://github.com/symfony/polyfill-php72/tree/1.x" 1153 | }, 1154 | "funding": [ 1155 | { 1156 | "url": "https://symfony.com/sponsor", 1157 | "type": "custom" 1158 | }, 1159 | { 1160 | "url": "https://github.com/fabpot", 1161 | "type": "github" 1162 | }, 1163 | { 1164 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1165 | "type": "tidelift" 1166 | } 1167 | ], 1168 | "time": "2024-01-29T20:11:03+00:00" 1169 | }, 1170 | { 1171 | "name": "web3p/ethereum-tx", 1172 | "version": "0.4.3", 1173 | "source": { 1174 | "type": "git", 1175 | "url": "https://github.com/web3p/ethereum-tx.git", 1176 | "reference": "8dc1adc10ae45ac440c43ac32a3c5adf63ed8cef" 1177 | }, 1178 | "dist": { 1179 | "type": "zip", 1180 | "url": "https://api.github.com/repos/web3p/ethereum-tx/zipball/8dc1adc10ae45ac440c43ac32a3c5adf63ed8cef", 1181 | "reference": "8dc1adc10ae45ac440c43ac32a3c5adf63ed8cef", 1182 | "shasum": "", 1183 | "mirrors": [ 1184 | { 1185 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1186 | "preferred": true 1187 | } 1188 | ] 1189 | }, 1190 | "require": { 1191 | "kornrunner/keccak": "~1", 1192 | "php": "^7.1|^8.0", 1193 | "simplito/elliptic-php": "~1.0.6", 1194 | "web3p/ethereum-util": "~0.1.3", 1195 | "web3p/rlp": "0.3.4" 1196 | }, 1197 | "require-dev": { 1198 | "phpunit/phpunit": "~7|~8.0" 1199 | }, 1200 | "type": "library", 1201 | "autoload": { 1202 | "psr-4": { 1203 | "Web3p\\EthereumTx\\": "src/" 1204 | } 1205 | }, 1206 | "notification-url": "https://packagist.org/downloads/", 1207 | "license": [ 1208 | "MIT" 1209 | ], 1210 | "authors": [ 1211 | { 1212 | "name": "sc0Vu", 1213 | "email": "alk03073135@gmail.com" 1214 | } 1215 | ], 1216 | "description": "Ethereum transaction library in PHP.", 1217 | "support": { 1218 | "issues": "https://github.com/web3p/ethereum-tx/issues", 1219 | "source": "https://github.com/web3p/ethereum-tx/tree/0.4.3" 1220 | }, 1221 | "time": "2021-09-01T05:13:20+00:00" 1222 | }, 1223 | { 1224 | "name": "web3p/ethereum-util", 1225 | "version": "0.1.4", 1226 | "source": { 1227 | "type": "git", 1228 | "url": "https://github.com/web3p/ethereum-util.git", 1229 | "reference": "9a01f5389835d4092d338bb7b7d119017052ca68" 1230 | }, 1231 | "dist": { 1232 | "type": "zip", 1233 | "url": "https://api.github.com/repos/web3p/ethereum-util/zipball/9a01f5389835d4092d338bb7b7d119017052ca68", 1234 | "reference": "9a01f5389835d4092d338bb7b7d119017052ca68", 1235 | "shasum": "", 1236 | "mirrors": [ 1237 | { 1238 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1239 | "preferred": true 1240 | } 1241 | ] 1242 | }, 1243 | "require": { 1244 | "kornrunner/keccak": "~1", 1245 | "php": "^7.1 | ^8.0", 1246 | "phpseclib/phpseclib": "~2.0", 1247 | "simplito/elliptic-php": "~1.0.6" 1248 | }, 1249 | "require-dev": { 1250 | "phpunit/phpunit": "~7 | ~8.0" 1251 | }, 1252 | "type": "library", 1253 | "autoload": { 1254 | "psr-4": { 1255 | "Web3p\\EthereumUtil\\": "src/" 1256 | } 1257 | }, 1258 | "notification-url": "https://packagist.org/downloads/", 1259 | "license": [ 1260 | "MIT" 1261 | ], 1262 | "authors": [ 1263 | { 1264 | "name": "sc0Vu", 1265 | "email": "alk03073135@gmail.com" 1266 | } 1267 | ], 1268 | "description": "A collection of utility functions for Ethereum written in PHP.", 1269 | "support": { 1270 | "issues": "https://github.com/web3p/ethereum-util/issues", 1271 | "source": "https://github.com/web3p/ethereum-util/tree/0.1.4" 1272 | }, 1273 | "time": "2022-12-18T05:42:39+00:00" 1274 | }, 1275 | { 1276 | "name": "web3p/rlp", 1277 | "version": "0.3.4", 1278 | "source": { 1279 | "type": "git", 1280 | "url": "https://github.com/web3p/rlp.git", 1281 | "reference": "1653af23142863b490bdf22c6d0335bdb588c983" 1282 | }, 1283 | "dist": { 1284 | "type": "zip", 1285 | "url": "https://api.github.com/repos/web3p/rlp/zipball/1653af23142863b490bdf22c6d0335bdb588c983", 1286 | "reference": "1653af23142863b490bdf22c6d0335bdb588c983", 1287 | "shasum": "", 1288 | "mirrors": [ 1289 | { 1290 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1291 | "preferred": true 1292 | } 1293 | ] 1294 | }, 1295 | "require": { 1296 | "ext-mbstring": "*", 1297 | "php": "^7.1 | ^8.0" 1298 | }, 1299 | "require-dev": { 1300 | "phpunit/phpunit": "~7|~8.0" 1301 | }, 1302 | "type": "library", 1303 | "autoload": { 1304 | "psr-4": { 1305 | "Web3p\\RLP\\": "src/" 1306 | } 1307 | }, 1308 | "notification-url": "https://packagist.org/downloads/", 1309 | "license": [ 1310 | "MIT" 1311 | ], 1312 | "authors": [ 1313 | { 1314 | "name": "sc0Vu", 1315 | "email": "alk03073135@gmail.com" 1316 | } 1317 | ], 1318 | "description": "Recursive Length Prefix Encoding in PHP.", 1319 | "support": { 1320 | "issues": "https://github.com/web3p/rlp/issues", 1321 | "source": "https://github.com/web3p/rlp/tree/0.3.4" 1322 | }, 1323 | "time": "2021-08-30T10:22:03+00:00" 1324 | } 1325 | ], 1326 | "packages-dev": [ 1327 | { 1328 | "name": "doctrine/deprecations", 1329 | "version": "1.1.x-dev", 1330 | "source": { 1331 | "type": "git", 1332 | "url": "https://github.com/doctrine/deprecations.git", 1333 | "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" 1334 | }, 1335 | "dist": { 1336 | "type": "zip", 1337 | "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", 1338 | "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", 1339 | "shasum": "", 1340 | "mirrors": [ 1341 | { 1342 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1343 | "preferred": true 1344 | } 1345 | ] 1346 | }, 1347 | "require": { 1348 | "php": "^7.1 || ^8.0" 1349 | }, 1350 | "require-dev": { 1351 | "doctrine/coding-standard": "^9", 1352 | "phpstan/phpstan": "1.4.10 || 1.10.15", 1353 | "phpstan/phpstan-phpunit": "^1.0", 1354 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 1355 | "psalm/plugin-phpunit": "0.18.4", 1356 | "psr/log": "^1 || ^2 || ^3", 1357 | "vimeo/psalm": "4.30.0 || 5.12.0" 1358 | }, 1359 | "suggest": { 1360 | "psr/log": "Allows logging deprecations via PSR-3 logger implementation" 1361 | }, 1362 | "default-branch": true, 1363 | "type": "library", 1364 | "autoload": { 1365 | "psr-4": { 1366 | "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" 1367 | } 1368 | }, 1369 | "notification-url": "https://packagist.org/downloads/", 1370 | "license": [ 1371 | "MIT" 1372 | ], 1373 | "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", 1374 | "homepage": "https://www.doctrine-project.org/", 1375 | "support": { 1376 | "issues": "https://github.com/doctrine/deprecations/issues", 1377 | "source": "https://github.com/doctrine/deprecations/tree/1.1.x" 1378 | }, 1379 | "time": "2024-01-30T19:34:25+00:00" 1380 | }, 1381 | { 1382 | "name": "doctrine/instantiator", 1383 | "version": "1.5.x-dev", 1384 | "source": { 1385 | "type": "git", 1386 | "url": "https://github.com/doctrine/instantiator.git", 1387 | "reference": "12be2483e1f0e850b353e26869e4e6c038459501" 1388 | }, 1389 | "dist": { 1390 | "type": "zip", 1391 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/12be2483e1f0e850b353e26869e4e6c038459501", 1392 | "reference": "12be2483e1f0e850b353e26869e4e6c038459501", 1393 | "shasum": "", 1394 | "mirrors": [ 1395 | { 1396 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1397 | "preferred": true 1398 | } 1399 | ] 1400 | }, 1401 | "require": { 1402 | "php": "^7.1 || ^8.0" 1403 | }, 1404 | "require-dev": { 1405 | "doctrine/coding-standard": "^9 || ^12", 1406 | "ext-pdo": "*", 1407 | "ext-phar": "*", 1408 | "phpbench/phpbench": "^0.16 || ^1", 1409 | "phpstan/phpstan": "^1.4", 1410 | "phpstan/phpstan-phpunit": "^1", 1411 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", 1412 | "vimeo/psalm": "^4.30 || ^5.4" 1413 | }, 1414 | "type": "library", 1415 | "autoload": { 1416 | "psr-4": { 1417 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 1418 | } 1419 | }, 1420 | "notification-url": "https://packagist.org/downloads/", 1421 | "license": [ 1422 | "MIT" 1423 | ], 1424 | "authors": [ 1425 | { 1426 | "name": "Marco Pivetta", 1427 | "email": "ocramius@gmail.com", 1428 | "homepage": "https://ocramius.github.io/" 1429 | } 1430 | ], 1431 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 1432 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 1433 | "keywords": [ 1434 | "constructor", 1435 | "instantiate" 1436 | ], 1437 | "support": { 1438 | "issues": "https://github.com/doctrine/instantiator/issues", 1439 | "source": "https://github.com/doctrine/instantiator/tree/1.5.x" 1440 | }, 1441 | "funding": [ 1442 | { 1443 | "url": "https://www.doctrine-project.org/sponsorship.html", 1444 | "type": "custom" 1445 | }, 1446 | { 1447 | "url": "https://www.patreon.com/phpdoctrine", 1448 | "type": "patreon" 1449 | }, 1450 | { 1451 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 1452 | "type": "tidelift" 1453 | } 1454 | ], 1455 | "time": "2023-12-09T14:16:53+00:00" 1456 | }, 1457 | { 1458 | "name": "myclabs/deep-copy", 1459 | "version": "1.x-dev", 1460 | "source": { 1461 | "type": "git", 1462 | "url": "https://github.com/myclabs/DeepCopy.git", 1463 | "reference": "2f5294676c802a62b0549f6bc8983f14294ce369" 1464 | }, 1465 | "dist": { 1466 | "type": "zip", 1467 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/2f5294676c802a62b0549f6bc8983f14294ce369", 1468 | "reference": "2f5294676c802a62b0549f6bc8983f14294ce369", 1469 | "shasum": "", 1470 | "mirrors": [ 1471 | { 1472 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1473 | "preferred": true 1474 | } 1475 | ] 1476 | }, 1477 | "require": { 1478 | "php": "^7.1 || ^8.0" 1479 | }, 1480 | "conflict": { 1481 | "doctrine/collections": "<1.6.8", 1482 | "doctrine/common": "<2.13.3 || >=3 <3.2.2" 1483 | }, 1484 | "require-dev": { 1485 | "doctrine/collections": "^1.6.8", 1486 | "doctrine/common": "^2.13.3 || ^3.2.2", 1487 | "phpspec/prophecy": "^1.10", 1488 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 1489 | }, 1490 | "default-branch": true, 1491 | "type": "library", 1492 | "autoload": { 1493 | "files": [ 1494 | "src/DeepCopy/deep_copy.php" 1495 | ], 1496 | "psr-4": { 1497 | "DeepCopy\\": "src/DeepCopy/" 1498 | } 1499 | }, 1500 | "notification-url": "https://packagist.org/downloads/", 1501 | "license": [ 1502 | "MIT" 1503 | ], 1504 | "description": "Create deep copies (clones) of your objects", 1505 | "keywords": [ 1506 | "clone", 1507 | "copy", 1508 | "duplicate", 1509 | "object", 1510 | "object graph" 1511 | ], 1512 | "support": { 1513 | "issues": "https://github.com/myclabs/DeepCopy/issues", 1514 | "source": "https://github.com/myclabs/DeepCopy/tree/1.x" 1515 | }, 1516 | "funding": [ 1517 | { 1518 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 1519 | "type": "tidelift" 1520 | } 1521 | ], 1522 | "time": "2024-02-10T11:10:03+00:00" 1523 | }, 1524 | { 1525 | "name": "phar-io/manifest", 1526 | "version": "1.0.1", 1527 | "source": { 1528 | "type": "git", 1529 | "url": "https://github.com/phar-io/manifest.git", 1530 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" 1531 | }, 1532 | "dist": { 1533 | "type": "zip", 1534 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", 1535 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", 1536 | "shasum": "", 1537 | "mirrors": [ 1538 | { 1539 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1540 | "preferred": true 1541 | } 1542 | ] 1543 | }, 1544 | "require": { 1545 | "ext-dom": "*", 1546 | "ext-phar": "*", 1547 | "phar-io/version": "^1.0.1", 1548 | "php": "^5.6 || ^7.0" 1549 | }, 1550 | "type": "library", 1551 | "extra": { 1552 | "branch-alias": { 1553 | "dev-master": "1.0.x-dev" 1554 | } 1555 | }, 1556 | "autoload": { 1557 | "classmap": [ 1558 | "src/" 1559 | ] 1560 | }, 1561 | "notification-url": "https://packagist.org/downloads/", 1562 | "license": [ 1563 | "BSD-3-Clause" 1564 | ], 1565 | "authors": [ 1566 | { 1567 | "name": "Arne Blankerts", 1568 | "email": "arne@blankerts.de", 1569 | "role": "Developer" 1570 | }, 1571 | { 1572 | "name": "Sebastian Heuer", 1573 | "email": "sebastian@phpeople.de", 1574 | "role": "Developer" 1575 | }, 1576 | { 1577 | "name": "Sebastian Bergmann", 1578 | "email": "sebastian@phpunit.de", 1579 | "role": "Developer" 1580 | } 1581 | ], 1582 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 1583 | "support": { 1584 | "issues": "https://github.com/phar-io/manifest/issues", 1585 | "source": "https://github.com/phar-io/manifest/tree/master" 1586 | }, 1587 | "time": "2017-03-05T18:14:27+00:00" 1588 | }, 1589 | { 1590 | "name": "phar-io/version", 1591 | "version": "1.0.1", 1592 | "source": { 1593 | "type": "git", 1594 | "url": "https://github.com/phar-io/version.git", 1595 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" 1596 | }, 1597 | "dist": { 1598 | "type": "zip", 1599 | "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", 1600 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", 1601 | "shasum": "", 1602 | "mirrors": [ 1603 | { 1604 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1605 | "preferred": true 1606 | } 1607 | ] 1608 | }, 1609 | "require": { 1610 | "php": "^5.6 || ^7.0" 1611 | }, 1612 | "type": "library", 1613 | "autoload": { 1614 | "classmap": [ 1615 | "src/" 1616 | ] 1617 | }, 1618 | "notification-url": "https://packagist.org/downloads/", 1619 | "license": [ 1620 | "BSD-3-Clause" 1621 | ], 1622 | "authors": [ 1623 | { 1624 | "name": "Arne Blankerts", 1625 | "email": "arne@blankerts.de", 1626 | "role": "Developer" 1627 | }, 1628 | { 1629 | "name": "Sebastian Heuer", 1630 | "email": "sebastian@phpeople.de", 1631 | "role": "Developer" 1632 | }, 1633 | { 1634 | "name": "Sebastian Bergmann", 1635 | "email": "sebastian@phpunit.de", 1636 | "role": "Developer" 1637 | } 1638 | ], 1639 | "description": "Library for handling version information and constraints", 1640 | "support": { 1641 | "issues": "https://github.com/phar-io/version/issues", 1642 | "source": "https://github.com/phar-io/version/tree/master" 1643 | }, 1644 | "time": "2017-03-05T17:38:23+00:00" 1645 | }, 1646 | { 1647 | "name": "phpdocumentor/reflection-common", 1648 | "version": "dev-master", 1649 | "source": { 1650 | "type": "git", 1651 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 1652 | "reference": "a0eeab580cbdf4414fef6978732510a36ed0a9d6" 1653 | }, 1654 | "dist": { 1655 | "type": "zip", 1656 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/a0eeab580cbdf4414fef6978732510a36ed0a9d6", 1657 | "reference": "a0eeab580cbdf4414fef6978732510a36ed0a9d6", 1658 | "shasum": "", 1659 | "mirrors": [ 1660 | { 1661 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1662 | "preferred": true 1663 | } 1664 | ] 1665 | }, 1666 | "require": { 1667 | "php": ">=7.1" 1668 | }, 1669 | "type": "library", 1670 | "extra": { 1671 | "branch-alias": { 1672 | "dev-master": "2.x-dev" 1673 | } 1674 | }, 1675 | "autoload": { 1676 | "psr-4": { 1677 | "phpDocumentor\\Reflection\\": "src/" 1678 | } 1679 | }, 1680 | "notification-url": "https://packagist.org/downloads/", 1681 | "license": [ 1682 | "MIT" 1683 | ], 1684 | "authors": [ 1685 | { 1686 | "name": "Jaap van Otterdijk", 1687 | "email": "opensource@ijaap.nl" 1688 | } 1689 | ], 1690 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1691 | "homepage": "http://www.phpdoc.org", 1692 | "keywords": [ 1693 | "FQSEN", 1694 | "phpDocumentor", 1695 | "phpdoc", 1696 | "reflection", 1697 | "static analysis" 1698 | ], 1699 | "support": { 1700 | "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", 1701 | "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master" 1702 | }, 1703 | "time": "2021-06-25T13:47:51+00:00" 1704 | }, 1705 | { 1706 | "name": "phpdocumentor/reflection-docblock", 1707 | "version": "5.x-dev", 1708 | "source": { 1709 | "type": "git", 1710 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1711 | "reference": "7b2f618fe17cd79ff4308b8000755557235bec66" 1712 | }, 1713 | "dist": { 1714 | "type": "zip", 1715 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7b2f618fe17cd79ff4308b8000755557235bec66", 1716 | "reference": "7b2f618fe17cd79ff4308b8000755557235bec66", 1717 | "shasum": "", 1718 | "mirrors": [ 1719 | { 1720 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1721 | "preferred": true 1722 | } 1723 | ] 1724 | }, 1725 | "require": { 1726 | "doctrine/deprecations": "^1.1", 1727 | "ext-filter": "*", 1728 | "php": "^7.4 || ^8.0", 1729 | "phpdocumentor/reflection-common": "^2.2", 1730 | "phpdocumentor/type-resolver": "^1.7", 1731 | "phpstan/phpdoc-parser": "^1.7", 1732 | "webmozart/assert": "^1.9.1" 1733 | }, 1734 | "require-dev": { 1735 | "mockery/mockery": "~1.3.5", 1736 | "phpstan/extension-installer": "^1.1", 1737 | "phpstan/phpstan": "^1.8", 1738 | "phpstan/phpstan-mockery": "^1.1", 1739 | "phpstan/phpstan-webmozart-assert": "^1.2", 1740 | "phpunit/phpunit": "^9.5", 1741 | "vimeo/psalm": "^5.13" 1742 | }, 1743 | "default-branch": true, 1744 | "type": "library", 1745 | "extra": { 1746 | "branch-alias": { 1747 | "dev-master": "5.x-dev" 1748 | } 1749 | }, 1750 | "autoload": { 1751 | "psr-4": { 1752 | "phpDocumentor\\Reflection\\": "src" 1753 | } 1754 | }, 1755 | "notification-url": "https://packagist.org/downloads/", 1756 | "license": [ 1757 | "MIT" 1758 | ], 1759 | "authors": [ 1760 | { 1761 | "name": "Mike van Riel", 1762 | "email": "me@mikevanriel.com" 1763 | }, 1764 | { 1765 | "name": "Jaap van Otterdijk", 1766 | "email": "opensource@ijaap.nl" 1767 | } 1768 | ], 1769 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1770 | "support": { 1771 | "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", 1772 | "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.x" 1773 | }, 1774 | "time": "2024-03-20T21:16:52+00:00" 1775 | }, 1776 | { 1777 | "name": "phpdocumentor/type-resolver", 1778 | "version": "1.x-dev", 1779 | "source": { 1780 | "type": "git", 1781 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1782 | "reference": "f237fbdffa17356996e82767556f8f6600ba49cf" 1783 | }, 1784 | "dist": { 1785 | "type": "zip", 1786 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/f237fbdffa17356996e82767556f8f6600ba49cf", 1787 | "reference": "f237fbdffa17356996e82767556f8f6600ba49cf", 1788 | "shasum": "", 1789 | "mirrors": [ 1790 | { 1791 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1792 | "preferred": true 1793 | } 1794 | ] 1795 | }, 1796 | "require": { 1797 | "doctrine/deprecations": "^1.0", 1798 | "php": "^7.3 || ^8.0", 1799 | "phpdocumentor/reflection-common": "^2.0", 1800 | "phpstan/phpdoc-parser": "^1.13" 1801 | }, 1802 | "require-dev": { 1803 | "ext-tokenizer": "*", 1804 | "phpbench/phpbench": "^1.2", 1805 | "phpstan/extension-installer": "^1.1", 1806 | "phpstan/phpstan": "^1.8", 1807 | "phpstan/phpstan-phpunit": "^1.1", 1808 | "phpunit/phpunit": "^9.5", 1809 | "rector/rector": "^0.13.9", 1810 | "vimeo/psalm": "^4.25" 1811 | }, 1812 | "default-branch": true, 1813 | "type": "library", 1814 | "extra": { 1815 | "branch-alias": { 1816 | "dev-1.x": "1.x-dev" 1817 | } 1818 | }, 1819 | "autoload": { 1820 | "psr-4": { 1821 | "phpDocumentor\\Reflection\\": "src" 1822 | } 1823 | }, 1824 | "notification-url": "https://packagist.org/downloads/", 1825 | "license": [ 1826 | "MIT" 1827 | ], 1828 | "authors": [ 1829 | { 1830 | "name": "Mike van Riel", 1831 | "email": "me@mikevanriel.com" 1832 | } 1833 | ], 1834 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 1835 | "support": { 1836 | "issues": "https://github.com/phpDocumentor/TypeResolver/issues", 1837 | "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.x" 1838 | }, 1839 | "time": "2024-03-22T10:43:43+00:00" 1840 | }, 1841 | { 1842 | "name": "phpspec/prophecy", 1843 | "version": "v1.10.3", 1844 | "source": { 1845 | "type": "git", 1846 | "url": "https://github.com/phpspec/prophecy.git", 1847 | "reference": "451c3cd1418cf640de218914901e51b064abb093" 1848 | }, 1849 | "dist": { 1850 | "type": "zip", 1851 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", 1852 | "reference": "451c3cd1418cf640de218914901e51b064abb093", 1853 | "shasum": "", 1854 | "mirrors": [ 1855 | { 1856 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1857 | "preferred": true 1858 | } 1859 | ] 1860 | }, 1861 | "require": { 1862 | "doctrine/instantiator": "^1.0.2", 1863 | "php": "^5.3|^7.0", 1864 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", 1865 | "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", 1866 | "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" 1867 | }, 1868 | "require-dev": { 1869 | "phpspec/phpspec": "^2.5 || ^3.2", 1870 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 1871 | }, 1872 | "type": "library", 1873 | "extra": { 1874 | "branch-alias": { 1875 | "dev-master": "1.10.x-dev" 1876 | } 1877 | }, 1878 | "autoload": { 1879 | "psr-4": { 1880 | "Prophecy\\": "src/Prophecy" 1881 | } 1882 | }, 1883 | "notification-url": "https://packagist.org/downloads/", 1884 | "license": [ 1885 | "MIT" 1886 | ], 1887 | "authors": [ 1888 | { 1889 | "name": "Konstantin Kudryashov", 1890 | "email": "ever.zet@gmail.com", 1891 | "homepage": "http://everzet.com" 1892 | }, 1893 | { 1894 | "name": "Marcello Duarte", 1895 | "email": "marcello.duarte@gmail.com" 1896 | } 1897 | ], 1898 | "description": "Highly opinionated mocking framework for PHP 5.3+", 1899 | "homepage": "https://github.com/phpspec/prophecy", 1900 | "keywords": [ 1901 | "Double", 1902 | "Dummy", 1903 | "fake", 1904 | "mock", 1905 | "spy", 1906 | "stub" 1907 | ], 1908 | "support": { 1909 | "issues": "https://github.com/phpspec/prophecy/issues", 1910 | "source": "https://github.com/phpspec/prophecy/tree/v1.10.3" 1911 | }, 1912 | "time": "2020-03-05T15:02:03+00:00" 1913 | }, 1914 | { 1915 | "name": "phpstan/phpdoc-parser", 1916 | "version": "1.26.0", 1917 | "source": { 1918 | "type": "git", 1919 | "url": "https://github.com/phpstan/phpdoc-parser.git", 1920 | "reference": "231e3186624c03d7e7c890ec662b81e6b0405227" 1921 | }, 1922 | "dist": { 1923 | "type": "zip", 1924 | "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227", 1925 | "reference": "231e3186624c03d7e7c890ec662b81e6b0405227", 1926 | "shasum": "", 1927 | "mirrors": [ 1928 | { 1929 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1930 | "preferred": true 1931 | } 1932 | ] 1933 | }, 1934 | "require": { 1935 | "php": "^7.2 || ^8.0" 1936 | }, 1937 | "require-dev": { 1938 | "doctrine/annotations": "^2.0", 1939 | "nikic/php-parser": "^4.15", 1940 | "php-parallel-lint/php-parallel-lint": "^1.2", 1941 | "phpstan/extension-installer": "^1.0", 1942 | "phpstan/phpstan": "^1.5", 1943 | "phpstan/phpstan-phpunit": "^1.1", 1944 | "phpstan/phpstan-strict-rules": "^1.0", 1945 | "phpunit/phpunit": "^9.5", 1946 | "symfony/process": "^5.2" 1947 | }, 1948 | "type": "library", 1949 | "autoload": { 1950 | "psr-4": { 1951 | "PHPStan\\PhpDocParser\\": [ 1952 | "src/" 1953 | ] 1954 | } 1955 | }, 1956 | "notification-url": "https://packagist.org/downloads/", 1957 | "license": [ 1958 | "MIT" 1959 | ], 1960 | "description": "PHPDoc parser with support for nullable, intersection and generic types", 1961 | "support": { 1962 | "issues": "https://github.com/phpstan/phpdoc-parser/issues", 1963 | "source": "https://github.com/phpstan/phpdoc-parser/tree/1.26.0" 1964 | }, 1965 | "time": "2024-02-23T16:05:55+00:00" 1966 | }, 1967 | { 1968 | "name": "phpunit/php-code-coverage", 1969 | "version": "5.3.2", 1970 | "source": { 1971 | "type": "git", 1972 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1973 | "reference": "c89677919c5dd6d3b3852f230a663118762218ac" 1974 | }, 1975 | "dist": { 1976 | "type": "zip", 1977 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", 1978 | "reference": "c89677919c5dd6d3b3852f230a663118762218ac", 1979 | "shasum": "", 1980 | "mirrors": [ 1981 | { 1982 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 1983 | "preferred": true 1984 | } 1985 | ] 1986 | }, 1987 | "require": { 1988 | "ext-dom": "*", 1989 | "ext-xmlwriter": "*", 1990 | "php": "^7.0", 1991 | "phpunit/php-file-iterator": "^1.4.2", 1992 | "phpunit/php-text-template": "^1.2.1", 1993 | "phpunit/php-token-stream": "^2.0.1", 1994 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 1995 | "sebastian/environment": "^3.0", 1996 | "sebastian/version": "^2.0.1", 1997 | "theseer/tokenizer": "^1.1" 1998 | }, 1999 | "require-dev": { 2000 | "phpunit/phpunit": "^6.0" 2001 | }, 2002 | "suggest": { 2003 | "ext-xdebug": "^2.5.5" 2004 | }, 2005 | "type": "library", 2006 | "extra": { 2007 | "branch-alias": { 2008 | "dev-master": "5.3.x-dev" 2009 | } 2010 | }, 2011 | "autoload": { 2012 | "classmap": [ 2013 | "src/" 2014 | ] 2015 | }, 2016 | "notification-url": "https://packagist.org/downloads/", 2017 | "license": [ 2018 | "BSD-3-Clause" 2019 | ], 2020 | "authors": [ 2021 | { 2022 | "name": "Sebastian Bergmann", 2023 | "email": "sebastian@phpunit.de", 2024 | "role": "lead" 2025 | } 2026 | ], 2027 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 2028 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 2029 | "keywords": [ 2030 | "coverage", 2031 | "testing", 2032 | "xunit" 2033 | ], 2034 | "support": { 2035 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 2036 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/5.3" 2037 | }, 2038 | "time": "2018-04-06T15:36:58+00:00" 2039 | }, 2040 | { 2041 | "name": "phpunit/php-file-iterator", 2042 | "version": "1.4.x-dev", 2043 | "source": { 2044 | "type": "git", 2045 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2046 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" 2047 | }, 2048 | "dist": { 2049 | "type": "zip", 2050 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", 2051 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", 2052 | "shasum": "", 2053 | "mirrors": [ 2054 | { 2055 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2056 | "preferred": true 2057 | } 2058 | ] 2059 | }, 2060 | "require": { 2061 | "php": ">=5.3.3" 2062 | }, 2063 | "type": "library", 2064 | "extra": { 2065 | "branch-alias": { 2066 | "dev-master": "1.4.x-dev" 2067 | } 2068 | }, 2069 | "autoload": { 2070 | "classmap": [ 2071 | "src/" 2072 | ] 2073 | }, 2074 | "notification-url": "https://packagist.org/downloads/", 2075 | "license": [ 2076 | "BSD-3-Clause" 2077 | ], 2078 | "authors": [ 2079 | { 2080 | "name": "Sebastian Bergmann", 2081 | "email": "sb@sebastian-bergmann.de", 2082 | "role": "lead" 2083 | } 2084 | ], 2085 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2086 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2087 | "keywords": [ 2088 | "filesystem", 2089 | "iterator" 2090 | ], 2091 | "support": { 2092 | "irc": "irc://irc.freenode.net/phpunit", 2093 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 2094 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5" 2095 | }, 2096 | "time": "2017-11-27T13:52:08+00:00" 2097 | }, 2098 | { 2099 | "name": "phpunit/php-text-template", 2100 | "version": "1.2.1", 2101 | "source": { 2102 | "type": "git", 2103 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2104 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 2105 | }, 2106 | "dist": { 2107 | "type": "zip", 2108 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2109 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2110 | "shasum": "", 2111 | "mirrors": [ 2112 | { 2113 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2114 | "preferred": true 2115 | } 2116 | ] 2117 | }, 2118 | "require": { 2119 | "php": ">=5.3.3" 2120 | }, 2121 | "type": "library", 2122 | "autoload": { 2123 | "classmap": [ 2124 | "src/" 2125 | ] 2126 | }, 2127 | "notification-url": "https://packagist.org/downloads/", 2128 | "license": [ 2129 | "BSD-3-Clause" 2130 | ], 2131 | "authors": [ 2132 | { 2133 | "name": "Sebastian Bergmann", 2134 | "email": "sebastian@phpunit.de", 2135 | "role": "lead" 2136 | } 2137 | ], 2138 | "description": "Simple template engine.", 2139 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2140 | "keywords": [ 2141 | "template" 2142 | ], 2143 | "support": { 2144 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 2145 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" 2146 | }, 2147 | "time": "2015-06-21T13:50:34+00:00" 2148 | }, 2149 | { 2150 | "name": "phpunit/php-timer", 2151 | "version": "1.0.x-dev", 2152 | "source": { 2153 | "type": "git", 2154 | "url": "https://github.com/sebastianbergmann/php-timer.git", 2155 | "reference": "9513098641797ce5f459dbc1de5a54c29b0ec1fb" 2156 | }, 2157 | "dist": { 2158 | "type": "zip", 2159 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/9513098641797ce5f459dbc1de5a54c29b0ec1fb", 2160 | "reference": "9513098641797ce5f459dbc1de5a54c29b0ec1fb", 2161 | "shasum": "", 2162 | "mirrors": [ 2163 | { 2164 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2165 | "preferred": true 2166 | } 2167 | ] 2168 | }, 2169 | "require": { 2170 | "php": "^5.3.3 || ^7.0" 2171 | }, 2172 | "require-dev": { 2173 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 2174 | }, 2175 | "type": "library", 2176 | "extra": { 2177 | "branch-alias": { 2178 | "dev-master": "1.0-dev" 2179 | } 2180 | }, 2181 | "autoload": { 2182 | "classmap": [ 2183 | "src/" 2184 | ] 2185 | }, 2186 | "notification-url": "https://packagist.org/downloads/", 2187 | "license": [ 2188 | "BSD-3-Clause" 2189 | ], 2190 | "authors": [ 2191 | { 2192 | "name": "Sebastian Bergmann", 2193 | "email": "sb@sebastian-bergmann.de", 2194 | "role": "lead" 2195 | } 2196 | ], 2197 | "description": "Utility class for timing", 2198 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 2199 | "keywords": [ 2200 | "timer" 2201 | ], 2202 | "support": { 2203 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 2204 | "source": "https://github.com/sebastianbergmann/php-timer/tree/1.0" 2205 | }, 2206 | "time": "2018-01-06T05:27:16+00:00" 2207 | }, 2208 | { 2209 | "name": "phpunit/php-token-stream", 2210 | "version": "2.0.2", 2211 | "source": { 2212 | "type": "git", 2213 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 2214 | "reference": "791198a2c6254db10131eecfe8c06670700904db" 2215 | }, 2216 | "dist": { 2217 | "type": "zip", 2218 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", 2219 | "reference": "791198a2c6254db10131eecfe8c06670700904db", 2220 | "shasum": "", 2221 | "mirrors": [ 2222 | { 2223 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2224 | "preferred": true 2225 | } 2226 | ] 2227 | }, 2228 | "require": { 2229 | "ext-tokenizer": "*", 2230 | "php": "^7.0" 2231 | }, 2232 | "require-dev": { 2233 | "phpunit/phpunit": "^6.2.4" 2234 | }, 2235 | "type": "library", 2236 | "extra": { 2237 | "branch-alias": { 2238 | "dev-master": "2.0-dev" 2239 | } 2240 | }, 2241 | "autoload": { 2242 | "classmap": [ 2243 | "src/" 2244 | ] 2245 | }, 2246 | "notification-url": "https://packagist.org/downloads/", 2247 | "license": [ 2248 | "BSD-3-Clause" 2249 | ], 2250 | "authors": [ 2251 | { 2252 | "name": "Sebastian Bergmann", 2253 | "email": "sebastian@phpunit.de" 2254 | } 2255 | ], 2256 | "description": "Wrapper around PHP's tokenizer extension.", 2257 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 2258 | "keywords": [ 2259 | "tokenizer" 2260 | ], 2261 | "support": { 2262 | "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", 2263 | "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" 2264 | }, 2265 | "abandoned": true, 2266 | "time": "2017-11-27T05:48:46+00:00" 2267 | }, 2268 | { 2269 | "name": "phpunit/phpunit", 2270 | "version": "6.5.14", 2271 | "source": { 2272 | "type": "git", 2273 | "url": "https://github.com/sebastianbergmann/phpunit.git", 2274 | "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7" 2275 | }, 2276 | "dist": { 2277 | "type": "zip", 2278 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bac23fe7ff13dbdb461481f706f0e9fe746334b7", 2279 | "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7", 2280 | "shasum": "", 2281 | "mirrors": [ 2282 | { 2283 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2284 | "preferred": true 2285 | } 2286 | ] 2287 | }, 2288 | "require": { 2289 | "ext-dom": "*", 2290 | "ext-json": "*", 2291 | "ext-libxml": "*", 2292 | "ext-mbstring": "*", 2293 | "ext-xml": "*", 2294 | "myclabs/deep-copy": "^1.6.1", 2295 | "phar-io/manifest": "^1.0.1", 2296 | "phar-io/version": "^1.0", 2297 | "php": "^7.0", 2298 | "phpspec/prophecy": "^1.7", 2299 | "phpunit/php-code-coverage": "^5.3", 2300 | "phpunit/php-file-iterator": "^1.4.3", 2301 | "phpunit/php-text-template": "^1.2.1", 2302 | "phpunit/php-timer": "^1.0.9", 2303 | "phpunit/phpunit-mock-objects": "^5.0.9", 2304 | "sebastian/comparator": "^2.1", 2305 | "sebastian/diff": "^2.0", 2306 | "sebastian/environment": "^3.1", 2307 | "sebastian/exporter": "^3.1", 2308 | "sebastian/global-state": "^2.0", 2309 | "sebastian/object-enumerator": "^3.0.3", 2310 | "sebastian/resource-operations": "^1.0", 2311 | "sebastian/version": "^2.0.1" 2312 | }, 2313 | "conflict": { 2314 | "phpdocumentor/reflection-docblock": "3.0.2", 2315 | "phpunit/dbunit": "<3.0" 2316 | }, 2317 | "require-dev": { 2318 | "ext-pdo": "*" 2319 | }, 2320 | "suggest": { 2321 | "ext-xdebug": "*", 2322 | "phpunit/php-invoker": "^1.1" 2323 | }, 2324 | "bin": [ 2325 | "phpunit" 2326 | ], 2327 | "type": "library", 2328 | "extra": { 2329 | "branch-alias": { 2330 | "dev-master": "6.5.x-dev" 2331 | } 2332 | }, 2333 | "autoload": { 2334 | "classmap": [ 2335 | "src/" 2336 | ] 2337 | }, 2338 | "notification-url": "https://packagist.org/downloads/", 2339 | "license": [ 2340 | "BSD-3-Clause" 2341 | ], 2342 | "authors": [ 2343 | { 2344 | "name": "Sebastian Bergmann", 2345 | "email": "sebastian@phpunit.de", 2346 | "role": "lead" 2347 | } 2348 | ], 2349 | "description": "The PHP Unit Testing framework.", 2350 | "homepage": "https://phpunit.de/", 2351 | "keywords": [ 2352 | "phpunit", 2353 | "testing", 2354 | "xunit" 2355 | ], 2356 | "support": { 2357 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 2358 | "source": "https://github.com/sebastianbergmann/phpunit/tree/6.5.14" 2359 | }, 2360 | "time": "2019-02-01T05:22:47+00:00" 2361 | }, 2362 | { 2363 | "name": "phpunit/phpunit-mock-objects", 2364 | "version": "5.0.x-dev", 2365 | "source": { 2366 | "type": "git", 2367 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 2368 | "reference": "13862f9c620ffbc8895792abe2a9e473326fb905" 2369 | }, 2370 | "dist": { 2371 | "type": "zip", 2372 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/13862f9c620ffbc8895792abe2a9e473326fb905", 2373 | "reference": "13862f9c620ffbc8895792abe2a9e473326fb905", 2374 | "shasum": "", 2375 | "mirrors": [ 2376 | { 2377 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2378 | "preferred": true 2379 | } 2380 | ] 2381 | }, 2382 | "require": { 2383 | "doctrine/instantiator": "^1.0.5", 2384 | "php": "^7.0", 2385 | "phpunit/php-text-template": "^1.2.1", 2386 | "sebastian/exporter": "^3.1" 2387 | }, 2388 | "conflict": { 2389 | "phpunit/phpunit": "<6.0" 2390 | }, 2391 | "require-dev": { 2392 | "phpunit/phpunit": "^6.5.11" 2393 | }, 2394 | "suggest": { 2395 | "ext-soap": "*" 2396 | }, 2397 | "type": "library", 2398 | "extra": { 2399 | "branch-alias": { 2400 | "dev-master": "5.0.x-dev" 2401 | } 2402 | }, 2403 | "autoload": { 2404 | "classmap": [ 2405 | "src/" 2406 | ] 2407 | }, 2408 | "notification-url": "https://packagist.org/downloads/", 2409 | "license": [ 2410 | "BSD-3-Clause" 2411 | ], 2412 | "authors": [ 2413 | { 2414 | "name": "Sebastian Bergmann", 2415 | "email": "sebastian@phpunit.de", 2416 | "role": "lead" 2417 | } 2418 | ], 2419 | "description": "Mock Object library for PHPUnit", 2420 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 2421 | "keywords": [ 2422 | "mock", 2423 | "xunit" 2424 | ], 2425 | "support": { 2426 | "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues", 2427 | "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/5.0" 2428 | }, 2429 | "abandoned": true, 2430 | "time": "2018-09-09T05:48:43+00:00" 2431 | }, 2432 | { 2433 | "name": "sebastian/code-unit-reverse-lookup", 2434 | "version": "1.0.x-dev", 2435 | "source": { 2436 | "type": "git", 2437 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 2438 | "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54" 2439 | }, 2440 | "dist": { 2441 | "type": "zip", 2442 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", 2443 | "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", 2444 | "shasum": "", 2445 | "mirrors": [ 2446 | { 2447 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2448 | "preferred": true 2449 | } 2450 | ] 2451 | }, 2452 | "require": { 2453 | "php": ">=5.6" 2454 | }, 2455 | "require-dev": { 2456 | "phpunit/phpunit": "^8.5" 2457 | }, 2458 | "type": "library", 2459 | "extra": { 2460 | "branch-alias": { 2461 | "dev-master": "1.0.x-dev" 2462 | } 2463 | }, 2464 | "autoload": { 2465 | "classmap": [ 2466 | "src/" 2467 | ] 2468 | }, 2469 | "notification-url": "https://packagist.org/downloads/", 2470 | "license": [ 2471 | "BSD-3-Clause" 2472 | ], 2473 | "authors": [ 2474 | { 2475 | "name": "Sebastian Bergmann", 2476 | "email": "sebastian@phpunit.de" 2477 | } 2478 | ], 2479 | "description": "Looks up which function or method a line of code belongs to", 2480 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 2481 | "support": { 2482 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 2483 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.3" 2484 | }, 2485 | "funding": [ 2486 | { 2487 | "url": "https://github.com/sebastianbergmann", 2488 | "type": "github" 2489 | } 2490 | ], 2491 | "time": "2024-03-01T13:45:45+00:00" 2492 | }, 2493 | { 2494 | "name": "sebastian/comparator", 2495 | "version": "2.1.3", 2496 | "source": { 2497 | "type": "git", 2498 | "url": "https://github.com/sebastianbergmann/comparator.git", 2499 | "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" 2500 | }, 2501 | "dist": { 2502 | "type": "zip", 2503 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", 2504 | "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", 2505 | "shasum": "", 2506 | "mirrors": [ 2507 | { 2508 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2509 | "preferred": true 2510 | } 2511 | ] 2512 | }, 2513 | "require": { 2514 | "php": "^7.0", 2515 | "sebastian/diff": "^2.0 || ^3.0", 2516 | "sebastian/exporter": "^3.1" 2517 | }, 2518 | "require-dev": { 2519 | "phpunit/phpunit": "^6.4" 2520 | }, 2521 | "type": "library", 2522 | "extra": { 2523 | "branch-alias": { 2524 | "dev-master": "2.1.x-dev" 2525 | } 2526 | }, 2527 | "autoload": { 2528 | "classmap": [ 2529 | "src/" 2530 | ] 2531 | }, 2532 | "notification-url": "https://packagist.org/downloads/", 2533 | "license": [ 2534 | "BSD-3-Clause" 2535 | ], 2536 | "authors": [ 2537 | { 2538 | "name": "Jeff Welch", 2539 | "email": "whatthejeff@gmail.com" 2540 | }, 2541 | { 2542 | "name": "Volker Dusch", 2543 | "email": "github@wallbash.com" 2544 | }, 2545 | { 2546 | "name": "Bernhard Schussek", 2547 | "email": "bschussek@2bepublished.at" 2548 | }, 2549 | { 2550 | "name": "Sebastian Bergmann", 2551 | "email": "sebastian@phpunit.de" 2552 | } 2553 | ], 2554 | "description": "Provides the functionality to compare PHP values for equality", 2555 | "homepage": "https://github.com/sebastianbergmann/comparator", 2556 | "keywords": [ 2557 | "comparator", 2558 | "compare", 2559 | "equality" 2560 | ], 2561 | "support": { 2562 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 2563 | "source": "https://github.com/sebastianbergmann/comparator/tree/master" 2564 | }, 2565 | "time": "2018-02-01T13:46:46+00:00" 2566 | }, 2567 | { 2568 | "name": "sebastian/diff", 2569 | "version": "2.0.x-dev", 2570 | "source": { 2571 | "type": "git", 2572 | "url": "https://github.com/sebastianbergmann/diff.git", 2573 | "reference": "abcc70409ddfb310a8cb41ef0c2e857425438cf4" 2574 | }, 2575 | "dist": { 2576 | "type": "zip", 2577 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/abcc70409ddfb310a8cb41ef0c2e857425438cf4", 2578 | "reference": "abcc70409ddfb310a8cb41ef0c2e857425438cf4", 2579 | "shasum": "", 2580 | "mirrors": [ 2581 | { 2582 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2583 | "preferred": true 2584 | } 2585 | ] 2586 | }, 2587 | "require": { 2588 | "php": "^7.0" 2589 | }, 2590 | "require-dev": { 2591 | "phpunit/phpunit": "^6.2" 2592 | }, 2593 | "type": "library", 2594 | "extra": { 2595 | "branch-alias": { 2596 | "dev-master": "2.0-dev" 2597 | } 2598 | }, 2599 | "autoload": { 2600 | "classmap": [ 2601 | "src/" 2602 | ] 2603 | }, 2604 | "notification-url": "https://packagist.org/downloads/", 2605 | "license": [ 2606 | "BSD-3-Clause" 2607 | ], 2608 | "authors": [ 2609 | { 2610 | "name": "Kore Nordmann", 2611 | "email": "mail@kore-nordmann.de" 2612 | }, 2613 | { 2614 | "name": "Sebastian Bergmann", 2615 | "email": "sebastian@phpunit.de" 2616 | } 2617 | ], 2618 | "description": "Diff implementation", 2619 | "homepage": "https://github.com/sebastianbergmann/diff", 2620 | "keywords": [ 2621 | "diff" 2622 | ], 2623 | "support": { 2624 | "issues": "https://github.com/sebastianbergmann/diff/issues", 2625 | "source": "https://github.com/sebastianbergmann/diff/tree/master" 2626 | }, 2627 | "time": "2017-12-14T11:32:19+00:00" 2628 | }, 2629 | { 2630 | "name": "sebastian/environment", 2631 | "version": "3.1.0", 2632 | "source": { 2633 | "type": "git", 2634 | "url": "https://github.com/sebastianbergmann/environment.git", 2635 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" 2636 | }, 2637 | "dist": { 2638 | "type": "zip", 2639 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 2640 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 2641 | "shasum": "", 2642 | "mirrors": [ 2643 | { 2644 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2645 | "preferred": true 2646 | } 2647 | ] 2648 | }, 2649 | "require": { 2650 | "php": "^7.0" 2651 | }, 2652 | "require-dev": { 2653 | "phpunit/phpunit": "^6.1" 2654 | }, 2655 | "type": "library", 2656 | "extra": { 2657 | "branch-alias": { 2658 | "dev-master": "3.1.x-dev" 2659 | } 2660 | }, 2661 | "autoload": { 2662 | "classmap": [ 2663 | "src/" 2664 | ] 2665 | }, 2666 | "notification-url": "https://packagist.org/downloads/", 2667 | "license": [ 2668 | "BSD-3-Clause" 2669 | ], 2670 | "authors": [ 2671 | { 2672 | "name": "Sebastian Bergmann", 2673 | "email": "sebastian@phpunit.de" 2674 | } 2675 | ], 2676 | "description": "Provides functionality to handle HHVM/PHP environments", 2677 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2678 | "keywords": [ 2679 | "Xdebug", 2680 | "environment", 2681 | "hhvm" 2682 | ], 2683 | "support": { 2684 | "issues": "https://github.com/sebastianbergmann/environment/issues", 2685 | "source": "https://github.com/sebastianbergmann/environment/tree/master" 2686 | }, 2687 | "time": "2017-07-01T08:51:00+00:00" 2688 | }, 2689 | { 2690 | "name": "sebastian/exporter", 2691 | "version": "3.1.x-dev", 2692 | "source": { 2693 | "type": "git", 2694 | "url": "https://github.com/sebastianbergmann/exporter.git", 2695 | "reference": "1939bc8fd1d39adcfa88c5b35335910869214c56" 2696 | }, 2697 | "dist": { 2698 | "type": "zip", 2699 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/1939bc8fd1d39adcfa88c5b35335910869214c56", 2700 | "reference": "1939bc8fd1d39adcfa88c5b35335910869214c56", 2701 | "shasum": "", 2702 | "mirrors": [ 2703 | { 2704 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2705 | "preferred": true 2706 | } 2707 | ] 2708 | }, 2709 | "require": { 2710 | "php": ">=7.2", 2711 | "sebastian/recursion-context": "^3.0" 2712 | }, 2713 | "require-dev": { 2714 | "ext-mbstring": "*", 2715 | "phpunit/phpunit": "^8.5" 2716 | }, 2717 | "type": "library", 2718 | "extra": { 2719 | "branch-alias": { 2720 | "dev-master": "3.1.x-dev" 2721 | } 2722 | }, 2723 | "autoload": { 2724 | "classmap": [ 2725 | "src/" 2726 | ] 2727 | }, 2728 | "notification-url": "https://packagist.org/downloads/", 2729 | "license": [ 2730 | "BSD-3-Clause" 2731 | ], 2732 | "authors": [ 2733 | { 2734 | "name": "Sebastian Bergmann", 2735 | "email": "sebastian@phpunit.de" 2736 | }, 2737 | { 2738 | "name": "Jeff Welch", 2739 | "email": "whatthejeff@gmail.com" 2740 | }, 2741 | { 2742 | "name": "Volker Dusch", 2743 | "email": "github@wallbash.com" 2744 | }, 2745 | { 2746 | "name": "Adam Harvey", 2747 | "email": "aharvey@php.net" 2748 | }, 2749 | { 2750 | "name": "Bernhard Schussek", 2751 | "email": "bschussek@gmail.com" 2752 | } 2753 | ], 2754 | "description": "Provides the functionality to export PHP variables for visualization", 2755 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 2756 | "keywords": [ 2757 | "export", 2758 | "exporter" 2759 | ], 2760 | "support": { 2761 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 2762 | "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.6" 2763 | }, 2764 | "funding": [ 2765 | { 2766 | "url": "https://github.com/sebastianbergmann", 2767 | "type": "github" 2768 | } 2769 | ], 2770 | "time": "2024-03-02T06:21:38+00:00" 2771 | }, 2772 | { 2773 | "name": "sebastian/global-state", 2774 | "version": "2.0.0", 2775 | "source": { 2776 | "type": "git", 2777 | "url": "https://github.com/sebastianbergmann/global-state.git", 2778 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 2779 | }, 2780 | "dist": { 2781 | "type": "zip", 2782 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 2783 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 2784 | "shasum": "", 2785 | "mirrors": [ 2786 | { 2787 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2788 | "preferred": true 2789 | } 2790 | ] 2791 | }, 2792 | "require": { 2793 | "php": "^7.0" 2794 | }, 2795 | "require-dev": { 2796 | "phpunit/phpunit": "^6.0" 2797 | }, 2798 | "suggest": { 2799 | "ext-uopz": "*" 2800 | }, 2801 | "type": "library", 2802 | "extra": { 2803 | "branch-alias": { 2804 | "dev-master": "2.0-dev" 2805 | } 2806 | }, 2807 | "autoload": { 2808 | "classmap": [ 2809 | "src/" 2810 | ] 2811 | }, 2812 | "notification-url": "https://packagist.org/downloads/", 2813 | "license": [ 2814 | "BSD-3-Clause" 2815 | ], 2816 | "authors": [ 2817 | { 2818 | "name": "Sebastian Bergmann", 2819 | "email": "sebastian@phpunit.de" 2820 | } 2821 | ], 2822 | "description": "Snapshotting of global state", 2823 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2824 | "keywords": [ 2825 | "global state" 2826 | ], 2827 | "support": { 2828 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 2829 | "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0" 2830 | }, 2831 | "time": "2017-04-27T15:39:26+00:00" 2832 | }, 2833 | { 2834 | "name": "sebastian/object-enumerator", 2835 | "version": "3.0.x-dev", 2836 | "source": { 2837 | "type": "git", 2838 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2839 | "reference": "ac5b293dba925751b808e02923399fb44ff0d541" 2840 | }, 2841 | "dist": { 2842 | "type": "zip", 2843 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541", 2844 | "reference": "ac5b293dba925751b808e02923399fb44ff0d541", 2845 | "shasum": "", 2846 | "mirrors": [ 2847 | { 2848 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2849 | "preferred": true 2850 | } 2851 | ] 2852 | }, 2853 | "require": { 2854 | "php": ">=7.0", 2855 | "sebastian/object-reflector": "^1.1.1", 2856 | "sebastian/recursion-context": "^3.0" 2857 | }, 2858 | "require-dev": { 2859 | "phpunit/phpunit": "^6.0" 2860 | }, 2861 | "type": "library", 2862 | "extra": { 2863 | "branch-alias": { 2864 | "dev-master": "3.0.x-dev" 2865 | } 2866 | }, 2867 | "autoload": { 2868 | "classmap": [ 2869 | "src/" 2870 | ] 2871 | }, 2872 | "notification-url": "https://packagist.org/downloads/", 2873 | "license": [ 2874 | "BSD-3-Clause" 2875 | ], 2876 | "authors": [ 2877 | { 2878 | "name": "Sebastian Bergmann", 2879 | "email": "sebastian@phpunit.de" 2880 | } 2881 | ], 2882 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2883 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2884 | "support": { 2885 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 2886 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5" 2887 | }, 2888 | "funding": [ 2889 | { 2890 | "url": "https://github.com/sebastianbergmann", 2891 | "type": "github" 2892 | } 2893 | ], 2894 | "time": "2024-03-01T13:54:02+00:00" 2895 | }, 2896 | { 2897 | "name": "sebastian/object-reflector", 2898 | "version": "1.1.x-dev", 2899 | "source": { 2900 | "type": "git", 2901 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2902 | "reference": "1d439c229e61f244ff1f211e5c99737f90c67def" 2903 | }, 2904 | "dist": { 2905 | "type": "zip", 2906 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def", 2907 | "reference": "1d439c229e61f244ff1f211e5c99737f90c67def", 2908 | "shasum": "", 2909 | "mirrors": [ 2910 | { 2911 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2912 | "preferred": true 2913 | } 2914 | ] 2915 | }, 2916 | "require": { 2917 | "php": ">=7.0" 2918 | }, 2919 | "require-dev": { 2920 | "phpunit/phpunit": "^6.0" 2921 | }, 2922 | "type": "library", 2923 | "extra": { 2924 | "branch-alias": { 2925 | "dev-master": "1.1-dev" 2926 | } 2927 | }, 2928 | "autoload": { 2929 | "classmap": [ 2930 | "src/" 2931 | ] 2932 | }, 2933 | "notification-url": "https://packagist.org/downloads/", 2934 | "license": [ 2935 | "BSD-3-Clause" 2936 | ], 2937 | "authors": [ 2938 | { 2939 | "name": "Sebastian Bergmann", 2940 | "email": "sebastian@phpunit.de" 2941 | } 2942 | ], 2943 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2944 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2945 | "support": { 2946 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 2947 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3" 2948 | }, 2949 | "funding": [ 2950 | { 2951 | "url": "https://github.com/sebastianbergmann", 2952 | "type": "github" 2953 | } 2954 | ], 2955 | "time": "2024-03-01T13:56:04+00:00" 2956 | }, 2957 | { 2958 | "name": "sebastian/recursion-context", 2959 | "version": "3.0.x-dev", 2960 | "source": { 2961 | "type": "git", 2962 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2963 | "reference": "9bfd3c6f1f08c026f542032dfb42813544f7d64c" 2964 | }, 2965 | "dist": { 2966 | "type": "zip", 2967 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/9bfd3c6f1f08c026f542032dfb42813544f7d64c", 2968 | "reference": "9bfd3c6f1f08c026f542032dfb42813544f7d64c", 2969 | "shasum": "", 2970 | "mirrors": [ 2971 | { 2972 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 2973 | "preferred": true 2974 | } 2975 | ] 2976 | }, 2977 | "require": { 2978 | "php": ">=7.0" 2979 | }, 2980 | "require-dev": { 2981 | "phpunit/phpunit": "^6.0" 2982 | }, 2983 | "type": "library", 2984 | "extra": { 2985 | "branch-alias": { 2986 | "dev-master": "3.0.x-dev" 2987 | } 2988 | }, 2989 | "autoload": { 2990 | "classmap": [ 2991 | "src/" 2992 | ] 2993 | }, 2994 | "notification-url": "https://packagist.org/downloads/", 2995 | "license": [ 2996 | "BSD-3-Clause" 2997 | ], 2998 | "authors": [ 2999 | { 3000 | "name": "Sebastian Bergmann", 3001 | "email": "sebastian@phpunit.de" 3002 | }, 3003 | { 3004 | "name": "Jeff Welch", 3005 | "email": "whatthejeff@gmail.com" 3006 | }, 3007 | { 3008 | "name": "Adam Harvey", 3009 | "email": "aharvey@php.net" 3010 | } 3011 | ], 3012 | "description": "Provides functionality to recursively process PHP variables", 3013 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 3014 | "support": { 3015 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 3016 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.2" 3017 | }, 3018 | "funding": [ 3019 | { 3020 | "url": "https://github.com/sebastianbergmann", 3021 | "type": "github" 3022 | } 3023 | ], 3024 | "time": "2024-03-01T14:07:30+00:00" 3025 | }, 3026 | { 3027 | "name": "sebastian/resource-operations", 3028 | "version": "1.0.0", 3029 | "source": { 3030 | "type": "git", 3031 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 3032 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 3033 | }, 3034 | "dist": { 3035 | "type": "zip", 3036 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3037 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3038 | "shasum": "", 3039 | "mirrors": [ 3040 | { 3041 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 3042 | "preferred": true 3043 | } 3044 | ] 3045 | }, 3046 | "require": { 3047 | "php": ">=5.6.0" 3048 | }, 3049 | "type": "library", 3050 | "extra": { 3051 | "branch-alias": { 3052 | "dev-master": "1.0.x-dev" 3053 | } 3054 | }, 3055 | "autoload": { 3056 | "classmap": [ 3057 | "src/" 3058 | ] 3059 | }, 3060 | "notification-url": "https://packagist.org/downloads/", 3061 | "license": [ 3062 | "BSD-3-Clause" 3063 | ], 3064 | "authors": [ 3065 | { 3066 | "name": "Sebastian Bergmann", 3067 | "email": "sebastian@phpunit.de" 3068 | } 3069 | ], 3070 | "description": "Provides a list of PHP built-in functions that operate on resources", 3071 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 3072 | "support": { 3073 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 3074 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/master" 3075 | }, 3076 | "abandoned": true, 3077 | "time": "2015-07-28T20:34:47+00:00" 3078 | }, 3079 | { 3080 | "name": "sebastian/version", 3081 | "version": "2.0.1", 3082 | "source": { 3083 | "type": "git", 3084 | "url": "https://github.com/sebastianbergmann/version.git", 3085 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 3086 | }, 3087 | "dist": { 3088 | "type": "zip", 3089 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 3090 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 3091 | "shasum": "", 3092 | "mirrors": [ 3093 | { 3094 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 3095 | "preferred": true 3096 | } 3097 | ] 3098 | }, 3099 | "require": { 3100 | "php": ">=5.6" 3101 | }, 3102 | "type": "library", 3103 | "extra": { 3104 | "branch-alias": { 3105 | "dev-master": "2.0.x-dev" 3106 | } 3107 | }, 3108 | "autoload": { 3109 | "classmap": [ 3110 | "src/" 3111 | ] 3112 | }, 3113 | "notification-url": "https://packagist.org/downloads/", 3114 | "license": [ 3115 | "BSD-3-Clause" 3116 | ], 3117 | "authors": [ 3118 | { 3119 | "name": "Sebastian Bergmann", 3120 | "email": "sebastian@phpunit.de", 3121 | "role": "lead" 3122 | } 3123 | ], 3124 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 3125 | "homepage": "https://github.com/sebastianbergmann/version", 3126 | "support": { 3127 | "issues": "https://github.com/sebastianbergmann/version/issues", 3128 | "source": "https://github.com/sebastianbergmann/version/tree/master" 3129 | }, 3130 | "time": "2016-10-03T07:35:21+00:00" 3131 | }, 3132 | { 3133 | "name": "theseer/tokenizer", 3134 | "version": "1.2.3", 3135 | "source": { 3136 | "type": "git", 3137 | "url": "https://github.com/theseer/tokenizer.git", 3138 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 3139 | }, 3140 | "dist": { 3141 | "type": "zip", 3142 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 3143 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 3144 | "shasum": "", 3145 | "mirrors": [ 3146 | { 3147 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 3148 | "preferred": true 3149 | } 3150 | ] 3151 | }, 3152 | "require": { 3153 | "ext-dom": "*", 3154 | "ext-tokenizer": "*", 3155 | "ext-xmlwriter": "*", 3156 | "php": "^7.2 || ^8.0" 3157 | }, 3158 | "type": "library", 3159 | "autoload": { 3160 | "classmap": [ 3161 | "src/" 3162 | ] 3163 | }, 3164 | "notification-url": "https://packagist.org/downloads/", 3165 | "license": [ 3166 | "BSD-3-Clause" 3167 | ], 3168 | "authors": [ 3169 | { 3170 | "name": "Arne Blankerts", 3171 | "email": "arne@blankerts.de", 3172 | "role": "Developer" 3173 | } 3174 | ], 3175 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3176 | "support": { 3177 | "issues": "https://github.com/theseer/tokenizer/issues", 3178 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 3179 | }, 3180 | "funding": [ 3181 | { 3182 | "url": "https://github.com/theseer", 3183 | "type": "github" 3184 | } 3185 | ], 3186 | "time": "2024-03-03T12:36:25+00:00" 3187 | }, 3188 | { 3189 | "name": "webmozart/assert", 3190 | "version": "1.11.0", 3191 | "source": { 3192 | "type": "git", 3193 | "url": "https://github.com/webmozarts/assert.git", 3194 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" 3195 | }, 3196 | "dist": { 3197 | "type": "zip", 3198 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", 3199 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", 3200 | "shasum": "", 3201 | "mirrors": [ 3202 | { 3203 | "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", 3204 | "preferred": true 3205 | } 3206 | ] 3207 | }, 3208 | "require": { 3209 | "ext-ctype": "*", 3210 | "php": "^7.2 || ^8.0" 3211 | }, 3212 | "conflict": { 3213 | "phpstan/phpstan": "<0.12.20", 3214 | "vimeo/psalm": "<4.6.1 || 4.6.2" 3215 | }, 3216 | "require-dev": { 3217 | "phpunit/phpunit": "^8.5.13" 3218 | }, 3219 | "type": "library", 3220 | "extra": { 3221 | "branch-alias": { 3222 | "dev-master": "1.10-dev" 3223 | } 3224 | }, 3225 | "autoload": { 3226 | "psr-4": { 3227 | "Webmozart\\Assert\\": "src/" 3228 | } 3229 | }, 3230 | "notification-url": "https://packagist.org/downloads/", 3231 | "license": [ 3232 | "MIT" 3233 | ], 3234 | "authors": [ 3235 | { 3236 | "name": "Bernhard Schussek", 3237 | "email": "bschussek@gmail.com" 3238 | } 3239 | ], 3240 | "description": "Assertions to validate method input/output with nice error messages.", 3241 | "keywords": [ 3242 | "assert", 3243 | "check", 3244 | "validate" 3245 | ], 3246 | "support": { 3247 | "issues": "https://github.com/webmozarts/assert/issues", 3248 | "source": "https://github.com/webmozarts/assert/tree/1.11.0" 3249 | }, 3250 | "time": "2022-06-03T18:03:27+00:00" 3251 | } 3252 | ], 3253 | "aliases": [], 3254 | "minimum-stability": "dev", 3255 | "stability-flags": [], 3256 | "prefer-stable": false, 3257 | "prefer-lowest": false, 3258 | "platform": [], 3259 | "platform-dev": [], 3260 | "plugin-api-version": "2.3.0" 3261 | } 3262 | --------------------------------------------------------------------------------