txt: ## dist_zef-knarkhov-Net-Ethereum.md
  # Raku interface for Ethereum blockchain
  
  A [Raku](https://raku.org) interface for interacting with the Ethereum blockchain and ecosystem via JSON RPC API.
  
  ## Synopsys
  
  ### Quick start: compile and deploy new contract
  
  ```
  #!/usr/bin/env raku
  
  use Net::Ethereum;
  
  my $ne = Net::Ethereum.new(
      :api_url('http://127.0.0.1:8501'),
      :show_progress(True),
      :unlockpwd('ospasswd'),
  );
  
  my %h = $ne.compile_and_deploy_contract(
      :contract_path('./sample.sol'),
      :compile_output_path('./compile'),
  );
  %h.gist.say;
  
  ```
  
  ### Net::Ethereum class attributes
  
  * `api_url` - URL of Ethereum node RPC server (<http://127.0.0.1:8501> by default, public mutable);
  * `abi` - contents of .abi file generated by solidity compiler (public mutable);
  * `contract_id` - contract address (e.g. 0xb3abfa488058dba76206071b3600ae6e0dec3205, public mutable);
  * `tx_wait_sec` - method `wait_for_transaction()` by default is waiting transaction to be mined for 10 iterations, each iteration sleeps for `$!tx_wait_sec` seconds ([+ 5 +] by default).
  * `keepalive` - set to [+ True +] if your [HTTP::UserAgent](https://gitlab.com/pheix/http-useragent) supports keep-alive connections ([- False -] by default);
  * `solidity` - path to solidity compiler (`/usr/local/bin/solc` by default);
  * `conn_name` - connection name in keep-alive mode: all keep-alive connections are storing with unique names ([+ parity-local +] by default);
  * `debug` - debugging flag ([- False -] by default);
  * `return_raw_data` - this flag enables including of raw data to Hash returned by `unmarshal()` method (it's useful while debugging);
  * `show_progress` - if this flag is set you will see textual progress bar while transaction acceptance waiting ([- False -] by default);
  * `cleanup` - this flag enables cleanup after `compile_and_deploy_contract()` method: unlink .abi and .bin files ([+ True +] by default);
  * `unlockpwd` - password for account unlocking, this attribute is immutable and could be set in constructor;
  
  ## API documentation
  
  This module was ported from Perl5 Net::Ethereum with core refactoring and breaking changes. [Original Perl5 documentation](https://metacpan.org/pod/Net::Ethereum) could be incompatible with Raku Net::Ethereum, so feel free to report [issues](https://gitlab.com/pheix/raku-net-ethereum/issues).
  
  ### Known API differences
  
  In Perl5 Net::Ethereum there are [wait\_for\_contract](https://metacpan.org/pod/Net::Ethereum#wait_for_contract) and [wait\_for\_transaction](https://metacpan.org/pod/Net::Ethereum#wait_for_transaction) subroutines. Quick look for [source code](https://metacpan.org/source/ITMFROLOV/Net-Ethereum-0.30/lib/Net/Ethereum.pm#L1151) shows that this functions are very similar. In Raku Net::Ethereum we have one common method `wait_for_transaction()`.
  
  ```
  method wait_for_transaction( :@hashes!, Int :$iters?, Bool :$contract? ) returns Array { ... }
  
  ```
  
  Method arguments are:
  
  * `@hashes` - array of transaction hashes to be mined;
  * `$iters` - optional timeout iterations (one iteration takes 5 seconds).
  * `$contract` - optional boolean: True if we're waiting for contract deploy transaction, False for other transactions;
  
  ## Running tests from test-bundle
  
  Tests from test-bundle are rather adjustable and full function testing is available if:
  
  * ethereum node is running and available at <http://127.0.0.1:8501>;
  * solidity compiler is installed, working properly and available at `/usr/local/bin/solc`;
  
  If your node running on different port, use [helper-script](https://gitlab.com/pheix/raku-net-ethereum/blob/master/hooks/forward.sh) `hooks/forward.sh` for quick forwarding:
  
  ```
  ./forward.sh 8501 <your_actual_node_port>
  
  ```
  
  ### Environment
  
  You should set **contract transaction hash** at global env variable `TXHASH`:
  
  ```
  export TXHASH=0x244409bb2cced62a2b93b2688167438ef47f60f1b5aa8b6c64e9de460ddec604
  
  ```
  
  ### Run tests
  
  Test could be ran with `prove` or `prove6`:
  
  ```
  prove6 ./t
  
  ```
  
  ```
  prove -ve 'raku -Ilib'
  
  ```
  
  ## Author
  
  Please contact me via [LinkedIn](https://www.linkedin.com/in/knarkhov/) or [Twitter](https://twitter.com/CondemnedCell). Your feedback is welcome at [narkhov.pro](https://narkhov.pro/contact-information.html).
  
  ## Perl5 Net::Ethereum
  
  [CPAN](http://search.cpan.org/~itmfrolov/Net-Ethereum-0.30/lib/Net/Ethereum.pm)
  
  [METACPAN](https://metacpan.org/pod/Net::Ethereum)
  
  [Habrahabr](https://habr.com/post/346234/)
  
  [Author](https://www.facebook.com/frolov.shop2you)
  
  [Contrubutor](https://gitlab.com/pheix/net-ethereum)
  