From 65db199e8efaae6ccf9f11aeda2c17b11e001532 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 2 Feb 2025 15:15:22 +0100 Subject: [PATCH 01/22] refactor for v0.12 --- .gitmodules | 3 - contracts/collectible.yaml.template | 32 ++-- contracts/usdt.yaml.template | 34 ++-- demo.sh | 220 ++++++++---------------- issuers/CollectibleFungibleAsset.issuer | Bin 0 -> 2952 bytes issuers/NonInflatableAsset.issuer | Bin 0 -> 2945 bytes rgb-schemata | 1 - rgb-schemata.sums | 6 - update_rgb-schemata_sums.sh | 3 - 9 files changed, 105 insertions(+), 194 deletions(-) delete mode 100644 .gitmodules create mode 100644 issuers/CollectibleFungibleAsset.issuer create mode 100644 issuers/NonInflatableAsset.issuer delete mode 160000 rgb-schemata delete mode 100644 rgb-schemata.sums delete mode 100755 update_rgb-schemata_sums.sh diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 54f7e3c..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "rgb-schemata"] - path = rgb-schemata - url = https://github.com/RGB-WG/rgb-schemata diff --git a/contracts/collectible.yaml.template b/contracts/collectible.yaml.template index 22e8386..0188d55 100644 --- a/contracts/collectible.yaml.template +++ b/contracts/collectible.yaml.template @@ -1,15 +1,21 @@ -interface: RGB25Base +consensus: bitcoin +testnet: true +codexId: TUiPwyY~-r0f7kk0-dy3sdfr-nsueQVC-3MtcWPy-xTNfCsM#chris-block-donald +name: Other token +method: issue +timestamp: "2024-12-18T10:32:00-02:00" -globals: - name: Other asset - details: Asset description - precision: 0 - terms: - text: demo CFA asset - media: ~ - issuedSupply: issued_supply +global: + - name: name + verified: Other asset + - name: details + unverified: Demo CFA asset + - name: precision + verified: centiMilli + - name: circulating + verified: issued_supply -assignments: - assetOwner: - seal: closing_method:txid:vout - amount: issued_supply +owned: + - name: owned + seal: txid:vout + data: issued_supply diff --git a/contracts/usdt.yaml.template b/contracts/usdt.yaml.template index d1d3ee6..99f0a81 100644 --- a/contracts/usdt.yaml.template +++ b/contracts/usdt.yaml.template @@ -1,17 +1,21 @@ -interface: RGB20Fixed +consensus: bitcoin +testnet: true +codexId: znwQGVhW-rfRa8el-pNaAsUW-UWxXsB_-4UlC~Tf-TERhBm4#mirage-queen-delphi +name: USDT Token +method: issue +timestamp: "2024-12-18T10:32:00-02:00" -globals: - spec: - ticker: USDT - name: USD Tether - details: ~ - precision: 0 - terms: - text: demo NIA asset - media: ~ - issuedSupply: issued_supply +global: + - name: name + verified: USD Tether + - name: ticker + verified: USDT + - name: precision + verified: centiMilli + - name: circulating + verified: issued_supply -assignments: - assetOwner: - seal: closing_method:txid:vout - amount: issued_supply +owned: + - name: owned + seal: txid:vout + data: issued_supply diff --git a/demo.sh b/demo.sh index 5688d26..c40444f 100755 --- a/demo.sh +++ b/demo.sh @@ -14,15 +14,12 @@ export SEED_PASSWORD="seed test password" # crate variables BP_WALLET_FEATURES="--features=cli,hot" -BP_WALLET_VER="0.11.0-beta.9" +BP_WALLET_VER="0.12.0-beta.4" RGB_WALLET_FEATURES="" -RGB_WALLET_VER="0.11.0-beta.9" +RGB_WALLET_VER="0.12.0-beta.4" -# closing method / derivation variables -CLOSING_METHODS=("opret1st" "tapret1st") - -# rgb-schemata variables -SCHEMATA_DIR="./rgb-schemata/schemata" +# RGB wallet types +WALLET_TYPES=("wpkh" "tapret-key-only") # indexer variables ELECTRUM_PORT=50001 @@ -41,13 +38,7 @@ NC='\033[0m' # No Color # maps declare -A CONTRACT_ID_MAP -declare -A CONTRACT_SCHEMA_MAP declare -A DESC_MAP -declare -A IFACE_MAP -IFACE_MAP["NIA"]="RGB20Fixed" -IFACE_MAP["CFA"]="RGB25Base" -declare -A SCHEMA_MAP -declare -A WLT_CM_MAP declare -A WLT_ID_MAP # copy stderr to fd 4 @@ -91,21 +82,19 @@ _trace() { } # internal functions -_check_method() { +_check_wallet_type() { local match="$1" - for m in "${CLOSING_METHODS[@]}"; do + for m in "${WALLET_TYPES[@]}"; do [ "$m" = "$match" ] && return done - _die "unknown $match closing method" + _die "unknown $match wallet type" } _gen_addr_rgb() { local wallet="$1" - local keychain="$2" _subtit "generating new address for $wallet" local wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" address -w "$wallet" \ - -k "$keychain" >$TRACE_OUT 2>/dev/null + _trace "${RGB[@]}" -d "data${wallet_id}" address -w "$wallet" >$TRACE_OUT 2>/dev/null ADDR="$(awk '/bcrt/ {print $NF}' $TRACE_OUT)" _log "generated address: $ADDR" } @@ -117,7 +106,7 @@ _wait_indexers_sync() { if [ "$PROFILE" = "electrum" ]; then local electrum_json electrum_res # shellcheck disable=2089 - electrum_json="{\"jsonrpc\": \"2.0\", \"method\": \"blockchain.block.header\", \"params\": [$block_count], \"id\": 0}" + electrum_json="{\"jsonrpc\": \"2.0\", \"wallet_type\": \"blockchain.block.header\", \"params\": [$block_count], \"id\": 0}" while :; do electrum_res="$(echo "$electrum_json" \ | netcat -w1 localhost $ELECTRUM_PORT \ @@ -166,16 +155,8 @@ _get_utxo() { _gen_utxo() { local wallet="$1" - local keychain="$2" - if [ -z "$keychain" ]; then - if [ "${WLT_CM_MAP[$wallet]}" = "opret1st" ]; then - keychain=9 - else - keychain=10 - fi - fi - _gen_addr_rgb "$wallet" "$keychain" - _subtit "sending funds to $wallet on keychain $keychain" + _gen_addr_rgb "$wallet" + _subtit "sending funds to $wallet" _trace "${BCLI[@]}" -rpcwallet=miner sendtoaddress "$ADDR" 1 >$TRACE_OUT txid="$(cat $TRACE_OUT)" _gen_blocks 1 @@ -193,28 +174,20 @@ _show_state() { local wallet="$1" local contract_name="$2" local sync="$3" - local contract_id iface schema wallet_id + local contract_id wallet_id wallet_id=${WLT_ID_MAP[$wallet]} contract_id=${CONTRACT_ID_MAP[$contract_name]} - schema=${CONTRACT_SCHEMA_MAP[$contract_name]} - iface=${IFACE_MAP[$schema]} if [ "$sync" = 1 ]; then sync=("--sync") else sync=() fi _trace "${RGB[@]}" -d "data${wallet_id}" \ - state -w "$wallet" -a "${sync[@]}" "$contract_id" "$iface" + state -w "$wallet" -a "${sync[@]}" "$contract_id" } # helper functions -check_schemata_version() { - if ! sha256sum -c --status rgb-schemata.sums; then - _die "rgb-schemata version mismatch (hint: try \"git submodule update\")" - fi -} - check_tools() { _subtit "checking required tools" local required_tools="awk base64 cargo cut docker grep head jq netcat sha256sum tr" @@ -347,12 +320,9 @@ check_balance() { else _subtit "checking $contract_name balance for $wallet" fi - local contract_id allocations amount wallet_id schema iface + local contract_id allocations amount wallet_id wallet_id=${WLT_ID_MAP[$wallet]} contract_id=${CONTRACT_ID_MAP[$contract_name]} - schema=${CONTRACT_SCHEMA_MAP[$contract_name]} - iface=${IFACE_MAP[$schema]} - schema_id=${SCHEMA_MAP[$schema]} mapfile -t outpoints < <(_list_unspent "$wallet" | awk '/:[0-9]+$/ {print $NF}') BALANCE=0 if [ "${#outpoints[@]}" -gt 0 ]; then @@ -361,7 +331,7 @@ check_balance() { echo " - $outpoint" done mapfile -t allocations < <("${RGB[@]}" -d "data${wallet_id}" \ - state -w "$wallet" "$contract_id" "$iface" 2>/dev/null \ + state -w "$wallet" "$contract_id" 2>/dev/null \ | grep '^ \+[0-9]' | awk '{print $1" "$2}') _log "allocations:" for allocation in "${allocations[@]}"; do @@ -420,34 +390,27 @@ import_contract() { issue_contract() { local wallet="$1" local contract_name="$2" - local schema="$3" - local method="$4" - _tit "issuing $schema contract $contract_name ($method)" - _check_method "$method" - local contract_base contract_tmpl contract_yaml iface schema_id + _tit "issuing contract $contract_name" + local contract_base contract_tmpl contract_yaml local contract_id issuance wallet_id wallet_id=${WLT_ID_MAP[$wallet]} contract_base=${CONTRACT_DIR}/${contract_name} contract_tmpl=${contract_base}.yaml.template contract_yaml=${contract_base}.yaml - iface=${IFACE_MAP[$schema]} - schema_id=${SCHEMA_MAP[$schema]} sed \ -e "s/issued_supply/2000/" \ - -e "s/closing_method/$method/" \ -e "s/txid/$TXID_ISSUE/" \ -e "s/vout/$VOUT_ISSUE/" \ "$contract_tmpl" > "$contract_yaml" _subtit "issuing" - _trace "${RGB[@]}" -d "data${wallet_id}" issue -w "$wallet" \ - "$schema_id" "ssi:$wallet" "$contract_yaml" >$TRACE_OUT 2>&1 + _trace "${RGB[@]}" -d "data${wallet_id}" issue -w "$wallet" "$contract_yaml" \ + >$TRACE_OUT 2>&1 issuance="$(cat $TRACE_OUT)" echo "$issuance" contract_id="$(echo "$issuance" | grep '^A new contract' | cut -d' ' -f4)" CONTRACT_ID_MAP[$contract_name]=$contract_id - CONTRACT_SCHEMA_MAP[$contract_name]=$schema _subtit "contract state after issuance" - _trace "${RGB[@]}" -d "data${wallet_id}" state -w "$wallet" "$contract_id" "$iface" --sync + _trace "${RGB[@]}" -d "data${wallet_id}" state -go -w "$wallet" [ $DEBUG = 1 ] && _subtit "unspents after issuance" && _list_unspent "$wallet" } @@ -459,19 +422,15 @@ prepare_btc_wallet() { prepare_rgb_wallet() { local wallet="$1" - local method="$2" - _tit "preparing $method wallet $wallet" - # closing-method-dependent variables - _check_method "$method" - local der_scheme desc_opt keychain - if [ "$method" = opret1st ]; then + local wallet_type="$2" + _tit "preparing $wallet_type wallet $wallet" + # wallet type-dependent variables + _check_wallet_type "$wallet_type" + local der_scheme + if [ "$wallet_type" = wpkh ]; then der_scheme="bip84" - desc_opt="--wpkh" - keychain="<0;1;9>" else der_scheme="bip86" - desc_opt="--tapret-key-only" - keychain="<0;1;9;10>" fi # BTC setup mkdir -p $WALLET_PATH @@ -481,43 +440,15 @@ prepare_rgb_wallet() { _trace "${BPHOT[@]}" derive -N -s $der_scheme \ "$WALLET_PATH/$wallet.seed" "$WALLET_PATH/$wallet.derive" >$TRACE_OUT account="$(cat $TRACE_OUT | awk '/Account/ {print $NF}')" - DESC_MAP[$wallet]="$account/$keychain/*" + DESC_MAP[$wallet]="$account/<0;1>/*" [ $DEBUG = 1 ] && echo "descriptor: ${DESC_MAP[$wallet]}" WALLETS+=("$wallet") WLT_ID_MAP[$wallet]=$WALLET_NUM ((WALLET_NUM+=1)) - WLT_CM_MAP[$wallet]=$method # RGB setup _subtit "creating RGB wallet $wallet" wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" create $desc_opt \ - "${DESC_MAP[$wallet]}" "$wallet" - # NIA - _subtit "importing NIA schema into $wallet" - _trace "${RGB[@]}" -d "data${wallet_id}" import -w "$wallet" \ - $SCHEMATA_DIR/NonInflatableAssets.rgb >$TRACE_OUT 2>&1 - schema_nia="$(awk '/^- schema/ {print $NF}' $TRACE_OUT)" - # CFA - _subtit "importing CFA schema into $wallet" - _trace "${RGB[@]}" -d "data${wallet_id}" import -w "$wallet" \ - $SCHEMATA_DIR/CollectibleFungibleAsset.rgb >$TRACE_OUT 2>&1 - schema_cfa="$(awk '/^- schema/ {print $NF}' $TRACE_OUT)" - # first wallet only - if [ "$wallet_id" = 0 ]; then - SCHEMA_MAP["NIA"]="$schema_nia" - SCHEMA_MAP["CFA"]="$schema_cfa" - if [ $DEBUG = 1 ]; then - _subtit "schema and interface info" - _log "detected schema IDs:" - echo "NIA: ${SCHEMA_MAP["NIA"]}" - echo "CFA: ${SCHEMA_MAP["CFA"]}" - echo - _log "schemata:" - _trace "${RGB[@]}" -d "data${wallet_id}" schemata -w "$wallet" - _log "interfaces:" - _trace "${RGB[@]}" -d "data${wallet_id}" interfaces -w "$wallet" - fi - fi + _trace "${RGB[@]}" -d "data${wallet_id}" create --"$wallet_type" "${DESC_MAP[$wallet]}" "$wallet" } sign_and_broadcast() { @@ -557,7 +488,6 @@ transfer_create() { ## data variables local contract_id rcpt_data rcpt_id send_data send_id local blnc_send blnc_rcpt - local schema iface SEND_WLT=$(echo "$wallets" |cut -d/ -f1) RCPT_WLT=$(echo "$wallets" |cut -d/ -f2) send_id=${WLT_ID_MAP[$SEND_WLT]} @@ -567,8 +497,6 @@ transfer_create() { rcpt_data="data${rcpt_id}" blnc_send=$(echo "$balances_start" |cut -d/ -f1) blnc_rcpt=$(echo "$balances_start" |cut -d/ -f2) - schema=${CONTRACT_SCHEMA_MAP[$XFER_CONTRACT_NAME]} - iface=${IFACE_MAP[$schema]} ## starting situation _tit "sending $send_amt $XFER_CONTRACT_NAME from $SEND_WLT to $RCPT_WLT" @@ -594,16 +522,12 @@ transfer_create() { if [ "$reuse_invoice" != 1 ]; then _subtit "(recipient) preparing invoice" if [ "$witness" = 1 ]; then - address_mode="-a" + address_mode="--wout" else [ "$NO_GEN_UTXO" != 1 ] && _gen_utxo "$RCPT_WLT" address_mode="" fi - # not quoting $address_mode so it doesn't get passed as "" if empty - # shellcheck disable=2086 - _trace "${RGB[@]}" -d "$rcpt_data" invoice $address_mode \ - -w "$RCPT_WLT" -i $iface --amount "$send_amt" "$contract_id" \ - >$TRACE_OUT + _trace "${RGB[@]}" -d "$rcpt_data" invoice "$address_mode" -w "$RCPT_WLT" 0 >$TRACE_OUT INVOICE="$(cat $TRACE_OUT)" else _subtit "(recipient) re-using invoice" @@ -614,11 +538,11 @@ transfer_create() { _subtit "(sender) preparing RGB transfer" CONSIGNMENT="consignment_${TRANSFER_NUM}.rgb" PSBT=tx_${TRANSFER_NUM}.psbt - local sats=(--sats 2000) + local sats=() local fee=() [ -n "$SATS" ] && sats=(--sats "$SATS") [ -n "$FEE" ] && fee=(--fee "$FEE") - _trace "${RGB[@]}" -d "$send_data" transfer -w "$SEND_WLT" \ + _trace "${RGB[@]}" -d "$send_data" pay -w "$SEND_WLT" \ "${sats[@]}" "${fee[@]}" \ "$INVOICE" "$send_data/$CONSIGNMENT" "$send_data/$PSBT" if ! ls "$send_data/$CONSIGNMENT" >/dev/null 2>&1; then @@ -642,22 +566,25 @@ transfer_create() { _subtit "(sender) copying consignment to recipient data directory" _trace cp {"$send_data","$rcpt_data"}/"$CONSIGNMENT" # inspect consignment (output to file as it's very big) - _trace "${RGB[@]}" -d "$send_data" inspect \ - "$send_data/$CONSIGNMENT" "$CONSIGNMENT.yaml" - _log "consignment exported to file: $CONSIGNMENT.yaml" + # TODO: Re-enable with `rgbx` tool + # _trace "${RGB[@]}" -d "$send_data" inspect \ + # "$send_data/$CONSIGNMENT" "$CONSIGNMENT.yaml" + # _log "consignment exported to file: $CONSIGNMENT.yaml" } transfer_complete() { + # TODO: We skip validation for now and process directly to `accept`, since v0.12 doesn't support + # (yet?) separate validation procedure ## recipient: validate transfer - _subtit "(recipient) validating consignment" + _subtit "(recipient) validating & accepting consignment" local rcpt_data rcpt_id send_data send_id vldt send_id=${WLT_ID_MAP[$SEND_WLT]} rcpt_id=${WLT_ID_MAP[$RCPT_WLT]} send_data="data${send_id}" rcpt_data="data${rcpt_id}" # note: all output to stderr - _trace "${RGB[@]}" -d "$rcpt_data" validate "$rcpt_data/$CONSIGNMENT" \ - >$TRACE_OUT 2>&1 + _trace "${RGB[@]}" -d "data${rcpt_id}" accept -w "$RCPT_WLT" \ + "$rcpt_data/$CONSIGNMENT" >$TRACE_OUT 2>&1 vldt="$(cat $TRACE_OUT)" [ $DEBUG = 1 ] && echo "$vldt" if ! echo "$vldt" | grep -q 'The provided consignment is valid'; then @@ -674,18 +601,6 @@ transfer_complete() { _sync_wallet "$SEND_WLT" _sync_wallet "$RCPT_WLT" - ## accept transfer - local accept - _subtit "(recipient) accepting transfer" - # note: all output to stderr - _trace "${RGB[@]}" -d "data${rcpt_id}" accept -w "$RCPT_WLT" \ - "$rcpt_data/$CONSIGNMENT" >$TRACE_OUT 2>&1 - accept="$(cat $TRACE_OUT)" - [ $DEBUG = 1 ] && echo "$accept" - if ! echo "$accept" | grep -q 'Transfer accepted into the stash'; then - _die "accept failed (transfer $TRANSFER_NUM)" - fi - ## ending situation [ $DEBUG = 1 ] && _subtit "sender state after transfer" && _show_state "$SEND_WLT" "$XFER_CONTRACT_NAME" 0 [ $DEBUG = 1 ] && _subtit "recipient state after transfer" && _show_state "$RCPT_WLT" "$XFER_CONTRACT_NAME" 0 @@ -766,13 +681,12 @@ fi # initial setup _tit "setting up" check_tools -check_schemata_version set_aliases trap cleanup EXIT # install crates -install_rust_crate "bp-wallet" "$BP_WALLET_VER" "$BP_WALLET_FEATURES" "--git https://github.com/BP-WG/bp-wallet --branch master" # commit 139d936 -install_rust_crate "rgb-wallet" "$RGB_WALLET_VER" "$RGB_WALLET_FEATURES" "--git https://github.com/RGB-WG/rgb --branch master" # commit 55a814a +install_rust_crate "bp-wallet" "$BP_WALLET_VER" "$BP_WALLET_FEATURES" "--git https://github.com/BP-WG/bp-wallet --branch v0.12" # commit 139d936 +install_rust_crate "rgb-wallet" "$RGB_WALLET_VER" "$RGB_WALLET_FEATURES" "--git https://github.com/RGB-WG/rgb --branch v0.12" # commit 55a814a # complete setup if [ -z "$SKIP_INIT" ]; then @@ -787,15 +701,15 @@ fi ## full round of opret transfers scenario_0() { # default - local method="opret1st" + local wallet_type="wpkh" # wallets - prepare_rgb_wallet wallet_0 $method - prepare_rgb_wallet wallet_1 $method - prepare_rgb_wallet wallet_2 $method + prepare_rgb_wallet wallet_0 $wallet_type + prepare_rgb_wallet wallet_1 $wallet_type + prepare_rgb_wallet wallet_2 $wallet_type # contract issuance get_issue_utxo wallet_0 - issue_contract wallet_0 usdt NIA $method - issue_contract wallet_0 collectible CFA $method + issue_contract wallet_0 usdt NIA + issue_contract wallet_0 collectible CFA # export/import contracts export_contract usdt wallet_0 import_contract usdt wallet_1 @@ -831,15 +745,15 @@ scenario_0() { # default ## full round of tapret transfers scenario_1() { - local method="tapret1st" + local wallet_type="tapret-key-only" # wallets - prepare_rgb_wallet wallet_0 $method - prepare_rgb_wallet wallet_1 $method - prepare_rgb_wallet wallet_2 $method + prepare_rgb_wallet wallet_0 $wallet_type + prepare_rgb_wallet wallet_1 $wallet_type + prepare_rgb_wallet wallet_2 $wallet_type # contract issuance get_issue_utxo wallet_0 - issue_contract wallet_0 usdt NIA $method - issue_contract wallet_0 collectible CFA $method + issue_contract wallet_0 usdt NIA + issue_contract wallet_0 collectible CFA # export/import contracts export_contract usdt wallet_0 import_contract usdt wallet_1 @@ -875,15 +789,15 @@ scenario_1() { ## full round of opret transfers (no aborted/retried) scenario_10() { - local method="opret1st" + local wallet_type="wpkh" # wallets - prepare_rgb_wallet wallet_0 $method - prepare_rgb_wallet wallet_1 $method - prepare_rgb_wallet wallet_2 $method + prepare_rgb_wallet wallet_0 $wallet_type + prepare_rgb_wallet wallet_1 $wallet_type + prepare_rgb_wallet wallet_2 $wallet_type # contract issuance get_issue_utxo wallet_0 - issue_contract wallet_0 usdt NIA $method - issue_contract wallet_0 collectible CFA $method + issue_contract wallet_0 usdt NIA + issue_contract wallet_0 collectible CFA # export/import contracts export_contract usdt wallet_0 import_contract usdt wallet_1 @@ -918,15 +832,15 @@ scenario_10() { ## full round of tapret transfers (no aborted/retried) scenario_11() { - local method="tapret1st" + local wallet_type="tapret-key-only" # wallets - prepare_rgb_wallet wallet_0 $method - prepare_rgb_wallet wallet_1 $method - prepare_rgb_wallet wallet_2 $method + prepare_rgb_wallet wallet_0 $wallet_type + prepare_rgb_wallet wallet_1 $wallet_type + prepare_rgb_wallet wallet_2 $wallet_type # contract issuance get_issue_utxo wallet_0 - issue_contract wallet_0 usdt NIA $method - issue_contract wallet_0 collectible CFA $method + issue_contract wallet_0 usdt NIA + issue_contract wallet_0 collectible CFA # export/import contracts export_contract usdt wallet_0 import_contract usdt wallet_1 diff --git a/issuers/CollectibleFungibleAsset.issuer b/issuers/CollectibleFungibleAsset.issuer new file mode 100644 index 0000000000000000000000000000000000000000..2fca245b006c05b8bf101f669d72b9a906f966f1 GIT binary patch literal 2952 zcmdT`X;2hb5T5sTX4!?v;YDIZS4}kHiC`2&kV{ZOIXnK{fGS_oB5TL=CP9k)|% z0R)khu%@bS#WtP_rai0LVj%uBLO`X)M-Lkg46?)s z*oGuPiMax@zA#S^q!-Ictim%gCuFU7HyyEI4@SLzFQM=+{MKZ(jSj$jS zxcPX^)8S7RUMyap8_+zX>8I7}wuaX`st+#9T$#3NGa%dDMh#0~9BAMd%U6-dZl`sx zipvP>^vS-G$=hB--gkC5V&WFwT~_r3rbV#eZp6wpL~4gtLQPGRaSWVlo>h`>n=pk@+C*tjofy$TY*p2 zv2Qkhe7bAny@QW!<+p+k&#K+xpuh>n@8*tcn{&POcPjVzuZdW)>WX3Ou1+_`9Zdc? zv*>7ULS-NSz#o>zZEjc+Qml_OKJ^Zod+VJ(;SGy-txy`)m+5EsKRja%xgc&h%aB4#pg;6ArFb=0$ zj(oI7mV_A9jR=EFL0DGnKN2$X7)VD&K{`4b(lIfRj*W$MTpXmwj)io5Jfss6AU$pz zq{okk^n?kJPE3S!QWB&mPK5NNNsvxXhIC2_q*GHNot6ga$&(>HWeTLHPKETeX^>7& zhxGL6kj}{P#IESp%w!rZYKqd_0nd23oNA_6MndvTJug~SiZ-~lWRA_A1sDccEP!Q! z)d~;-HXF#w0(Lv#I52xQ$j$~l4;&642tX8p(+ONIAV~mYAj?2eKu!+G%>{XRAU_|> znPX(z9GOcxIVYO;$3p6SO6GVgTALXpw)eJoxC`~%H^o7N*#v;X;r%xpxmX$LA7#tp3@oKYe{ZMdbSWP zm{M6*67{XD3O(9b6&utpD~Lve`_qXk@-()5>4sivI#}_Q7Ajdq9bQmw=uO#>Ll%8n zY>st9-xoGpupi0Dve=QH+4trtD*W}h*p$rAi_z%fK#!tlL4FR`?x&Z!)~8L;Mf{WU z{;vx4-z~PqeHJ}Z?%z3d_;N~qQ5`NU+4)_mGB8nZPuT}pxc-DL+aj3?F*!Lt*#BsbzG;^ymG{P<^lSsgpV`AFnl0D5y0N9+&v{imf?+ z#d5o0(*0+htpV@NUUaTT*ukjZ`qOAncX=!yrb5G z7KPS|;ziZiYNXnr@d(9wm6&2}t+kaZ3YJ){x7b#p&{>4~Ps=oE)1)ui*FLA6FautX=V4 zMAh{X-5L+Fzk1d8`{lO>RCQsADX9F`y&aVkHwABFfs&&x1?MO`3jA_a0e<{WN}p3P z8AH2&ytjPD)?Uc-?sj`r%#wR6YpC%Nl>Ky{28Ij>RljgKv;hwdNBSIfX-Pp89 zGW7Ln3K(_1YR7@;Ya6<=D3p|g>-V=gnXe(@|_>5)w`nfd?<60~C*RMIYaojhxd7W2l>i}x)Lx9tv zi?$uDfcfItb*4-8`|u~9e;qmT)2d2$uOqr1*!qiV)gr)2%BOLALusz3_HNZ~zjfiu z3$E(6?CkzS?17}8GmDSqPOTc~H}uC9F{L+`hm>g}^v^tl7TkVoVA#!NJ6Fp$HyqKB zgy^7XWWZ4#&H8JdGA|)<0B)m1+d!>_XIV;k)y;tf8gbGfJ!My*sEnq;?v#TUC4qO? zP=L-XP)c)2aj$iv`@ zAF1Iv6r_=I`B8*q6A%iTb6(*Q{QHWrf8ra^N0bV$a zE!Rt(3n&Vh&48wX#R3olRx8NL0yZ097%*=h$j$~V3+#5lae(K6!vUO5AP7Jdfg}N0 z201w(Hy7mPf&6?hf4-jXyvPFF!8p*uKMs-?5fZ~%(Bk+o(}|jAqn|FhRJI|vZ`{`oKCm)#O-ey20n{GI?Du2SOpPJ;iYsoEjXZq+;<>}6ReN3@;oW~s`oU^{ z&;FQBZOUo7doY}Z$x%k4vJElZqD)6XxLS{aO6RaFqtUz0;$0ATZztL@p|G^TYdcs4 zx^=P&)+y7RMO9Nm!9x;=S5!PIf`>=Qi81 z4^BxE?@P`Z+<1lvdnG2?nE6>5nou^>t++YJ$L`$q>~hcgl$o0Ff70InRipm9&9-dd z(kA)A-Ghg&81swk#G>*Y-&e?iaax;kFQDOulbVqKXIyGKjR0ydKy6wRP%U>)ThS-G zTk rgb-schemata.sums From e3708d3c8c9cc8ea6cc9b081b04959ef5234e579 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 2 Feb 2025 21:09:58 +0000 Subject: [PATCH 02/22] Debugging v0.12 --- contracts/collectible.yaml.template | 3 ++- contracts/usdt.yaml.template | 2 +- demo.sh | 24 ++++++++++++------------ 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/contracts/collectible.yaml.template b/contracts/collectible.yaml.template index 0188d55..1b042b6 100644 --- a/contracts/collectible.yaml.template +++ b/contracts/collectible.yaml.template @@ -1,7 +1,7 @@ consensus: bitcoin testnet: true codexId: TUiPwyY~-r0f7kk0-dy3sdfr-nsueQVC-3MtcWPy-xTNfCsM#chris-block-donald -name: Other token +name: OtherToken method: issue timestamp: "2024-12-18T10:32:00-02:00" @@ -10,6 +10,7 @@ global: verified: Other asset - name: details unverified: Demo CFA asset + verified: {} - name: precision verified: centiMilli - name: circulating diff --git a/contracts/usdt.yaml.template b/contracts/usdt.yaml.template index 99f0a81..ff557e6 100644 --- a/contracts/usdt.yaml.template +++ b/contracts/usdt.yaml.template @@ -1,7 +1,7 @@ consensus: bitcoin testnet: true codexId: znwQGVhW-rfRa8el-pNaAsUW-UWxXsB_-4UlC~Tf-TERhBm4#mirage-queen-delphi -name: USDT Token +name: USDT method: issue timestamp: "2024-12-18T10:32:00-02:00" diff --git a/demo.sh b/demo.sh index c40444f..00ebfa0 100755 --- a/demo.sh +++ b/demo.sh @@ -92,11 +92,11 @@ _check_wallet_type() { _gen_addr_rgb() { local wallet="$1" - _subtit "generating new address for $wallet" + _subtit "generating new funding address for $wallet" local wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" address -w "$wallet" >$TRACE_OUT 2>/dev/null + _trace "${RGB[@]}" -d "data${wallet_id}" fund "$wallet" >$TRACE_OUT 2>/dev/null ADDR="$(awk '/bcrt/ {print $NF}' $TRACE_OUT)" - _log "generated address: $ADDR" + _log "generated funding address: $ADDR" } _wait_indexers_sync() { @@ -139,7 +139,7 @@ _sync_wallet() { local wallet="$1" _subtit "syncing $wallet" local wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" utxos -w "$wallet" --sync + _trace "${RGB[@]}" -d "data${wallet_id}" sync "$INDEXER_CLI" "$wallet" } _get_utxo() { @@ -147,7 +147,7 @@ _get_utxo() { local txid="$2" _subtit "extracting vout for $wallet (txid: $txid)" local wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" utxos -w "$wallet" >$TRACE_OUT 2>/dev/null + _trace "${RGB[@]}" -d "data${wallet_id}" seals "$wallet" >$TRACE_OUT 2>/dev/null vout=$(awk "/$txid/ {print \$NF}" $TRACE_OUT | cut -d: -f2) [ -n "$vout" ] || _die "couldn't retrieve vout for txid $txid" _log "txid $txid, vout: $vout" @@ -167,7 +167,7 @@ _gen_utxo() { _list_unspent() { local wallet="$1" local wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" utxos -w "$wallet" + _trace "${RGB[@]}" -d "data${wallet_id}" seals "$wallet" } _show_state() { @@ -183,7 +183,7 @@ _show_state() { sync=() fi _trace "${RGB[@]}" -d "data${wallet_id}" \ - state -w "$wallet" -a "${sync[@]}" "$contract_id" + state -w "$wallet" -goa "${sync[@]}" "$contract_id" } @@ -235,7 +235,7 @@ set_aliases() { BP=("bp-wallet/bin/bp") ESPLORA_CLI=("docker" "compose" "exec" "-T" "esplora" "cli") INDEXER_CLI="$INDEXER_OPT=$INDEXER_ENDPOINT" - RGB=("rgb-wallet/bin/rgb" "-n" "$NETWORK" "$INDEXER_CLI") + RGB=("rgb-wallet/bin/rgb" "-n" "$NETWORK") # TODO: We had to get rid of "$INDEXER_CLI") if [ "$PROFILE" = "electrum" ]; then BCLI=("${BITCOIND_CLI[@]}") else @@ -331,8 +331,8 @@ check_balance() { echo " - $outpoint" done mapfile -t allocations < <("${RGB[@]}" -d "data${wallet_id}" \ - state -w "$wallet" "$contract_id" 2>/dev/null \ - | grep '^ \+[0-9]' | awk '{print $1" "$2}') + state -w "$wallet" -o "$contract_id" 2>/dev/null \ + | grep '^[[:space:]]' | awk '{print $2" "$4}') _log "allocations:" for allocation in "${allocations[@]}"; do echo " - $allocation" @@ -407,7 +407,7 @@ issue_contract() { >$TRACE_OUT 2>&1 issuance="$(cat $TRACE_OUT)" echo "$issuance" - contract_id="$(echo "$issuance" | grep '^A new contract' | cut -d' ' -f4)" + contract_id="$(echo "$issuance" | grep '^A new contract' | cut -d' ' -f7)" CONTRACT_ID_MAP[$contract_name]=$contract_id _subtit "contract state after issuance" _trace "${RGB[@]}" -d "data${wallet_id}" state -go -w "$wallet" @@ -448,7 +448,7 @@ prepare_rgb_wallet() { # RGB setup _subtit "creating RGB wallet $wallet" wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" create --"$wallet_type" "${DESC_MAP[$wallet]}" "$wallet" + _trace "${RGB[@]}" -d "data${wallet_id}" --init create --"$wallet_type" "$wallet" "${DESC_MAP[$wallet]}" } sign_and_broadcast() { From 85bae3eae2533f84357032753626e222fed5fbfe Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 3 Feb 2025 18:56:21 +0100 Subject: [PATCH 03/22] hacks --- demo.sh | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/demo.sh b/demo.sh index 00ebfa0..43628c7 100755 --- a/demo.sh +++ b/demo.sh @@ -27,6 +27,7 @@ ELECTRUM_ENDPOINT="localhost:$ELECTRUM_PORT" ESPLORA_ENDPOINT="http://localhost:8094/regtest/api" INDEXER_OPT="--electrum" INDEXER_ENDPOINT=$ELECTRUM_ENDPOINT +INDEXER_CLI="$INDEXER_OPT=$INDEXER_ENDPOINT" PROFILE="electrum" # shell colors @@ -38,9 +39,13 @@ NC='\033[0m' # No Color # maps declare -A CONTRACT_ID_MAP +declare -A CONTRACT_NAME_MAP declare -A DESC_MAP declare -A WLT_ID_MAP +CONTRACT_NAME_MAP["usdt"]=USDT +CONTRACT_NAME_MAP["collectible"]=OtherToken + # copy stderr to fd 4 exec 4>&2 @@ -205,7 +210,8 @@ cleanup() { if [ -z "$SKIP_INIT" ] && [ -z "$SKIP_STOP" ]; then _subtit "stopping services and cleaning data directories" stop_services - rm -rf data{0,1,2,core,index} + # TODO: re-enable after debug + # rm -rf data{0,1,2,core,index} else _subtit "skipping services stop" fi @@ -234,7 +240,6 @@ set_aliases() { BPHOT=("bp-wallet/bin/bp-hot") BP=("bp-wallet/bin/bp") ESPLORA_CLI=("docker" "compose" "exec" "-T" "esplora" "cli") - INDEXER_CLI="$INDEXER_OPT=$INDEXER_ENDPOINT" RGB=("rgb-wallet/bin/rgb" "-n" "$NETWORK") # TODO: We had to get rid of "$INDEXER_CLI") if [ "$PROFILE" = "electrum" ]; then BCLI=("${BITCOIND_CLI[@]}") @@ -363,7 +368,8 @@ export_contract() { contract_file=${CONTRACT_DIR}/${contract_name}.rgb contract_id=${CONTRACT_ID_MAP[$contract_name]} wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" export -w "$wallet" "$contract_id" "$contract_file" + cp -R "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" "$contract_file" + #_trace "${RGB[@]}" -d "data${wallet_id}" export -w "$wallet" "$contract_id" "$contract_file" } get_issue_utxo() { @@ -382,8 +388,9 @@ import_contract() { local contract_file wallet_id contract_file=${CONTRACT_DIR}/${contract_name}.rgb wallet_id=${WLT_ID_MAP[$wallet]} + cp -R "$contract_file" "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" # note: all output to stderr - _trace "${RGB[@]}" -d "data${wallet_id}" import -w "$wallet" "$contract_file" 2>&1 | grep Contract + #_trace "${RGB[@]}" -d "data${wallet_id}" import -w "$wallet" "$contract_file" 2>&1 | grep Contract } # requires get_issue_utxo to have been called first @@ -403,6 +410,7 @@ issue_contract() { -e "s/vout/$VOUT_ISSUE/" \ "$contract_tmpl" > "$contract_yaml" _subtit "issuing" + cp issuers/* "data${wallet_id}/" _trace "${RGB[@]}" -d "data${wallet_id}" issue -w "$wallet" "$contract_yaml" \ >$TRACE_OUT 2>&1 issuance="$(cat $TRACE_OUT)" @@ -688,6 +696,8 @@ trap cleanup EXIT install_rust_crate "bp-wallet" "$BP_WALLET_VER" "$BP_WALLET_FEATURES" "--git https://github.com/BP-WG/bp-wallet --branch v0.12" # commit 139d936 install_rust_crate "rgb-wallet" "$RGB_WALLET_VER" "$RGB_WALLET_FEATURES" "--git https://github.com/RGB-WG/rgb --branch v0.12" # commit 55a814a +mkdir "$CONTRACT_DIR" + # complete setup if [ -z "$SKIP_INIT" ]; then start_services From 792c5d89ab7d24064a43fd04dd741528bcd627a2 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 3 Feb 2025 19:15:42 +0100 Subject: [PATCH 04/22] Fix for invoice command arguments still not working... --- demo.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/demo.sh b/demo.sh index 43628c7..99607d4 100755 --- a/demo.sh +++ b/demo.sh @@ -535,7 +535,8 @@ transfer_create() { [ "$NO_GEN_UTXO" != 1 ] && _gen_utxo "$RCPT_WLT" address_mode="" fi - _trace "${RGB[@]}" -d "$rcpt_data" invoice "$address_mode" -w "$RCPT_WLT" 0 >$TRACE_OUT + _trace "${RGB[@]}" -d "$rcpt_data" invoice "$address_mode" \ + -w "$RCPT_WLT" "$contract_id" "$send_amt" >$TRACE_OUT INVOICE="$(cat $TRACE_OUT)" else _subtit "(recipient) re-using invoice" From 54af9117436f1cc283da4f8fe8ea008e3e0cd378 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 5 Feb 2025 20:24:47 +0100 Subject: [PATCH 05/22] solve invoicing and repeated run issues --- demo.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/demo.sh b/demo.sh index 99607d4..7bddff5 100755 --- a/demo.sh +++ b/demo.sh @@ -368,7 +368,8 @@ export_contract() { contract_file=${CONTRACT_DIR}/${contract_name}.rgb contract_id=${CONTRACT_ID_MAP[$contract_name]} wallet_id=${WLT_ID_MAP[$wallet]} - cp -R "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" "$contract_file" + rm -rf "$contract_file" + cp -r "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" "$contract_file" #_trace "${RGB[@]}" -d "data${wallet_id}" export -w "$wallet" "$contract_id" "$contract_file" } @@ -388,7 +389,8 @@ import_contract() { local contract_file wallet_id contract_file=${CONTRACT_DIR}/${contract_name}.rgb wallet_id=${WLT_ID_MAP[$wallet]} - cp -R "$contract_file" "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" + rm -rf "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" + cp -r "$contract_file" "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" # note: all output to stderr #_trace "${RGB[@]}" -d "data${wallet_id}" import -w "$wallet" "$contract_file" 2>&1 | grep Contract } @@ -535,7 +537,7 @@ transfer_create() { [ "$NO_GEN_UTXO" != 1 ] && _gen_utxo "$RCPT_WLT" address_mode="" fi - _trace "${RGB[@]}" -d "$rcpt_data" invoice "$address_mode" \ + _trace "${RGB[@]}" -d "$rcpt_data" invoice $address_mode \ -w "$RCPT_WLT" "$contract_id" "$send_amt" >$TRACE_OUT INVOICE="$(cat $TRACE_OUT)" else From 62eda3de9185f5d9fe9c8e78c12d22e9ed670e9e Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Fri, 7 Feb 2025 19:52:48 +0100 Subject: [PATCH 06/22] fix check for consignment validation --- demo.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo.sh b/demo.sh index 7bddff5..bbc4b58 100755 --- a/demo.sh +++ b/demo.sh @@ -598,7 +598,7 @@ transfer_complete() { "$rcpt_data/$CONSIGNMENT" >$TRACE_OUT 2>&1 vldt="$(cat $TRACE_OUT)" [ $DEBUG = 1 ] && echo "$vldt" - if ! echo "$vldt" | grep -q 'The provided consignment is valid'; then + if echo "$vldt" | grep -q 'invalid'; then _die "validation failed (transfer $TRANSFER_NUM)" fi From bb5c01f5e8cc95b5714c707618bc038cf2c03964 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Fri, 7 Feb 2025 20:00:25 +0100 Subject: [PATCH 07/22] enable rust backtracing --- demo.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/demo.sh b/demo.sh index bbc4b58..e15cf5b 100755 --- a/demo.sh +++ b/demo.sh @@ -221,14 +221,20 @@ install_rust_crate() { local crate="$1" local version="$2" local features opts + local debug="" if [ -n "$3" ]; then read -r -a features <<< "$3" fi if [ -n "$4" ]; then read -r -a opts <<< "$4" fi + if [ $DEBUG = 1 ]; then + debug=("--profile" "dev" "--force") + else + debug=("--profile" "test") + fi _subtit "installing $crate to ./$crate" - cargo install "$crate" --version "$version" --locked \ + cargo install "$crate" --version "$version" --locked "${debug[@]}" \ --root "./$crate" "${features[@]}" "${opts[@]}" \ || _die "error installing $crate" } @@ -669,6 +675,7 @@ while [ -n "$1" ]; do ;; -v|--verbose) DEBUG=1 + export RUST_BACKTRACE=1 ;; --esplora) INDEXER_OPT="--esplora" From 6d4523235776479af08ed72501a6b5be71f8c168 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Fri, 7 Feb 2025 20:00:37 +0100 Subject: [PATCH 08/22] wip: disable unworking tests --- demo.sh | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/demo.sh b/demo.sh index e15cf5b..447b374 100755 --- a/demo.sh +++ b/demo.sh @@ -729,28 +729,28 @@ scenario_0() { # default # contract issuance get_issue_utxo wallet_0 issue_contract wallet_0 usdt NIA - issue_contract wallet_0 collectible CFA +# issue_contract wallet_0 collectible CFA # export/import contracts export_contract usdt wallet_0 import_contract usdt wallet_1 import_contract usdt wallet_2 - export_contract collectible wallet_0 - import_contract collectible wallet_1 - import_contract collectible wallet_2 +# export_contract collectible wallet_0 +# import_contract collectible wallet_1 +# import_contract collectible wallet_2 # initial balance checks check_balance wallet_0 2000 usdt - check_balance wallet_0 2000 collectible +# check_balance wallet_0 2000 collectible # transfers - transfer_create wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted - transfer_assets wallet_0/wallet_1 2000/0 100 1900/100 0 1 usdt # retried - transfer_assets wallet_0/wallet_1 2000/0 200 1800/200 0 0 collectible # CFA +# transfer_create wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted + transfer_assets wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # retried +# transfer_assets wallet_0/wallet_1 2000/0 200 1800/200 0 0 collectible # CFA transfer_assets wallet_0/wallet_1 1900/100 200 1700/300 1 0 usdt # change, witness transfer_assets wallet_1/wallet_2 300/0 250 50/250 0 0 usdt # spend both received allocations - transfer_assets wallet_1/wallet_2 200/0 100 100/100 0 0 collectible # CFA, spend received allocations +# transfer_assets wallet_1/wallet_2 200/0 100 100/100 0 0 collectible # CFA, spend received allocations transfer_assets wallet_2/wallet_0 250/1700 100 150/1800 1 0 usdt # close loop, witness - transfer_assets wallet_2/wallet_0 100/1800 50 50/1850 1 0 collectible # CFA, close loop, witness +# transfer_assets wallet_2/wallet_0 100/1800 50 50/1850 1 0 collectible # CFA, close loop, witness transfer_assets wallet_0/wallet_1 1800/50 50 1750/100 0 0 usdt # spend received back - transfer_assets wallet_0/wallet_1 1850/100 25 1825/125 0 0 collectible # CFA, spend received back +# transfer_assets wallet_0/wallet_1 1850/100 25 1825/125 0 0 collectible # CFA, spend received back transfer_assets wallet_1/wallet_2 100/150 100 0/250 0 0 usdt # spend all (no change) transfer_assets wallet_2/wallet_0 250/1750 250 0/2000 1 0 usdt # spend all (witness) # final balance checks @@ -758,9 +758,9 @@ scenario_0() { # default check_balance wallet_0 2000 usdt check_balance wallet_1 0 usdt check_balance wallet_2 0 usdt - check_balance wallet_0 1825 collectible - check_balance wallet_1 125 collectible - check_balance wallet_2 50 collectible +# check_balance wallet_0 1825 collectible +# check_balance wallet_1 125 collectible +# check_balance wallet_2 50 collectible } ## full round of tapret transfers From ea0f514a962b8b7d186edea3eeb21e841e7b0f42 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 11 Feb 2025 12:42:44 +0100 Subject: [PATCH 09/22] add recompile argument --- demo.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/demo.sh b/demo.sh index 447b374..2ac885f 100755 --- a/demo.sh +++ b/demo.sh @@ -3,6 +3,7 @@ # variables CONTRACT_DIR="contracts" DEBUG=0 +RECOMPILE=0 NAME=$(basename "$0") NETWORK="regtest" TRACE_OUT="trace.out" @@ -222,6 +223,7 @@ install_rust_crate() { local version="$2" local features opts local debug="" + local force="" if [ -n "$3" ]; then read -r -a features <<< "$3" fi @@ -229,12 +231,15 @@ install_rust_crate() { read -r -a opts <<< "$4" fi if [ $DEBUG = 1 ]; then - debug=("--profile" "dev" "--force") + debug=("--profile" "dev") else debug=("--profile" "test") fi + if [ $RECOMPILE = 1 ]; then + force="--force" + fi _subtit "installing $crate to ./$crate" - cargo install "$crate" --version "$version" --locked "${debug[@]}" \ + cargo install "$crate" --version "$version" --locked "${debug[@]}" $force \ --root "./$crate" "${features[@]}" "${opts[@]}" \ || _die "error installing $crate" } @@ -648,6 +653,7 @@ help() { echo " -l --list list the available scenarios" echo " -s --scenario run the specified scenario (default: 0)" echo " -v --verbose enable verbose output" + echo " -r --recompile force complete recompile" echo " --esplora use esplora as indexer (default: electrum)" } @@ -677,6 +683,9 @@ while [ -n "$1" ]; do DEBUG=1 export RUST_BACKTRACE=1 ;; + -r|--recompile) + RECOMPILE=1 + ;; --esplora) INDEXER_OPT="--esplora" INDEXER_ENDPOINT=$ESPLORA_ENDPOINT From b5cb26c7d5cc2fabed6079489245bfacca6e2690 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 11 Feb 2025 12:43:04 +0100 Subject: [PATCH 10/22] fix broadcast instruction args --- demo.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo.sh b/demo.sh index 2ac885f..aeac6ca 100755 --- a/demo.sh +++ b/demo.sh @@ -482,7 +482,7 @@ sign_and_broadcast() { _die "signing failed (transfer $TRANSFER_NUM)" fi _subtit "(sender) finalizing and broadcasting the PSBT" - local broadcast="-p" + local broadcast="-b" [ "$NO_BROADCAST" = 1 ] && broadcast="" _trace "${RGB[@]}" finalize $broadcast "$INDEXER_CLI" -n $NETWORK -d "$send_data" \ -w "$wallet" "$send_data/$PSBT" "$send_data/${PSBT%psbt}tx" From 4a47a2d0f62358e677231218a608a5e0036084fa Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 11 Feb 2025 17:45:13 +0100 Subject: [PATCH 11/22] add dedicated flag for skipping final cleanup --- demo.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/demo.sh b/demo.sh index aeac6ca..8a73f7e 100755 --- a/demo.sh +++ b/demo.sh @@ -655,6 +655,8 @@ help() { echo " -v --verbose enable verbose output" echo " -r --recompile force complete recompile" echo " --esplora use esplora as indexer (default: electrum)" + echo " -u --skip-stop skip stopping docker containers after the completion" + echo " --stop stop docker containers (if running)" } while [ -n "$1" ]; do @@ -686,6 +688,9 @@ while [ -n "$1" ]; do -r|--recompile) RECOMPILE=1 ;; + -u|--skip-stop) + SKIP_STOP=1 + ;; --esplora) INDEXER_OPT="--esplora" INDEXER_ENDPOINT=$ESPLORA_ENDPOINT From e35876cdcdd11d30633acbb5b0bd25974c635295 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 11 Feb 2025 18:34:27 +0100 Subject: [PATCH 12/22] improvements and fixes --- demo.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/demo.sh b/demo.sh index 8a73f7e..9474baf 100755 --- a/demo.sh +++ b/demo.sh @@ -153,7 +153,7 @@ _get_utxo() { local txid="$2" _subtit "extracting vout for $wallet (txid: $txid)" local wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" seals "$wallet" >$TRACE_OUT 2>/dev/null + _trace "${RGB[@]}" -d "data${wallet_id}" seals -w "$wallet" >$TRACE_OUT 2>/dev/null vout=$(awk "/$txid/ {print \$NF}" $TRACE_OUT | cut -d: -f2) [ -n "$vout" ] || _die "couldn't retrieve vout for txid $txid" _log "txid $txid, vout: $vout" @@ -173,7 +173,7 @@ _gen_utxo() { _list_unspent() { local wallet="$1" local wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" seals "$wallet" + _trace "${RGB[@]}" -d "data${wallet_id}" seals -w "$wallet" } _show_state() { @@ -211,8 +211,7 @@ cleanup() { if [ -z "$SKIP_INIT" ] && [ -z "$SKIP_STOP" ]; then _subtit "stopping services and cleaning data directories" stop_services - # TODO: re-enable after debug - # rm -rf data{0,1,2,core,index} + rm -rf data{0,1,2,core,index} else _subtit "skipping services stop" fi @@ -627,8 +626,8 @@ transfer_complete() { [ $DEBUG = 1 ] && _subtit "sender state after transfer" && _show_state "$SEND_WLT" "$XFER_CONTRACT_NAME" 0 [ $DEBUG = 1 ] && _subtit "recipient state after transfer" && _show_state "$RCPT_WLT" "$XFER_CONTRACT_NAME" 0 _subtit "final balances" - check_balance "$SEND_WLT" "$BLNC_SEND" "$XFER_CONTRACT_NAME" 1 check_balance "$RCPT_WLT" "$BLNC_RCPT" "$XFER_CONTRACT_NAME" 1 + check_balance "$SEND_WLT" "$BLNC_SEND" "$XFER_CONTRACT_NAME" 1 # increment transfer number ((TRANSFER_NUM+=1)) From 54c4675444797f475465a0ead35d2b44a76dac70 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 11 Feb 2025 18:42:16 +0100 Subject: [PATCH 13/22] add missed variable defaults (SATS and FEE) --- demo.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/demo.sh b/demo.sh index 9474baf..0599663 100755 --- a/demo.sh +++ b/demo.sh @@ -11,6 +11,8 @@ TRANSFER_NUM=0 WALLET_NUM=0 WALLET_PATH="wallets" WALLETS=() +SATS=500 # TODO: This is required only for witness-out transfers. We need to account for it +# TODO: FEE is also used but not defined anywhere export SEED_PASSWORD="seed test password" # crate variables From d0c42f2a5f4de980053f69239231f384a494fb4b Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Fri, 14 Feb 2025 11:27:27 +0100 Subject: [PATCH 14/22] uncomment all tests. Update to new issuers --- contracts/collectible.yaml.template | 2 +- contracts/usdt.yaml.template | 2 +- demo.sh | 26 ++++++++++++------------ issuers/CollectibleFungibleAsset.issuer | Bin 2952 -> 2956 bytes issuers/NonInflatableAsset.issuer | Bin 2945 -> 2949 bytes 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/contracts/collectible.yaml.template b/contracts/collectible.yaml.template index 1b042b6..1a6256c 100644 --- a/contracts/collectible.yaml.template +++ b/contracts/collectible.yaml.template @@ -1,6 +1,6 @@ consensus: bitcoin testnet: true -codexId: TUiPwyY~-r0f7kk0-dy3sdfr-nsueQVC-3MtcWPy-xTNfCsM#chris-block-donald +codexId: 6bl9LdZ_-BU8Skh9-f~4UazR-TFwyotq-ac4yebi-zodXJnw#weather-motif-patriot name: OtherToken method: issue timestamp: "2024-12-18T10:32:00-02:00" diff --git a/contracts/usdt.yaml.template b/contracts/usdt.yaml.template index ff557e6..ea6bfc8 100644 --- a/contracts/usdt.yaml.template +++ b/contracts/usdt.yaml.template @@ -1,6 +1,6 @@ consensus: bitcoin testnet: true -codexId: znwQGVhW-rfRa8el-pNaAsUW-UWxXsB_-4UlC~Tf-TERhBm4#mirage-queen-delphi +codexId: qaeakTdk-FccgZC9-4yYpoHa-quPSbQL-XmyBxtn-2CpD~38#jackson-couple-oberon name: USDT method: issue timestamp: "2024-12-18T10:32:00-02:00" diff --git a/demo.sh b/demo.sh index 0599663..fb5ec99 100755 --- a/demo.sh +++ b/demo.sh @@ -744,28 +744,28 @@ scenario_0() { # default # contract issuance get_issue_utxo wallet_0 issue_contract wallet_0 usdt NIA -# issue_contract wallet_0 collectible CFA + issue_contract wallet_0 collectible CFA # export/import contracts export_contract usdt wallet_0 import_contract usdt wallet_1 import_contract usdt wallet_2 -# export_contract collectible wallet_0 -# import_contract collectible wallet_1 -# import_contract collectible wallet_2 + export_contract collectible wallet_0 + import_contract collectible wallet_1 + import_contract collectible wallet_2 # initial balance checks check_balance wallet_0 2000 usdt -# check_balance wallet_0 2000 collectible + check_balance wallet_0 2000 collectible # transfers -# transfer_create wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted + transfer_create wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted transfer_assets wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # retried -# transfer_assets wallet_0/wallet_1 2000/0 200 1800/200 0 0 collectible # CFA + transfer_assets wallet_0/wallet_1 2000/0 200 1800/200 0 0 collectible # CFA transfer_assets wallet_0/wallet_1 1900/100 200 1700/300 1 0 usdt # change, witness transfer_assets wallet_1/wallet_2 300/0 250 50/250 0 0 usdt # spend both received allocations -# transfer_assets wallet_1/wallet_2 200/0 100 100/100 0 0 collectible # CFA, spend received allocations + transfer_assets wallet_1/wallet_2 200/0 100 100/100 0 0 collectible # CFA, spend received allocations transfer_assets wallet_2/wallet_0 250/1700 100 150/1800 1 0 usdt # close loop, witness -# transfer_assets wallet_2/wallet_0 100/1800 50 50/1850 1 0 collectible # CFA, close loop, witness + transfer_assets wallet_2/wallet_0 100/1800 50 50/1850 1 0 collectible # CFA, close loop, witness transfer_assets wallet_0/wallet_1 1800/50 50 1750/100 0 0 usdt # spend received back -# transfer_assets wallet_0/wallet_1 1850/100 25 1825/125 0 0 collectible # CFA, spend received back + transfer_assets wallet_0/wallet_1 1850/100 25 1825/125 0 0 collectible # CFA, spend received back transfer_assets wallet_1/wallet_2 100/150 100 0/250 0 0 usdt # spend all (no change) transfer_assets wallet_2/wallet_0 250/1750 250 0/2000 1 0 usdt # spend all (witness) # final balance checks @@ -773,9 +773,9 @@ scenario_0() { # default check_balance wallet_0 2000 usdt check_balance wallet_1 0 usdt check_balance wallet_2 0 usdt -# check_balance wallet_0 1825 collectible -# check_balance wallet_1 125 collectible -# check_balance wallet_2 50 collectible + check_balance wallet_0 1825 collectible + check_balance wallet_1 125 collectible + check_balance wallet_2 50 collectible } ## full round of tapret transfers diff --git a/issuers/CollectibleFungibleAsset.issuer b/issuers/CollectibleFungibleAsset.issuer index 2fca245b006c05b8bf101f669d72b9a906f966f1..1e6789e7c2608b230902ed4fa9784b54fbf62513 100644 GIT binary patch delta 62 zcmV-E0Kxx=7mOE>r2+quUL%po3n1yaeJ$301y2%^A7B548qE~N!zwMQr#Q*x;?9Rx UCVa8-r2ztwUL%po3m{EMkHaQEuSffmO&!a79e%m&x#SfKb1iXW^2IY> Q3d6DVF9HDqvnT^(2)Gj$I{*Lx diff --git a/issuers/NonInflatableAsset.issuer b/issuers/NonInflatableAsset.issuer index 58c9fe00a03ff0679abb6f3ba8598c75a1ec2abc..824809fcf892be671b195e2f4f178aa78283de2b 100644 GIT binary patch delta 59 zcmV-B0L1@+7ljv)p8@}ope`V(r<##BWEICCWG{HhifA3Gu01BuEqSsB8)w)mL;ruV R?k)la0|8(E0J9wfWC-o47kmH! delta 55 zcmV-70LcG^7l9X$p8*1qpe`WJd=ME}R;~0}@#$$bpe#{k7R7r3`-LS7^xsTGVFqro N?k)lW0<$3lWC(7w6;J>G From 98ac85f3bc12a6da27df1da5e70198aab1cdf8c4 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Thu, 24 Apr 2025 19:14:25 +0200 Subject: [PATCH 15/22] fix typo --- demo.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo.sh b/demo.sh index fb5ec99..c905760 100755 --- a/demo.sh +++ b/demo.sh @@ -557,7 +557,7 @@ transfer_create() { fi _log "invoice: $INVOICE" - ## RGB tansfer + ## RGB transfer _subtit "(sender) preparing RGB transfer" CONSIGNMENT="consignment_${TRANSFER_NUM}.rgb" PSBT=tx_${TRANSFER_NUM}.psbt From 7f7527332ae820e09f82211c830e1dea150394ca Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 28 Apr 2025 20:05:08 +0200 Subject: [PATCH 16/22] update to v0.12.0-beta.6 candidate --- contracts/collectible.yaml.template | 8 ++++---- contracts/usdt.yaml.template | 8 ++++---- demo.sh | 16 +++++++++------- issuers/CollectibleFungibleAsset.issuer | Bin 2956 -> 3392 bytes issuers/NonInflatableAsset.issuer | Bin 2949 -> 3397 bytes 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/contracts/collectible.yaml.template b/contracts/collectible.yaml.template index 1a6256c..d224267 100644 --- a/contracts/collectible.yaml.template +++ b/contracts/collectible.yaml.template @@ -1,22 +1,22 @@ consensus: bitcoin testnet: true -codexId: 6bl9LdZ_-BU8Skh9-f~4UazR-TFwyotq-ac4yebi-zodXJnw#weather-motif-patriot +codexId: WAHKjUOZ-gjaVJj0-IeQ8OHE-1lysvcD-E~Y~gnx-ZwsOezQ#rapid-forever-nice name: OtherToken method: issue timestamp: "2024-12-18T10:32:00-02:00" global: - - name: name - verified: Other asset - name: details unverified: Demo CFA asset verified: {} + - name: name + verified: Other asset - name: precision verified: centiMilli - name: circulating verified: issued_supply owned: - - name: owned + - name: amount seal: txid:vout data: issued_supply diff --git a/contracts/usdt.yaml.template b/contracts/usdt.yaml.template index ea6bfc8..8e158c3 100644 --- a/contracts/usdt.yaml.template +++ b/contracts/usdt.yaml.template @@ -1,21 +1,21 @@ consensus: bitcoin testnet: true -codexId: qaeakTdk-FccgZC9-4yYpoHa-quPSbQL-XmyBxtn-2CpD~38#jackson-couple-oberon +codexId: C11V4boH-t0lNXdS-U6MDKet-us0NCCo-1cWX7xU-7ahdfqw#regard-genius-belgium name: USDT method: issue timestamp: "2024-12-18T10:32:00-02:00" global: - - name: name - verified: USD Tether - name: ticker verified: USDT + - name: name + verified: USD Tether - name: precision verified: centiMilli - name: circulating verified: issued_supply owned: - - name: owned + - name: amount seal: txid:vout data: issued_supply diff --git a/demo.sh b/demo.sh index c905760..4bfb3ac 100755 --- a/demo.sh +++ b/demo.sh @@ -17,9 +17,9 @@ export SEED_PASSWORD="seed test password" # crate variables BP_WALLET_FEATURES="--features=cli,hot" -BP_WALLET_VER="0.12.0-beta.4" +BP_WALLET_VER="0.12.0-beta.5" RGB_WALLET_FEATURES="" -RGB_WALLET_VER="0.12.0-beta.4" +RGB_WALLET_VER="0.12.0-beta.5" # RGB wallet types WALLET_TYPES=("wpkh" "tapret-key-only") @@ -56,6 +56,7 @@ exec 4>&2 _die() { # always output to stderr (copied to fd 4) printf "\n${C4}ERROR: %s${NC}\n" "$@" >&4 + cat "${TRACE_OUT}" exit 1 } @@ -349,7 +350,7 @@ check_balance() { done mapfile -t allocations < <("${RGB[@]}" -d "data${wallet_id}" \ state -w "$wallet" -o "$contract_id" 2>/dev/null \ - | grep '^[[:space:]]' | awk '{print $2" "$4}') + | grep '^[[:space:]]' | awk '{print $3" "$5}') _log "allocations:" for allocation in "${allocations[@]}"; do echo " - $allocation" @@ -381,7 +382,7 @@ export_contract() { contract_id=${CONTRACT_ID_MAP[$contract_name]} wallet_id=${WLT_ID_MAP[$wallet]} rm -rf "$contract_file" - cp -r "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" "$contract_file" + cp -r "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.*.contract" "$contract_file" #_trace "${RGB[@]}" -d "data${wallet_id}" export -w "$wallet" "$contract_id" "$contract_file" } @@ -424,7 +425,7 @@ issue_contract() { -e "s/vout/$VOUT_ISSUE/" \ "$contract_tmpl" > "$contract_yaml" _subtit "issuing" - cp issuers/* "data${wallet_id}/" + _trace "${RGB[@]}" -d "data${wallet_id}" import issuers/* _trace "${RGB[@]}" -d "data${wallet_id}" issue -w "$wallet" "$contract_yaml" \ >$TRACE_OUT 2>&1 issuance="$(cat $TRACE_OUT)" @@ -470,7 +471,8 @@ prepare_rgb_wallet() { # RGB setup _subtit "creating RGB wallet $wallet" wallet_id=${WLT_ID_MAP[$wallet]} - _trace "${RGB[@]}" -d "data${wallet_id}" --init create --"$wallet_type" "$wallet" "${DESC_MAP[$wallet]}" + _trace "${RGB[@]}" -d "data${wallet_id}" init -q + _trace "${RGB[@]}" -d "data${wallet_id}" create --"$wallet_type" "$wallet" "${DESC_MAP[$wallet]}" } sign_and_broadcast() { @@ -757,7 +759,7 @@ scenario_0() { # default check_balance wallet_0 2000 collectible # transfers transfer_create wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted - transfer_assets wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # retried + transfer_assets wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # retried transfer_assets wallet_0/wallet_1 2000/0 200 1800/200 0 0 collectible # CFA transfer_assets wallet_0/wallet_1 1900/100 200 1700/300 1 0 usdt # change, witness transfer_assets wallet_1/wallet_2 300/0 250 50/250 0 0 usdt # spend both received allocations diff --git a/issuers/CollectibleFungibleAsset.issuer b/issuers/CollectibleFungibleAsset.issuer index 1e6789e7c2608b230902ed4fa9784b54fbf62513..101a33fc5695c92013b0946fcf98e989b9ebe51d 100644 GIT binary patch delta 546 zcmeAXKOm*x?C%*I9O@dxz{tQL?pBnTT#}iemzbkanwMEvnyQdEQQV{cVA~xJiOG`6 z2dD37@>z5J^8fJqGpC9co+)3vUrgCMv6}&?nUETNhW|vUVSoalVC z`!g{xvV{iw`*}J$GBEG~4R@Hq)XwBk#K7QG!Q?Q3$#J5?0!Ai>4M41g)gvy>z#!qApOcfCT#}iTlj>HQmky#GCn|WkERvtgd_$AMh3!a{u7~w0SXuy7+&tI)xB27>Mt}&Og{d9tJGPMqldM0 zS1z|W`RviT_HebDiGK~)So6#CQd1_IFz#n$nf#GiezGvrC756?x58u|=58LKS&R() RK!bsJaxRC$<{Z{5>;Q(WSCRk# diff --git a/issuers/NonInflatableAsset.issuer b/issuers/NonInflatableAsset.issuer index 824809fcf892be671b195e2f4f178aa78283de2b..3f11c10140a70bad7fc5d65fea8901adc74c4b97 100644 GIT binary patch delta 538 zcmZn_KPsi>?C%*I9O@dxz{tQL>zALWo0*rElUS0Nl#{BER+^Wd31TEp6!fS+*mlQ5 zVzQ+2!Rb4ieAZmQ{6D<@%&DS}CKOK}d~0!+#>wFhBv&N!+oa4|lO| z_w32tirf~5yqK(i)nQL z69Xe#Xt2MZr?Vpi10T>-hZ#)mOb$g13{DkH4ilIhCps)(WOCR5#7YVb4hQ)dQW%^R znc5kd_!)o%NWd7V4=l*p|yUzCwtiMEm*Mj)0s!x zS@>F+Blmqd8=tM|2eW%B14APtQv)N&Y9XN25@3b`jNt%cz}+F}(CDzxVIx0-gAgNw zLlGlG2SW=Z7c)P|!3Vh5olddaGH|juonmx>xO*;>%R~oRCN^83=ae8ix)|CJIyiwk i@)$VT;1&QiOmfg=V#{MlU|>Y{5F-q)haH?z#!z8pXZsEmXlbLn3R+1I8n``{*zGDj5CflaAOFCnPa2FftHU^PdPc3{b$xz_4=ptcm6+qQ@0d#Plmpc4f$}T4$?vLAP=f uyL9>uE$9FBlbIO}*jV$+^HNhbTQP26gt8}pWLnJz)X&JkzuBAh7drryXHEYA From fd67dff0664b2d5141ea8b66f39db2f3322accbe Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Mon, 28 Apr 2025 20:58:44 +0200 Subject: [PATCH 17/22] further v0.12.0-beta.6 adoption --- .gitignore | 1 + demo.sh | 14 ++++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 1ab302a..064b63d 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ wallets/ # contract generated files contracts/*.rgb contracts/*.yaml +contracts/*.contract !contracts/*.template # consignment inspect files diff --git a/demo.sh b/demo.sh index 4bfb3ac..981cff3 100755 --- a/demo.sh +++ b/demo.sh @@ -365,7 +365,7 @@ check_balance() { fi if [ "$BALANCE" != "$expected" ]; then _die "$(printf '%s' \ - "balance $BALANCE for contract $contract_id ($contract_name) " \ + "$wallet balance $BALANCE for $contract_id ($contract_name) " \ "differs from the expected $expected (transfer $TRANSFER_NUM)")" fi _log "$(printf '%s' \ @@ -378,11 +378,10 @@ export_contract() { local wallet="$2" _tit "exporting $contract_name contract from $wallet" local contract_file contract_id wallet_id - contract_file=${CONTRACT_DIR}/${contract_name}.rgb contract_id=${CONTRACT_ID_MAP[$contract_name]} wallet_id=${WLT_ID_MAP[$wallet]} - rm -rf "$contract_file" - cp -r "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.*.contract" "$contract_file" + rm -rf ${CONTRACT_DIR}/"${CONTRACT_NAME_MAP[$contract_name]}".*.contract + cp -r data"${wallet_id}"/bitcoin.testnet/"${CONTRACT_NAME_MAP[$contract_name]}".*.contract "${CONTRACT_DIR}/" #_trace "${RGB[@]}" -d "data${wallet_id}" export -w "$wallet" "$contract_id" "$contract_file" } @@ -399,11 +398,10 @@ import_contract() { local contract_name="$1" local wallet="$2" _tit "importing $contract_name contract into $wallet" - local contract_file wallet_id - contract_file=${CONTRACT_DIR}/${contract_name}.rgb + local wallet_id wallet_id=${WLT_ID_MAP[$wallet]} - rm -rf "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" - cp -r "$contract_file" "data${wallet_id}/bitcoin.testnet/${CONTRACT_NAME_MAP[$contract_name]}.contract" + rm -rf data"${wallet_id}"/bitcoin.testnet/"${CONTRACT_NAME_MAP[$contract_name]}".*.contract + cp -r $CONTRACT_DIR/"${CONTRACT_NAME_MAP[$contract_name]}".*.contract "data${wallet_id}/bitcoin.testnet/" # note: all output to stderr #_trace "${RGB[@]}" -d "data${wallet_id}" import -w "$wallet" "$contract_file" 2>&1 | grep Contract } From cee33b0324b8ffe4eda9536f29b414330d75c6f6 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 29 Apr 2025 22:08:43 +0200 Subject: [PATCH 18/22] increase SATS to prevent tests from non-deterministic failures --- demo.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo.sh b/demo.sh index 981cff3..32a9b10 100755 --- a/demo.sh +++ b/demo.sh @@ -11,8 +11,8 @@ TRANSFER_NUM=0 WALLET_NUM=0 WALLET_PATH="wallets" WALLETS=() -SATS=500 # TODO: This is required only for witness-out transfers. We need to account for it -# TODO: FEE is also used but not defined anywhere +SATS=800 # TODO: This is required only for witness-out transfers. We need to account for it +FEE=260 export SEED_PASSWORD="seed test password" # crate variables From 9f0e82b142dcccea5a0601f778c712f4c27ca6ef Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 30 Apr 2025 15:50:14 +0200 Subject: [PATCH 19/22] improve verbosiity; use new args --- demo.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/demo.sh b/demo.sh index 32a9b10..22d2e50 100755 --- a/demo.sh +++ b/demo.sh @@ -109,7 +109,7 @@ _gen_addr_rgb() { } _wait_indexers_sync() { - echo -n "waiting for indexer to have synced" + echo -n "Waiting for the indexer to sync ... " local block_count block_count=$("${BCLI[@]}" getblockcount) if [ "$PROFILE" = "electrum" ]; then @@ -335,7 +335,7 @@ check_balance() { local subtit="${4:-0}" if [ "$subtit" = 0 ]; then _tit "checking $contract_name balance for $wallet" - else + elif [ "$subtit" = 1 ]; then _subtit "checking $contract_name balance for $wallet" fi local contract_id allocations amount wallet_id @@ -566,7 +566,7 @@ transfer_create() { [ -n "$SATS" ] && sats=(--sats "$SATS") [ -n "$FEE" ] && fee=(--fee "$FEE") _trace "${RGB[@]}" -d "$send_data" pay -w "$SEND_WLT" \ - "${sats[@]}" "${fee[@]}" \ + "${sats[@]}" "${fee[@]}" --force \ "$INVOICE" "$send_data/$CONSIGNMENT" "$send_data/$PSBT" if ! ls "$send_data/$CONSIGNMENT" >/dev/null 2>&1; then _die "could not locate consignment file: $send_data/$CONSIGNMENT" @@ -593,6 +593,8 @@ transfer_create() { # _trace "${RGB[@]}" -d "$send_data" inspect \ # "$send_data/$CONSIGNMENT" "$CONSIGNMENT.yaml" # _log "consignment exported to file: $CONSIGNMENT.yaml" + + [ $DEBUG = 1 ] && _subtit "tentative sender state" && _show_state "$SEND_WLT" "$XFER_CONTRACT_NAME" 0 } transfer_complete() { From 7dda9d4edd6c72d163d26f030d5dd0855ba1ebd1 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 30 Apr 2025 15:50:23 +0200 Subject: [PATCH 20/22] do correct transfer aborting --- demo.sh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/demo.sh b/demo.sh index 22d2e50..38f6f03 100755 --- a/demo.sh +++ b/demo.sh @@ -497,6 +497,15 @@ transfer_assets() { unset BLNC_RCPT BLNC_SEND RCPT_WLT SEND_WLT } +transfer_aborted() { + transfer_create "$@" # parameter pass-through + _subtit "(sender) aborting transfer" + _sync_wallet "$SEND_WLT" + # unset global variables set by transfer operations + unset BALANCE CONSIGNMENT PSBT XFER_CONTRACT_NAME + unset BLNC_RCPT BLNC_SEND RCPT_WLT SEND_WLT +} + transfer_create() { ## params local wallets="$1" # sender>receiver wallet names @@ -721,7 +730,7 @@ trap cleanup EXIT # install crates install_rust_crate "bp-wallet" "$BP_WALLET_VER" "$BP_WALLET_FEATURES" "--git https://github.com/BP-WG/bp-wallet --branch v0.12" # commit 139d936 -install_rust_crate "rgb-wallet" "$RGB_WALLET_VER" "$RGB_WALLET_FEATURES" "--git https://github.com/RGB-WG/rgb --branch v0.12" # commit 55a814a +install_rust_crate "rgb-wallet" "$RGB_WALLET_VER" "$RGB_WALLET_FEATURES" "--path ../rgb-wallet/cli" # "--git https://github.com/RGB-WG/rgb --branch v0.12" # commit 55a814a mkdir "$CONTRACT_DIR" @@ -758,7 +767,7 @@ scenario_0() { # default check_balance wallet_0 2000 usdt check_balance wallet_0 2000 collectible # transfers - transfer_create wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted + transfer_aborted wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted transfer_assets wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # retried transfer_assets wallet_0/wallet_1 2000/0 200 1800/200 0 0 collectible # CFA transfer_assets wallet_0/wallet_1 1900/100 200 1700/300 1 0 usdt # change, witness @@ -802,7 +811,7 @@ scenario_1() { check_balance wallet_0 2000 usdt check_balance wallet_0 2000 collectible # transfers - transfer_create wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted + transfer_aborted wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted transfer_assets wallet_0/wallet_1 2000/0 100 1900/100 0 1 usdt # retried transfer_assets wallet_0/wallet_1 2000/0 200 1800/200 0 0 collectible # CFA transfer_assets wallet_0/wallet_1 1900/100 200 1700/300 1 0 usdt # change, witness From 17fd9e2d2500b8f0137003e1fe2655d344ac81fb Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Wed, 30 Apr 2025 17:47:27 +0200 Subject: [PATCH 21/22] revert temporary debug changes --- demo.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/demo.sh b/demo.sh index 38f6f03..2cc197d 100755 --- a/demo.sh +++ b/demo.sh @@ -56,7 +56,6 @@ exec 4>&2 _die() { # always output to stderr (copied to fd 4) printf "\n${C4}ERROR: %s${NC}\n" "$@" >&4 - cat "${TRACE_OUT}" exit 1 } @@ -729,8 +728,8 @@ set_aliases trap cleanup EXIT # install crates -install_rust_crate "bp-wallet" "$BP_WALLET_VER" "$BP_WALLET_FEATURES" "--git https://github.com/BP-WG/bp-wallet --branch v0.12" # commit 139d936 -install_rust_crate "rgb-wallet" "$RGB_WALLET_VER" "$RGB_WALLET_FEATURES" "--path ../rgb-wallet/cli" # "--git https://github.com/RGB-WG/rgb --branch v0.12" # commit 55a814a +install_rust_crate "bp-wallet" "$BP_WALLET_VER" "$BP_WALLET_FEATURES" "--git https://github.com/BP-WG/bp-wallet --branch v0.12" # commit 0d439062 +install_rust_crate "rgb-wallet" "$RGB_WALLET_VER" "$RGB_WALLET_FEATURES" "--git https://github.com/RGB-WG/rgb --branch v0.12" # commit 9ffff7fb mkdir "$CONTRACT_DIR" @@ -768,7 +767,7 @@ scenario_0() { # default check_balance wallet_0 2000 collectible # transfers transfer_aborted wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # aborted - transfer_assets wallet_0/wallet_1 2000/0 100 1900/100 0 0 usdt # retried + transfer_assets wallet_0/wallet_1 2000/0 100 1900/100 0 1 usdt # retried transfer_assets wallet_0/wallet_1 2000/0 200 1800/200 0 0 collectible # CFA transfer_assets wallet_0/wallet_1 1900/100 200 1700/300 1 0 usdt # change, witness transfer_assets wallet_1/wallet_2 300/0 250 50/250 0 0 usdt # spend both received allocations From e975b885e9d718a0cb2da7739ee942031bc9d2ed Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 1 Jun 2025 14:06:47 +0200 Subject: [PATCH 22/22] chore: update to v0.12 RC2 pre-publication --- contracts/collectible.yaml.template | 9 ++++++--- contracts/usdt.yaml.template | 9 ++++++--- demo.sh | 4 ++-- issuers/CollectibleFungibleAsset.issuer | Bin 3392 -> 0 bytes issuers/NonInflatableAsset.issuer | Bin 3397 -> 0 bytes issuers/RGB20-Simplest-v0-rLosfg.issuer | Bin 0 -> 6152 bytes issuers/RGB25-UniquelyFungible-v0-r~mUOw.issuer | Bin 0 -> 6056 bytes 7 files changed, 14 insertions(+), 8 deletions(-) delete mode 100644 issuers/CollectibleFungibleAsset.issuer delete mode 100644 issuers/NonInflatableAsset.issuer create mode 100644 issuers/RGB20-Simplest-v0-rLosfg.issuer create mode 100644 issuers/RGB25-UniquelyFungible-v0-r~mUOw.issuer diff --git a/contracts/collectible.yaml.template b/contracts/collectible.yaml.template index d224267..3ac661b 100644 --- a/contracts/collectible.yaml.template +++ b/contracts/collectible.yaml.template @@ -1,6 +1,9 @@ consensus: bitcoin testnet: true -codexId: WAHKjUOZ-gjaVJj0-IeQ8OHE-1lysvcD-E~Y~gnx-ZwsOezQ#rapid-forever-nice +issuer: + codexId: qg8TdlRF-~RGz7bI-pceS960-evWjLKg-NcWTNWy-D9pIYBA + version: 0 + api: r~mUOw name: OtherToken method: issue timestamp: "2024-12-18T10:32:00-02:00" @@ -13,10 +16,10 @@ global: verified: Other asset - name: precision verified: centiMilli - - name: circulating + - name: issued verified: issued_supply owned: - - name: amount + - name: balance seal: txid:vout data: issued_supply diff --git a/contracts/usdt.yaml.template b/contracts/usdt.yaml.template index 8e158c3..596f93a 100644 --- a/contracts/usdt.yaml.template +++ b/contracts/usdt.yaml.template @@ -1,6 +1,9 @@ consensus: bitcoin testnet: true -codexId: C11V4boH-t0lNXdS-U6MDKet-us0NCCo-1cWX7xU-7ahdfqw#regard-genius-belgium +issuer: + codexId: y6L7YTlM-5_v4LWy-oQsj5hV-I2imvxD-zRu0JBo-yaguhrY + version: 0 + api: rLosfg name: USDT method: issue timestamp: "2024-12-18T10:32:00-02:00" @@ -12,10 +15,10 @@ global: verified: USD Tether - name: precision verified: centiMilli - - name: circulating + - name: issued verified: issued_supply owned: - - name: amount + - name: balance seal: txid:vout data: issued_supply diff --git a/demo.sh b/demo.sh index 2cc197d..5fc070c 100755 --- a/demo.sh +++ b/demo.sh @@ -17,9 +17,9 @@ export SEED_PASSWORD="seed test password" # crate variables BP_WALLET_FEATURES="--features=cli,hot" -BP_WALLET_VER="0.12.0-beta.5" +BP_WALLET_VER="0.12.0-rc.1" RGB_WALLET_FEATURES="" -RGB_WALLET_VER="0.12.0-beta.5" +RGB_WALLET_VER="0.12.0-rc.1.1" # RGB wallet types WALLET_TYPES=("wpkh" "tapret-key-only") diff --git a/issuers/CollectibleFungibleAsset.issuer b/issuers/CollectibleFungibleAsset.issuer deleted file mode 100644 index 101a33fc5695c92013b0946fcf98e989b9ebe51d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3392 zcmdT`dvp}l8Nc`L%svv?C4my9pqr$Hf=CPrDlv~?lK_Fdmp}r<$z=B?J7jidGc%h9 zh+w2VqCuka6m$WPEgn*1!9(Pv!H8`RF&tZ^K2oG6mP2dh4Xpyr_Rg{k|Flfcv8U(s zJ7;%)=YEg-ecycF{5HEN&*?17Ed>yOxH&TCQh7<_1iN44>;2fyDGFA{0Jo^5`8d%n z$(&E-y?DCI^KyPpEg&-eW-vGs{PzM$WCH-b>rTzP_r?1Xd$)D9DNRU0<*>gkdq>M7TP9_gn{Cz!1-So%Q}+~oHe$I{ z8*N>g8mR&N%L*Y~I@d8{CN!%uCn_~qhDOdS`9<|sd;q9u7caZ~0;lp~?S|*du`BJ; z<691&7~j@%2ruk@8n*tGVute!8EMx8k%d}|xJ|L^~}$n~{tt4!|r z%lWy3_uyYIu+bFX@{b61~VH~2@rEc7k` z7N3k=yh5g}((ry<+x|^YWu;xo{%Xf6)jl!i>f{+8_U!Fkuqo>jo1l9Yx@$RP62i|- z?-A+d3=EJB0-9G8KL+5=Txhd)cbTU6y>_X_&Wk?3s@QqOE=sB$*Zaw;sggacmHeuv zCZP~Xy3AQrn3p{p04q6QwxjikkpXZtA!ak0-OdCcVmiqu!48;SD{uoxJX#Nt4UjMG zAcgpa4sDFKfZt2tx4)eKW@2nd;i%)!nN9}+9hV1&4^!5k8Y+6Oo?z>y6h^Y$0>IM{ zt$|vyu_W1hL%<#Zj0SFJ9>YA%>|x%r0VWm#MuuPmSPP>JHm$^WqfCx|QwFe5j{b0= zyHQR%GZ7gxNH-F0IkbXxcN{FlK?D}#?fAsu1?C}S6hW2#6VmCA-i!eo0Hy;E{%&{E zzLasn;xA#s>HGVVDmQ<)>*sqf3~hd)V7PmV`NsZod3;97LgPWtF=~1Zeekh^dAFxK%GPBb3tl?u zs2WXWoPKQgk@0P|V@E&T{)^+|E??-pR`br+$!}K;zU-ypdtA(!SBG~tT8-y=UXOb| z^O@E!%)9oD`BPqJ@!yuVA8DM|lNdMk&uepco_!`YV9c^yw;xADpnFG52tt%jc!R0IQd5=AC_HMRDW#YyaXzQN+v~dK1oq! z$>+h7&DDf?>ad#slL#uEV&)VT%e+!ImGTLG%?AFQv3vJ4dk zsw(vRVM7CKY=lisu(=toSYdHR5?M+4cprZ9_Ce_?TIB^deoBvcXsEX!%l71zSDr~d z-+u6`z{7_xoIG)OXV3m0B#nOH(TYQT@zw``S&u6WW1@M{%{LHYsTMGx+=OEwt&JX! z$m9qDZ?I@*1sbHHLW&TkiPj}c#;}$^Q$$O!nQ)>gS8>VJ3GS`yb>^iM1G>=G z_YA53pLOZ|0imJZ2I#%5X{6V???&*iUccGI3A2WOCcbuMQ5Tz8F*2nK55<2}S`@o} zz8<5{NRJV&b;QNz41DxO^*3jWF5VdHp7`SOHNAo3nMb$D^=mgi*{!EH>s=6`$;n}$ VSCUz8$6z>+Dg3L)(-C`O{!eG4gkk^y diff --git a/issuers/NonInflatableAsset.issuer b/issuers/NonInflatableAsset.issuer deleted file mode 100644 index 3f11c10140a70bad7fc5d65fea8901adc74c4b97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3397 zcmdT`dvH|M89(Rjz57T?mIMq+jcyVv1%VKPRbn2?CIJF@ZvqLh-rVe-&0cc%-pzgF zf$}gSk0?kK0TFZ|juj`VQE(EO7>H;y&@fV^S|d^u%V4cM{^sD3WnZ)%JJ!^?FqY{q zJ@dM2MO!!r@GmojbjcjY^l8wnNUR`xu>_5*UsMIId-Rh z|HuoSN5^kyzA(^xVr=AAsrd8b0~h;>@7}ojkC{DRC5<|@kN?3sc+cPeah~nlu+^2^ z{+F}6yX`Ngyv##Vq}viDuzo!G*xF|5z<18O59KVHH0G^0+Dmudg`>{A;?K%id3Mdf zpLD(4)&*f&0upv}GA9Zy!w2Iw?Af>?GxcKD*Do$tY;n<-CQSdRXLrZ^jhWvw3A(P3 zjxVFaxofcGs2okDpL}@d{_z{EhYozU?Kg*GFP!VR?0xs!8u@sw{6)MB4~gR27X) zOd$Y`WzNEa+^ksuM3DpgHnbMmB>)@^$i4~9YOx0)vUiYAf(_VvqksoE;?Y`&tblxJ z2Ps5v_|R(C=I%eLlVX$f`9*i(Kj+oMcg>oDj zNpvU5Zn4K9V>+ou!VQIHu;!M6g(wKXV!UaeC_HDMf{X&F)W0E}`snpCumWIed*Jsw z8(LFhLq%V~gp>F5CAl_zwBz;N=LR=Dmp{}!(R_7JximgKrPR3BcSu~+)M%;fADVf+ z`^~}i`?t;f!$3nghR_Jm8+ICgkh=WkclV-3`S7!@PY2tm%fI`?VL#Z@9bxS&+Go-)Eywy)v}DKFWBe=e2RqW<1&arFlo|m_O%s6#Z>+%l`VgJ&EHceX}}e`{^fV z1dW-ND^bahefxA`+Ucg&b?WIYT?U4h1FRd{DBR%YnBhqo88hnJ}u`H+2!?T%gs+KTI!pJb!s#sRY ztC)#c#g3R+vk>EOASNpdG1=LO$;m;??AeH!GY2tq=OQLI7cukZA!h!3#N_26CO;oB z1qFyHEJRFE5n_sq5mQov7^f34rKN}|D?`kJ1&CR=5HaQDh^eSR%%VjRa;;;eGK(!$ zq(n|F;U%|@OI);@m9X-tkrzFL#h5iI?Om;eEDNiupxX^S9*8mYdSP`n^!Xsi!KF)K zO%3FE==VcGfT9Qk0a#lLB?-zhR1~PHu&xf)*TaSe*w_e{Ewi}8fjmY9xB!0q=0VAF zTH$yPUXh>X>g~Vs;EyXm4Q{EA3oW_!*NvNZqz(G}I@T;+?`+;qL%ji6vMaaTb!x`h zmc3sGr*)n?ezbFY&z?JyM&J8T#lF7ysC$7~ZzmbXL~??Mt0N1H{CfeEhwL&)Ypus2 z(m6cO87$gaz6Pm?Va70~3D+%&#t|-orZAUaGugd@XfbQ51q4M{hBY-9Ny_0Ce>Ti2 zB52eNmIk9}FZL^@Gjr!khwx+~Ym(=rT_PukWxUuD=ys3Tn7kkyoc}8FH8_GMC516- z=jm+}8tH9>%kAUhv->~(vg*6jh3Bu1^~62DbX9NgaK?eHQtj&Xk9X_w&3X>PYjVN} X&`ZgzH)C+bkZI&sZ%>EiiTFPO;$?~V diff --git a/issuers/RGB20-Simplest-v0-rLosfg.issuer b/issuers/RGB20-Simplest-v0-rLosfg.issuer new file mode 100644 index 0000000000000000000000000000000000000000..408e7ff66f00a2c6e24b2c555854e344457d4158 GIT binary patch literal 6152 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 literal 0 HcmV?d00001 diff --git a/issuers/RGB25-UniquelyFungible-v0-r~mUOw.issuer b/issuers/RGB25-UniquelyFungible-v0-r~mUOw.issuer new file mode 100644 index 0000000000000000000000000000000000000000..75014b349a01f128ea38f1f08af4dc82a020ab6a GIT binary patch literal 6056 zcmdT|33L=i8t&?up3EeYgD80-NQWR85dexj9nZm^pbsyZK zmd$-LYR=))1Tw?f3`Y~LjfxEvWL}Bcc;WTL$}e_&Gy1PnlHaL4(Ixx%>rqWvrP1Ja z0@ziV6BQ4XL0B0laH0!Z!`x8ictQDSR#Z-fv>UnvPUcjUHu`Q|8-!83k|wz6GSdPL_wcf!CgM`3 zv^&JAcK?@c>pfZV_(1-c~Borv3~fp(wTIeODBT|>HoU#gdv-HFye7?b z@b2pqsM6Pfky3*c2Bf>>hr#^$G)1MoTmaH&y}anxRK8{N-@am3S$8irwEF5`23H8YI^OZj=d!pcA)S$tiX1Vs16fb!&j>(B_d1=yd$03t7 z9+Wr~?E1ODpv>Z0{mJOmX-3r1vt4R5YTFu(Mx(T?v769|^>}-N0W+6rU{*4(A>y=S zeoic%56CD)(~dFf&^ANfp}V~qDwL*yNg1>KpFT~>gc@g3CY0VxX(&DFk3(DZ{jS4q zf9UchwrlHw-rWm(RJ=N_*>+@K)|ErcH}A`G9I=sBO|6!`oWUHKde=`oPS>^aFU2Ik zl6Fsg;f~0n&U<#9se7Vyzm4+ClH_UL)~mM5ikhKWSBRwkJwB`5dM0KmSXJ_}*1zW6 zxfkt2y1lwp8kP2uCV9Zc6K@Y1`#Bx|u@b0+jSSSl}@m(h6V%Edy{rKg%A zCf&O(Z2F15C2QABe6-b3e_KRWzpEc@Kiain_lZr@lHRyo?2(Ubm#*ovwP?E@Te{JTZum(bCyP1M|?Wu`E6b6qxSAP@zh@q zc4@x2;gVew&FY?%1Zl7?+n zSvwQr`hHoL`OLZbDUG&~j-Mk3&Hj2(!titRRxi-bJ-NlgQi>l{p0pKKyM%aKr6#FR z>1p+HiZ{XLmIPFJ_6kGgiwlbCT@KENLBoPj>s8v!jrFvxu z2V2pJFQ-^Nd;s2SQTXaVQ3?z|@jeRjKI~mCj&fN*rY|fdHtg0@c-E z=1eeamcwN_GTZ9s{qTYIj=UO5jKi^q;^erD&I+XhDW zxUYEAf%wQCgdKNhw8Td6qMHw(3nuz@LRe8D#sf+x4o{-I3j%L(=zZgL(Hd?j44Fb& zmn_+WS|o;eQyv#YoBneX0~?V2;wo z=r&A4j`;X2F3U)U;O!Gms9zLmeiXe=l_ak z|6QugOQ`)p`|iS~H$Kjt+3>0I*!orf*r@f(ws~{c0vGw@Tb7jn&viXCcwOwmS;Ia! z?0aCo|MeW(h^^gH-ei_G*T3E6a701ea*D*gD?h8-+B+;GgZOY`|Fooaf%{H57Y5d+ z9ZgFdusZ3Bt8>QVzEV&Cx5rk`bG95h@!rvuotx@Ul@2UAc3Fztw=b}Nx3@TZoD~*P z0Cz0mjy1xHJ25B{$AF)%!W}RFTFnXfpMFJrv88AWn_7G|aSJ>Z|9;+t&X0`6ooe_< zUs@j*pKhoW0 CD-ksS literal 0 HcmV?d00001