From bc9c1d46ba17f5e5455dc673a5ebc25080b4117c Mon Sep 17 00:00:00 2001 From: Angelo De Caro Date: Wed, 28 Feb 2024 12:57:31 +0100 Subject: [PATCH 1/2] workflow Signed-off-by: Angelo De Caro --- .github/workflows/golangci-lint.yml | 58 +++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/workflows/golangci-lint.yml diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml new file mode 100644 index 000000000..9c7b4f767 --- /dev/null +++ b/.github/workflows/golangci-lint.yml @@ -0,0 +1,58 @@ +name: golangci-lint + +on: + push: + branches: + - master + - main + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + +permissions: + contents: read + # Optional: allow read access to pull request. Use with `only-new-issues` option. + # pull-requests: read + +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: '1.20' + cache: false + - name: golangci-lint + uses: golangci/golangci-lint-action@v4 + with: + # Require: The version of golangci-lint to use. + # When `install-mode` is `binary` (default) the value can be v1.2 or v1.2.3 or `latest` to use the latest version. + # When `install-mode` is `goinstall` the value can be v1.2.3, `latest`, or the hash of a commit. + version: v1.54 + + # Optional: working directory, useful for monorepos + # working-directory: somedir + + # Optional: golangci-lint command line arguments. + # + # Note: By default, the `.golangci.yml` file should be at the root of the repository. + # The location of the configuration file can be changed by using `--config=` + # args: --timeout=30m --config=/my/path/.golangci.yml --issues-exit-code=0 + + # Optional: show only new issues if it's a pull request. The default value is `false`. + # only-new-issues: true + + # Optional: if set to true, then all caching functionality will be completely disabled, + # takes precedence over all other caching options. + # skip-cache: true + + # Optional: if set to true, then the action won't cache or restore ~/go/pkg. + # skip-pkg-cache: true + + # Optional: if set to true, then the action won't cache or restore ~/.cache/go-build. + # skip-build-cache: true + + # Optional: The mode to install golangci-lint. It can be 'binary' or 'goinstall'. + # install-mode: "goinstall" \ No newline at end of file From 1770292345079e354bda9e6ae6f1655b6943c139 Mon Sep 17 00:00:00 2001 From: Angelo De Caro Date: Wed, 28 Feb 2024 13:12:04 +0100 Subject: [PATCH 2/2] fix warnings Signed-off-by: Angelo De Caro --- cmd/tokengen/main.go | 8 +++- cmd/tokengen/main_test.go | 3 +- integration/nwo/token/common/ppmgen.go | 38 +++++++++++++++++-- .../zkatdlog/crypto/audit/auditor_test.go | 21 +--------- token/core/zkatdlog/crypto/common/nym.go | 2 +- .../zkatdlog/crypto/issue/wellformedness.go | 2 +- .../zkatdlog/crypto/pssign/blindsign_test.go | 2 +- .../core/zkatdlog/crypto/range/proof_test.go | 2 +- .../core/zkatdlog/crypto/sigproof/pok_test.go | 2 +- .../crypto/validator/validator_test.go | 23 +---------- .../services/certifier/interactive/service.go | 4 +- token/services/db/sql/init.go | 7 +++- token/services/db/sql/init_test.go | 7 +++- token/services/db/sql/tokens.go | 12 +++++- token/services/db/sql/tokens_test.go | 2 - token/services/db/sql/transactions.go | 13 ++++++- token/services/interop/encoding/encoding.go | 19 +++++++--- token/services/network/fabric/tcc/tcc_test.go | 8 ++-- token/services/network/orion/views.go | 28 ++++++++++---- .../services/selector/mailman/mailman_test.go | 2 +- 20 files changed, 123 insertions(+), 82 deletions(-) diff --git a/cmd/tokengen/main.go b/cmd/tokengen/main.go index bba34aaff..1f470690f 100644 --- a/cmd/tokengen/main.go +++ b/cmd/tokengen/main.go @@ -37,8 +37,12 @@ func main() { mainFlags := mainCmd.PersistentFlags() mainFlags.String("logging-level", "", "Legacy logging level flag") - viper.BindPFlag("logging_level", mainFlags.Lookup("logging-level")) - mainFlags.MarkHidden("logging-level") + if err := viper.BindPFlag("logging_level", mainFlags.Lookup("logging-level")); err != nil { + panic(err) + } + if err := mainFlags.MarkHidden("logging-level"); err != nil { + panic(err) + } mainCmd.AddCommand(pp2.GenCmd()) mainCmd.AddCommand(pp2.UpdateCmd()) diff --git a/cmd/tokengen/main_test.go b/cmd/tokengen/main_test.go index cb3a9d06e..eb494f7ca 100644 --- a/cmd/tokengen/main_test.go +++ b/cmd/tokengen/main_test.go @@ -7,7 +7,6 @@ SPDX-License-Identifier: Apache-2.0 package main import ( - "io/ioutil" "os" "os/exec" "path/filepath" @@ -211,7 +210,7 @@ func TestGenFailure(t *testing.T) { testGenRunWithError(gt, tokengen, test.Args, test.ErrMsg) } - tempOutput, err := ioutil.TempDir("", "tokengen-test") + tempOutput, err := os.MkdirTemp("", "tokengen-test") gt.Expect(err).NotTo(HaveOccurred()) defer os.RemoveAll(tempOutput) diff --git a/integration/nwo/token/common/ppmgen.go b/integration/nwo/token/common/ppmgen.go index ac1d2e4c9..c07c5ecd7 100644 --- a/integration/nwo/token/common/ppmgen.go +++ b/integration/nwo/token/common/ppmgen.go @@ -68,9 +68,24 @@ func (f *FabTokenPublicParamsGenerator) Generate(tms *topology.TMS, wallets *gen } } - //lint:ignore SA9003 To-Do pending if len(tms.Issuers) != 0 { - // TODO: + if len(wallets.Issuers) == 0 { + return nil, errors.Errorf("no issuer wallets provided") + } + for _, issuer := range wallets.Issuers { + // Build an MSP Identity + provider, err := x509.NewProviderWithBCCSPConfig(issuer.Path, "", msp2.AuditorMSPID, nil, issuer.Opts) + if err != nil { + return nil, errors.WithMessage(err, "failed to create x509 provider") + } + id, _, err := provider.Identity(nil) + if err != nil { + return nil, errors.WithMessage(err, "failed to get identity") + } + if tms.Issuers[0] == issuer.ID { + pp.AddIssuer(id) + } + } } ppRaw, err := pp.Serialize() @@ -152,9 +167,24 @@ func (d *DLogPublicParamsGenerator) Generate(tms *topology.TMS, wallets *generat } } - //lint:ignore SA9003 To-Do pending if len(tms.Issuers) != 0 { - // TODO + if len(wallets.Issuers) == 0 { + return nil, errors.Errorf("no issuer wallets provided") + } + for _, issuer := range wallets.Issuers { + // Build an MSP Identity + provider, err := x509.NewProviderWithBCCSPConfig(issuer.Path, "", msp2.AuditorMSPID, nil, issuer.Opts) + if err != nil { + return nil, errors.WithMessage(err, "failed to create x509 provider") + } + id, _, err := provider.Identity(nil) + if err != nil { + return nil, errors.WithMessage(err, "failed to get identity") + } + if tms.Issuers[0] == issuer.ID { + pp.AddIssuer(id) + } + } } ppRaw, err := pp.Serialize() diff --git a/token/core/zkatdlog/crypto/audit/auditor_test.go b/token/core/zkatdlog/crypto/audit/auditor_test.go index d843f8b5f..bed653189 100644 --- a/token/core/zkatdlog/crypto/audit/auditor_test.go +++ b/token/core/zkatdlog/crypto/audit/auditor_test.go @@ -182,25 +182,8 @@ func createTransferWithBogusOutput(pp *crypto.PublicParams) (*transfer2.Transfer return transfer, metadata, tokns } -func getIssuers(N, index int, pk *math.G1, pp []*math.G1, curve *math.Curve) []*math.G1 { - rand, err := curve.Rand() - Expect(err).NotTo(HaveOccurred()) - issuers := make([]*math.G1, N) - issuers[index] = pk - for i := 0; i < N; i++ { - if i != index { - sk := curve.NewRandomZr(rand) - t := curve.NewRandomZr(rand) - issuers[i] = pp[0].Mul(sk) - issuers[i].Add(pp[1].Mul(t)) - } - } - return issuers -} - type fakeProv struct { - typ string - path string + typ string } func (f *fakeProv) GetString(key string) string { @@ -245,7 +228,7 @@ func (f *fakeProv) TranslatePath(path string) string { func getIdemixInfo(dir string) (view.Identity, *idemix2.AuditInfo) { registry := registry2.New() - registry.RegisterService(&fakeProv{typ: "memory"}) + Expect(registry.RegisterService(&fakeProv{typ: "memory"})).NotTo(HaveOccurred()) kvss, err := kvs.New(registry, "memory", "") Expect(err).NotTo(HaveOccurred()) diff --git a/token/core/zkatdlog/crypto/common/nym.go b/token/core/zkatdlog/crypto/common/nym.go index 4cd38edd7..8ae8bbc40 100644 --- a/token/core/zkatdlog/crypto/common/nym.go +++ b/token/core/zkatdlog/crypto/common/nym.go @@ -136,7 +136,7 @@ func (v *NymVerifier) Verify(message []byte, signature []byte) error { } // compute challenge if v.Curve == nil { - errors.Errorf("failed to verify nym signature: please initialize curve") + return errors.Errorf("failed to verify nym signature: please initialize curve") } chal := v.Curve.HashToZr(append(message, raw...)) // check challenge equality diff --git a/token/core/zkatdlog/crypto/issue/wellformedness.go b/token/core/zkatdlog/crypto/issue/wellformedness.go index 43ca04403..49dae088d 100644 --- a/token/core/zkatdlog/crypto/issue/wellformedness.go +++ b/token/core/zkatdlog/crypto/issue/wellformedness.go @@ -82,7 +82,7 @@ func (p *WellFormednessProver) Prove() ([]byte, error) { // compute challenge for proof raw, err := common.GetG1Array(p.Commitments, p.Tokens).Bytes() if err != nil { - errors.Wrapf(err, "The computation of the issue proof failed") + return nil, errors.Wrapf(err, "The computation of the issue proof failed") } // compute proof wf, err := p.computeProof(p.Curve.HashToZr(raw)) diff --git a/token/core/zkatdlog/crypto/pssign/blindsign_test.go b/token/core/zkatdlog/crypto/pssign/blindsign_test.go index a443db489..248cc667c 100644 --- a/token/core/zkatdlog/crypto/pssign/blindsign_test.go +++ b/token/core/zkatdlog/crypto/pssign/blindsign_test.go @@ -67,6 +67,6 @@ func getPedersenParameters(length int, curve *math.Curve) []*math.G1 { func getSigner(length int, curve *math.Curve) *pssign.Signer { s := pssign.NewSigner(nil, nil, nil, curve) - s.KeyGen(length) + Expect(s.KeyGen(length)).ToNot(HaveOccurred()) return s } diff --git a/token/core/zkatdlog/crypto/range/proof_test.go b/token/core/zkatdlog/crypto/range/proof_test.go index 2d12ba257..d839e3f5c 100644 --- a/token/core/zkatdlog/crypto/range/proof_test.go +++ b/token/core/zkatdlog/crypto/range/proof_test.go @@ -62,7 +62,7 @@ func getRangeProver() *rp.Prover { func getSigner(length int) *pssign.Signer { s := pssign.NewSigner(nil, nil, nil, math.Curves[1]) - s.KeyGen(length) + Expect(s.KeyGen(length)).ToNot(HaveOccurred()) return s } diff --git a/token/core/zkatdlog/crypto/sigproof/pok_test.go b/token/core/zkatdlog/crypto/sigproof/pok_test.go index ff2acd433..21a8ee192 100644 --- a/token/core/zkatdlog/crypto/sigproof/pok_test.go +++ b/token/core/zkatdlog/crypto/sigproof/pok_test.go @@ -83,6 +83,6 @@ func prepareWitness(s *pssign.Signer) *sigproof.POKWitness { func getSigner(length int, curve *math.Curve) *pssign.Signer { s := &pssign.Signer{SignVerifier: &pssign.SignVerifier{Curve: curve}} - s.KeyGen(length) + Expect(s.KeyGen(length)).NotTo(HaveOccurred()) return s } diff --git a/token/core/zkatdlog/crypto/validator/validator_test.go b/token/core/zkatdlog/crypto/validator/validator_test.go index 15e1716e7..774ed2544 100644 --- a/token/core/zkatdlog/crypto/validator/validator_test.go +++ b/token/core/zkatdlog/crypto/validator/validator_test.go @@ -300,24 +300,6 @@ func prepareTransferRequest(pp *crypto.PublicParams, auditor *audit.Auditor) (*t return prepareTransfer(pp, signer, auditor, auditInfo, id, owners) } -func getIssuers(N, index int, pk *math.G1, pp []*math.G1, curve *math.Curve) []*math.G1 { - rand, err := curve.Rand() - Expect(err).NotTo(HaveOccurred()) - issuers := make([]*math.G1, N) - issuers[index] = pk - for i := 0; i < N; i++ { - if i != index { - sk := curve.NewRandomZr(rand) - t := curve.NewRandomZr(rand) - issuers[i] = pp[0].Mul(sk) - issuers[i].Add(pp[1].Mul(t)) - } - } - - return issuers - -} - func prepareTokens(values, bf []*math.Zr, ttype string, pp []*math.G1, curve *math.Curve) []*math.G1 { tokens := make([]*math.G1, len(values)) for i := 0; i < len(values); i++ { @@ -335,8 +317,7 @@ func prepareToken(value *math.Zr, rand *math.Zr, ttype string, pp []*math.G1, cu } type fakeProv struct { - typ string - path string + typ string } func (f *fakeProv) GetString(key string) string { @@ -381,7 +362,7 @@ func (f *fakeProv) TranslatePath(path string) string { func getIdemixInfo(dir string) (view.Identity, *idemix2.AuditInfo, driver.SigningIdentity) { registry := registry2.New() - registry.RegisterService(&fakeProv{typ: "memory"}) + Expect(registry.RegisterService(&fakeProv{typ: "memory"})).NotTo(HaveOccurred()) kvss, err := kvs.New(registry, "memory", "") Expect(err).NotTo(HaveOccurred()) diff --git a/token/services/certifier/interactive/service.go b/token/services/certifier/interactive/service.go index e2fac6ec7..d628e09a6 100644 --- a/token/services/certifier/interactive/service.go +++ b/token/services/certifier/interactive/service.go @@ -44,10 +44,10 @@ func NewCertificationService(responderRegistry ResponderRegistry, mp metrics.Pro } } -func (c *CertificationService) Start() error { +func (c *CertificationService) Start() (err error) { logger.Debugf("starting certifier service...") (&sync.Once{}).Do(func() { - c.ResponderRegistry.RegisterResponder(c, &CertificationRequestView{}) + err = c.ResponderRegistry.RegisterResponder(c, &CertificationRequestView{}) }) logger.Debugf("starting certifier service...done") return nil diff --git a/token/services/db/sql/init.go b/token/services/db/sql/init.go index 8bf5a07ef..811cc2a98 100644 --- a/token/services/db/sql/init.go +++ b/token/services/db/sql/init.go @@ -12,6 +12,7 @@ import ( "encoding/hex" "fmt" "regexp" + "runtime/debug" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/flogging" "github.com/pkg/errors" @@ -25,7 +26,11 @@ func initSchema(db *sql.DB, schemas ...string) error { if err != nil { return err } - defer tx.Rollback() + defer func() { + if err := tx.Rollback(); err != nil { + logger.Errorf("failed to rollback [%s][%s]", err, debug.Stack()) + } + }() for _, schema := range schemas { logger.Debug(schema) diff --git a/token/services/db/sql/init_test.go b/token/services/db/sql/init_test.go index b0aa2f2e6..bd4d85895 100644 --- a/token/services/db/sql/init_test.go +++ b/token/services/db/sql/init_test.go @@ -12,6 +12,7 @@ import ( "fmt" "os" "path" + "runtime/debug" "testing" "time" @@ -169,5 +170,9 @@ func startPostgresContainer(t *testing.T) (func(), string) { t.Fatal(err) } - return func() { pg.Terminate(ctx) }, pgConnStr + return func() { + if err := pg.Terminate(ctx); err != nil { + logger.Errorf("failed to terminate [%s][%s]", err, debug.Stack()) + } + }, pgConnStr } diff --git a/token/services/db/sql/tokens.go b/token/services/db/sql/tokens.go index 2e22f18dc..8ddd5290c 100644 --- a/token/services/db/sql/tokens.go +++ b/token/services/db/sql/tokens.go @@ -69,7 +69,11 @@ func (db *TokenDB) storeToken(tr driver.TokenRecord, owners []string, table stri if err != nil { return errors.New("failed starting a db transaction") } - defer tx.Rollback() + defer func() { + if err := tx.Rollback(); err != nil { + logger.Errorf("failed to rollback [%s][%s]", err, debug.Stack()) + } + }() // Store token now := time.Now().UTC() @@ -722,7 +726,11 @@ func (db *TokenDB) StoreCertifications(certifications map[*token.ID][]byte) erro if err != nil { return errors.New("failed starting a transaction") } - defer tx.Rollback() + defer func() { + if err := tx.Rollback(); err != nil { + logger.Errorf("failed to rollback [%s][%s]", err, debug.Stack()) + } + }() for tokenID, certification := range certifications { if tokenID == nil { return errors.Errorf("invalid token-id, cannot be nil") diff --git a/token/services/db/sql/tokens_test.go b/token/services/db/sql/tokens_test.go index 4a5070380..2f02d3503 100644 --- a/token/services/db/sql/tokens_test.go +++ b/token/services/db/sql/tokens_test.go @@ -17,8 +17,6 @@ import ( "github.com/test-go/testify/assert" ) -var ns = "testing" - func TestTokensSqlite(t *testing.T) { tempDir := t.TempDir() diff --git a/token/services/db/sql/transactions.go b/token/services/db/sql/transactions.go index e63b16f5e..15c330e5a 100644 --- a/token/services/db/sql/transactions.go +++ b/token/services/db/sql/transactions.go @@ -11,6 +11,7 @@ import ( "encoding/json" "fmt" "math/big" + "runtime/debug" "sync" "time" @@ -248,7 +249,11 @@ func (db *TransactionDB) SetStatus(txID string, status driver.TxStatus) error { if err != nil { return errors.New("failed starting a transaction") } - defer tx.Rollback() + defer func() { + if err := tx.Rollback(); err != nil { + logger.Errorf("failed to rollback [%s][%s]", err, debug.Stack()) + } + }() if err := db.setStatusIfExists(tx, db.table.Movements, txID, status); err != nil { return err @@ -364,7 +369,11 @@ func (db *TransactionDB) AddTransactionEndorsementAck(txID string, endorser view if err != nil { return errors.New("failed starting a transaction") } - defer tx.Rollback() + defer func() { + if err := tx.Rollback(); err != nil { + logger.Errorf("failed to rollback [%s][%s]", err, debug.Stack()) + } + }() if _, err := tx.Exec(query, id, txID, endorser, sigma, now); err != nil { return errors.Wrapf(err, "failed to execute") } diff --git a/token/services/interop/encoding/encoding.go b/token/services/interop/encoding/encoding.go index 2f08eb3ab..350c2036e 100644 --- a/token/services/interop/encoding/encoding.go +++ b/token/services/interop/encoding/encoding.go @@ -79,16 +79,23 @@ func RegisterEncoding(e Encoding, f func() EncodingFunc) error { func init() { noneEncoding := &noneEncoding{} - RegisterEncoding(None, func() EncodingFunc { + if err := RegisterEncoding(None, func() EncodingFunc { return noneEncoding - }) - RegisterEncoding(Base64, func() EncodingFunc { + }); err != nil { + panic(err) + } + + if err := RegisterEncoding(Base64, func() EncodingFunc { return base64.StdEncoding - }) + }); err != nil { + panic(err) + } hexEncoding := &hexEncoding{} - RegisterEncoding(Hex, func() EncodingFunc { + if err := RegisterEncoding(Hex, func() EncodingFunc { return hexEncoding - }) + }); err != nil { + panic(err) + } } type hexEncoding struct{} diff --git a/token/services/network/fabric/tcc/tcc_test.go b/token/services/network/fabric/tcc/tcc_test.go index c6d035219..695c0538a 100644 --- a/token/services/network/fabric/tcc/tcc_test.go +++ b/token/services/network/fabric/tcc/tcc_test.go @@ -7,15 +7,13 @@ package tcc_test import ( "encoding/base64" - "io/ioutil" "os" + chaincode2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/network/fabric/tcc" + "github.com/hyperledger-labs/fabric-token-sdk/token/services/network/fabric/tcc/mock" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/pkg/errors" - - chaincode2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/network/fabric/tcc" - "github.com/hyperledger-labs/fabric-token-sdk/token/services/network/fabric/tcc/mock" ) var _ = Describe("ccvalidator", func() { @@ -41,7 +39,7 @@ var _ = Describe("ccvalidator", func() { // public parameters. pp := base64.StdEncoding.EncodeToString([]byte("public parameters")) var err error - ppFile, err = ioutil.TempFile("", "pp") + ppFile, err = os.CreateTemp("", "pp") Expect(err).NotTo(HaveOccurred()) _, err = ppFile.WriteString(pp) Expect(err).NotTo(HaveOccurred()) diff --git a/token/services/network/orion/views.go b/token/services/network/orion/views.go index 9b1cfd907..3f5497dee 100644 --- a/token/services/network/orion/views.go +++ b/token/services/network/orion/views.go @@ -12,13 +12,27 @@ import ( func InstallViews(sp view.ServiceProvider) error { logger.Debugf("Installing custodian views...") - view.GetRegistry(sp).RegisterResponder(&PublicParamsRequestResponderView{}, &PublicParamsRequestView{}) - view.GetRegistry(sp).RegisterResponder(&RequestApprovalResponderView{}, &RequestApprovalView{}) - view.GetRegistry(sp).RegisterResponder(&BroadcastResponderView{}, &BroadcastView{}) - view.GetRegistry(sp).RegisterResponder(&LookupKeyRequestRespondView{}, &LookupKeyRequestView{}) - view.GetRegistry(sp).RegisterResponder(&RequestTxStatusResponderView{}, &RequestTxStatusView{}) - view.GetRegistry(sp).RegisterResponder(&RequestSpentTokensResponderView{}, &RequestSpentTokensView{}) - view.GetRegistry(sp).RegisterResponder(&RequestQueryTokensResponderView{}, &RequestQueryTokensView{}) + if err := view.GetRegistry(sp).RegisterResponder(&PublicParamsRequestResponderView{}, &PublicParamsRequestView{}); err != nil { + return err + } + if err := view.GetRegistry(sp).RegisterResponder(&RequestApprovalResponderView{}, &RequestApprovalView{}); err != nil { + return err + } + if err := view.GetRegistry(sp).RegisterResponder(&BroadcastResponderView{}, &BroadcastView{}); err != nil { + return err + } + if err := view.GetRegistry(sp).RegisterResponder(&LookupKeyRequestRespondView{}, &LookupKeyRequestView{}); err != nil { + return err + } + if err := view.GetRegistry(sp).RegisterResponder(&RequestTxStatusResponderView{}, &RequestTxStatusView{}); err != nil { + return err + } + if err := view.GetRegistry(sp).RegisterResponder(&RequestSpentTokensResponderView{}, &RequestSpentTokensView{}); err != nil { + return err + } + if err := view.GetRegistry(sp).RegisterResponder(&RequestQueryTokensResponderView{}, &RequestQueryTokensView{}); err != nil { + return err + } return nil } diff --git a/token/services/selector/mailman/mailman_test.go b/token/services/selector/mailman/mailman_test.go index 6ce4ee8ed..1ef9d60c0 100644 --- a/token/services/selector/mailman/mailman_test.go +++ b/token/services/selector/mailman/mailman_test.go @@ -59,7 +59,7 @@ func TestMail(t *testing.T) { } func setupKVS() *testutils.MockQueryService { - wallet := &token2.Owner{Raw: []byte(fmt.Sprintf("wallet0"))} + wallet := &token2.Owner{Raw: []byte("wallet0")} qs := testutils.NewMockQueryService() for i := 0; i < NumTokens; i++ {