Skip to content

Commit

Permalink
feat: ContractCreateTx works
Browse files Browse the repository at this point in the history
  • Loading branch information
randomshinichi committed May 27, 2019
1 parent d58baa2 commit 74ac97a
Show file tree
Hide file tree
Showing 2 changed files with 159 additions and 4 deletions.
89 changes: 85 additions & 4 deletions aeternity/transactions.go
Original file line number Diff line number Diff line change
Expand Up @@ -541,13 +541,11 @@ func (t *OracleRegisterTx) JSON() (string, error) {
// NO_ABI = 0
// ABI_SOPHIA = 1
// ABI_SOLIDITY = 2
abiVersionCasted := int64(t.AbiVersion)
vmVersionCasted := int64(t.VMVersion)

ttlTypeStr := ttlTypeIntToStr(t.OracleTTLType)

swaggerT := models.OracleRegisterTx{
AbiVersion: &abiVersionCasted,
AbiVersion: &t.AbiVersion,
AccountID: models.EncodedHash(t.AccountID),
Fee: t.TxFee,
Nonce: t.AccountNonce,
Expand All @@ -559,7 +557,7 @@ func (t *OracleRegisterTx) JSON() (string, error) {
QueryFormat: &t.QuerySpec,
ResponseFormat: &t.ResponseSpec,
TTL: t.TxTTL,
VMVersion: &vmVersionCasted,
VMVersion: &t.VMVersion,
}
output, err := swaggerT.MarshalBinary()
return string(output), err
Expand Down Expand Up @@ -761,3 +759,86 @@ func (t *OracleRespondTx) JSON() (string, error) {
func NewOracleRespondTx(OracleID string, AccountNonce uint64, QueryID string, Response string, TTLType uint64, TTLValue uint64, TxFee utils.BigInt, TxTTL uint64) OracleRespondTx {
return OracleRespondTx{OracleID, AccountNonce, QueryID, Response, TTLType, TTLValue, TxFee, TxTTL}
}

type ContractCreateTx struct {
OwnerID string
AccountNonce uint64
Code string
VMVersion uint64
AbiVersion uint64
Deposit uint64
Amount utils.BigInt
Gas uint64
GasPrice uint64
TxFee utils.BigInt
TxTTL uint64
CallData string
}

func (tx *ContractCreateTx) RLP() (rlpRawMsg []byte, err error) {
aID, err := buildIDTag(IDTagAccount, tx.OwnerID)
if err != nil {
return
}
codeBinary, err := Decode(tx.Code)
if err != nil {
return
}
callDataBinary, err := Decode(tx.CallData)
if err != nil {
return
}

rlpRawMsg, err = buildRLPMessage(
ObjectTagContractCreateTransaction,
rlpMessageVersion,
aID,
tx.AccountNonce,
codeBinary,
tx.VMVersion+tx.AbiVersion, // TODO: AbiVersion should default to 2 if not specified, but the constructor always forces it to be specified anyway!@!
tx.TxFee.Int,
tx.TxTTL,
tx.Deposit,
tx.Amount.Int,
tx.Gas,
tx.GasPrice,
callDataBinary,
)
return
}

func (tx *ContractCreateTx) JSON() (string, error) {
swaggerT := models.ContractCreateTx{
OwnerID: models.EncodedHash(tx.OwnerID),
Nonce: tx.AccountNonce,
Code: &tx.Code,
VMVersion: &tx.VMVersion,
AbiVersion: &tx.AbiVersion,
Deposit: &tx.Deposit,
Amount: tx.Amount,
Gas: &tx.Gas,
GasPrice: &tx.GasPrice,
Fee: tx.TxFee,
TTL: &tx.TxTTL,
CallData: models.EncodedByteArray(tx.CallData),
}
output, err := swaggerT.MarshalBinary()
return string(output), err
}

func NewContractCreateTx(OwnerID string, AccountNonce uint64, Code string, VMVersion, AbiVersion, Deposit uint64, Amount utils.BigInt, Gas, GasPrice uint64, TxFee utils.BigInt, TxTTL uint64, CallData string) ContractCreateTx {
return ContractCreateTx{
OwnerID: OwnerID,
AccountNonce: AccountNonce,
Code: Code,
VMVersion: VMVersion,
AbiVersion: AbiVersion,
Deposit: Deposit,
Amount: Amount,
Gas: Gas,
GasPrice: GasPrice,
TxFee: TxFee,
TxTTL: TxTTL,
CallData: CallData,
}
}
74 changes: 74 additions & 0 deletions aeternity/transactions_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -730,3 +730,77 @@ func TestOracleRespondTx_RLP(t *testing.T) {
})
}
}

