CashScript is a high-level programming language for smart contracts on Bitcoin Cash. It offers a strong abstraction layer over Bitcoin Cash' native virtual machine, Bitcoin Script. Its syntax is based on Ethereum's smart contract language Solidity, but its functionality is very different since smart contracts on Bitcoin Cash differ greatly from smart contracts on Ethereum. For a detailed comparison of them, refer to the blog post Smart Contracts on Ethereum, Bitcoin and Bitcoin Cash.
This repository contains the code for the CashScript compiler & command line tool under packages/cashc/
. This repository also contains the code for the CashScript JavaScript SDK under packages/cashscript/
. The source code of the CashScript.org website is included under website/
. Visit the website for a detailed Documentation on the CashScript language and SDK.
CashScript is a high-level language that allows you to write Bitcoin Cash smart contracts in a straightforward and familiar way. Its syntax is inspired by Ethereum's Solidity language, but its functionality is different since the underlying systems have very different fundamentals. See the language documentation for a full reference of the language.
CashScript features a compiler as a standalone command line tool, called cashc
. It can be installed through npm and used to compile .cash
files into .json
artifact files. These artifact files can be imported into the CashScript JavaScript SDK (or other SDKs in the future). Note that the CashScript SDK also has a function to import and compile .cash
files directly, so it is not required to use the cashc
command line tool.
npm install -g cashc
Usage: cashc [options] [source_file]
Options:
--output, -o Specify a file to output the generated artifact. [string]
--hex, -h Compile the contract to hex format rather than a full artifact
[boolean]
--asm, -A Compile the contract to ASM format rather than a full artifact
[boolean]
--opcount, -c Display the number of opcodes in the compiled bytecode[boolean]
--size, -s Display the size in bytes of the compiled bytecode [boolean]
--args, -a List of constructor arguments to pass into the contract. Can
only be used in combination with either the --hex or --asm
flags. When compiling to a JSON artifact, contract
instantiation should be done through the CashScript SDK. Note
that NO type checking is performed by the cashc CLI, so it is
safer to use the CashScript SDK. [array]
--help Show help [boolean]
--version Show version number [boolean]
The main way to interact with CashScript contracts and integrate them into applications is using the CashScript SDK. This SDK allows you to compile .cash
files or import .json
artifact files, and convert them to Contract
objects. These objects are used to create new contract instances. These instances are used to interact with the contracts using the functions that were implemented in the .cash
file. For more information on the CashScript SDK, refer to the SDK documentation.
npm install cashscript
import { Contract, ... } from 'cashscript';
const { Contract, ... } = require('cashscript');
Using the CashScript SDK, you can import / compile existing contract files, create new instances of these contracts, and interact with these instances:
...
// Compile the P2PKH contract
const P2PKH = Contract.compile('./p2pkh.cash', 'mainnet');
// Instantiate a new P2PKH contract with constructor arguments: { pkh: pkh }
const instance = P2PKH.new(pkh);
// Get contract balance & output address + balance
console.log('contract address:', instance.address);
console.log('contract balance:', await instance.getBalance());
// Call the spend function with the owner's signature
// And use it to send 0. 000 100 00 BCH back to the contract's address
const txDetails = await instance.functions
.spend(pk, new SignatureTemplate(keypair))
.to(instance.address, 10000)
.send();
console.log(txDetails);
...
If you want to see CashScript in action and check out its usage, there are several example contracts in the examples/
directory. The .cash
files contain example contracts, and the .ts
files contain example usage of the CashScript SDK to interact with these contracts.
The "Hello World" of CashScript contracts is defining the P2PKH pattern inside a contract, which can be found under examples/p2pkh.cash
. Its usage can be found under examples/p2pkh.ts
.
To run the examples, clone this repository and navigate to the examples/
directory. Since the examples depend on the SDK, be sure to run npm install
or yarn
inside the examples/
directory, which installs all required packages.
git clone [email protected]:Bitcoin-com/cashscript.git
cd cashscript/examples
npm install
All .ts
files in the examples/
directory can then be executed with ts-node
.
npm install -g ts-node
ts-node p2pkh.ts
All .js
files can be executed with node
.
node p2pkh.js