Quick Start
Installing
Your normal
- npm
- Yarn
npm install @buidlerlabs/hashgraph-venin-js
yarn add @buidlerlabs/hashgraph-venin-js
will suffice.
Hello Venin
As we've seen in our introductory page, firing up your first Venin smart-contract example should be straight forward but let's kick it up a notch to make things a little more interesting. Suppose you have a trimmed down version (comments & dec method stripped) of the following contract:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
contract Counter {
uint public count;
function get() public view returns (uint) {
return count;
}
function inc() public {
count += 1;
}
}
Instead of having a value that we read from the contract, we have state-mutating methods and a way to query the inner state which is much closer to production scenarios and, therefore, much more useful for our learning journey.
Interacting with it via Venin could be as simple as:
By convention, when calling Contract.newFrom and passing it a path of a .sol file, Venin expects to find the solidity contract code in the contracts folder. This is configurable via the HEDERAS_CONTRACTS_RELATIVE_PATH environment variable.
If you were to run this code snippet, you would end up with a complaint issued by ApiSession.default saying something about a network not available issue. That's because Venin does not know, out of the box, to which network you want to connect.
We'll discuss configuration aspects in the upcoming page, but for now, to make this running, just create a .env file in your project root directory and have the following values defined:
HEDERAS_NETWORK=testnet
HEDERAS_OPERATOR_ID=0.0...
HEDERAS_OPERATOR_KEY=302e02...
Further notes on the .env config used by the code present in the Live Editor boxes
HEDERAS_DEFAULT_CONTRACT_REQUESTS_RETURN_ONLY_RECEIPTS=false
HEDERAS_DEFAULT_PAYMENT_FOR_CONTRACT_QUERY=1000000
HEDERAS_LOGGER_LEVEL=debug
HEDERAS_LOGGER_ENABLED=true
You can head over to the config page for a detailed explanation of what these (along with other) settings translate to.
Make sure to replace the values as you see fit:
HEDERAS_NETWORK: can be either one of the official networks (previewnet,testnetormainnet) or, for a more close-tight experience,customnetHEDERAS_OPERATOR_IDandHEDERAS_OPERATOR_KEYare the operator's account id and private key which will pay for the transactions.
If you don't have a pair of operator credentials, you can create a testnet/previewnet account for free if you register on the Hedera Portal. Once created, your test-account will auto top-up daily, free of charge, to 10000ℏ.
Having the .env file available with the required values is enough to allow for successfully re-running the above example.
If working locally and want to see a bit more console activity of what's happening underneath the hood, you can enable the logger and setup a sensible threshold by also adding to .env the following values:
HEDERAS_LOGGER_LEVEL=debug
HEDERAS_LOGGER_ENABLED=true
Architecture
Before we move on, it's worth talking here a bit about Venin's envisioned design:
This is just a high level overview that helps arguing the library architecture decisions for most of the developer use-cases. It is, by no means, complete. More sophisticated entities such as the StratoWallet interface (which helps configure the underlying network layer aiding the wallet bridge in the process) have been excluded from the diagram.
This has been done both to conserve pixels and due to the fact that those entities are still in development.
Basically, we tried to walk away from the builder feel given by working with the official Hedera SDK and move towards a more mapping kind of approach which, hopefully, should be more familiar to how Object Oriented Programing solutions are thought. This means that, instead of having
new FileCreateTransaction()
.setKeys([client.operatorPublicKey])
.setContents(contractByteCode)
.execute(client);
we tweaked and reversed the execution to have
session.upload(contract);
which would better approximate the mechanics of
instance = session.newInstance(class)
with instance being the live, hedera-deployed, runtime object and class being the blueprint of whatever needs to be constructed on the network (eg. Token or Contract).
Having said that, depending on the Hedera targeted service, there are 2 types of entities in the library:
- static entities - which are further down differentiable into
CreatableEntitys andUploadableEntitys - live entities - which are the "resulting instances" of having the static entities deployed
Next up
Now that we've discussed a bit about installing and running some Venin code as well as the overall design vision of the library, it's high time we have a look at configuring/customizing a runtime ApiSession.