Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/dkackman/chia-repl
A REPL tool for Chia
https://github.com/dkackman/chia-repl
blockchain chia chia-blockchain clvm crypto nft nodejs repl
Last synced: about 1 month ago
JSON representation
A REPL tool for Chia
- Host: GitHub
- URL: https://github.com/dkackman/chia-repl
- Owner: dkackman
- License: apache-2.0
- Created: 2022-04-06T01:48:41.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-09-10T15:45:21.000Z (about 1 year ago)
- Last Synced: 2024-09-30T15:11:56.466Z (about 2 months ago)
- Topics: blockchain, chia, chia-blockchain, clvm, crypto, nft, nodejs, repl
- Language: JavaScript
- Homepage:
- Size: 3.77 MB
- Stars: 22
- Watchers: 4
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# chia-repl
[![CodeQL](https://github.com/dkackman/chia-repl/actions/workflows/codeql.yml/badge.svg)](https://github.com/dkackman/chia-repl/actions/workflows/codeql.yml)
[![Node.js CI](https://github.com/dkackman/chia-repl/actions/workflows/node.js.yml/badge.svg)](https://github.com/dkackman/chia-repl/actions/workflows/node.js.yml)
A REPL tool for Chia that incorporates various chia and crypto utilities in a single, interactive node environment.
- [Chia RPC](https://dkackman.github.io/chia-api/)
- [clvm_tools-js](https://github.com/Chia-Mine/clvm_tools-js)
- [clvm-js](https://github.com/Chia-Mine/clvm-js)
- [chia-utils](https://github.com/CMEONE/chia-utils)
- [@rigidity/bls-signatures](https://github.com/Rigidity/bls-signatures)
- [chia-daemon](https://github.com/dkackman/chia-repl/tree/main/packages/chia-daemon)
- [chia-nft-minter](https://github.com/dkackman/chia-repl/tree/main/packages/chia-nft-minter)The wiki has [more examples and detail](https://github.com/dkackman/chia-repl/wiki).
## Packaged
```shell
npm install -g chia-repl
chia-repl
🌿 Welcome to Chia!
🌿
```## From Source
```shell
npm install
npm start -w chia-repl
> [email protected] start
> node index.js🌿 Welcome to Chia!
🌿
```Uses the [node repl](https://nodejs.org/api/repl.html) so the CLI works like node's.
## Commands
REPL commands always start with `.` and are lsited with `.help`.
```bash
🌿 .help
.break Sometimes you get stuck, this gets you out
.clear Break, and also clear the local context
.connect Opens the websocket connection to the chia daemon using the currently loaded connection
.credits Shows credits for the various tool authors
.disconnect Closes the websocket connection to the chia daemon
.editor Enter editor mode
.exit Exit the REPL
.help Print this help message
.list-connections Displays a list of saved connection names
.listen Opens the websocket connection to the chia daemon and listens for `wallet_ui` messages
.load Load JS from a file into the REPL session
.load-connection Loads a saved connection with an optional name
.more-help Shows more help about using the environment
.save Save all evaluated commands in this REPL session to a file
.save-connection Saves the current connection with an optional name
.save-options Saves the options
.version Shows the version of this applicationPress Ctrl+C to abort current expression, Ctrl+D to exit the REPL
🌿
```## Globals
Various global objects and functions are available within the REPL environment and can be listed with `.more-help`.
Some of these configure the connection and REPL options, while other enable interaction with the chia node, utility functions, and the clvm.```bash
🌿 .more-help
These global objects are available within the REPL environment
bls BLS signature functions
chia Chia node rpc services. This object is only availble after a successful .connect
All functions on these chia services are async & awaitable: crawler, daemon, farmer, full_node, harvester, wallet, simulator
clvm_tools clvm_tools-js functions (run, brun, opc, opd, read_ir)
clvm clvm-js (Program, SExp etc.)
utils Chia-utils (bech32m and other helpers)
connection Properties of the current connection
options Configurable REPL options
contentHasher A helper to generate NFT compatible hashes for files or remote resources
metadataFactory A helper to generate NFT and Collection metadata
minter The NFT minter. Only availble when connected to the chia daemon
repl.builtinModules
Show other available builtin node modulesThese global functions are invocable within the REPL environment
compile(chiaLisp, prefix, ...compileArgs)
Compiles a chialisp program into its address, clvm, puzzle, and puzzle_hash
test(chiaLisp, compileArgs = [], programArgs = []))
Runs a chialisp program and displays its output
```## Examples
The global `connection` context object has the host, port, and path to cert files. These properties can be set inside the repl with `connection.host = "my-host"` etc.
Once connected to the `daemon` each of the service endpoints becomes availalbe as an awaitable context function.Knowing [the chia rpc api](https://dkackman.github.io/chia-api/) will help immensely. All endpoints and data payloads should work. Since it is a full nodejs REPL environment, core modules like `fs` and `http` are available.
### Mint a simple NFT
```javascript
🌿 let dataFileInfo = {
name: 'test-nft-by-you',
type: 'image/jpg',
filepath: 'E:\\nft\\flower.jpg'
};
🌿 let mintingInfo = {
wallet_id: 2,
target_address: 'txch10kn82kl6hqv47qzeh4ugmqjr5mmdcnrlymfx8wl9nrhhkyxnzfkspna7l9',
};
🌿 let collectionMetaData = metadataFactory.createCollectionMetadata('test-nft-collection-by-you');
🌿 let nftMetadata = metadataFactory.createNftMetadata('test-nft-by-you', collectionMetaData);
🌿 await minter.createNftFromFile(dataFileInfo, mintingInfo, nftMetadata);
{
spend_bundle: {
aggregated_signature: '0x99e39df189f009a4679067d212a6845b7bfec05452d9696de79907a861239de3cbd247a27c39b2ca2492740f9f4aab58028ebf035f40597d16ddeee5194f8dfaa8c8ec8e90b6c91fce60944f0e55997b443be63ed8e9dcb9d685a9b473e1b441',
coin_solutions: [ [Object], [Object], [Object] ]
},
success: true,
wallet_id: 2
}
```### Run a CLVM Program
```javascript
🌿 const {SExp, OPERATOR_LOOKUP, KEYWORD_TO_ATOM, h, t, run_program} = clvm;
🌿 const plus = h(KEYWORD_TO_ATOM["+"]);
🌿 const q = h(KEYWORD_TO_ATOM["q"]);
🌿 const program = SExp.to([plus, 1, t(q, 175)]);
🌿 const env = SExp.to(25);
🌿 const [cost, result] = run_program(program, env, OPERATOR_LOOKUP);
🌿 let isEqual = result.equal_to(SExp.to(25 + 175));
🌿 isEqual = result.as_int() === (25 + 175);
true
🌿 cost
833
🌿 result
SExp { _atom: Bytes { _b: Uint8Array(2) [ 0, 200 ] }, _pair: null }
🌿
```### Compile a Simple Program with clvm_tools
```lisp
🌿 clvm_tools.run("(mod ARGUMENT (+ ARGUMENT 3))")
'(+ 1 (q . 3))'
🌿 clvm_tools.brun(_, '1')
'4'
🌿
```### Compile a Simple Program From a File
```lisp
🌿 clvm_tools.run('../examples/factorial.clsp')
'(a (q 2 2 (c 2 (c 5 ()))) (c (q 2 (i (= 5 (q . 1)) (q 1 . 1) (q 18 5 (a 2 (c 2 (c (- 5 (q . 1)) ()))))) 1) 1))'
🌿 clvm_tools.brun(_, '(5)')
'120'
🌿
```### Compile a ChiaLisp Program
```lisp
🌿 compile('../examples/piggybank.clsp', 'xch', '-i../examples/include')
{
address: 'tcxh1smq2mvt8mdmulp7q5tvwh8rn8g6u8ykfr5020a3aj3mj3hsha5ns3zea78',
clvm: '(a (q 2 (i (> 11 5) (q 2 (i (> 11 14) (q 4 (c 10 (c 4 (c 11 ()))) (c (c 10 (c 23 (q ()))) ())) (q 4 (c 10 (c 23 (c 11 ()))) ())) 1) (q 8)) 1) (c (q 0xcafef00d 51 . 500) 1))',
puzzle: 'ff02ffff01ff02ffff03ffff15ff0bff0580ffff01ff02ffff03ffff15ff0bff0e80ffff01ff04ffff04ff0affff04ff04ffff04ff0bff80808080ffff04ffff04ff0affff04ff17ffff01ff80808080ff808080ffff01ff04ffff04ff0affff04ff17ffff04ff0bff80808080ff808080ff0180ffff01ff088080ff0180ffff04ffff01ff84cafef00dff338201f4ff018080',
puzzle_hash: '86c0adb167db77cf87c0a2d8eb9c733a35c392c91d1ea7f63d947728de17ed27'
}
```### Test a ChiaLisp Program
```lisp
🌿 test('(mod ARGUMENT (+ ARGUMENT 3))', [], [ '15' ])
'18'
```### Connecting and Calling a Node Function
```javascript
🌿 .connect
Connecting to wss://localhost:55400...
done
🌿 await chia.full_node.get_network_info()
{ network_name: 'testnet10', network_prefix: 'txch', success: true }
🌿
```### Chaining Calls
Since it is a javascript environment, variables can be defined and set, and are preserved through. The [special value](https://nodejs.org/api/repl.html#assignment-of-the-_-underscore-variable) `_` can also be used to chain function calls.
```javascript
🌿 await chia.full_node.get_blockchain_state()
blockchain_state: {
...
}
🌿 _.blockchain_state.peak.header_hash
'0x098b7fd5768174776eb4a29cedcabffb21c487b592c73f72ac33bc4ffecf6c38'
🌿 await chia.full_node.get_block({ header_hash: _ })
{
block: {
...
}
}
🌿
```### OpenAPI Helpers for RPC Payloads
```javascript
🌿 chia.daemon.getPayloadDescriptor('is_running')
{
type: 'object',
required: [ 'service' ],
properties: { service: { type: 'string' } }
}
🌿 var p = chia.daemon.makePayload('is_running')
undefined
🌿 p.service = 'chia_fulll_node'
'chia_fulll_node'
🌿 await chia.daemon.is_running(p)
{ is_running: false, service_name: 'chia_fulll_node', success: true }
```### BLS Support
```javascript
🌿 var seed = Uint8Array.from([
... 0, 50, 6, 244, 24, 199, 1, 25, 52, 88, 192,
... 19, 18, 12, 89, 6, 220, 18, 102, 58, 209, 82,
... 12, 62, 89, 110, 182, 9, 44, 20, 254, 22
... ]);
undefined
🌿 bls.AugSchemeMPL.keyGen(seed)
$38c91b9e16a98741$export$8f54525b330fd87b {
value: 25076100791286022435148702897030204761993316905161740767284798605189048279853n
}
🌿
```___
_chia and its logo are the registered trademark or trademark of Chia Network, Inc. in the United States and worldwide._