devPHAse
Development tool for Phala Phat contracts.
Install
Add to your projects using package manager (yarn@^1
/ npm
)
yarn add -D devphase
yarn add -D typescript ts-node # required peer dependencies
Commands
Global flags
--json # Prints result of command in json format
--verbosity=X # Adjusts verbosity (0 - silent, 1 - default, 2 - verbose)
Project commands
- Init project (creates required files and directories)
yarn devphase init
- Check project configuration and dependencies
yarn devphase check
Stack related commands
- Starting local stack (node + pruntime + pherry)
yarn devphase stack run [--save-log]
--save-log # Saves logs to file
- Setup local stack (register gatekeeper, create cluster, deploy system contract etc.)
yarn devphase stack setup
-n, --network # Switch network (local - by default)
Accounts management
- Prints list of managed accounts (from
./accounts.json
)
yarn devphase account list [--columns <value> | -x] [--sort <value>] [--filter <value>] [--output csv|json|yaml] [--csv | --no-truncate] [--no-header]
- Creates new managed account
yarn devphase account create -a <value> [-p <value>] [-n]
-a, --alias=<value> # (required) Account alias
-n, --no-passphrase # Force no passphrase (prompted if not specified)
-p, --passphrase=<value> # Passphrase used to protect keyring
Contracts management
- Prints list of managed contracts (from
./contracts.json
)
yarn devphase contract list [--columns <value> | -x] [--sort <value>] [--filter <value>] [--output csv|json|yaml] [--csv | --no-truncate] [--no-header]
- Creates new contract project from template
yarn devphase contract create -n <value>
-n, --name=<value> # (required) Contract name
- Compiles contract using system
cargo
binary
yarn devphase contract compile [-c <value>] [-w] [-r]
-c, --contract=<value> # Contract name
-r, --release # Compile in release mode
-w, --watch # Watch changes
- Deployes contract to network
yarn devphase contract deploy [ARGS] -c <value> -o <value> [-t InkCode|SidevmCode] [-n <value>] [-l <value>] [-a <value>]
ARGS # Constructor arguments
-a, --account=<value> # [default: alice] Account used to deploy (managed account key)
-c, --contract=<value> # (required) Contract name
-l, --cluster=<value> # Target cluster Id
-n, --network=<value> # [default: local] Target network to deploy (local default)
-o, --constructor=<value> # (required) Contract constructor to call (name)
-t, --type=<option> # [default: InkCode] <options: InkCode|SidevmCode>
yarn devphase contract call [ARGS] -c <value> -i <value> -m <value> [-t InkCode|SidevmCode] [-a query|tx] [-n <value>] [-l <value>] [-a <value>]
ARGS # Call arguments
-a, --accessor=<option> # [default: query] Method type: transaction or query <options: query|tx>
-a, --account=<value> # [default: alice] Account used to call (managed account key)
-c, --contract=<value> # (required) Contract name
-i, --id=<value> # (required) Contract ID
-l, --cluster=<value> # Target cluster Id
-m, --method=<value> # (required) Contract method to call (name)
-n, --network=<value> # [default: local] Target network to deploy (local default)
-t, --type=<option> # [default: InkCode] <options: InkCode|SidevmCode>
- Contracts TS bindings creation
yarn devphase contract typegen -c <value>
-c, --contract=<value> # (required) Contract name
yarn devphase contract test [-s <value>] [-n <value>]
-n, --network=<value> # [default: local] Network key
-s, --suite=<value> # Test suite name (directory)
Configuration
Create devphase.config.ts
in root directory (init
command in TODO)
Here is default configuration. All values are optional (merged recuresivly)
import { ProjectConfigOptions } from 'devphase';
const config : ProjectConfigOptions = {
directories: {
artifacts: 'artifacts',
contracts: 'contracts',
logs: 'logs',
stacks: 'stacks',
tests: 'tests',
typings: 'typings'
},
stack: {
blockTime: 6000,
version: 'latest',
node: {
port: 9944,
binary: '{{directories.stacks}}/{{stack.version}}/phala-node',
workingDir: '{{directories.stacks}}/.data/node',
envs: {},
args: {
'--dev': true,
'--rpc-methods': 'Unsafe',
'--block-millisecs': '{{stack.blockTime}}',
'--ws-port': '{{stack.node.port}}'
},
timeout: 10000,
},
pruntime: {
port: 8000,
binary: '{{directories.stacks}}/{{stack.version}}/pruntime',
workingDir: '{{directories.stacks}}/.data/pruntime',
envs: {},
args: {
'--allow-cors': true,
'--cores': 0,
'--port': '{{stack.pruntime.port}}'
},
timeout: 2000,
},
pherry: {
gkMnemonic: '//Alice',
binary: '{{directories.stacks}}/{{stack.version}}/pherry',
workingDir: '{{directories.stacks}}/.data/pherry',
envs: {},
args: {
'--no-wait': true,
'--mnemonic': '{{stack.pherry.gkMnemonic}}',
'--inject-key': '0000000000000000000000000000000000000000000000000000000000000001',
'--substrate-ws-endpoint': 'ws://localhost:{{stack.node.port}}',
'--pruntime-endpoint': 'http://localhost:{{stack.pruntime.port}}',
'--dev-wait-block-ms': '{{stack.blockTime}}',
},
timeout: 2000,
}
},
testing: {
mocha: {},
spawnStack: true,
stackLogOutput: false,
blockTime: 100,
envSetup: {
setup: {
custom: undefined,
timeout: 60 * 1000,
},
teardown: {
custom: undefined,
timeout: 10 * 1000,
}
},
},
networks: {
local: {
nodeUrl: 'ws://localhost:{{stack.node.port}}',
nodeApiOptions: {
types: {
...KhalaTypes,
...PhalaSDKTypes,
}
},
workerUrl: 'http://localhost:{{stack.pruntime.port}}',
blockTime: 6000,
}
},
accountsConfig: {
keyrings: {
alice: '//Alice',
bob: '//Bob',
charlie: '//Charlie',
dave: '//Dave',
eve: '//Eve',
ferdie: '//Ferdie'
},
suAccount: 'alice'
}
};
export default config;
Usage sample
Check usage sample repo
Sandbox
Check sandbox environment repo for easy testing with up-to-date code