diff --git a/src/Personal.php b/src/Personal.php new file mode 100644 index 0000000..9405184 --- /dev/null +++ b/src/Personal.php @@ -0,0 +1,198 @@ + + * + * @author Peter Lai + * @license MIT + */ + +namespace Web3; + +use Web3\Providers\Provider; +use Web3\Providers\HttpProvider; +use Web3\RequestManagers\RequestManager; +use Web3\RequestManagers\HttpRequestManager; + +class Personal +{ + /** + * provider + * + * @var \Web3\Providers\Provider + */ + protected $provider; + + /** + * methods + * + * @var array + */ + private $methods = [ + 'personal_listAccounts' => [], + ]; + + /** + * construct + * + * @param mixed string | Web3\Providers\Provider $provider + * @return void + */ + public function __construct($provider) + { + if (is_string($provider) && (filter_var($provider, FILTER_VALIDATE_URL) !== false)) { + // check the uri schema + if (preg_match('/^https?:\/\//', $provider) === 1) { + $requestManager = new HttpRequestManager($provider); + + $this->provider = new HttpProvider($requestManager); + } + } else if ($provider instanceof Provider) { + $this->provider = $provider; + } + } + + /** + * call + * + * @param string $name + * @param array $arguments + * @return void + */ + public function __call($name, $arguments) + { + if (empty($this->provider)) { + throw new \RuntimeException('Please set provider first.'); + } + + $class = explode('\\', get_class()); + + if (strtolower($class[1]) === 'personal' && preg_match('/^[a-zA-Z0-9]+$/', $name) === 1) { + $method = strtolower($class[1]) . '_' . $name; + + if (!array_key_exists($method, $this->methods)) { + throw new \RuntimeException('Unallowed rpc method: ' . $method); + } + $allowedMethod = $this->methods[$method]; + + if ($this->provider->isBatch) { + $callback = null; + } else { + $callback = array_pop($arguments); + + if (is_callable($callback) !== true) { + throw new \InvalidArgumentException('The last param must be callback function.'); + } + } + if (isset($allowedMethod['params']) && is_array($allowedMethod['params'])) { + // validate params + foreach ($allowedMethod['params'] as $key => $param) { + if (isset($param['validators'])) { + if (is_array($param['validators'])) { + $isError = true; + + foreach ($param['validators'] as $rule) { + if (isset($arguments[$key])) { + if (call_user_func([$rule, 'validate'], $arguments[$key]) === true) { + $isError = false; + break; + } + } else { + if (isset($param['default'])) { + $arguments[$key] = $param['default']; + $isError = false; + break; + } + } + } + if ($isError === true) { + throw new \RuntimeException('Wrong type of ' . $name . ' method argument ' . $key . '.'); + } + } else { + if (!isset($arguments[$key]) || call_user_func([$param['validators'], 'validate'], $arguments[$key]) === false) { + if (isset($param['default']) && !isset($arguments[$key])) { + $arguments[$key] = $param['default']; + } else { + throw new \RuntimeException('Wrong type of ' . $name . ' method argument ' . $key . '.'); + } + } + } + } + } + } + $this->provider->send($method, $arguments, $callback); + } + } + + /** + * get + * + * @param string $name + * @return mixed + */ + public function __get($name) + { + $method = 'get' . ucfirst($name); + + if (method_exists($this, $method)) { + return call_user_func_array([$this, $method], []); + } + } + + /** + * set + * + * @param string $name + * @param mixed $value + * @return bool + */ + public function __set($name, $value) + { + $method = 'set' . ucfirst($name); + + if (method_exists($this, $method)) { + return call_user_func_array([$this, $method], [$value]); + } + return false; + } + + /** + * getProvider + * + * @return void + */ + public function getProvider() + { + return $this->provider; + } + + /** + * setProvider + * + * @param $provider + * @return bool + */ + public function setProvider($provider) + { + if ($provider instanceof Provider) { + $this->provider = $provider; + return true; + } + return false; + } + + /** + * batch + * + * @param bool $status + * @return void + */ + public function batch($status) + { + $status = is_bool($status); + + $this->provider->batch($status); + } +} \ No newline at end of file diff --git a/src/Web3.php b/src/Web3.php index 918a7ae..8afdcae 100644 --- a/src/Web3.php +++ b/src/Web3.php @@ -13,6 +13,7 @@ namespace Web3; use Web3\Eth; use Web3\Net; +use Web3\Personal; use Web3\Providers\Provider; use Web3\Providers\HttpProvider; use Web3\RequestManagers\RequestManager; @@ -42,6 +43,13 @@ class Web3 */ protected $net; + /** + * personal + * + * @var \Web3\Personal + */ + protected $personal; + /** * methods * @@ -210,7 +218,7 @@ class Web3 /** * getEth * - * @return void + * @return \Web3\Eth */ public function getEth() { @@ -224,7 +232,7 @@ class Web3 /** * getNet * - * @return void + * @return \Web3\Net */ public function getNet() { @@ -235,6 +243,20 @@ class Web3 return $this->net; } + /** + * getPersonal + * + * @return \Web3\Personal + */ + public function getPersonal() + { + if (!isset($this->personal)) { + $personal = new Personal($this->provider); + $this->personal = $personal; + } + return $this->personal; + } + /** * batch * diff --git a/test/unit/Web3Test.php b/test/unit/Web3Test.php index 9edd367..c326ed0 100644 --- a/test/unit/Web3Test.php +++ b/test/unit/Web3Test.php @@ -7,6 +7,7 @@ use Test\TestCase; use Web3\Web3; use Web3\Eth; use Web3\Net; +use Web3\Personal; use Web3\Providers\HttpProvider; use Web3\RequestManagers\RequestManager; use Web3\RequestManagers\HttpRequestManager; @@ -52,6 +53,7 @@ class Web3Test extends TestCase $this->assertTrue($web3->provider->requestManager instanceof RequestManager); $this->assertTrue($web3->eth instanceof Eth); $this->assertTrue($web3->net instanceof Net); + $this->assertTrue($web3->personal instanceof Personal); } /**