summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack <87339414+algojack@users.noreply.github.com>2022-01-07 17:20:53 -0500
committerGitHub <noreply@github.com>2022-01-07 17:20:53 -0500
commit0984eff93c97a35484ebe3e8383c870e02df0a79 (patch)
tree69be7cde1c26cd660b95f5cc3c870655ae11733e
parentf9497d9e754c059c735081a01c5ecabed580ae12 (diff)
parent989cc16949d4eb42d8fb1d50005f4590d2b16df4 (diff)
Merge pull request #3369 from fionnachan/goal-asset-create-support-configtemp-branch
Allow setting manager, reserve, freeze, and clawback at goal asset create
-rw-r--r--cmd/goal/asset.go71
-rwxr-xr-xtest/scripts/e2e_subs/asset-misc.sh102
2 files changed, 172 insertions, 1 deletions
diff --git a/cmd/goal/asset.go b/cmd/goal/asset.go
index ad2891e82..b940a54e1 100644
--- a/cmd/goal/asset.go
+++ b/cmd/goal/asset.go
@@ -37,8 +37,13 @@ var (
assetURL string
assetName string
assetManager string
+ assetReserve string
assetClawback string
assetFreezer string
+ assetNoManager bool
+ assetNoReserve bool
+ assetNoFreezer bool
+ assetNoClawback bool
assetNewManager string
assetNewReserve string
@@ -64,6 +69,14 @@ func init() {
createAssetCmd.Flags().StringVar(&assetName, "name", "", "Name for the entire asset")
createAssetCmd.Flags().StringVar(&assetURL, "asseturl", "", "URL where user can access more information about the asset (max 32 bytes)")
createAssetCmd.Flags().StringVar(&assetMetadataHashBase64, "assetmetadatab64", "", "base-64 encoded 32-byte commitment to asset metadata")
+ createAssetCmd.Flags().StringVar(&assetManager, "manager", "", "Manager account that can issue transactions to re-configure or destroy the asset")
+ createAssetCmd.Flags().StringVar(&assetReserve, "reserve", "", "Reserve account that non-minted assets will reside in")
+ createAssetCmd.Flags().StringVar(&assetFreezer, "freezer", "", "Freezer account that can freeze or unfreeze the asset holdings for a specific account")
+ createAssetCmd.Flags().StringVar(&assetClawback, "clawback", "", "Clawback account that is allowed to transfer assets from and to any asset holder")
+ createAssetCmd.Flags().BoolVar(&assetNoManager, "no-manager", false, "Explicitly declare the lack of manager")
+ createAssetCmd.Flags().BoolVar(&assetNoReserve, "no-reserve", false, "Explicitly declare the lack of reserve")
+ createAssetCmd.Flags().BoolVar(&assetNoFreezer, "no-freezer", false, "Explicitly declare the lack of freezer")
+ createAssetCmd.Flags().BoolVar(&assetNoClawback, "no-clawback", false, "Explicitly declare the lack of clawback")
createAssetCmd.MarkFlagRequired("total")
createAssetCmd.MarkFlagRequired("creator")
@@ -185,10 +198,66 @@ var createAssetCmd = &cobra.Command{
Run: func(cmd *cobra.Command, _ []string) {
checkTxValidityPeriodCmdFlags(cmd)
+ if assetManager != "" && assetNoManager {
+ reportErrorf("The [--manager] flag and the [--no-manager] flag are mutually exclusive, do not provide both flags.")
+ }
+
+ if assetReserve != "" && assetNoReserve {
+ reportErrorf("The [--reserve] flag and the [--no-reserve] flag are mutually exclusive, do not provide both flags.")
+ }
+
+ if assetFreezer != "" && assetNoFreezer {
+ reportErrorf("The [--freezer] flag and the [--no-freezer] flag are mutually exclusive, do not provide both flags.")
+ }
+
+ if assetClawback != "" && assetNoClawback {
+ reportErrorf("The [--clawback] flag and the [--no-clawback] flag are mutually exclusive, do not provide both flags.")
+ }
+
dataDir := ensureSingleDataDir()
client := ensureFullClient(dataDir)
accountList := makeAccountsList(dataDir)
creator := accountList.getAddressByName(assetCreator)
+ manager := creator
+ reserve := creator
+ freezer := creator
+ clawback := creator
+
+ if cmd.Flags().Changed("manager") {
+ assetManager = accountList.getAddressByName(assetManager)
+ manager = assetManager
+ }
+
+ if assetNoManager {
+ manager = ""
+ }
+
+ if cmd.Flags().Changed("reserve") {
+ assetReserve = accountList.getAddressByName(assetReserve)
+ reserve = assetReserve
+ }
+
+ if assetNoReserve {
+ reserve = ""
+ }
+
+ if cmd.Flags().Changed("freezer") {
+ assetFreezer = accountList.getAddressByName(assetFreezer)
+ freezer = assetFreezer
+ }
+
+ if assetNoFreezer {
+ freezer = ""
+ }
+
+ if cmd.Flags().Changed("clawback") {
+ assetClawback = accountList.getAddressByName(assetClawback)
+ clawback = assetClawback
+ }
+
+ if assetNoClawback {
+ clawback = ""
+ }
var err error
var assetMetadataHash []byte
@@ -199,7 +268,7 @@ var createAssetCmd = &cobra.Command{
}
}
- tx, err := client.MakeUnsignedAssetCreateTx(assetTotal, assetFrozen, creator, creator, creator, creator, assetUnitName, assetName, assetURL, assetMetadataHash, assetDecimals)
+ tx, err := client.MakeUnsignedAssetCreateTx(assetTotal, assetFrozen, manager, reserve, freezer, clawback, assetUnitName, assetName, assetURL, assetMetadataHash, assetDecimals)
if err != nil {
reportErrorf("Cannot construct transaction: %s", err)
}
diff --git a/test/scripts/e2e_subs/asset-misc.sh b/test/scripts/e2e_subs/asset-misc.sh
index 849b86484..73c018eb8 100755
--- a/test/scripts/e2e_subs/asset-misc.sh
+++ b/test/scripts/e2e_subs/asset-misc.sh
@@ -15,6 +15,7 @@ ACCOUNT=$(${gcmd} account list|awk '{ print $3 }')
ACCOUNTB=$(${gcmd} account new|awk '{ print $6 }')
ACCOUNTC=$(${gcmd} account new|awk '{ print $6 }')
ACCOUNTD=$(${gcmd} account new|awk '{ print $6 }')
+ACCOUNTE=$(${gcmd} account new|awk '{ print $6 }')
ASSET_NAME='Birlot : décollage vs. ࠶🦪'
@@ -47,4 +48,105 @@ else
exit 1
fi
+# Test Scenario - check addresses are set correctly
+# case 1: asset created without specifying manager, reserve, freezer, or clawback
+MANAGER_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Manager address'|awk '{ print $3 }')
+RESERVE_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Reserve address'|awk '{ print $3 }')
+FREEZE_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Freeze address'|awk '{ print $3 }')
+CLAWBACK_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Clawback address'|awk '{ print $3 }')
+
+# check manager, reserve, freeze, and clawback are by default the creator
+if [ "$MANAGER_ADDRESS" = "$ACCOUNT" ] \
+ && [ "$RESERVE_ADDRESS" = "$ACCOUNT" ] \
+ && [ "$FREEZE_ADDRESS" = "$ACCOUNT" ] \
+ && [ "$CLAWBACK_ADDRESS" = "$ACCOUNT" ]; then
+ echo ok
+else
+ date '+asset-misc asset manager, reserve, freezer, and clawback should be creator error %Y%m%d_%H%M%S'
+ exit 1
+fi
+
+# case 2: asset created with no manager, no reserve, no freezer, and no clawback
+${gcmd} asset create --creator "${ACCOUNT}" --no-manager --no-reserve --no-freezer --no-clawback --name "${ASSET_NAME}" --unitname iamisc --total 1000000000000 --asseturl "${ASSET_URL}"
+
+IMMUTABLE_ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --unitname iamisc|grep 'Asset ID'|awk '{ print $3 }')
+
+IMMUTABLE_MANAGER_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Manager address'|awk '{ print $3 }')
+IMMUTABLE_RESERVE_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Reserve address'|awk -F "[()]" '{ print $2 }')
+IMMUTABLE_FREEZE_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Freeze address'|awk '{ print $3 }')
+IMMUTABLE_CLAWBACK_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Clawback address'|awk '{ print $3 }')
+
+# goal asset info returns the creator's address as the reserve address when reserve address is empty
+# check goal/asset.go
+if [ "$IMMUTABLE_MANAGER_ADDRESS" = "" ] \
+ && [ "$IMMUTABLE_RESERVE_ADDRESS" = "Empty. Defaulting to creator" ] \
+ && [ "$IMMUTABLE_FREEZE_ADDRESS" = "" ] \
+ && [ "$IMMUTABLE_CLAWBACK_ADDRESS" = "" ]; then
+ echo ok
+else
+ date '+asset-misc immutable asset manager/reserve/freezer/clawback addresses error %Y%m%d_%H%M%S'
+ exit 1
+fi
+
+# case 3: asset created with manager, reserve, freezer, and clawback different from the creator
+${gcmd} asset create --creator "${ACCOUNT}" --manager "${ACCOUNTB}" --reserve "${ACCOUNTC}" --freezer "${ACCOUNTD}" --clawback "${ACCOUNTE}" --name "${ASSET_NAME}" --unitname dma --total 1000000000000 --asseturl "${ASSET_URL}"
+
+DIFF_MANAGER_ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --unitname dma|grep 'Asset ID'|awk '{ print $3 }')
+
+DMA_MANAGER_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Manager address'|awk '{ print $3 }')
+DMA_RESERVE_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Reserve address'|awk '{ print $3 }')
+DMA_FREEZE_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Freeze address'|awk '{ print $3 }')
+DMA_CLAWBACK_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Clawback address'|awk '{ print $3 }')
+
+if [ "$DMA_MANAGER_ADDRESS" = "$ACCOUNTB" ] \
+ && [ "$DMA_RESERVE_ADDRESS" = "$ACCOUNTC" ] \
+ && [ "$DMA_FREEZE_ADDRESS" = "$ACCOUNTD" ] \
+ && [ "$DMA_CLAWBACK_ADDRESS" = "$ACCOUNTE" ]; then
+ echo ok
+else
+ date '+asset-misc asset addresses with diff manager/reserve/freeze/clawback error %Y%m%d_%H%M%S'
+ exit 1
+fi
+
+# Test Scenario - check if asset is created successfully when passed in different combination of flags for addresses
+# case 1: create asset with both manager flag and no-manager flag
+if ${gcmd} asset create --creator "${ACCOUNT}" --no-manager --manager "${ACCOUNTB}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
+ date '+asset-misc asset with --manager and --no-manager flags created successfully error %Y%m%d_%H%M%S'
+ exit 1
+else
+ echo "Expected. Cannot create asset with both manager flag and no-manager flag"
+fi
+
+# case 2: create asset with both reserve flag and no-reserve flag
+if ${gcmd} asset create --creator "${ACCOUNT}" --no-reserve --reserve "${ACCOUNTC}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
+ date '+asset-misc asset with --reserve and --no-reserve flags created successfully error %Y%m%d_%H%M%S'
+ exit 1
+else
+ echo "Expected. Cannot create asset with both reserve flag and no-reserve flag"
+fi
+
+# case 3: create asset with both freezer flag and no-freezer flag
+if ${gcmd} asset create --creator "${ACCOUNT}" --no-freezer --freezer "${ACCOUNTD}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
+ date '+asset-misc asset with --freezer and --no-freezer flags created successfully error %Y%m%d_%H%M%S'
+ exit 1
+else
+ echo "Expected. Cannot create asset with both freezer flag and no-freezer flag"
+fi
+
+# case 4: create asset with both clawback flag and no-clawback flag
+if ${gcmd} asset create --creator "${ACCOUNT}" --no-clawback --clawback "${ACCOUNTE}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
+ date '+asset-misc asset with --clawback and --no-clawback flags created successfully error %Y%m%d_%H%M%S'
+ exit 1
+else
+ echo "Expected. Cannot create asset with both clawback flag and no-clawback flag"
+fi
+
+# case 5: create asset with reserve flag, no-freezer flag and no-clawback flag
+if ${gcmd} asset create --creator "${ACCOUNT}" --no-freezer --no-clawback --reserve "${ACCOUNTE}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
+ echo "ok"
+else
+ date '+asset-misc asset with independent flags created unsuccessfully error %Y%m%d_%H%M%S'
+ exit 1
+fi
+
date '+asset-misc finish %Y%m%d_%H%M%S'