Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remaking a PR for CI #3398

Merged
merged 8 commits into from
Jan 10, 2022
71 changes: 70 additions & 1 deletion cmd/goal/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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")

Expand Down Expand Up @@ -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
Expand All @@ -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)
}
Expand Down
102 changes: 102 additions & 0 deletions test/scripts/e2e_subs/asset-misc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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. ࠶🦪'

Expand Down Expand Up @@ -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'