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

goal: Add asset optin command #3881

Merged
merged 8 commits into from
Apr 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions cmd/goal/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ func init() {
assetCmd.AddCommand(sendAssetCmd)
assetCmd.AddCommand(infoAssetCmd)
assetCmd.AddCommand(freezeAssetCmd)
assetCmd.AddCommand(optinAssetCmd)

assetCmd.PersistentFlags().StringVarP(&walletName, "wallet", "w", "", "Set the wallet to be used for the selected operation")

Expand Down Expand Up @@ -116,12 +117,18 @@ func init() {
freezeAssetCmd.MarkFlagRequired("account")
freezeAssetCmd.MarkFlagRequired("freeze")

optinAssetCmd.Flags().StringVar(&assetUnitName, "asset", "", "Unit name of the asset being accepted")
optinAssetCmd.Flags().Uint64Var(&assetID, "assetid", 0, "ID of the asset being accepted")
optinAssetCmd.Flags().StringVarP(&account, "account", "a", "", "Account address to opt in to using the asset (if not specified, uses default account)")
optinAssetCmd.Flags().StringVar(&assetCreator, "creator", "", "Account address for asset creator")

// Add common transaction flags to all txn-generating asset commands
addTxnFlags(createAssetCmd)
addTxnFlags(destroyAssetCmd)
addTxnFlags(configAssetCmd)
addTxnFlags(sendAssetCmd)
addTxnFlags(freezeAssetCmd)
addTxnFlags(optinAssetCmd)

infoAssetCmd.Flags().Uint64Var(&assetID, "assetid", 0, "ID of the asset to look up")
infoAssetCmd.Flags().StringVar(&assetUnitName, "asset", "", "DEPRECATED! Unit name of the asset to look up")
Expand Down Expand Up @@ -661,6 +668,81 @@ func assetDecimalsFmt(amount uint64, decimals uint32) string {
return fmt.Sprintf("%d.%0*d", amount/pow, decimals, amount%pow)
}

var optinAssetCmd = &cobra.Command{
Use: "optin",
Short: "Optin to assets",
Long: "Opt in to receive a new asset. An account will begin accepting an asset by issuing a zero-amount asset transfer to itself.",
Args: validateNoPosArgsFn,
Run: func(cmd *cobra.Command, _ []string) {
checkTxValidityPeriodCmdFlags(cmd)

dataDir := ensureSingleDataDir()
client := ensureFullClient(dataDir)
accountList := makeAccountsList(dataDir)
// Opt in txns are always 0
const xferAmount uint64 = 0

creatorResolved := accountList.getAddressByName(assetCreator)

lookupAssetID(cmd, creatorResolved, client)

// Check if from was specified, else use default
if account == "" {
account = accountList.getDefaultAccount()
}
tx, err := client.MakeUnsignedAssetSendTx(assetID, xferAmount, account, "", "")
if err != nil {
reportErrorf("Cannot construct transaction: %s", err)
}

tx.Note = parseNoteField(cmd)
tx.Lease = parseLease(cmd)

firstValid, lastValid, err = client.ComputeValidityRounds(firstValid, lastValid, numValidRounds)
if err != nil {
reportErrorf("Cannot determine last valid round: %s", err)
}

tx, err = client.FillUnsignedTxTemplate(account, firstValid, lastValid, fee, tx)
if err != nil {
reportErrorf("Cannot construct transaction: %s", err)
}

explicitFee := cmd.Flags().Changed("fee")
if explicitFee {
tx.Fee = basics.MicroAlgos{Raw: fee}
}

if outFilename == "" {
wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true)
signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx)
if err != nil {
reportErrorf(errorSigningTX, err)
}

txid, err := client.BroadcastTransaction(signedTxn)
if err != nil {
reportErrorf(errorBroadcastingTX, err)
}

// Report tx details to user
reportInfof("Issued transaction from account %s, txid %s (fee %d)", tx.Sender, txid, tx.Fee.Raw)

if !noWaitAfterSend {
_, err = waitForCommit(client, txid, lastValid)
if err != nil {
reportErrorf(err.Error())
}
}
} else {
err = writeTxnToFile(client, sign, dataDir, walletName, tx, outFilename)
if err != nil {
reportErrorf(err.Error())
}
}
},
}

