diff --git a/.gitignore b/.gitignore index 3b4b165..84b601d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ covprofile +*.env diff --git a/go.mod b/go.mod index 04210fa..afbe0f0 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/grassrootseconomics/cic_go +module github.com/grassrootseconomics/cic-go go 1.18 diff --git a/cic_meta/meta.go b/meta/meta.go similarity index 99% rename from cic_meta/meta.go rename to meta/meta.go index b6eb97e..a549297 100644 --- a/cic_meta/meta.go +++ b/meta/meta.go @@ -1,4 +1,4 @@ -package cic_meta +package meta import ( "github.com/ethereum/go-ethereum/common" diff --git a/cic_meta/util.go b/meta/util.go similarity index 98% rename from cic_meta/util.go rename to meta/util.go index 829e91a..b521fc1 100644 --- a/cic_meta/util.go +++ b/meta/util.go @@ -1,4 +1,4 @@ -package cic_meta +package meta import ( "crypto/sha256" diff --git a/cic_net/cic_net.go b/net/cic_net.go similarity index 96% rename from cic_net/cic_net.go rename to net/cic_net.go index f20e9fb..c7da894 100644 --- a/cic_net/cic_net.go +++ b/net/cic_net.go @@ -1,4 +1,4 @@ -package cic_net +package net import ( "crypto/ecdsa" @@ -22,6 +22,7 @@ type WriteTx struct { from common.Address to common.Address gasLimit uint64 + nonce uint64 privateKey ecdsa.PrivateKey } diff --git a/cic_net/cic_net_test.go b/net/cic_net_test.go similarity index 86% rename from cic_net/cic_net_test.go rename to net/cic_net_test.go index cc24650..8a06f87 100644 --- a/cic_net/cic_net_test.go +++ b/net/cic_net_test.go @@ -1,4 +1,4 @@ -package cic_net +package net import ( "github.com/lmittmann/w3" @@ -22,9 +22,9 @@ func TestCicNet_Connect(t *testing.T) { name := "Test RPC connection" wantErr := false - t.Run(name, func(t *testing.T) { - cicnet, _ := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + cicnet, _ := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + t.Run(name, func(t *testing.T) { if err := cicnet.Close(); (err != nil) != wantErr { t.Errorf("EntryCount() error = %v, wantErr %v", err, wantErr) } diff --git a/cic_net/erc20_demurrage_token.go b/net/erc20_demurrage_token.go similarity index 99% rename from cic_net/erc20_demurrage_token.go rename to net/erc20_demurrage_token.go index 3240ebc..9056a68 100644 --- a/cic_net/erc20_demurrage_token.go +++ b/net/erc20_demurrage_token.go @@ -1,4 +1,4 @@ -package cic_net +package net import ( "context" diff --git a/cic_net/erc20_demurrage_token_test.go b/net/erc20_demurrage_token_test.go similarity index 84% rename from cic_net/erc20_demurrage_token_test.go rename to net/erc20_demurrage_token_test.go index 366f23b..21b7d0e 100644 --- a/cic_net/erc20_demurrage_token_test.go +++ b/net/erc20_demurrage_token_test.go @@ -1,4 +1,4 @@ -package cic_net +package net import ( "context" @@ -44,16 +44,16 @@ func TestCicNet_DemurrageToken_DemurrageTokeInfo(t *testing.T) { }, } + cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + + if err != nil { + t.Fatalf("NewCicNet error = %v", err) + } + for _, testcase := range tests { tt := testcase t.Run(tt.name, func(t *testing.T) { - cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) - - if err != nil { - t.Fatalf("NewCicNet error = %v", err) - } - got, err := cicnet.DemurrageTokenInfo(context.Background(), tt.args.contractAddress) if (err != nil) != tt.wantErr { @@ -62,7 +62,7 @@ func TestCicNet_DemurrageToken_DemurrageTokeInfo(t *testing.T) { if !tt.wantErr { if got.DemurrageAmount.Cmp(big.NewInt(0)) < 1 { - t.Fatalf("DemurrageAmount = %v, want %d atleast", got, 1) + t.Errorf("DemurrageAmount = %v, want %d atleast", got, 1) } } }) @@ -109,16 +109,16 @@ func TestCicNet_DemurrageToken_BaseBalanceOf(t *testing.T) { }, } + cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + + if err != nil { + t.Fatalf("NewCicNet error = %v", err) + } + for _, testcase := range tests { tt := testcase t.Run(tt.name, func(t *testing.T) { - cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) - - if err != nil { - t.Fatalf("NewCicNet error = %v", err) - } - got, err := cicnet.BaseBalanceOf(context.Background(), tt.args.contractAddress, tt.args.accountAddress) if (err != nil) != tt.wantErr { @@ -127,7 +127,7 @@ func TestCicNet_DemurrageToken_BaseBalanceOf(t *testing.T) { if !tt.wantErr { if got.Cmp(&tt.balanceGte) < 0 { - t.Fatalf("Token = %v, want %d", got, tt.balanceGte.Int64()) + t.Errorf("Token = %v, want %d", got, tt.balanceGte.Int64()) } } }) @@ -151,6 +151,16 @@ func TestCicNet_DemurrageToken_ChangePeriod(t *testing.T) { } fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA) + cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + if err != nil { + t.Fatalf("NewCicNet error = %v", err) + } + + nonce, err := cicnet.LastNonce(context.Background(), fromAddress) + if err != nil { + t.Fatalf("Cicnet client error") + } + tests := []struct { name string args args @@ -163,6 +173,7 @@ func TestCicNet_DemurrageToken_ChangePeriod(t *testing.T) { writeTx: WriteTx{ from: fromAddress, to: w3.A("0xaB89822F31c2092861F713F6F34bd6877a8C1878"), + nonce: nonce + 1, gasLimit: 12000000, privateKey: *privateKey, }, @@ -175,11 +186,6 @@ func TestCicNet_DemurrageToken_ChangePeriod(t *testing.T) { tt := testcase t.Run(tt.name, func(t *testing.T) { - cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) - - if err != nil { - t.Fatalf("NewCicNet error = %v", err) - } tx, err := cicnet.ChangePeriod(context.Background(), tt.args.writeTx) t.Logf("ChangePeriod tx_hash %s", tx.String()) @@ -209,6 +215,16 @@ func TestCicNet_DemurrageToken_ApplyDemurrageLimited(t *testing.T) { } fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA) + cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + if err != nil { + t.Fatalf("NewCicNet error = %v", err) + } + + nonce, err := cicnet.LastNonce(context.Background(), fromAddress) + if err != nil { + t.Fatalf("Cicnet client error") + } + tests := []struct { name string args args @@ -222,6 +238,7 @@ func TestCicNet_DemurrageToken_ApplyDemurrageLimited(t *testing.T) { writeTx: WriteTx{ from: fromAddress, to: w3.A("0xaB89822F31c2092861F713F6F34bd6877a8C1878"), + nonce: nonce + 1, gasLimit: 12000000, privateKey: *privateKey, }, @@ -234,12 +251,6 @@ func TestCicNet_DemurrageToken_ApplyDemurrageLimited(t *testing.T) { tt := testcase t.Run(tt.name, func(t *testing.T) { - cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) - - if err != nil { - t.Fatalf("NewCicNet error = %v", err) - } - tx, err := cicnet.ApplyDemurrageLimited(context.Background(), tt.args.rounds, tt.args.writeTx) t.Logf("ApplyDemurrageLimited tx_hash %s", tx.String()) diff --git a/cic_net/erc20_token.go b/net/erc20_token.go similarity index 98% rename from cic_net/erc20_token.go rename to net/erc20_token.go index 74d4d8d..a81f97d 100644 --- a/cic_net/erc20_token.go +++ b/net/erc20_token.go @@ -1,4 +1,4 @@ -package cic_net +package net import ( "context" diff --git a/cic_net/erc20_token_test.go b/net/erc20_token_test.go similarity index 84% rename from cic_net/erc20_token_test.go rename to net/erc20_token_test.go index 9208fb8..e3a3e64 100644 --- a/cic_net/erc20_token_test.go +++ b/net/erc20_token_test.go @@ -1,4 +1,4 @@ -package cic_net +package net import ( "context" @@ -37,16 +37,16 @@ func TestCicNet_ERC20Token_ERC20TokenInfo(t *testing.T) { }, } + cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + + if err != nil { + t.Fatalf("NewCicNet error = %v", err) + } + for _, testcase := range tests { tt := testcase t.Run(tt.name, func(t *testing.T) { - cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) - - if err != nil { - t.Fatalf("NewCicNet error = %v", err) - } - got, err := cicnet.ERC20TokenInfo(context.Background(), tt.args.contractAddress) if (err != nil) != tt.wantErr { @@ -54,7 +54,7 @@ func TestCicNet_ERC20Token_ERC20TokenInfo(t *testing.T) { } if got.Symbol != tt.symbol { - t.Fatalf("Token = %v, want %v", got, tt.symbol) + t.Errorf("Token = %v, want %v", got, tt.symbol) } }) } @@ -92,16 +92,16 @@ func TestCicNet_ERC20Token_BalanceOf(t *testing.T) { }, } + cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + + if err != nil { + t.Fatalf("NewCicNet error = %v", err) + } + for _, testcase := range tests { tt := testcase t.Run(tt.name, func(t *testing.T) { - cicnet, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) - - if err != nil { - t.Fatalf("NewCicNet error = %v", err) - } - got, err := cicnet.BalanceOf(context.Background(), tt.args.contractAddress, tt.args.accountAddress) if (err != nil) != tt.wantErr { @@ -109,7 +109,7 @@ func TestCicNet_ERC20Token_BalanceOf(t *testing.T) { } if got.Cmp(&tt.balanceGte) < 0 { - t.Fatalf("Token = %v, want %d", got, tt.balanceGte.Int64()) + t.Errorf("Token = %v, want %d", got, tt.balanceGte.Int64()) } }) } diff --git a/cic_net/token_index.go b/net/token_index.go similarity index 97% rename from cic_net/token_index.go rename to net/token_index.go index 9c71a10..bfd5e26 100644 --- a/cic_net/token_index.go +++ b/net/token_index.go @@ -1,4 +1,4 @@ -package cic_net +package net import ( "context" diff --git a/cic_net/token_index_test.go b/net/token_index_test.go similarity index 75% rename from cic_net/token_index_test.go rename to net/token_index_test.go index 48aa3f7..3d9bf75 100644 --- a/cic_net/token_index_test.go +++ b/net/token_index_test.go @@ -1,4 +1,4 @@ -package cic_net +package net import ( "context" @@ -11,13 +11,13 @@ func TestCicNet_TokenIndex_EntryCount(t *testing.T) { name := "Entry count" wantErr := false + tokenIndex, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + + if err != nil { + t.Fatalf("NewCicNet error = %v", err) + } + t.Run(name, func(t *testing.T) { - tokenIndex, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) - - if err != nil { - t.Fatalf("NewCicNet error = %v", err) - } - got, err := tokenIndex.EntryCount(context.Background()) if (err != nil) != wantErr { @@ -25,7 +25,7 @@ func TestCicNet_TokenIndex_EntryCount(t *testing.T) { } if got.Cmp(big.NewInt(0)) < 1 { - t.Fatalf("EntryCount() = %v, want %v", got, 1) + t.Errorf("EntryCount() = %v, want %v", got, 1) } }) } @@ -59,16 +59,16 @@ func TestCicNet_TokenIndex_AddressAtIndex(t *testing.T) { }, } + tokenIndex, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) + + if err != nil { + t.Fatalf("NewCicNet error = %v", err) + } + for _, testcase := range tests { tt := testcase t.Run(tt.name, func(t *testing.T) { - tokenIndex, err := NewCicNet(conf.rpcProvider, w3.A(conf.tokenIndex)) - - if err != nil { - t.Fatalf("NewCicNet error = %v", err) - } - got, err := tokenIndex.AddressAtIndex(context.Background(), tt.args.index) if (err != nil) != tt.wantErr { @@ -76,7 +76,7 @@ func TestCicNet_TokenIndex_AddressAtIndex(t *testing.T) { } if got != tt.address { - t.Fatalf("AddressAtIndex = %v, want %v", got, tt.address) + t.Errorf("AddressAtIndex = %v, want %v", got, tt.address) } }) } diff --git a/cic_net/util.go b/net/util.go similarity index 78% rename from cic_net/util.go rename to net/util.go index 23ec89e..f353192 100644 --- a/cic_net/util.go +++ b/net/util.go @@ -1,4 +1,4 @@ -package cic_net +package net import ( "context" @@ -8,7 +8,7 @@ import ( "math/big" ) -func (c *CicNet) latestNonce(ctx context.Context, address common.Address) (uint64, error) { +func (c *CicNet) LastNonce(ctx context.Context, address common.Address) (uint64, error) { var nonce uint64 err := c.ethClient.CallCtx( @@ -25,14 +25,9 @@ func (c *CicNet) latestNonce(ctx context.Context, address common.Address) (uint6 func (c *CicNet) signAndCall(ctx context.Context, input []byte, txData WriteTx) (common.Hash, error) { var txHash common.Hash - nonce, err := c.latestNonce(ctx, txData.from) - if err != nil { - return [32]byte{}, err - } - tx, err := types.SignNewTx(&txData.privateKey, c.kitabuSigner, &types.LegacyTx{ To: &txData.to, - Nonce: nonce, + Nonce: txData.nonce, Data: input, Gas: txData.gasLimit, GasPrice: big.NewInt(1),