func TestContractCreateTx_RLP(t *testing.T) {
type fields struct {
OwnerID string
AccountNonce uint64
Code string
VMVersion uint64
AbiVersion uint64
Deposit uint64
Amount utils.BigInt
Gas uint64
GasPrice uint64
TxFee utils.BigInt
TxTTL uint64
CallData string
}
testCases := []struct {
name string
fields fields
wantTx string
wantErr bool
}{
{
name: "Basic contract creation",
fields: fields{
OwnerID: "ak_2a1j2Mk9YSmC1gioUq4PWRm3bsv887MbuRVwyv4KaUGoR1eiKi",
AccountNonce: 1,
// encoded "contract SimpleStorage =\n record state = { data : int }\n function init(value : int) : state = { data = value }\n function get() : int = state.data\n function set(value : int) = put(state{data = value})"
Code: `cb_+QYYRgKgf6Gy7VnRXycsYSiFGAUHhMs+Oeg+RJvmPzCSAnxk8LT5BKX5AUmgOoWULXtHOgf10E7h2cFqXOqxa3kc6pKJYRpEw/nlugeDc2V0uMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoP//////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////////////////////////////////jJoEnsSQdsAgNxJqQzA+rc5DsuLDKUV7ETxQp+ItyJgJS3g2dldLhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////////////////////////////////////////uEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+QKLoOIjHWzfyTkW3kyzqYV79lz0D8JW9KFJiz9+fJgMGZNEhGluaXS4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACg//////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALkBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA//////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYD//////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuQFEYgAAj2IAAMKRgICAUX9J7EkHbAIDcSakMwPq3OQ7LiwylFexE8UKfiLciYCUtxRiAAE5V1CAgFF/4iMdbN/JORbeTLOphXv2XPQPwlb0oUmLP358mAwZk0QUYgAA0VdQgFF/OoWULXtHOgf10E7h2cFqXOqxa3kc6pKJYRpEw/nlugcUYgABG1dQYAEZUQBbYAAZWWAgAZCBUmAgkANgAFmQgVKBUllgIAGQgVJgIJADYAOBUpBZYABRWVJgAFJgAPNbYACAUmAA81tgAFFRkFZbYCABUVGQUIOSUICRUFCAWZCBUllgIAGQgVJgIJADYAAZWWAgAZCBUmAgkANgAFmQgVKBUllgIAGQgVJgIJADYAOBUoFSkFCQVltgIAFRUVlQgJFQUGAAUYFZkIFSkFBgAFJZkFCQVltQUFlQUGIAAMpWhTIuMS4w4SWVhA==`,
VMVersion: 0,
AbiVersion: 0,
Deposit: 10000,
Amount: *utils.NewBigIntFromUint64(1),
Gas: 10000,
GasPrice: 1,
TxFee: Config.Client.Fee,
TxTTL: Config.Client.TTL,
CallData: "cb_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBo8mdjOP9QiDmrpHdJ7/qL6H7yhPIH+z2ZmHAc1TiHxQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACo7dbVl",
},
wantTx: "tx_+QbYKgGhAc6nreRwyfmdnU5ACICobx1Ju0RLYvEanrtku8/rc/7zAbkGG/kGGEYCoH+hsu1Z0V8nLGEohRgFB4TLPjnoPkSb5j8wkgJ8ZPC0+QSl+QFJoDqFlC17RzoH9dBO4dnBalzqsWt5HOqSiWEaRMP55boHg3NldLjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKD//////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////4yaBJ7EkHbAIDcSakMwPq3OQ7LiwylFexE8UKfiLciYCUt4NnZXS4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////////////////////////////7hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkCi6DiIx1s38k5Ft5Ms6mFe/Zc9A/CVvShSYs/fnyYDBmTRIRpbml0uMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoP//////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5AaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAP//////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGA//////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALkBRGIAAI9iAADCkYCAgFF/SexJB2wCA3EmpDMD6tzkOy4sMpRXsRPFCn4i3ImAlLcUYgABOVdQgIBRf+IjHWzfyTkW3kyzqYV79lz0D8JW9KFJiz9+fJgMGZNEFGIAANFXUIBRfzqFlC17RzoH9dBO4dnBalzqsWt5HOqSiWEaRMP55boHFGIAARtXUGABGVEAW2AAGVlgIAGQgVJgIJADYABZkIFSgVJZYCABkIFSYCCQA2ADgVKQWWAAUVlSYABSYADzW2AAgFJgAPNbYABRUZBWW2AgAVFRkFCDklCAkVBQgFmQgVJZYCABkIFSYCCQA2AAGVlgIAGQgVJgIJADYABZkIFSgVJZYCABkIFSYCCQA2ADgVKBUpBQkFZbYCABUVFZUICRUFBgAFGBWZCBUpBQYABSWZBQkFZbUFBZUFBiAADKVoUyLjEuMACGteYg9IAAggH0gicQAYInEAG4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgaPJnYzj/UIg5q6R3Se/6i+h+8oTyB/s9mZhwHNU4h8UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqtMHI5Q==",
wantErr: false,
},
}
for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
tx := NewContractCreateTx(
tt.fields.OwnerID,
tt.fields.AccountNonce,
tt.fields.Code,
tt.fields.VMVersion,
tt.fields.AbiVersion,
tt.fields.Deposit,
tt.fields.Amount,
tt.fields.Gas,
tt.fields.GasPrice,
tt.fields.TxFee,
tt.fields.TxTTL,
tt.fields.CallData,
)
txJSON, _ := tx.JSON()
fmt.Println(txJSON)

gotTx, err := BaseEncodeTx(&tx)
if (err != nil) != tt.wantErr {
t.Errorf("ContractCreateTx.RLP() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(gotTx, tt.wantTx) {
gotTxRawBytes, wantTxRawBytes := getRLPSerialized(gotTx, tt.wantTx)
t.Errorf("ContractCreateTx.RLP() = \n%v\n%v, want \n%v\n%v", gotTx, gotTxRawBytes, tt.wantTx, wantTxRawBytes)
}
})
}
}

0 comments on commit 74ac97a

Please sign in to comment.