var infoAssetCmd = &cobra.Command{
Use: "info",
Short: "Look up current parameters for an asset",
Expand Down
2 changes: 1 addition & 1 deletion ledger/apply/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ func putIn(balances Balances, addr basics.Address, asset basics.AssetIndex, amou
return err
}
if !ok {
return fmt.Errorf("asset %v missing from %v", asset, addr)
return fmt.Errorf("receiver error: must optin, asset %v missing from %v", asset, addr)
}

if rcvHolding.Frozen && !bypassFreeze {
Expand Down
8 changes: 4 additions & 4 deletions test/scripts/e2e_subs/app-assets.sh
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ function asset-deposit {
}

function asset-optin {
${gcmd} asset send -a 0 "$@"
${gcmd} asset optin "$@"
}

function clawback_addr {
Expand Down Expand Up @@ -175,7 +175,7 @@ appl "withdraw(uint64):void" --app-arg="int:800" --foreign-asset="$ASSETID" --fr

USER=$(${gcmd} account new | awk '{ print $6 }') #new account
${gcmd} clerk send -a 999000 -f "$ACCOUNT" -t "$USER" #fund account
asset-optin -f "$USER" -t "$USER" --assetid "$ASSETID" #opt in to asset
asset-optin --assetid "$ASSETID" -a $USER #opt in to asset
# SET $USER as clawback address
${gcmd} asset config --manager $SMALL --assetid $ASSETID --new-clawback $USER
cb_addr=$(${gcmd} asset info --assetid $ASSETID | clawback_addr)
Expand All @@ -190,7 +190,7 @@ ${gcmd} asset send -f "$SMALL" -t "$USER" -a "1000" --assetid "$ASSETID" --clawb

USER2=$(${gcmd} account new | awk '{ print $6 }') #new account
${gcmd} clerk send -a 999000 -f "$ACCOUNT" -t "$USER2" #fund account
asset-optin -f "$USER2" -t "$USER2" --assetid "$ASSETID" #opt in to asset
asset-optin --assetid "$ASSETID" -a $USER2 #opt in to asset
# set $APPACCT as clawback address on asset
${gcmd} asset config --manager $SMALL --assetid $ASSETID --new-clawback $APPACCT
cb_addr=$(${gcmd} asset info --assetid $ASSETID | clawback_addr)
Expand Down Expand Up @@ -231,7 +231,7 @@ appl "create(uint64):void" --app-arg="int:1000000" --from="$SMALL"

# mint asset
APPASSETID=$(asset_ids "$APPACCT")
asset-optin -f "$SMALL" -t "$SMALL" --assetid "$APPASSETID" #opt in to asset
asset-optin --assetid "$APPASSETID" -a $SMALL #opt in to asset
appl "mint():void" --from="$SMALL" --foreign-asset="$APPASSETID" -o "$T/mint.tx"
payin 1000 -o "$T/pay1.tx"
cat "$T/mint.tx" "$T/pay1.tx" | ${gcmd} clerk group -i - -o "$T/group.tx"
Expand Down
6 changes: 3 additions & 3 deletions test/scripts/e2e_subs/asset-misc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ ${gcmd} clerk send --from ${ACCOUNT} --to ${ACCOUNTC} --amount 1000000
${gcmd} clerk send --from ${ACCOUNT} --to ${ACCOUNTD} --amount 1000000

# opt in to asset
${gcmd} asset send --assetid ${ASSET_ID} -f ${ACCOUNTB} -t ${ACCOUNTB} -a 0
${gcmd} asset send --assetid ${ASSET_ID} -f ${ACCOUNTC} -t ${ACCOUNTC} -a 0
${gcmd} asset send --assetid ${ASSET_ID} -f ${ACCOUNTD} -t ${ACCOUNTD} -a 0
${gcmd} asset optin --assetid ${ASSET_ID} -a ${ACCOUNTB}
${gcmd} asset optin --assetid ${ASSET_ID} -a ${ACCOUNTC}
${gcmd} asset optin --assetid ${ASSET_ID} -a ${ACCOUNTD}

# fund asset
${gcmd} asset send --assetid ${ASSET_ID} -f ${ACCOUNT} -t ${ACCOUNTB} -a 1000
Expand Down
8 changes: 4 additions & 4 deletions test/scripts/e2e_subs/create_destroy_optin_optout.sh
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ ${gcmd} clerk send -a 100000 -f $ACCOUNT -t $ACCOUNTD
ASSET_ID=$(${gcmd} asset create --creator ${ACCOUNT} --name cdcoin --unitname cdc --total 1337 | grep "Created" | awk '{ sub("\r", "", $NF); print $NF }')

# Asset - optin / optout / optin / optout
${gcmd} asset send --assetid $ASSET_ID -a 0 -f $ACCOUNTB -t $ACCOUNTB
${gcmd} asset optin --assetid $ASSET_ID -a $ACCOUNTB
${gcmd} asset send --assetid $ASSET_ID -a 0 -f $ACCOUNTB -t $ACCOUNTB -c $ACCOUNT
${gcmd} asset send --assetid $ASSET_ID -a 0 -f $ACCOUNTB -t $ACCOUNTB
${gcmd} asset optin --assetid $ASSET_ID -a $ACCOUNTB
${gcmd} asset send --assetid $ASSET_ID -a 0 -f $ACCOUNTB -t $ACCOUNTB -c $ACCOUNT

# Destroy the ASA
Expand All @@ -57,9 +57,9 @@ ${gcmd} asset destroy --manager ${ACCOUNT} --assetid ${ASSET_ID}
ASSET_ID=$(${gcmd} asset create --creator ${ACCOUNT} --name cdcoin --unitname cdc --total 1337 | grep "Created" | awk '{ sub("\r", "", $NF); print $NF }')

# Asset - optin / optout / optin
${gcmd} asset send --assetid $ASSET_ID -a 0 -f $ACCOUNTB -t $ACCOUNTB
${gcmd} asset optin --assetid $ASSET_ID -a $ACCOUNTB
${gcmd} asset send --assetid $ASSET_ID -a 0 -f $ACCOUNTB -t $ACCOUNTB -c $ACCOUNT
${gcmd} asset send --assetid $ASSET_ID -a 0 -f $ACCOUNTB -t $ACCOUNTB
${gcmd} asset optin --assetid $ASSET_ID -a $ACCOUNTB

######################################
# Create an application, then delete #
Expand Down
2 changes: 1 addition & 1 deletion test/scripts/e2e_subs/dex.sh
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ $gcmd clerk send -a 10000000 -t "${ACCT_ACTOR}" -f "${ACCOUNT}"
echo "Created and funded accounts: creator ${ACCT_CREATOR}, actor ${ACCT_ACTOR}"

ASSETID=$(${gcmd} asset create --creator "${ACCT_CREATOR}" --total 100000 --unitname STOK --decimals 0 | grep "Created asset with asset index" | rev | cut -d ' ' -f 1 | rev)
${gcmd} asset send -a 0 -f "${ACCT_ACTOR}" -t "${ACCT_ACTOR}" --creator "${ACCT_CREATOR}" --assetid "${ASSETID}"
${gcmd} asset optin -a "${ACCT_ACTOR}" --creator "${ACCT_CREATOR}" --assetid "${ASSETID}"
echo "Created asset ${ASSETID}"

APPID=$(${gcmd} app create --creator "${ACCT_CREATOR}" --approval-prog "${DIR}/tealprogs/dex.teal" --global-byteslices 1 --global-ints 0 --local-byteslices 0 --local-ints 16 --clear-prog <(printf '#pragma version 2\nint 1') | grep Created | awk '{ print $6 }')
Expand Down
2 changes: 1 addition & 1 deletion test/scripts/e2e_subs/e2e-app-real-assets-round.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ APP_ID=$(${gcmd} app create --creator ${ACCOUNT} --foreign-asset $ASSET_ID --app
# Create another account, fund it, send it some asset
ACCOUNTB=$(${gcmd} account new|awk '{ print $6 }')
${gcmd} clerk send -a 1000000 -f $ACCOUNT -t $ACCOUNTB
${gcmd} asset send --assetid $ASSET_ID -a 0 -f $ACCOUNTB -t $ACCOUNTB
${gcmd} asset optin --assetid $ASSET_ID -a $ACCOUNTB
${gcmd} asset send --assetid $ASSET_ID -a 17 -f $ACCOUNT -t $ACCOUNTB

# Call app from account B, do some checks on asset balance
Expand Down
4 changes: 2 additions & 2 deletions test/scripts/e2e_subs/limit-swap-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ ${gcmd} clerk send --amount 1000000 --from ${ACCOUNT} --to ${ACCOUNT_ASSET_TRADE

echo "make asset trader able to accept asset"
ROUND=$(goal node status | grep 'Last committed block:'|awk '{ print $4 }')
${gcmd} asset send -o ${TEMPDIR}/b-asset-init.tx -a 0 --assetid ${ASSET_ID} -t $ACCOUNT_ASSET_TRADER -f $ACCOUNT_ASSET_TRADER --validrounds $((${SETUP_ROUND} - ${ROUND} - 1))
${gcmd} asset optin -o ${TEMPDIR}/b-asset-init.tx --assetid ${ASSET_ID} -a $ACCOUNT_ASSET_TRADER --validrounds $((${SETUP_ROUND} - ${ROUND} - 1))

${gcmd} clerk sign -i ${TEMPDIR}/b-asset-init.tx -p ${TEMPDIR}/limit-order-b.teal -o ${TEMPDIR}/b-asset-init.stx

Expand Down Expand Up @@ -103,7 +103,7 @@ ${gcmd} clerk send --amount 1000000 --from ${ACCOUNT} --to ${ACCOUNT_ASSET_TRADE

echo "make asset trader able to accept asset"
ROUND=$(goal node status | grep 'Last committed block:'|awk '{ print $4 }')
${gcmd} asset send -o ${TEMPDIR}/b-asset-init.tx -a 0 --assetid ${ASSET_ID} -t $ACCOUNT_ASSET_TRADER -f $ACCOUNT_ASSET_TRADER --validrounds $((${SETUP_ROUND} - ${ROUND} - 1))
${gcmd} asset optin -o ${TEMPDIR}/b-asset-init.tx --assetid ${ASSET_ID} -a $ACCOUNT_ASSET_TRADER --validrounds $((${SETUP_ROUND} - ${ROUND} - 1))

${gcmd} clerk sign -i ${TEMPDIR}/b-asset-init.tx -p ${TEMPDIR}/limit-order-b.teal -o ${TEMPDIR}/b-asset-init.stx

Expand Down