Skip to content

Commit 2346615

Browse files
algojackfionnachan
andauthored
Remaking a PR for CI (#3398)
* Allow setting manager, reserve, freeze, and clawback at goal asset create * Add e2e tests * Add more tests for goal asset create flags Co-authored-by: Fionna <[email protected]>
1 parent f9497d9 commit 2346615

File tree

2 files changed

+172
-1
lines changed

2 files changed

+172
-1
lines changed

cmd/goal/asset.go

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,13 @@ var (
3737
assetURL string
3838
assetName string
3939
assetManager string
40+
assetReserve string
4041
assetClawback string
4142
assetFreezer string
43+
assetNoManager bool
44+
assetNoReserve bool
45+
assetNoFreezer bool
46+
assetNoClawback bool
4247

4348
assetNewManager string
4449
assetNewReserve string
@@ -64,6 +69,14 @@ func init() {
6469
createAssetCmd.Flags().StringVar(&assetName, "name", "", "Name for the entire asset")
6570
createAssetCmd.Flags().StringVar(&assetURL, "asseturl", "", "URL where user can access more information about the asset (max 32 bytes)")
6671
createAssetCmd.Flags().StringVar(&assetMetadataHashBase64, "assetmetadatab64", "", "base-64 encoded 32-byte commitment to asset metadata")
72+
createAssetCmd.Flags().StringVar(&assetManager, "manager", "", "Manager account that can issue transactions to re-configure or destroy the asset")
73+
createAssetCmd.Flags().StringVar(&assetReserve, "reserve", "", "Reserve account that non-minted assets will reside in")
74+
createAssetCmd.Flags().StringVar(&assetFreezer, "freezer", "", "Freezer account that can freeze or unfreeze the asset holdings for a specific account")
75+
createAssetCmd.Flags().StringVar(&assetClawback, "clawback", "", "Clawback account that is allowed to transfer assets from and to any asset holder")
76+
createAssetCmd.Flags().BoolVar(&assetNoManager, "no-manager", false, "Explicitly declare the lack of manager")
77+
createAssetCmd.Flags().BoolVar(&assetNoReserve, "no-reserve", false, "Explicitly declare the lack of reserve")
78+
createAssetCmd.Flags().BoolVar(&assetNoFreezer, "no-freezer", false, "Explicitly declare the lack of freezer")
79+
createAssetCmd.Flags().BoolVar(&assetNoClawback, "no-clawback", false, "Explicitly declare the lack of clawback")
6780
createAssetCmd.MarkFlagRequired("total")
6881
createAssetCmd.MarkFlagRequired("creator")
6982

@@ -185,10 +198,66 @@ var createAssetCmd = &cobra.Command{
185198
Run: func(cmd *cobra.Command, _ []string) {
186199
checkTxValidityPeriodCmdFlags(cmd)
187200

201+
if assetManager != "" && assetNoManager {
202+
reportErrorf("The [--manager] flag and the [--no-manager] flag are mutually exclusive, do not provide both flags.")
203+
}
204+
205+
if assetReserve != "" && assetNoReserve {
206+
reportErrorf("The [--reserve] flag and the [--no-reserve] flag are mutually exclusive, do not provide both flags.")
207+
}
208+
209+
if assetFreezer != "" && assetNoFreezer {
210+
reportErrorf("The [--freezer] flag and the [--no-freezer] flag are mutually exclusive, do not provide both flags.")
211+
}
212+
213+
if assetClawback != "" && assetNoClawback {
214+
reportErrorf("The [--clawback] flag and the [--no-clawback] flag are mutually exclusive, do not provide both flags.")
215+
}
216+
188217
dataDir := ensureSingleDataDir()
189218
client := ensureFullClient(dataDir)
190219
accountList := makeAccountsList(dataDir)
191220
creator := accountList.getAddressByName(assetCreator)
221+
manager := creator
222+
reserve := creator
223+
freezer := creator
224+
clawback := creator
225+
226+
if cmd.Flags().Changed("manager") {
227+
assetManager = accountList.getAddressByName(assetManager)
228+
manager = assetManager
229+
}
230+
231+
if assetNoManager {
232+
manager = ""
233+
}
234+
235+
if cmd.Flags().Changed("reserve") {
236+
assetReserve = accountList.getAddressByName(assetReserve)
237+
reserve = assetReserve
238+
}
239+
240+
if assetNoReserve {
241+
reserve = ""
242+
}
243+
244+
if cmd.Flags().Changed("freezer") {
245+
assetFreezer = accountList.getAddressByName(assetFreezer)
246+
freezer = assetFreezer
247+
}
248+
249+
if assetNoFreezer {
250+
freezer = ""
251+
}
252+
253+
if cmd.Flags().Changed("clawback") {
254+
assetClawback = accountList.getAddressByName(assetClawback)
255+
clawback = assetClawback
256+
}
257+
258+
if assetNoClawback {
259+
clawback = ""
260+
}
192261

193262
var err error
194263
var assetMetadataHash []byte
@@ -199,7 +268,7 @@ var createAssetCmd = &cobra.Command{
199268
}
200269
}
201270

202-
tx, err := client.MakeUnsignedAssetCreateTx(assetTotal, assetFrozen, creator, creator, creator, creator, assetUnitName, assetName, assetURL, assetMetadataHash, assetDecimals)
271+
tx, err := client.MakeUnsignedAssetCreateTx(assetTotal, assetFrozen, manager, reserve, freezer, clawback, assetUnitName, assetName, assetURL, assetMetadataHash, assetDecimals)
203272
if err != nil {
204273
reportErrorf("Cannot construct transaction: %s", err)
205274
}

test/scripts/e2e_subs/asset-misc.sh

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ ACCOUNT=$(${gcmd} account list|awk '{ print $3 }')
1515
ACCOUNTB=$(${gcmd} account new|awk '{ print $6 }')
1616
ACCOUNTC=$(${gcmd} account new|awk '{ print $6 }')
1717
ACCOUNTD=$(${gcmd} account new|awk '{ print $6 }')
18+
ACCOUNTE=$(${gcmd} account new|awk '{ print $6 }')
1819

1920
ASSET_NAME='Birlot : décollage vs. ࠶🦪'
2021

@@ -47,4 +48,105 @@ else
4748
exit 1
4849
fi
4950

51+
# Test Scenario - check addresses are set correctly
52+
# case 1: asset created without specifying manager, reserve, freezer, or clawback
53+
MANAGER_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Manager address'|awk '{ print $3 }')
54+
RESERVE_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Reserve address'|awk '{ print $3 }')
55+
FREEZE_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Freeze address'|awk '{ print $3 }')
56+
CLAWBACK_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Clawback address'|awk '{ print $3 }')
57+
58+
# check manager, reserve, freeze, and clawback are by default the creator
59+
if [ "$MANAGER_ADDRESS" = "$ACCOUNT" ] \
60+
&& [ "$RESERVE_ADDRESS" = "$ACCOUNT" ] \
61+
&& [ "$FREEZE_ADDRESS" = "$ACCOUNT" ] \
62+
&& [ "$CLAWBACK_ADDRESS" = "$ACCOUNT" ]; then
63+
echo ok
64+
else
65+
date '+asset-misc asset manager, reserve, freezer, and clawback should be creator error %Y%m%d_%H%M%S'
66+
exit 1
67+
fi
68+
69+
# case 2: asset created with no manager, no reserve, no freezer, and no clawback
70+
${gcmd} asset create --creator "${ACCOUNT}" --no-manager --no-reserve --no-freezer --no-clawback --name "${ASSET_NAME}" --unitname iamisc --total 1000000000000 --asseturl "${ASSET_URL}"
71+
72+
IMMUTABLE_ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --unitname iamisc|grep 'Asset ID'|awk '{ print $3 }')
73+
74+
IMMUTABLE_MANAGER_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Manager address'|awk '{ print $3 }')
75+
IMMUTABLE_RESERVE_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Reserve address'|awk -F "[()]" '{ print $2 }')
76+
IMMUTABLE_FREEZE_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Freeze address'|awk '{ print $3 }')
77+
IMMUTABLE_CLAWBACK_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Clawback address'|awk '{ print $3 }')
78+
79+
# goal asset info returns the creator's address as the reserve address when reserve address is empty
80+
# check goal/asset.go
81+
if [ "$IMMUTABLE_MANAGER_ADDRESS" = "" ] \
82+
&& [ "$IMMUTABLE_RESERVE_ADDRESS" = "Empty. Defaulting to creator" ] \
83+
&& [ "$IMMUTABLE_FREEZE_ADDRESS" = "" ] \
84+
&& [ "$IMMUTABLE_CLAWBACK_ADDRESS" = "" ]; then
85+
echo ok
86+
else
87+
date '+asset-misc immutable asset manager/reserve/freezer/clawback addresses error %Y%m%d_%H%M%S'
88+
exit 1
89+
fi
90+
91+
# case 3: asset created with manager, reserve, freezer, and clawback different from the creator
92+
${gcmd} asset create --creator "${ACCOUNT}" --manager "${ACCOUNTB}" --reserve "${ACCOUNTC}" --freezer "${ACCOUNTD}" --clawback "${ACCOUNTE}" --name "${ASSET_NAME}" --unitname dma --total 1000000000000 --asseturl "${ASSET_URL}"
93+
94+
DIFF_MANAGER_ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --unitname dma|grep 'Asset ID'|awk '{ print $3 }')
95+
96+
DMA_MANAGER_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Manager address'|awk '{ print $3 }')
97+
DMA_RESERVE_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Reserve address'|awk '{ print $3 }')
98+
DMA_FREEZE_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Freeze address'|awk '{ print $3 }')
99+
DMA_CLAWBACK_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Clawback address'|awk '{ print $3 }')
100+
101+
if [ "$DMA_MANAGER_ADDRESS" = "$ACCOUNTB" ] \
102+
&& [ "$DMA_RESERVE_ADDRESS" = "$ACCOUNTC" ] \
103+
&& [ "$DMA_FREEZE_ADDRESS" = "$ACCOUNTD" ] \
104+
&& [ "$DMA_CLAWBACK_ADDRESS" = "$ACCOUNTE" ]; then
105+
echo ok
106+
else
107+
date '+asset-misc asset addresses with diff manager/reserve/freeze/clawback error %Y%m%d_%H%M%S'
108+
exit 1
109+
fi
110+
111+
# Test Scenario - check if asset is created successfully when passed in different combination of flags for addresses
112+
# case 1: create asset with both manager flag and no-manager flag
113+
if ${gcmd} asset create --creator "${ACCOUNT}" --no-manager --manager "${ACCOUNTB}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
114+
date '+asset-misc asset with --manager and --no-manager flags created successfully error %Y%m%d_%H%M%S'
115+
exit 1
116+
else
117+
echo "Expected. Cannot create asset with both manager flag and no-manager flag"
118+
fi
119+
120+
# case 2: create asset with both reserve flag and no-reserve flag
121+
if ${gcmd} asset create --creator "${ACCOUNT}" --no-reserve --reserve "${ACCOUNTC}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
122+
date '+asset-misc asset with --reserve and --no-reserve flags created successfully error %Y%m%d_%H%M%S'
123+
exit 1
124+
else
125+
echo "Expected. Cannot create asset with both reserve flag and no-reserve flag"
126+
fi
127+
128+
# case 3: create asset with both freezer flag and no-freezer flag
129+
if ${gcmd} asset create --creator "${ACCOUNT}" --no-freezer --freezer "${ACCOUNTD}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
130+
date '+asset-misc asset with --freezer and --no-freezer flags created successfully error %Y%m%d_%H%M%S'
131+
exit 1
132+
else
133+
echo "Expected. Cannot create asset with both freezer flag and no-freezer flag"
134+
fi
135+
136+
# case 4: create asset with both clawback flag and no-clawback flag
137+
if ${gcmd} asset create --creator "${ACCOUNT}" --no-clawback --clawback "${ACCOUNTE}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
138+
date '+asset-misc asset with --clawback and --no-clawback flags created successfully error %Y%m%d_%H%M%S'
139+
exit 1
140+
else
141+
echo "Expected. Cannot create asset with both clawback flag and no-clawback flag"
142+
fi
143+
144+
# case 5: create asset with reserve flag, no-freezer flag and no-clawback flag
145+
if ${gcmd} asset create --creator "${ACCOUNT}" --no-freezer --no-clawback --reserve "${ACCOUNTE}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then
146+
echo "ok"
147+
else
148+
date '+asset-misc asset with independent flags created unsuccessfully error %Y%m%d_%H%M%S'
149+
exit 1
150+
fi
151+
50152
date '+asset-misc finish %Y%m%d_%H%M%S'

0 commit comments

Comments
 (0)