diff --git a/docs/liquid/liquid-part2.md b/docs/liquid/liquid-part2.md index ecbf814..8b45e3c 100644 --- a/docs/liquid/liquid-part2.md +++ b/docs/liquid/liquid-part2.md @@ -27,8 +27,92 @@ Looking up this value on [https://blockstream.info/liquid/assets](https://blocks ### Issuing our own Asset -* Issuing our own asset is straight-forward, as its a single line command in the client. Let's issue 10 new tokens and set the supply to be fixed (no re-issuance) - - `$ sudo ./scripts/app compose elements exec node elements-cli -rpcuser=$E_RPCUSER -rpcpassword=$E_RPCPASS issueasset 10 0 true` +Issuing assets is pretty straight forward, it can be roughly broken down into 3 main steps[^3]: + +1. Generate a Legacy Address[^4] and PUBKEY for that address +2. Generate a Contract Hash +3. Issue the Asset + +* STEP 1a: Let's generate our legacy address and set the output to a variable + `$ LEG_ADDRESS=$(sudo ./scripts/app compose elements exec node elements-cli -rpcuser=$E_RPCUSER -rpcpassword=$E_RPCPASS getnewaddress "" legacy`) + + lq1qq2s92z0uq78kd4gfepua6qvfwx40g4lqqer9e3tzrr0j04ugyzsed39mnh9wvuhw0hmaqy5mxs9egqrr7j3rx8j2sdyun9m90 + +* STEP 1b: Set this address to a variable for use later and generate the public key. + - `$ export LEG_ADDRESS="lq1qq2s92....."` + - `$ sudo ./scripts/app compose elements exec node elements-cli -rpcuser=$E_RPCUSER -rpcpassword=$E_RPCPASS getaddressinfo $LEG_ADDRESS | jq '.pubkey'` + + 025aa49d444a150c99c904c8e779e5317aff4aee15ee9171f450e14af9dd8b8780 + + - `$ export PUBKEY="025aa49d444a150c99c904c8e779e5317aff4aee15ee9171f450e14af9dd8b8780"` + +* STEP 2: In order to generate the contract hash, it requires a few steps - so I've simplified it by making a bash script. Copy this into a file named `gen_asset_contract.sh` and mark as executable + +``` +#!/bin/bash +#set -x + +shopt -s expand_aliases + +### FILENAME: gen_asset_contract.sh +### USAGE: ./gen_asset_contract.sh PUBKEY + +if [ -z "$1" ] + then + echo "Please supply PUBKEY before running" + exit 1 +fi + +PUBKEY=$1 + +###EDIT THESE VALUES### + +DOMAIN="nulldata.org" +NAME="StackerNews-Demo1" +PRECISION=8 +TICKER="SND-1" +CONTRACT='{"entity":{"domain":"'$DOMAIN'"},"issuer_pubkey":"'$PUBKEY'","name":"'$NAME'","precision":'$PRECISION',"ticker":"'$TICKER'","version":'0'}' +CONTRACT_HASH=$(echo -n "${CONTRACT}" | sha256sum | sha256sum | sed 's/ .*//g') + +#Generate a byte-aligned reveresed CONTRACT_HASH for use in asset Creation +TEMP=$CONTRACT_HASH +LEN=${#TEMP} +until [ $LEN -eq "0" ]; do + END=${TEMP:(-2)} + CONTRACT_HASH_REV="$CONTRACT_HASH_REV$END" + TEMP=${TEMP::$((${#TEMP} - 2))} + LEN=$((LEN-2)) +done + +### END EDITING HERE ### +echo CONTRACT=$CONTRACT +echo CONTRACT_HASH=$CONTRACT_HASH +echo CONTRACT_HASH_REV=$CONTRACT_HASH_REVT_HASH_REV=$CONTRACT_HASH_REV +``` + +* STEP 2: Now we can use the script we saved before to generate the contract: + + - `$ ./gen_asset_contract.sh $PUBKEY` + + CONTRACT={"entity":{"domain":"nulldata.org"},"issuer_pubkey":"025aa49d444a150c99c904c8e779e5317aff4aee15ee9171f450e14af9dd8b8780","name":"StackerNews-Demo1","precision":8,"ticker":"SND-1","version":0} + + CONTRACT_HASH=df4bd5aec71f808f78b752cbaac783019fa20268265f66baa406e4202b77e4a1 + + CONTRACT_HASH_REV=a1e4772b20e406a4ba665f266802a29f0183c7aacb52b7788f801fc7aed54bdf + + +* STEP 2: Finally export those variables via bash to use later: + +``` +export CONTRACT={"entity":{"domain":"nulldata.org"},"issuer_pubkey":"025aa49d444a150c99c904c8e779e5317aff4aee15ee9171f450e14af9dd8b8780","name":"StackerNews-Demo1","precision":8,"ticker":"SND-1","version":1} + +export CONTRACT_HASH=7d6bf3e3228fd00e9591c4c6bd1163d088a387e95d29fdfcf2e4e5035a137a94 + +export CONTRACT_HASH_REV=947a135a03e5e4f2fcfd295de987a388d06311bdc6c491950ed08f22e3f36b7d +``` + +* STEP 3: Now Issuing our own asset is straight-forward, as its a single line command in the client. Let's issue 10 new tokens and set the supply to be fixed (no re-issuance) + - `$ sudo ./scripts/app compose elements exec node elements-cli -rpcuser=$E_RPCUSER -rpcpassword=$E_RPCPASS issueasset 10 0 true $CONTRACT_HASH_REV` { "txid": dd3983619f67e7a743ccfd32e48bbdb591c1d44b86a71d442be95a2453c0479a, @@ -97,12 +181,28 @@ We can see that we've received 100,000,000 'sats' of our custom asset. However, The publication of asset metadata info on Liquid works on a `.well-known` system where specific files are published on a webserver that you control. There are a few different steps to accomplish this, so lets begin * The first step is we need to generate a `legacy` address in case we ever want to delete the asset from the registry later[^3] - - `sudo ./scripts/app compose elements exec node elements-cli -rpcuser=$E_RPCUSER -rpcpassword=$E_RPCPASS getnewaddress "" legacy` + - `$ sudo ./scripts/app compose elements exec node elements-cli -rpcuser=$E_RPCUSER -rpcpassword=$E_RPCPASS getnewaddress "" legacy` - lq1qq2s92z0uq78kd4gfepua6qvfwx40g4lqqer9e3tzrr0j04ugyzsed39mnh9wvuhw0hmaqy5mxs9egqrr7j3rx8j2sdyun9m90 + lq1qq2s92..... + +* Set this address to a variable for use later and generate the public key. + - `$ export DELETE_ADDRESS="lq1qq2s92....."` + - `$ sudo ./scripts/app compose elements exec node elements-cli -rpcuser=$E_RPCUSER -rpcpassword=$E_RPCPASS getaddressinfo $DELETE_ADDRESS | jq '.pubkey'` + + 025aa49d444a150c99c904c8e779e5317aff4aee15ee9171f450e14af9dd8b8780 + + - `$ export PUBKEY="025aa49d444a150c99c904c8e779e5317aff4aee15ee9171f450e14af9dd8b8780"` + +* We need to set some variable and then generate a json 'contract' file + + + + + [^1]: The values E_RPCUSER and E_RPCPASS, where environmental variables we set in Part I [^2]: Like in bitcoin, 1 integer unit is 100,000,000 base units (not sats, but equivalent concept) -[^3]: Using a legacy address for this task imposes no real implications to your security since its only used to remove assets from the registry. Its possible to do this with a non-legacy address, but more steps are involved and we will need to use other tools rather than what's already built-in to Elements node, so we will just use a legacy address for this. \ No newline at end of file +[^3]: Technically just running `elements-cli issueasset 10 0` is enough to issue an asset, however there will be limitations later on when trying to register the asset, burn, remove, etc. +[^4]: Using a legacy address for this task imposes no real implications to your security since its only used to remove assets from the registry. Its possible to do this with a non-legacy address, but more steps are involved and we will need to use other tools rather than what's already built-in to Elements node, so we will just use a legacy address for this. \ No newline at end of file