diff options
Diffstat (limited to 'data/transactions/logic/fields.go')
-rw-r--r-- | data/transactions/logic/fields.go | 526 |
1 files changed, 354 insertions, 172 deletions
diff --git a/data/transactions/logic/fields.go b/data/transactions/logic/fields.go index 8d4d4a839..a1c944ffb 100644 --- a/data/transactions/logic/fields.go +++ b/data/transactions/logic/fields.go @@ -17,13 +17,11 @@ package logic import ( - "fmt" - "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/protocol" ) -//go:generate stringer -type=TxnField,GlobalField,AssetParamsField,AppParamsField,AssetHoldingField,OnCompletionConstType,EcdsaCurve,Base64Encoding -output=fields_string.go +//go:generate stringer -type=TxnField,GlobalField,AssetParamsField,AppParamsField,AcctParamsField,AssetHoldingField,OnCompletionConstType,EcdsaCurve,Base64Encoding -output=fields_string.go // TxnField is an enum type for `txn` and `gtxn` type TxnField int @@ -164,119 +162,135 @@ const ( invalidTxnField // fence for some setup that loops from Sender..invalidTxnField ) +// FieldSpec unifies the various specs for presentation +type FieldSpec interface { + Type() StackType + OpVersion() uint64 + Note() string + Version() uint64 +} + // TxnFieldNames are arguments to the 'txn' and 'txnById' opcodes var TxnFieldNames []string -// TxnFieldTypes is StackBytes or StackUint64 parallel to TxnFieldNames -var TxnFieldTypes []StackType - var txnFieldSpecByField map[TxnField]txnFieldSpec -var txnFieldSpecByName tfNameSpecMap + +// TxnFieldSpecByName gives access to the field specs by field name +var TxnFieldSpecByName tfNameSpecMap // simple interface used by doc generator for fields versioning type tfNameSpecMap map[string]txnFieldSpec -func (s tfNameSpecMap) getExtraFor(name string) (extra string) { - if s[name].version > 1 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s tfNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } type txnFieldSpec struct { field TxnField ftype StackType + array bool // Is this an array field? version uint64 // When this field become available to txn/gtxn. 0=always itxVersion uint64 // When this field become available to itxn_field. 0=never effects bool // Is this a field on the "effects"? That is, something in ApplyData } -var txnFieldSpecs = []txnFieldSpec{ - {Sender, StackBytes, 0, 5, false}, - {Fee, StackUint64, 0, 5, false}, - {FirstValid, StackUint64, 0, 0, false}, - {FirstValidTime, StackUint64, 0, 0, false}, - {LastValid, StackUint64, 0, 0, false}, - {Note, StackBytes, 0, 6, false}, - {Lease, StackBytes, 0, 0, false}, - {Receiver, StackBytes, 0, 5, false}, - {Amount, StackUint64, 0, 5, false}, - {CloseRemainderTo, StackBytes, 0, 5, false}, - {VotePK, StackBytes, 0, 6, false}, - {SelectionPK, StackBytes, 0, 6, false}, - {VoteFirst, StackUint64, 0, 6, false}, - {VoteLast, StackUint64, 0, 6, false}, - {VoteKeyDilution, StackUint64, 0, 6, false}, - {Type, StackBytes, 0, 5, false}, - {TypeEnum, StackUint64, 0, 5, false}, - {XferAsset, StackUint64, 0, 5, false}, - {AssetAmount, StackUint64, 0, 5, false}, - {AssetSender, StackBytes, 0, 5, false}, - {AssetReceiver, StackBytes, 0, 5, false}, - {AssetCloseTo, StackBytes, 0, 5, false}, - {GroupIndex, StackUint64, 0, 0, false}, - {TxID, StackBytes, 0, 0, false}, - {ApplicationID, StackUint64, 2, 0, false}, - {OnCompletion, StackUint64, 2, 0, false}, - {ApplicationArgs, StackBytes, 2, 0, false}, - {NumAppArgs, StackUint64, 2, 0, false}, - {Accounts, StackBytes, 2, 0, false}, - {NumAccounts, StackUint64, 2, 0, false}, - {ApprovalProgram, StackBytes, 2, 0, false}, - {ClearStateProgram, StackBytes, 2, 0, false}, - {RekeyTo, StackBytes, 2, 6, false}, - {ConfigAsset, StackUint64, 2, 5, false}, - {ConfigAssetTotal, StackUint64, 2, 5, false}, - {ConfigAssetDecimals, StackUint64, 2, 5, false}, - {ConfigAssetDefaultFrozen, StackUint64, 2, 5, false}, - {ConfigAssetUnitName, StackBytes, 2, 5, false}, - {ConfigAssetName, StackBytes, 2, 5, false}, - {ConfigAssetURL, StackBytes, 2, 5, false}, - {ConfigAssetMetadataHash, StackBytes, 2, 5, false}, - {ConfigAssetManager, StackBytes, 2, 5, false}, - {ConfigAssetReserve, StackBytes, 2, 5, false}, - {ConfigAssetFreeze, StackBytes, 2, 5, false}, - {ConfigAssetClawback, StackBytes, 2, 5, false}, - {FreezeAsset, StackUint64, 2, 5, false}, - {FreezeAssetAccount, StackBytes, 2, 5, false}, - {FreezeAssetFrozen, StackUint64, 2, 5, false}, - {Assets, StackUint64, 3, 0, false}, - {NumAssets, StackUint64, 3, 0, false}, - {Applications, StackUint64, 3, 0, false}, - {NumApplications, StackUint64, 3, 0, false}, - {GlobalNumUint, StackUint64, 3, 0, false}, - {GlobalNumByteSlice, StackUint64, 3, 0, false}, - {LocalNumUint, StackUint64, 3, 0, false}, - {LocalNumByteSlice, StackUint64, 3, 0, false}, - {ExtraProgramPages, StackUint64, 4, 0, false}, - {Nonparticipation, StackUint64, 5, 6, false}, - - {Logs, StackBytes, 5, 5, true}, - {NumLogs, StackUint64, 5, 5, true}, - {CreatedAssetID, StackUint64, 5, 5, true}, - {CreatedApplicationID, StackUint64, 5, 5, true}, +func (fs *txnFieldSpec) Type() StackType { + return fs.ftype } -// TxnaFieldNames are arguments to the 'txna' opcode -// It is a subset of txn transaction fields so initialized here in-place -var TxnaFieldNames = []string{ApplicationArgs.String(), Accounts.String(), Assets.String(), Applications.String(), Logs.String()} +func (fs *txnFieldSpec) OpVersion() uint64 { + return 0 +} -// TxnaFieldTypes is StackBytes or StackUint64 parallel to TxnaFieldNames -var TxnaFieldTypes = []StackType{ - txnaFieldSpecByField[ApplicationArgs].ftype, - txnaFieldSpecByField[Accounts].ftype, - txnaFieldSpecByField[Assets].ftype, - txnaFieldSpecByField[Applications].ftype, - txnaFieldSpecByField[Logs].ftype, +func (fs *txnFieldSpec) Version() uint64 { + return fs.version } -var txnaFieldSpecByField = map[TxnField]txnFieldSpec{ - ApplicationArgs: {ApplicationArgs, StackBytes, 2, 0, false}, - Accounts: {Accounts, StackBytes, 2, 0, false}, - Assets: {Assets, StackUint64, 3, 0, false}, - Applications: {Applications, StackUint64, 3, 0, false}, +func (fs *txnFieldSpec) Note() string { + note := txnFieldDocs[fs.field.String()] + if fs.effects { + note = addExtra(note, "Application mode only") + } + return note +} - Logs: {Logs, StackBytes, 5, 5, true}, +var txnFieldSpecs = []txnFieldSpec{ + {Sender, StackBytes, false, 0, 5, false}, + {Fee, StackUint64, false, 0, 5, false}, + {FirstValid, StackUint64, false, 0, 0, false}, + {FirstValidTime, StackUint64, false, 0, 0, false}, + {LastValid, StackUint64, false, 0, 0, false}, + {Note, StackBytes, false, 0, 6, false}, + {Lease, StackBytes, false, 0, 0, false}, + {Receiver, StackBytes, false, 0, 5, false}, + {Amount, StackUint64, false, 0, 5, false}, + {CloseRemainderTo, StackBytes, false, 0, 5, false}, + {VotePK, StackBytes, false, 0, 6, false}, + {SelectionPK, StackBytes, false, 0, 6, false}, + {VoteFirst, StackUint64, false, 0, 6, false}, + {VoteLast, StackUint64, false, 0, 6, false}, + {VoteKeyDilution, StackUint64, false, 0, 6, false}, + {Type, StackBytes, false, 0, 5, false}, + {TypeEnum, StackUint64, false, 0, 5, false}, + {XferAsset, StackUint64, false, 0, 5, false}, + {AssetAmount, StackUint64, false, 0, 5, false}, + {AssetSender, StackBytes, false, 0, 5, false}, + {AssetReceiver, StackBytes, false, 0, 5, false}, + {AssetCloseTo, StackBytes, false, 0, 5, false}, + {GroupIndex, StackUint64, false, 0, 0, false}, + {TxID, StackBytes, false, 0, 0, false}, + {ApplicationID, StackUint64, false, 2, 6, false}, + {OnCompletion, StackUint64, false, 2, 6, false}, + {ApplicationArgs, StackBytes, true, 2, 6, false}, + {NumAppArgs, StackUint64, false, 2, 0, false}, + {Accounts, StackBytes, true, 2, 6, false}, + {NumAccounts, StackUint64, false, 2, 0, false}, + {ApprovalProgram, StackBytes, false, 2, 6, false}, + {ClearStateProgram, StackBytes, false, 2, 6, false}, + {RekeyTo, StackBytes, false, 2, 6, false}, + {ConfigAsset, StackUint64, false, 2, 5, false}, + {ConfigAssetTotal, StackUint64, false, 2, 5, false}, + {ConfigAssetDecimals, StackUint64, false, 2, 5, false}, + {ConfigAssetDefaultFrozen, StackUint64, false, 2, 5, false}, + {ConfigAssetUnitName, StackBytes, false, 2, 5, false}, + {ConfigAssetName, StackBytes, false, 2, 5, false}, + {ConfigAssetURL, StackBytes, false, 2, 5, false}, + {ConfigAssetMetadataHash, StackBytes, false, 2, 5, false}, + {ConfigAssetManager, StackBytes, false, 2, 5, false}, + {ConfigAssetReserve, StackBytes, false, 2, 5, false}, + {ConfigAssetFreeze, StackBytes, false, 2, 5, false}, + {ConfigAssetClawback, StackBytes, false, 2, 5, false}, + {FreezeAsset, StackUint64, false, 2, 5, false}, + {FreezeAssetAccount, StackBytes, false, 2, 5, false}, + {FreezeAssetFrozen, StackUint64, false, 2, 5, false}, + {Assets, StackUint64, true, 3, 6, false}, + {NumAssets, StackUint64, false, 3, 0, false}, + {Applications, StackUint64, true, 3, 6, false}, + {NumApplications, StackUint64, false, 3, 0, false}, + {GlobalNumUint, StackUint64, false, 3, 6, false}, + {GlobalNumByteSlice, StackUint64, false, 3, 6, false}, + {LocalNumUint, StackUint64, false, 3, 6, false}, + {LocalNumByteSlice, StackUint64, false, 3, 6, false}, + {ExtraProgramPages, StackUint64, false, 4, 6, false}, + {Nonparticipation, StackUint64, false, 5, 6, false}, + + {Logs, StackBytes, true, 5, 5, true}, + {NumLogs, StackUint64, false, 5, 5, true}, + {CreatedAssetID, StackUint64, false, 5, 5, true}, + {CreatedApplicationID, StackUint64, false, 5, 5, true}, +} + +// TxnaFieldNames are arguments to the 'txna' opcode +// It need not be fast, as it's only used for doc generation. +func TxnaFieldNames() []string { + var names []string + for _, fs := range txnFieldSpecs { + if fs.array { + names = append(names, fs.field.String()) + } + } + return names } var innerTxnTypes = map[string]uint64{ @@ -285,6 +299,7 @@ var innerTxnTypes = map[string]uint64{ string(protocol.AssetTransferTx): 5, string(protocol.AssetConfigTx): 5, string(protocol.AssetFreezeTx): 5, + string(protocol.ApplicationCallTx): 6, } // TxnTypeNames is the values of Txn.Type in enum order @@ -368,15 +383,23 @@ const ( // GroupID [32]byte GroupID + // v6 + + // OpcodeBudget The remaining budget available for execution + OpcodeBudget + + // CallerApplicationID The ID of the caller app, else 0 + CallerApplicationID + + // CallerApplicationAddress The Address of the caller app, else ZeroAddress + CallerApplicationAddress + invalidGlobalField ) // GlobalFieldNames are arguments to the 'global' opcode var GlobalFieldNames []string -// GlobalFieldTypes is StackUint64 StackBytes in parallel with GlobalFieldNames -var GlobalFieldTypes []StackType - type globalFieldSpec struct { field GlobalField ftype StackType @@ -384,6 +407,26 @@ type globalFieldSpec struct { version uint64 } +func (fs *globalFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *globalFieldSpec) OpVersion() uint64 { + return 0 +} + +func (fs *globalFieldSpec) Version() uint64 { + return fs.version +} +func (fs *globalFieldSpec) Note() string { + note := globalFieldDocs[fs.field.String()] + if fs.mode == runModeApplication { + note = addExtra(note, "Application mode only.") + } + // There are no Signature mode only globals + return note +} + var globalFieldSpecs = []globalFieldSpec{ {MinTxnFee, StackUint64, modeAny, 0}, // version 0 is the same as TEAL v1 (initial TEAL release) {MinBalance, StackUint64, modeAny, 0}, @@ -397,20 +440,21 @@ var globalFieldSpecs = []globalFieldSpec{ {CreatorAddress, StackBytes, runModeApplication, 3}, {CurrentApplicationAddress, StackBytes, runModeApplication, 5}, {GroupID, StackBytes, modeAny, 5}, + {OpcodeBudget, StackUint64, modeAny, 6}, + {CallerApplicationID, StackUint64, runModeApplication, 6}, + {CallerApplicationAddress, StackBytes, runModeApplication, 6}, } -// GlobalFieldSpecByField maps GlobalField to spec var globalFieldSpecByField map[GlobalField]globalFieldSpec -var globalFieldSpecByName gfNameSpecMap -// simple interface used by doc generator for fields versioning +// GlobalFieldSpecByName gives access to the field specs by field name +var GlobalFieldSpecByName gfNameSpecMap + type gfNameSpecMap map[string]globalFieldSpec -func (s gfNameSpecMap) getExtraFor(name string) (extra string) { - if s[name].version > 1 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s gfNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } // EcdsaCurve is an enum for `ecdsa_` opcodes @@ -430,22 +474,38 @@ type ecdsaCurveSpec struct { version uint64 } +func (fs *ecdsaCurveSpec) Type() StackType { + return StackNone // Will not show, since all are the same +} + +func (fs *ecdsaCurveSpec) OpVersion() uint64 { + return 5 +} + +func (fs *ecdsaCurveSpec) Version() uint64 { + return fs.version +} + +func (fs *ecdsaCurveSpec) Note() string { + note := EcdsaCurveDocs[fs.field.String()] + return note +} + var ecdsaCurveSpecs = []ecdsaCurveSpec{ {Secp256k1, 5}, } var ecdsaCurveSpecByField map[EcdsaCurve]ecdsaCurveSpec -var ecdsaCurveSpecByName ecDsaCurveNameSpecMap + +// EcdsaCurveSpecByName gives access to the field specs by field name +var EcdsaCurveSpecByName ecDsaCurveNameSpecMap // simple interface used by doc generator for fields versioning type ecDsaCurveNameSpecMap map[string]ecdsaCurveSpec -func (s ecDsaCurveNameSpecMap) getExtraFor(name string) (extra string) { - // Uses 5 here because ecdsa fields were introduced in 5 - if s[name].version > 5 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s ecDsaCurveNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } // Base64Encoding is an enum for the `base64decode` opcode @@ -478,11 +538,24 @@ var base64EncodingSpecByName base64EncodingSpecMap type base64EncodingSpecMap map[string]base64EncodingSpec +func (fs *base64EncodingSpec) Type() StackType { + return fs.ftype +} + +func (fs *base64EncodingSpec) OpVersion() uint64 { + return 6 +} + +func (fs *base64EncodingSpec) Version() uint64 { + return fs.version +} + +func (fs *base64EncodingSpec) Note() string { + note := "" // no doc list? + return note +} func (s base64EncodingSpecMap) getExtraFor(name string) (extra string) { // Uses 6 here because base64_decode fields were introduced in 6 - if s[name].version > 6 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } return } @@ -500,32 +573,44 @@ const ( // AssetHoldingFieldNames are arguments to the 'asset_holding_get' opcode var AssetHoldingFieldNames []string -// AssetHoldingFieldTypes is StackUint64 StackBytes in parallel with AssetHoldingFieldNames -var AssetHoldingFieldTypes []StackType - type assetHoldingFieldSpec struct { field AssetHoldingField ftype StackType version uint64 } +func (fs *assetHoldingFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *assetHoldingFieldSpec) OpVersion() uint64 { + return 2 +} + +func (fs *assetHoldingFieldSpec) Version() uint64 { + return fs.version +} + +func (fs *assetHoldingFieldSpec) Note() string { + note := assetHoldingFieldDocs[fs.field.String()] + return note +} + var assetHoldingFieldSpecs = []assetHoldingFieldSpec{ {AssetBalance, StackUint64, 2}, {AssetFrozen, StackUint64, 2}, } var assetHoldingFieldSpecByField map[AssetHoldingField]assetHoldingFieldSpec -var assetHoldingFieldSpecByName ahfNameSpecMap -// simple interface used by doc generator for fields versioning +// AssetHoldingFieldSpecByName gives access to the field specs by field name +var AssetHoldingFieldSpecByName ahfNameSpecMap + type ahfNameSpecMap map[string]assetHoldingFieldSpec -func (s ahfNameSpecMap) getExtraFor(name string) (extra string) { - // Uses 2 here because asset fields were introduced in 2 - if s[name].version > 2 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s ahfNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } // AssetParamsField is an enum for `asset_params_get` opcode @@ -564,15 +649,29 @@ const ( // AssetParamsFieldNames are arguments to the 'asset_params_get' opcode var AssetParamsFieldNames []string -// AssetParamsFieldTypes is StackUint64 StackBytes in parallel with AssetParamsFieldNames -var AssetParamsFieldTypes []StackType - type assetParamsFieldSpec struct { field AssetParamsField ftype StackType version uint64 } +func (fs *assetParamsFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *assetParamsFieldSpec) OpVersion() uint64 { + return 2 +} + +func (fs *assetParamsFieldSpec) Version() uint64 { + return fs.version +} + +func (fs *assetParamsFieldSpec) Note() string { + note := assetParamsFieldDocs[fs.field.String()] + return note +} + var assetParamsFieldSpecs = []assetParamsFieldSpec{ {AssetTotal, StackUint64, 2}, {AssetDecimals, StackUint64, 2}, @@ -589,17 +688,15 @@ var assetParamsFieldSpecs = []assetParamsFieldSpec{ } var assetParamsFieldSpecByField map[AssetParamsField]assetParamsFieldSpec -var assetParamsFieldSpecByName apfNameSpecMap -// simple interface used by doc generator for fields versioning +// AssetParamsFieldSpecByName gives access to the field specs by field name +var AssetParamsFieldSpecByName apfNameSpecMap + type apfNameSpecMap map[string]assetParamsFieldSpec -func (s apfNameSpecMap) getExtraFor(name string) (extra string) { - // Uses 2 here because asset fields were introduced in 2 - if s[name].version > 2 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s apfNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } // AppParamsField is an enum for `app_params_get` opcode @@ -633,15 +730,29 @@ const ( // AppParamsFieldNames are arguments to the 'app_params_get' opcode var AppParamsFieldNames []string -// AppParamsFieldTypes is StackUint64 StackBytes in parallel with AppParamsFieldNames -var AppParamsFieldTypes []StackType - type appParamsFieldSpec struct { field AppParamsField ftype StackType version uint64 } +func (fs *appParamsFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *appParamsFieldSpec) OpVersion() uint64 { + return 5 +} + +func (fs *appParamsFieldSpec) Version() uint64 { + return fs.version +} + +func (fs *appParamsFieldSpec) Note() string { + note := appParamsFieldDocs[fs.field.String()] + return note +} + var appParamsFieldSpecs = []appParamsFieldSpec{ {AppApprovalProgram, StackBytes, 5}, {AppClearStateProgram, StackBytes, 5}, @@ -655,17 +766,75 @@ var appParamsFieldSpecs = []appParamsFieldSpec{ } var appParamsFieldSpecByField map[AppParamsField]appParamsFieldSpec -var appParamsFieldSpecByName appNameSpecMap + +// AppParamsFieldSpecByName gives access to the field specs by field name +var AppParamsFieldSpecByName appNameSpecMap // simple interface used by doc generator for fields versioning type appNameSpecMap map[string]appParamsFieldSpec -func (s appNameSpecMap) getExtraFor(name string) (extra string) { - // Uses 5 here because app fields were introduced in 5 - if s[name].version > 5 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s appNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs +} + +// AcctParamsField is an enum for `acct_params_get` opcode +type AcctParamsField int + +const ( + // AcctBalance is the blance, with pending rewards + AcctBalance AcctParamsField = iota + // AcctMinBalance is algos needed for this accounts apps and assets + AcctMinBalance + //AcctAuthAddr is the rekeyed address if any, else ZeroAddress + AcctAuthAddr + + invalidAcctParamsField +) + +// AcctParamsFieldNames are arguments to the 'acct_params_get' opcode +var AcctParamsFieldNames []string + +type acctParamsFieldSpec struct { + field AcctParamsField + ftype StackType + version uint64 +} + +func (fs *acctParamsFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *acctParamsFieldSpec) OpVersion() uint64 { + return 6 +} + +func (fs *acctParamsFieldSpec) Version() uint64 { + return fs.version +} + +func (fs *acctParamsFieldSpec) Note() string { + note := acctParamsFieldDocs[fs.field.String()] + return note +} + +var acctParamsFieldSpecs = []acctParamsFieldSpec{ + {AcctBalance, StackUint64, 6}, + {AcctMinBalance, StackUint64, 6}, + {AcctAuthAddr, StackBytes, 6}, +} + +var acctParamsFieldSpecByField map[AcctParamsField]acctParamsFieldSpec + +// AcctParamsFieldSpecByName gives access to the field specs by field name +var AcctParamsFieldSpecByName acctNameSpecMap + +// simple interface used by doc generator for fields versioning +type acctNameSpecMap map[string]acctParamsFieldSpec + +func (s acctNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } func init() { @@ -673,50 +842,56 @@ func init() { for fi := Sender; fi < invalidTxnField; fi++ { TxnFieldNames[fi] = fi.String() } - TxnFieldTypes = make([]StackType, int(invalidTxnField)) txnFieldSpecByField = make(map[TxnField]txnFieldSpec, len(TxnFieldNames)) for i, s := range txnFieldSpecs { if int(s.field) != i { panic("txnFieldSpecs disjoint with TxnField enum") } - TxnFieldTypes[i] = s.ftype txnFieldSpecByField[s.field] = s } - txnFieldSpecByName = make(tfNameSpecMap, len(TxnFieldNames)) + TxnFieldSpecByName = make(map[string]txnFieldSpec, len(TxnFieldNames)) for i, tfn := range TxnFieldNames { - txnFieldSpecByName[tfn] = txnFieldSpecByField[TxnField(i)] + TxnFieldSpecByName[tfn] = txnFieldSpecByField[TxnField(i)] } GlobalFieldNames = make([]string, int(invalidGlobalField)) for i := MinTxnFee; i < invalidGlobalField; i++ { - GlobalFieldNames[int(i)] = i.String() + GlobalFieldNames[i] = i.String() } - GlobalFieldTypes = make([]StackType, len(GlobalFieldNames)) globalFieldSpecByField = make(map[GlobalField]globalFieldSpec, len(GlobalFieldNames)) for i, s := range globalFieldSpecs { if int(s.field) != i { panic("globalFieldSpecs disjoint with GlobalField enum") } - GlobalFieldTypes[i] = s.ftype globalFieldSpecByField[s.field] = s } - globalFieldSpecByName = make(gfNameSpecMap, len(GlobalFieldNames)) + GlobalFieldSpecByName = make(gfNameSpecMap, len(GlobalFieldNames)) for i, gfn := range GlobalFieldNames { - globalFieldSpecByName[gfn] = globalFieldSpecByField[GlobalField(i)] + GlobalFieldSpecByName[gfn] = globalFieldSpecByField[GlobalField(i)] } EcdsaCurveNames = make([]string, int(invalidEcdsaCurve)) for i := Secp256k1; i < invalidEcdsaCurve; i++ { - EcdsaCurveNames[int(i)] = i.String() + EcdsaCurveNames[i] = i.String() } ecdsaCurveSpecByField = make(map[EcdsaCurve]ecdsaCurveSpec, len(EcdsaCurveNames)) for _, s := range ecdsaCurveSpecs { ecdsaCurveSpecByField[s.field] = s } - ecdsaCurveSpecByName = make(ecDsaCurveNameSpecMap, len(EcdsaCurveNames)) + EcdsaCurveSpecByName = make(ecDsaCurveNameSpecMap, len(EcdsaCurveNames)) for i, ahfn := range EcdsaCurveNames { - ecdsaCurveSpecByName[ahfn] = ecdsaCurveSpecByField[EcdsaCurve(i)] + EcdsaCurveSpecByName[ahfn] = ecdsaCurveSpecByField[EcdsaCurve(i)] + } + + base64EncodingSpecByField = make(map[Base64Encoding]base64EncodingSpec, len(base64EncodingNames)) + for _, s := range base64EncodingSpecs { + base64EncodingSpecByField[s.field] = s + } + + base64EncodingSpecByName = make(base64EncodingSpecMap, len(base64EncodingNames)) + for i, encoding := range base64EncodingNames { + base64EncodingSpecByName[encoding] = base64EncodingSpecByField[Base64Encoding(i)] } base64EncodingSpecByField = make(map[Base64Encoding]base64EncodingSpec, len(base64EncodingNames)) @@ -731,47 +906,54 @@ func init() { AssetHoldingFieldNames = make([]string, int(invalidAssetHoldingField)) for i := AssetBalance; i < invalidAssetHoldingField; i++ { - AssetHoldingFieldNames[int(i)] = i.String() + AssetHoldingFieldNames[i] = i.String() } - AssetHoldingFieldTypes = make([]StackType, len(AssetHoldingFieldNames)) assetHoldingFieldSpecByField = make(map[AssetHoldingField]assetHoldingFieldSpec, len(AssetHoldingFieldNames)) for _, s := range assetHoldingFieldSpecs { - AssetHoldingFieldTypes[int(s.field)] = s.ftype assetHoldingFieldSpecByField[s.field] = s } - assetHoldingFieldSpecByName = make(ahfNameSpecMap, len(AssetHoldingFieldNames)) + AssetHoldingFieldSpecByName = make(ahfNameSpecMap, len(AssetHoldingFieldNames)) for i, ahfn := range AssetHoldingFieldNames { - assetHoldingFieldSpecByName[ahfn] = assetHoldingFieldSpecByField[AssetHoldingField(i)] + AssetHoldingFieldSpecByName[ahfn] = assetHoldingFieldSpecByField[AssetHoldingField(i)] } AssetParamsFieldNames = make([]string, int(invalidAssetParamsField)) for i := AssetTotal; i < invalidAssetParamsField; i++ { - AssetParamsFieldNames[int(i)] = i.String() + AssetParamsFieldNames[i] = i.String() } - AssetParamsFieldTypes = make([]StackType, len(AssetParamsFieldNames)) assetParamsFieldSpecByField = make(map[AssetParamsField]assetParamsFieldSpec, len(AssetParamsFieldNames)) for _, s := range assetParamsFieldSpecs { - AssetParamsFieldTypes[int(s.field)] = s.ftype assetParamsFieldSpecByField[s.field] = s } - assetParamsFieldSpecByName = make(apfNameSpecMap, len(AssetParamsFieldNames)) + AssetParamsFieldSpecByName = make(apfNameSpecMap, len(AssetParamsFieldNames)) for i, apfn := range AssetParamsFieldNames { - assetParamsFieldSpecByName[apfn] = assetParamsFieldSpecByField[AssetParamsField(i)] + AssetParamsFieldSpecByName[apfn] = assetParamsFieldSpecByField[AssetParamsField(i)] } AppParamsFieldNames = make([]string, int(invalidAppParamsField)) for i := AppApprovalProgram; i < invalidAppParamsField; i++ { - AppParamsFieldNames[int(i)] = i.String() + AppParamsFieldNames[i] = i.String() } - AppParamsFieldTypes = make([]StackType, len(AppParamsFieldNames)) appParamsFieldSpecByField = make(map[AppParamsField]appParamsFieldSpec, len(AppParamsFieldNames)) for _, s := range appParamsFieldSpecs { - AppParamsFieldTypes[int(s.field)] = s.ftype appParamsFieldSpecByField[s.field] = s } - appParamsFieldSpecByName = make(appNameSpecMap, len(AppParamsFieldNames)) + AppParamsFieldSpecByName = make(appNameSpecMap, len(AppParamsFieldNames)) for i, apfn := range AppParamsFieldNames { - appParamsFieldSpecByName[apfn] = appParamsFieldSpecByField[AppParamsField(i)] + AppParamsFieldSpecByName[apfn] = appParamsFieldSpecByField[AppParamsField(i)] + } + + AcctParamsFieldNames = make([]string, int(invalidAcctParamsField)) + for i := AcctBalance; i < invalidAcctParamsField; i++ { + AcctParamsFieldNames[i] = i.String() + } + acctParamsFieldSpecByField = make(map[AcctParamsField]acctParamsFieldSpec, len(AcctParamsFieldNames)) + for _, s := range acctParamsFieldSpecs { + acctParamsFieldSpecByField[s.field] = s + } + AcctParamsFieldSpecByName = make(acctNameSpecMap, len(AcctParamsFieldNames)) + for i, apfn := range AcctParamsFieldNames { + AcctParamsFieldSpecByName[apfn] = acctParamsFieldSpecByField[AcctParamsField(i)] } txnTypeIndexes = make(map[string]uint64, len(TxnTypeNames)) |