Skip to content

Commit 94e8d18

Browse files
fix: contstuction payloads (#190)
* add:system tests * add: go.mod * update: rename send_test * update: own go mod * block tests * add: accounts, mempool and network tests * some construction endpoints * add: system-test workflow * fix: lint * update: workflows * fix: lint * fix: system tests * fix: makefile rosetta-cli * fix: payloads get signers * add: payloads systemtest * lint :) * changelog + rabbit * fix: package name
1 parent 9b56e7a commit 94e8d18

15 files changed

Lines changed: 97 additions & 31 deletions

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ Ref: https://keepachangelog.com/en/1.0.0/
4545
* [180](https://github.com/cosmos/rosetta/pull/180) Update to cosmos-sdk v0.52.0-rc.1.
4646
* [180](https://github.com/cosmos/rosetta/pull/180) Added bech32 prefix flag.
4747

48+
### Bug Fixes
49+
50+
* [#190](https://github.com/cosmos/rosetta/pull/190) Fixed construction payloads to properly handle transaction signers.
51+
4852
## [v0.50.11](https://github.com/cosmos/rosetta/releases/tag/v0.50.11) 2024-12-19
4953

5054
### Improvements

client_online.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func NewClient(cfg *Config) (*Client, error) {
9797
bank: nil,
9898
tmRPC: nil,
9999
version: fmt.Sprintf("%s/%s", info.AppName, v),
100-
converter: NewConverter(cfg.Codec, cfg.InterfaceRegistry, txConfig),
100+
converter: NewConverter(cfg.Codec, cfg.InterfaceRegistry, txConfig, address.NewBech32Codec(cfg.Bech32Prefix)),
101101
}, nil
102102
}
103103

converter.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
secp "github.com/decred/dcrd/dcrec/secp256k1/v4"
1717

1818
signingv1beta1 "cosmossdk.io/api/cosmos/tx/signing/v1beta1"
19+
"cosmossdk.io/core/address"
1920
sdkmath "cosmossdk.io/math"
2021
banktypes "cosmossdk.io/x/bank/types"
2122

@@ -107,9 +108,10 @@ type converter struct {
107108
bytesToSign func(tx authsigning.Tx, signerData authsigning.SignerData) (b []byte, err error)
108109
ir codectypes.InterfaceRegistry
109110
cdc *codec.ProtoCodec
111+
ac address.Codec
110112
}
111113

112-
func NewConverter(cdc *codec.ProtoCodec, ir codectypes.InterfaceRegistry, cfg sdkclient.TxConfig) Converter {
114+
func NewConverter(cdc *codec.ProtoCodec, ir codectypes.InterfaceRegistry, cfg sdkclient.TxConfig, ac address.Codec) Converter {
113115
return converter{
114116
newTxBuilder: cfg.NewTxBuilder,
115117
txBuilderFromTx: cfg.WrapTxBuilder,
@@ -131,6 +133,7 @@ func NewConverter(cdc *codec.ProtoCodec, ir codectypes.InterfaceRegistry, cfg sd
131133
},
132134
ir: ir,
133135
cdc: cdc,
136+
ac: ac,
134137
}
135138
}
136139

@@ -677,7 +680,7 @@ func (c converter) SigningComponents(tx authsigning.Tx, metadata *ConstructionMe
677680
return nil, nil, crgerrs.WrapError(crgerrs.ErrConverter, fmt.Sprintf("getting signers v2 from tx %s", err.Error()))
678681
}
679682

680-
signers, err := tx.GetSignaturesV2()
683+
signers, err := tx.GetSigners()
681684
if err != nil {
682685
return nil, nil, crgerrs.WrapError(crgerrs.ErrConverter, fmt.Sprintf("getting signers v2 from tx %s", err.Error()))
683686
}
@@ -707,18 +710,23 @@ func (c converter) SigningComponents(tx authsigning.Tx, metadata *ConstructionMe
707710
// by checking if the signer at index i matches the pubkey at index
708711
pubKey, err := c.ToSDK().PubKey(rosPubKeys[0])
709712
if err != nil {
710-
return nil, nil, crgerrs.WrapError(crgerrs.ErrConverter, fmt.Sprintf("while setting signatures %s", err.Error()))
713+
return nil, nil, crgerrs.WrapError(crgerrs.ErrConverter, fmt.Sprintf("while checking pubkey %s", err.Error()))
711714
}
712-
if !bytes.Equal(pubKey.Address().Bytes(), signer.PubKey.Address()) {
715+
if !bytes.Equal(pubKey.Address().Bytes(), signer) {
713716
return nil, nil, crgerrs.WrapError(
714717
crgerrs.ErrBadArgument,
715718
fmt.Sprintf("public key at index %d does not match the expected transaction signer: %X <-> %X", i, rosPubKeys[i].Bytes, signer),
716719
)
717720
}
718721

722+
addr, err := c.ac.BytesToString(signer)
723+
if err != nil {
724+
return nil, nil, crgerrs.WrapError(crgerrs.ErrConverter, fmt.Sprintf("while converting to bech32 address: %s", err.Error()))
725+
}
726+
719727
// set the signer data
720728
signerData := authsigning.SignerData{
721-
Address: string(signer.PubKey.Address()),
729+
Address: addr,
722730
ChainID: metadata.ChainID,
723731
AccountNumber: metadata.SignersData[i].AccountNumber,
724732
Sequence: metadata.SignersData[i].Sequence,
@@ -731,11 +739,8 @@ func (c converter) SigningComponents(tx authsigning.Tx, metadata *ConstructionMe
731739
return nil, nil, crgerrs.WrapError(crgerrs.ErrUnknown, fmt.Sprintf("unable to sign tx: %s", err.Error()))
732740
}
733741

734-
// set payload
735-
signerAddress := sdk.AccAddress(signer.PubKey.Address()).String()
736-
737742
payloadsToSign[i] = &rosettatypes.SigningPayload{
738-
AccountIdentifier: &rosettatypes.AccountIdentifier{Address: signerAddress},
743+
AccountIdentifier: &rosettatypes.AccountIdentifier{Address: addr},
739744
Bytes: signBytes,
740745
SignatureType: rosettatypes.Ecdsa,
741746
}

converter_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func (s *ConverterTestSuite) SetupTest() {
4444
// instantiate converter
4545
cdc, ir := rosetta.MakeCodec()
4646
txConfig := authtx.NewTxConfig(cdc, address.NewBech32Codec("cosmos"), address.NewBech32Codec("cosmosvaloper"), authtx.DefaultSignModes)
47-
s.c = rosetta.NewConverter(cdc, ir, txConfig)
47+
s.c = rosetta.NewConverter(cdc, ir, txConfig, address.NewBech32Codec("cosmos"))
4848
// add utils
4949
s.ir = ir
5050
s.cdc = cdc

tests/systemtests/accounts_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//go:build system_test
22

3-
package systemtests
3+
package rossettaSystemTests
44

55
import (
66
"testing"

tests/systemtests/block_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//go:build system_test
22

3-
package systemtests
3+
package rossettaSystemTests
44

55
import (
66
"testing"

tests/systemtests/construction_test.go

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
//go:build system_test
22

3-
package systemtests
3+
package rossettaSystemTests
44

55
import (
66
"encoding/base64"
77
"encoding/hex"
8+
"fmt"
89
"strings"
910
"testing"
1011

@@ -25,12 +26,13 @@ func TestDerive(t *testing.T) {
2526
rosettaRest := newRestClient(rosetta)
2627

2728
pubKey := secp256k1.GenPrivKey().PubKey()
28-
addr, err := address.NewBech32Codec("cosmos").BytesToString(pubKey.Address().Bytes())
29-
assert.NoError(t, err)
30-
3129
hexPk := strings.Split(pubKey.String(), "{")[1]
30+
3231
res, err := rosettaRest.constructionDerive(hexPk[:len(hexPk)-1])
3332
assert.NoError(t, err)
33+
34+
addr, err := address.NewBech32Codec("cosmos").BytesToString(pubKey.Address().Bytes())
35+
assert.NoError(t, err)
3436
assert.Equal(t, addr, gjson.GetBytes(res, "address").String())
3537
}
3638

@@ -82,3 +84,30 @@ func TestMetadata(t *testing.T) {
8284
assert.Equal(t, gjson.GetBytes(res, "metadata.gas_price").String(), "123uatom")
8385
assert.Greater(t, gjson.GetBytes(res, "suggested_fee.0.value").Int(), int64(0))
8486
}
87+
88+
func TestPayloads(t *testing.T) {
89+
sut.ResetChain(t)
90+
sut.StartChain(t)
91+
92+
rosetta.restart(t)
93+
rosettaRest := newRestClient(rosetta)
94+
95+
cli := systemtests.NewCLIWrapper(t, sut, verbose)
96+
addr := cli.GetKeyAddr("node0")
97+
bz, err := base64.StdEncoding.DecodeString(cli.GetPubKeyByCustomField(addr, "address"))
98+
assert.NoError(t, err)
99+
100+
pk := secp256k1.PubKey{Key: bz}
101+
hexPk := strings.Split(pk.String(), "{")[1]
102+
hexPk = hexPk[:len(hexPk)-1]
103+
104+
op := operation{
105+
msgType: "/cosmos.bank.v1beta1.MsgSend",
106+
metadata: fmt.Sprintf(`{"from_address": "%s", "to_address": "%s", "amount":[{"amount":"123", "denom":"stake"}]}`, addr, cli.AddKey("to_address")),
107+
}
108+
109+
res, err := rosettaRest.constructionPayloads(`"signer_data":[{"account_number":1, "sequence": 0}]`, hexPk, op)
110+
assert.NoError(t, err)
111+
assert.NotEmpty(t, gjson.GetBytes(res, "unsigned_transaction"))
112+
assert.Equal(t, gjson.GetBytes(res, "payloads.0.address").String(), addr)
113+
}

tests/systemtests/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module rossetaSystemTests
1+
module rossettaSystemTests
22

33
go 1.23.1
44

tests/systemtests/main_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//go:build system_test
22

3-
package systemtests
3+
package rossettaSystemTests
44

55
import (
66
"testing"

tests/systemtests/mempool_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//go:build system_test
22

3-
package systemtests
3+
package rossettaSystemTests
44

55
import (
66
"testing"

0 commit comments

Comments
 (0)