From fb3af150ba7f946bfa11f96eed3a43d22dd8dbd1 Mon Sep 17 00:00:00 2001 From: rianhughes Date: Mon, 9 Oct 2023 12:14:20 +0300 Subject: [PATCH 1/9] Implement formatCallDAta for Cairo2 --- account/account.go | 78 ++++++++++++++++------- account/account_test.go | 134 +++++++++++++++++++++++++++------------- 2 files changed, 144 insertions(+), 68 deletions(-) diff --git a/account/account.go b/account/account.go index ea3643b9..30bb9e74 100644 --- a/account/account.go +++ b/account/account.go @@ -29,7 +29,6 @@ var ( //go:generate mockgen -destination=../mocks/mock_account.go -package=mocks -source=account.go AccountInterface type AccountInterface interface { Sign(ctx context.Context, msg *felt.Felt) ([]*felt.Felt, error) - BuildInvokeTx(ctx context.Context, invokeTx *rpc.InvokeTxnV1, fnCall *[]rpc.FunctionCall) error TransactionHashInvoke(invokeTxn rpc.InvokeTxnType) (*felt.Felt, error) TransactionHashDeployAccount(tx rpc.DeployAccountTxn, contractAddress *felt.Felt) (*felt.Felt, error) TransactionHashDeclare(tx rpc.DeclareTxnType) (*felt.Felt, error) @@ -317,12 +316,6 @@ func (account *Account) WaitForTransactionReceipt(ctx context.Context, transacti } } -// BuildInvokeTx formats the calldata and signs the transaction -func (account *Account) BuildInvokeTx(ctx context.Context, invokeTx *rpc.InvokeTxnV1, fnCall *[]rpc.FunctionCall) error { - invokeTx.Calldata = FmtCalldata(*fnCall) - return account.SignInvokeTransaction(ctx, invokeTx) -} - func (account *Account) AddInvokeTransaction(ctx context.Context, invokeTx rpc.InvokeTxnV1) (*rpc.AddInvokeTransactionResponse, error) { return account.provider.AddInvokeTransaction(ctx, invokeTx) } @@ -420,26 +413,63 @@ func (account *Account) TransactionByHash(ctx context.Context, hash *felt.Felt) return account.provider.TransactionByHash(ctx, hash) } +func (account *Account) FmtCalldata(fnCalls []rpc.FunctionCall, cairoVersion int) ([]*felt.Felt, error) { + switch cairoVersion { + case 0: + return FmtCalldataCairo0(fnCalls), nil + case 2: + return FmtCalldataCairo2(fnCalls), nil + default: + return nil, errors.New("Cairo version not supported") + } +} + /* -Formats the multicall transactions in a format which can be signed and verified by the network and OpenZeppelin account contracts +Formats the call data for Cairo0 contracts */ -func FmtCalldata(fnCalls []rpc.FunctionCall) []*felt.Felt { - callArray := []*felt.Felt{} - callData := []*felt.Felt{new(felt.Felt).SetUint64(uint64(len(fnCalls)))} - - for _, tx := range fnCalls { - callData = append(callData, tx.ContractAddress, tx.EntryPointSelector) +func FmtCalldataCairo0(fnCalls []rpc.FunctionCall) []*felt.Felt { + execCallData := []*felt.Felt{} + execCallData = append(execCallData, new(felt.Felt).SetUint64(uint64(len(fnCalls)))) + + // Legacy : Cairo 0 + concatCallData := []*felt.Felt{} + for _, fnCall := range fnCalls { + execCallData = append( + execCallData, + fnCall.ContractAddress, + fnCall.EntryPointSelector, + new(felt.Felt).SetUint64(uint64(len(concatCallData))), + new(felt.Felt).SetUint64(uint64(len(fnCall.Calldata))+1), + ) + concatCallData = append(concatCallData, fnCall.Calldata...) + } + execCallData = append(execCallData, new(felt.Felt).SetUint64(uint64(len(concatCallData))+1)) + execCallData = append(execCallData, concatCallData...) + execCallData = append(execCallData, new(felt.Felt).SetUint64(0)) - if len(tx.Calldata) == 0 { - callData = append(callData, &felt.Zero, &felt.Zero) - continue - } + return execCallData +} - callData = append(callData, new(felt.Felt).SetUint64(uint64(len(callArray))), new(felt.Felt).SetUint64(uint64(len(tx.Calldata))+1)) - callArray = append(callArray, tx.Calldata...) +/* +Formats the call data for Cairo 1 contracs +*/ +func FmtCalldataCairo2(fnCalls []rpc.FunctionCall) []*felt.Felt { + execCallData := []*felt.Felt{} + execCallData = append(execCallData, new(felt.Felt).SetUint64(uint64(len(fnCalls)))) + + concatCallData := []*felt.Felt{} + for _, fnCall := range fnCalls { + execCallData = append( + execCallData, + fnCall.ContractAddress, + fnCall.EntryPointSelector, + new(felt.Felt).SetUint64(uint64(len(concatCallData))), + new(felt.Felt).SetUint64(uint64(len(fnCall.Calldata))), + ) + concatCallData = append(concatCallData, fnCall.Calldata...) } - callData = append(callData, new(felt.Felt).SetUint64(uint64(len(callArray)+1))) - callData = append(callData, callArray...) - callData = append(callData, new(felt.Felt).SetUint64(0)) - return callData + execCallData = append(execCallData, new(felt.Felt).SetUint64(uint64(len(concatCallData)))) + execCallData = append(execCallData, concatCallData...) + + return execCallData } diff --git a/account/account_test.go b/account/account_test.go index 9367ce43..aa776176 100644 --- a/account/account_test.go +++ b/account/account_test.go @@ -158,7 +158,13 @@ func TestTransactionHashInvoke(t *testing.T) { } func TestFmtCallData(t *testing.T) { + mockCtrl := gomock.NewController(t) + t.Cleanup(mockCtrl.Finish) + mockRpcProvider := mocks.NewMockRpcProvider(mockCtrl) + type testSetType struct { + CairoVersion int + ChainID string FnCall rpc.FunctionCall ExpectedCallData []*felt.Felt } @@ -166,6 +172,8 @@ func TestFmtCallData(t *testing.T) { "devnet": {}, "mock": { { + CairoVersion: 0, + ChainID: "SN_GOERLI", FnCall: rpc.FunctionCall{ ContractAddress: utils.TestHexToFelt(t, "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"), EntryPointSelector: utils.GetSelectorFromNameFelt("transfer"), @@ -191,7 +199,12 @@ func TestFmtCallData(t *testing.T) { }[testEnv] for _, test := range testSet { - fmtCallData := account.FmtCalldata([]rpc.FunctionCall{test.FnCall}) + mockRpcProvider.EXPECT().ChainID(context.Background()).Return(test.ChainID, nil) + acnt, err := account.NewAccount(mockRpcProvider, &felt.Zero, "pubkey", account.NewMemKeystore()) + require.NoError(t, err) + + fmtCallData, err := acnt.FmtCalldata([]rpc.FunctionCall{test.FnCall}, test.CairoVersion) + require.NoError(t, err) require.Equal(t, fmtCallData, test.ExpectedCallData) } } @@ -315,51 +328,55 @@ func TestSignMOCK(t *testing.T) { func TestAddInvoke(t *testing.T) { type testSetType struct { - ExpectedHash *felt.Felt - ExpectedError *rpc.RPCError - SetKS bool - AccountAddress *felt.Felt - PubKey *felt.Felt - PrivKey *felt.Felt - InvokeTx rpc.InvokeTxnV1 - FnCall rpc.FunctionCall - TxDetails rpc.TxDetails + ExpectedHash *felt.Felt + ExpectedError *rpc.RPCError + CairoContractVersion int + SetKS bool + AccountAddress *felt.Felt + PubKey *felt.Felt + PrivKey *felt.Felt + InvokeTx rpc.InvokeTxnV1 + FnCall rpc.FunctionCall + TxDetails rpc.TxDetails } testSet := map[string][]testSetType{ "mock": {}, "devnet": {}, - "testnet": {{ - // https://goerli.voyager.online/tx/0x73cf79c4bfa0c7a41f473c07e1be5ac25faa7c2fdf9edcbd12c1438f40f13d8#overview - ExpectedHash: utils.TestHexToFelt(t, "0x73cf79c4bfa0c7a41f473c07e1be5ac25faa7c2fdf9edcbd12c1438f40f13d8"), - ExpectedError: rpc.ErrDuplicateTx, - AccountAddress: utils.TestHexToFelt(t, "0x043784df59268c02b716e20bf77797bd96c68c2f100b2a634e448c35e3ad363e"), - SetKS: true, - PubKey: utils.TestHexToFelt(t, "0x049f060d2dffd3bf6f2c103b710baf519530df44529045f92c3903097e8d861f"), - PrivKey: utils.TestHexToFelt(t, "0x043b7fe9d91942c98cd5fd37579bd99ec74f879c4c79d886633eecae9dad35fa"), - InvokeTx: rpc.InvokeTxnV1{ - Nonce: new(felt.Felt).SetUint64(2), - MaxFee: utils.TestHexToFelt(t, "0x574fbde6000"), - Version: rpc.TransactionV1, - Type: rpc.TransactionType_Invoke, - SenderAddress: utils.TestHexToFelt(t, "0x043784df59268c02b716e20bf77797bd96c68c2f100b2a634e448c35e3ad363e"), - }, - FnCall: rpc.FunctionCall{ - ContractAddress: utils.TestHexToFelt(t, "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"), - EntryPointSelector: utils.GetSelectorFromNameFelt("transfer"), - Calldata: []*felt.Felt{ - utils.TestHexToFelt(t, "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"), - utils.TestHexToFelt(t, "0x1"), + "testnet": { + { + // https://goerli.voyager.online/tx/0x73cf79c4bfa0c7a41f473c07e1be5ac25faa7c2fdf9edcbd12c1438f40f13d8#overview + ExpectedHash: utils.TestHexToFelt(t, "0x73cf79c4bfa0c7a41f473c07e1be5ac25faa7c2fdf9edcbd12c1438f40f13d8"), + ExpectedError: rpc.ErrDuplicateTx, + CairoContractVersion: 0, + AccountAddress: utils.TestHexToFelt(t, "0x043784df59268c02b716e20bf77797bd96c68c2f100b2a634e448c35e3ad363e"), + SetKS: true, + PubKey: utils.TestHexToFelt(t, "0x049f060d2dffd3bf6f2c103b710baf519530df44529045f92c3903097e8d861f"), + PrivKey: utils.TestHexToFelt(t, "0x043b7fe9d91942c98cd5fd37579bd99ec74f879c4c79d886633eecae9dad35fa"), + InvokeTx: rpc.InvokeTxnV1{ + Nonce: new(felt.Felt).SetUint64(2), + MaxFee: utils.TestHexToFelt(t, "0x574fbde6000"), + Version: rpc.TransactionV1, + Type: rpc.TransactionType_Invoke, + SenderAddress: utils.TestHexToFelt(t, "0x043784df59268c02b716e20bf77797bd96c68c2f100b2a634e448c35e3ad363e"), + }, + FnCall: rpc.FunctionCall{ + ContractAddress: utils.TestHexToFelt(t, "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"), + EntryPointSelector: utils.GetSelectorFromNameFelt("transfer"), + Calldata: []*felt.Felt{ + utils.TestHexToFelt(t, "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"), + utils.TestHexToFelt(t, "0x1"), + }, }, }, - }, { // https://goerli.voyager.online/tx/0x171537c58b16db45aeec3d3f493617cd3dd571561b856c115dc425b85212c86#overview - ExpectedHash: utils.TestHexToFelt(t, "0x171537c58b16db45aeec3d3f493617cd3dd571561b856c115dc425b85212c86"), - ExpectedError: rpc.ErrDuplicateTx, - AccountAddress: utils.TestHexToFelt(t, "0x043784df59268c02b716e20bf77797bd96c68c2f100b2a634e448c35e3ad363e"), - SetKS: true, - PubKey: utils.TestHexToFelt(t, "0x049f060d2dffd3bf6f2c103b710baf519530df44529045f92c3903097e8d861f"), - PrivKey: utils.TestHexToFelt(t, "0x043b7fe9d91942c98cd5fd37579bd99ec74f879c4c79d886633eecae9dad35fa"), + ExpectedHash: utils.TestHexToFelt(t, "0x171537c58b16db45aeec3d3f493617cd3dd571561b856c115dc425b85212c86"), + ExpectedError: rpc.ErrDuplicateTx, + CairoContractVersion: 0, + AccountAddress: utils.TestHexToFelt(t, "0x043784df59268c02b716e20bf77797bd96c68c2f100b2a634e448c35e3ad363e"), + SetKS: true, + PubKey: utils.TestHexToFelt(t, "0x049f060d2dffd3bf6f2c103b710baf519530df44529045f92c3903097e8d861f"), + PrivKey: utils.TestHexToFelt(t, "0x043b7fe9d91942c98cd5fd37579bd99ec74f879c4c79d886633eecae9dad35fa"), InvokeTx: rpc.InvokeTxnV1{ Nonce: new(felt.Felt).SetUint64(6), MaxFee: utils.TestHexToFelt(t, "0x9184e72a000"), @@ -376,12 +393,36 @@ func TestAddInvoke(t *testing.T) { }, }, }, + { + // https://goerli.voyager.online/tx/0x1bc0f8c04584735ea9e4485f927c25a6e025bda3117beb508cd1bb5e41f08d9 + ExpectedHash: utils.TestHexToFelt(t, "0x1bc0f8c04584735ea9e4485f927c25a6e025bda3117beb508cd1bb5e41f08d9"), + ExpectedError: rpc.ErrDuplicateTx, + CairoContractVersion: 2, + AccountAddress: utils.TestHexToFelt(t, "0x0088d0038623a89bf853c70ea68b1062ccf32b094d1d7e5f924cda8404dc73e1"), + SetKS: true, + PubKey: utils.TestHexToFelt(t, "0x7ed3c6482e12c3ef7351214d1195ee7406d814af04a305617599ff27be43883"), + PrivKey: utils.TestHexToFelt(t, "0x07514c4f0de1f800b0b0c7377ef39294ce218a7abd9a1c9b6aa574779f7cdc6a"), + InvokeTx: rpc.InvokeTxnV1{ + Nonce: new(felt.Felt).SetUint64(6), + MaxFee: utils.TestHexToFelt(t, "0x9184e72a000"), + Version: rpc.TransactionV1, + Type: rpc.TransactionType_Invoke, + SenderAddress: utils.TestHexToFelt(t, "0x0088d0038623a89bf853c70ea68b1062ccf32b094d1d7e5f924cda8404dc73e1"), + }, + FnCall: rpc.FunctionCall{ + ContractAddress: utils.TestHexToFelt(t, "0x05044dfb70b9475663e3ddddb11bbbeccc71614b8db86fc3dc0c16b2b9d3151d"), + EntryPointSelector: utils.GetSelectorFromNameFelt("increase_value_8"), + Calldata: []*felt.Felt{ + utils.TestHexToFelt(t, "0x1234"), + }, + }, + }, }, "mainnet": {}, }[testEnv] for _, test := range testSet { - client, err := rpc.NewClient(base + "/rpc") + client, err := rpc.NewClient(base) require.NoError(t, err, "Error in rpc.NewClient") provider := rpc.NewProvider(client) @@ -396,15 +437,20 @@ func TestAddInvoke(t *testing.T) { acnt, err := account.NewAccount(provider, test.AccountAddress, test.PubKey.String(), ks) require.NoError(t, err) - require.NoError(t, acnt.BuildInvokeTx(context.Background(), &test.InvokeTx, &[]rpc.FunctionCall{test.FnCall}), "Error building Invoke") + test.InvokeTx.Calldata, err = acnt.FmtCalldata([]rpc.FunctionCall{test.FnCall}, test.CairoContractVersion) + require.NoError(t, err) - txHash, err := acnt.TransactionHashInvoke(test.InvokeTx) + err = acnt.SignInvokeTransaction(context.Background(), &test.InvokeTx) require.NoError(t, err) - require.Equal(t, txHash.String(), test.ExpectedHash.String()) resp, err := acnt.AddInvokeTransaction(context.Background(), test.InvokeTx) - require.Equal(t, err.Error(), test.ExpectedError.Error()) - require.Nil(t, resp) + if err != nil { + require.Equal(t, err.Error(), test.ExpectedError.Error()) + require.Nil(t, resp) + } else { + require.Equal(t, resp.TransactionHash, test.ExpectedHash) + } + } } From 97ce3bd324607fb694595c7b5c8a8b774f796c00 Mon Sep 17 00:00:00 2001 From: rianhughes Date: Mon, 9 Oct 2023 12:34:39 +0300 Subject: [PATCH 2/9] Add another test for increase_value() --- account/account.go | 7 +++++++ account/account_test.go | 24 +++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/account/account.go b/account/account.go index 30bb9e74..6852ae6b 100644 --- a/account/account.go +++ b/account/account.go @@ -2,7 +2,9 @@ package account import ( "context" + "encoding/json" "errors" + "fmt" "time" "github.com/NethermindEth/juno/core/felt" @@ -473,3 +475,8 @@ func FmtCalldataCairo2(fnCalls []rpc.FunctionCall) []*felt.Felt { return execCallData } + +func PrintTxAsJson(tx any) { + qwe, err := json.MarshalIndent(tx, "", "") + fmt.Println(string(qwe), err) +} diff --git a/account/account_test.go b/account/account_test.go index aa776176..e9f87bc9 100644 --- a/account/account_test.go +++ b/account/account_test.go @@ -345,7 +345,6 @@ func TestAddInvoke(t *testing.T) { "testnet": { { // https://goerli.voyager.online/tx/0x73cf79c4bfa0c7a41f473c07e1be5ac25faa7c2fdf9edcbd12c1438f40f13d8#overview - ExpectedHash: utils.TestHexToFelt(t, "0x73cf79c4bfa0c7a41f473c07e1be5ac25faa7c2fdf9edcbd12c1438f40f13d8"), ExpectedError: rpc.ErrDuplicateTx, CairoContractVersion: 0, AccountAddress: utils.TestHexToFelt(t, "0x043784df59268c02b716e20bf77797bd96c68c2f100b2a634e448c35e3ad363e"), @@ -370,7 +369,6 @@ func TestAddInvoke(t *testing.T) { }, { // https://goerli.voyager.online/tx/0x171537c58b16db45aeec3d3f493617cd3dd571561b856c115dc425b85212c86#overview - ExpectedHash: utils.TestHexToFelt(t, "0x171537c58b16db45aeec3d3f493617cd3dd571561b856c115dc425b85212c86"), ExpectedError: rpc.ErrDuplicateTx, CairoContractVersion: 0, AccountAddress: utils.TestHexToFelt(t, "0x043784df59268c02b716e20bf77797bd96c68c2f100b2a634e448c35e3ad363e"), @@ -395,7 +393,6 @@ func TestAddInvoke(t *testing.T) { }, { // https://goerli.voyager.online/tx/0x1bc0f8c04584735ea9e4485f927c25a6e025bda3117beb508cd1bb5e41f08d9 - ExpectedHash: utils.TestHexToFelt(t, "0x1bc0f8c04584735ea9e4485f927c25a6e025bda3117beb508cd1bb5e41f08d9"), ExpectedError: rpc.ErrDuplicateTx, CairoContractVersion: 2, AccountAddress: utils.TestHexToFelt(t, "0x0088d0038623a89bf853c70ea68b1062ccf32b094d1d7e5f924cda8404dc73e1"), @@ -417,6 +414,27 @@ func TestAddInvoke(t *testing.T) { }, }, }, + { + // https://goerli.voyager.online/tx/0xe8cdb03ddc6b65c2c268eb8084bef41ef63009c10a38f8d1e167652a721588 + ExpectedError: rpc.ErrDuplicateTx, + CairoContractVersion: 2, + AccountAddress: utils.TestHexToFelt(t, "0x0088d0038623a89bf853c70ea68b1062ccf32b094d1d7e5f924cda8404dc73e1"), + SetKS: true, + PubKey: utils.TestHexToFelt(t, "0x7ed3c6482e12c3ef7351214d1195ee7406d814af04a305617599ff27be43883"), + PrivKey: utils.TestHexToFelt(t, "0x07514c4f0de1f800b0b0c7377ef39294ce218a7abd9a1c9b6aa574779f7cdc6a"), + InvokeTx: rpc.InvokeTxnV1{ + Nonce: new(felt.Felt).SetUint64(7), + MaxFee: utils.TestHexToFelt(t, "0x9184e72a000"), + Version: rpc.TransactionV1, + Type: rpc.TransactionType_Invoke, + SenderAddress: utils.TestHexToFelt(t, "0x0088d0038623a89bf853c70ea68b1062ccf32b094d1d7e5f924cda8404dc73e1"), + }, + FnCall: rpc.FunctionCall{ + ContractAddress: utils.TestHexToFelt(t, "0x05044dfb70b9475663e3ddddb11bbbeccc71614b8db86fc3dc0c16b2b9d3151d"), + EntryPointSelector: utils.GetSelectorFromNameFelt("increase_value"), + Calldata: []*felt.Felt{}, + }, + }, }, "mainnet": {}, }[testEnv] From bdaa78913b3b91835b020b2bee34d164170cdaf0 Mon Sep 17 00:00:00 2001 From: rianhughes Date: Mon, 9 Oct 2023 16:05:23 +0300 Subject: [PATCH 3/9] add another test --- account/account_test.go | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/account/account_test.go b/account/account_test.go index e9f87bc9..9e7716bb 100644 --- a/account/account_test.go +++ b/account/account_test.go @@ -328,7 +328,6 @@ func TestSignMOCK(t *testing.T) { func TestAddInvoke(t *testing.T) { type testSetType struct { - ExpectedHash *felt.Felt ExpectedError *rpc.RPCError CairoContractVersion int SetKS bool @@ -435,6 +434,27 @@ func TestAddInvoke(t *testing.T) { Calldata: []*felt.Felt{}, }, }, + { + // https://goerli.voyager.online/tx/0xdcec9fdd48440243fa8fdb8bf87cc40d5ef91181d5a4a0304140df5701c238 + ExpectedError: rpc.ErrDuplicateTx, + CairoContractVersion: 2, + AccountAddress: utils.TestHexToFelt(t, "0x0088d0038623a89bf853c70ea68b1062ccf32b094d1d7e5f924cda8404dc73e1"), + SetKS: true, + PubKey: utils.TestHexToFelt(t, "0x7ed3c6482e12c3ef7351214d1195ee7406d814af04a305617599ff27be43883"), + PrivKey: utils.TestHexToFelt(t, "0x07514c4f0de1f800b0b0c7377ef39294ce218a7abd9a1c9b6aa574779f7cdc6a"), + InvokeTx: rpc.InvokeTxnV1{ + Nonce: new(felt.Felt).SetUint64(18), + MaxFee: utils.TestHexToFelt(t, "0x9184e72a000"), + Version: rpc.TransactionV1, + Type: rpc.TransactionType_Invoke, + SenderAddress: utils.TestHexToFelt(t, "0x0088d0038623a89bf853c70ea68b1062ccf32b094d1d7e5f924cda8404dc73e1"), + }, + FnCall: rpc.FunctionCall{ + ContractAddress: utils.TestHexToFelt(t, "0x05044dfb70b9475663e3ddddb11bbbeccc71614b8db86fc3dc0c16b2b9d3151d"), + EntryPointSelector: utils.GetSelectorFromNameFelt("increase_value_8"), + Calldata: []*felt.Felt{utils.TestHexToFelt(t, "0xaC25b2B9F4ca06179fA0D2522F47Bc86A9DF9314")}, + }, + }, }, "mainnet": {}, }[testEnv] @@ -462,11 +482,10 @@ func TestAddInvoke(t *testing.T) { require.NoError(t, err) resp, err := acnt.AddInvokeTransaction(context.Background(), test.InvokeTx) + fmt.Println(resp, err) if err != nil { require.Equal(t, err.Error(), test.ExpectedError.Error()) require.Nil(t, resp) - } else { - require.Equal(t, resp.TransactionHash, test.ExpectedHash) } } From e40926235f71cb026ea0561164bed51134bf3144 Mon Sep 17 00:00:00 2001 From: rianhughes Date: Mon, 9 Oct 2023 16:20:14 +0300 Subject: [PATCH 4/9] Fix Github devnet test - mint FeeToken --- account/account_test.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/account/account_test.go b/account/account_test.go index 9e7716bb..b2f1245b 100644 --- a/account/account_test.go +++ b/account/account_test.go @@ -499,12 +499,16 @@ func TestAddDeployAccountDevnet(t *testing.T) { require.NoError(t, err, "Error in rpc.NewClient") provider := rpc.NewProvider(client) - acnts, err := newDevnet(t, base) + devnet, acnts, err := newDevnet(t, base) require.NoError(t, err, "Error setting up Devnet") fakeUser := acnts[0] fakeUserAddr := utils.TestHexToFelt(t, fakeUser.Address) fakeUserPub := utils.TestHexToFelt(t, fakeUser.PublicKey) + // mint some FeeToken + _, err = devnet.Mint(fakeUserAddr, new(big.Int).SetInt64(10000000000000)) + require.NoError(t, err, "Error devnet.Mint") + // Set up ks ks := account.NewMemKeystore() fakePrivKeyBI, ok := new(big.Int).SetString(fakeUser.PrivateKey, 0) @@ -790,8 +794,8 @@ func TestAddDeclareTxn(t *testing.T) { } } -func newDevnet(t *testing.T, url string) ([]devnet.TestAccount, error) { +func newDevnet(t *testing.T, url string) (*devnet.DevNet, []devnet.TestAccount, error) { devnet := devnet.NewDevNet(url) acnts, err := devnet.Accounts() - return acnts, err + return devnet, acnts, err } From 9162a4bb512fa757d0aee7d1fa3adb2f76f545fb Mon Sep 17 00:00:00 2001 From: rianhughes Date: Mon, 9 Oct 2023 16:22:58 +0300 Subject: [PATCH 5/9] print --- account/account_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/account/account_test.go b/account/account_test.go index b2f1245b..40eaa918 100644 --- a/account/account_test.go +++ b/account/account_test.go @@ -506,7 +506,8 @@ func TestAddDeployAccountDevnet(t *testing.T) { fakeUserPub := utils.TestHexToFelt(t, fakeUser.PublicKey) // mint some FeeToken - _, err = devnet.Mint(fakeUserAddr, new(big.Int).SetInt64(10000000000000)) + mintResp, err := devnet.Mint(fakeUserAddr, new(big.Int).SetInt64(10000000000000)) + fmt.Println(mintResp) require.NoError(t, err, "Error devnet.Mint") // Set up ks @@ -536,6 +537,7 @@ func TestAddDeployAccountDevnet(t *testing.T) { require.NoError(t, acnt.SignDeployAccountTransaction(context.Background(), &tx, precomputedAddress)) resp, err := acnt.AddDeployAccountTransaction(context.Background(), tx) + fmt.Println(resp, err) require.NoError(t, err, "AddDeployAccountTransaction gave an Error") require.NotNil(t, resp, "AddDeployAccountTransaction resp not nil") } From f03befeb93d0419b5b24d35484ef0bab6a4675e7 Mon Sep 17 00:00:00 2001 From: rianhughes Date: Mon, 9 Oct 2023 16:25:04 +0300 Subject: [PATCH 6/9] lower max fee? --- account/account_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account/account_test.go b/account/account_test.go index 40eaa918..27beb45d 100644 --- a/account/account_test.go +++ b/account/account_test.go @@ -524,7 +524,7 @@ func TestAddDeployAccountDevnet(t *testing.T) { tx := rpc.DeployAccountTxn{ Nonce: &felt.Zero, // Contract accounts start with nonce zero. - MaxFee: new(felt.Felt).SetUint64(4724395326064), + MaxFee: new(felt.Felt).SetUint64(472439532606), Type: rpc.TransactionType_DeployAccount, Version: rpc.TransactionV1, Signature: []*felt.Felt{}, From bcfee7353c19ad11941c4e3f4ae9b789688d8e3e Mon Sep 17 00:00:00 2001 From: rianhughes Date: Mon, 9 Oct 2023 16:27:38 +0300 Subject: [PATCH 7/9] print more --- account/account_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/account/account_test.go b/account/account_test.go index 27beb45d..6b5ac233 100644 --- a/account/account_test.go +++ b/account/account_test.go @@ -532,6 +532,8 @@ func TestAddDeployAccountDevnet(t *testing.T) { ContractAddressSalt: fakeUserPub, ConstructorCalldata: []*felt.Felt{fakeUserPub}, } + qwe, err := json.MarshalIndent(tx, "", "") + fmt.Println(string(qwe)) precomputedAddress, err := acnt.PrecomputeAddress(&felt.Zero, fakeUserPub, classHash, tx.ConstructorCalldata) require.NoError(t, acnt.SignDeployAccountTransaction(context.Background(), &tx, precomputedAddress)) From f039b164412555a2f034ae435acdec13b2e33018 Mon Sep 17 00:00:00 2001 From: rianhughes Date: Mon, 9 Oct 2023 16:30:09 +0300 Subject: [PATCH 8/9] rm devnet bin --- .bin/devnet.sh | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100755 .bin/devnet.sh diff --git a/.bin/devnet.sh b/.bin/devnet.sh deleted file mode 100755 index bfdf8d3f..00000000 --- a/.bin/devnet.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -i=0 -version="" -export ACCOUNT_ADDRESS=0x06bb9425718d801fd06f144abb82eced725f0e81db61d2f9f4c9a26ece46a829 - -while true; do - i=$((i + 1)) - curl --fail localhost:5050/is_alive 2>/dev/null 2>&1 - result=$? - if [ $result -eq 0 ]; then - sleep 5 - curl --fail -H 'Content-Type: application/json' -XPOST http://localhost:5050/mint \ - -d '{ "address": "'${ACCOUNT_ADDRESS}'", "amount": 1000000000000000}' - exit 0 - fi - if [ $i -gt 10 ]; then - break - fi - echo "we will continue in a while, loop ${i}..." - i=$((i + 1)) - sleep 3 -done - -echo "could not check devnet is_alive; fail!!!" -exit 1 - From a1f6117dc2f24eaaee7596cc4afee52d5c7661a0 Mon Sep 17 00:00:00 2001 From: rianhughes Date: Mon, 9 Oct 2023 16:35:33 +0300 Subject: [PATCH 9/9] readd devnet.sh, and update endpoint --- .bin/devnet.sh | 26 ++++++++++++++++++++++++++ .github/workflows/test_account.yml | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .bin/devnet.sh diff --git a/.bin/devnet.sh b/.bin/devnet.sh new file mode 100644 index 00000000..3618d7cf --- /dev/null +++ b/.bin/devnet.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +i=0 +version="" +export ACCOUNT_ADDRESS=0x06bb9425718d801fd06f144abb82eced725f0e81db61d2f9f4c9a26ece46a829 + +while true; do + i=$((i + 1)) + curl --fail localhost:5050/is_alive 2>/dev/null 2>&1 + result=$? + if [ $result -eq 0 ]; then + sleep 5 + curl --fail -H 'Content-Type: application/json' -XPOST http://localhost:5050/mint \ + -d '{ "address": "'${ACCOUNT_ADDRESS}'", "amount": 1000000000000000}' + exit 0 + fi + if [ $i -gt 10 ]; then + break + fi + echo "we will continue in a while, loop ${i}..." + i=$((i + 1)) + sleep 3 +done + +echo "could not check devnet is_alive; fail!!!" +exit 1 \ No newline at end of file diff --git a/.github/workflows/test_account.yml b/.github/workflows/test_account.yml index a5b07f63..62b3f9e2 100644 --- a/.github/workflows/test_account.yml +++ b/.github/workflows/test_account.yml @@ -34,7 +34,7 @@ jobs: run: cd account && go test -timeout 600s -v -env devnet . env: TESTNET_ACCOUNT_PRIVATE_KEY: ${{ secrets.TESTNET_ACCOUNT_PRIVATE_KEY }} - INTEGRATION_BASE: "http://0.0.0.0:5050" + INTEGRATION_BASE: "http://localhost:5050" # Test Account on mock - name: Test Account with mocks