Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions crypto/address.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,14 @@ func ValidateAddress(address string) (bool, error) {
_, err := AddressToBytes(address)
return err == nil, err
}

func isChecksumValidAddress(address string) bool {
if _, err := AddressToBytes(address); err != nil {
return false
}
body := address[2:]
if body == strings.ToLower(body) || body == strings.ToUpper(body) {
return true
}
return body == EIP55Checksum(body)
}
8 changes: 4 additions & 4 deletions crypto/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ func BuildUnvote() *Transaction {
return transaction
}

func BuildValidatorRegistration(validatorPassphrase string, stake *big.Int) (*Transaction, error) {
pop, err := FromMnemonic(validatorPassphrase)
func BuildValidatorRegistration(validatorPassphrase string, registrantAddress string, stake *big.Int) (*Transaction, error) {
pop, err := FromMnemonic(validatorPassphrase, registrantAddress)
if err != nil {
return nil, err
}
Expand All @@ -72,8 +72,8 @@ func BuildValidatorRegistration(validatorPassphrase string, stake *big.Int) (*Tr
return transaction, nil
}

func BuildValidatorUpdate(validatorPassphrase string) (*Transaction, error) {
pop, err := FromMnemonic(validatorPassphrase)
func BuildValidatorUpdate(validatorPassphrase string, registrantAddress string) (*Transaction, error) {
pop, err := FromMnemonic(validatorPassphrase, registrantAddress)
if err != nil {
return nil, err
}
Expand Down
7 changes: 4 additions & 3 deletions crypto/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,15 +79,16 @@ func TestBuildUnvoteRoundTrip(t *testing.T) {

const (
validatorPassphraseFixture = "gold favorite math anchor detect march purpose such sausage crucial reform novel connect misery update episode invite salute barely garbage exclude winner visa cruise"
validatorRegistrantFixture = "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd"
validatorPassphraseFixturePublicKey = "a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496"
validatorPassphraseFixtureProofOfPossession = "a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe"
validatorPassphraseFixtureProofOfPossession = "8dff1b303bfacacb2eb716892b79123b256314d8fc91635aae307f0fd7faf58019bba25c494b38eb1adccd91f49923ef00e39947932d7edffe710c48b9ab61ad4a9bd48f41f9babcfdd5c88bf3ad74c4d70d091a407310297b1dc4bc84ec6d5f"
)

func TestBuildValidatorRegistrationRoundTrip(t *testing.T) {
assert := assert.New(t)
require := require.New(t)

transaction, err := BuildValidatorRegistration(validatorPassphraseFixture, big.NewInt(2_500_000_000))
transaction, err := BuildValidatorRegistration(validatorPassphraseFixture, validatorRegistrantFixture, big.NewInt(2_500_000_000))
require.NoError(err)

assert.Equal(validatorPassphraseFixturePublicKey, transaction.ValidatorPublicKey)
Expand All @@ -106,7 +107,7 @@ func TestBuildValidatorUpdateRoundTrip(t *testing.T) {
assert := assert.New(t)
require := require.New(t)

transaction, err := BuildValidatorUpdate(validatorPassphraseFixture)
transaction, err := BuildValidatorUpdate(validatorPassphraseFixture, validatorRegistrantFixture)
require.NoError(err)

assert.Equal(validatorPassphraseFixturePublicKey, transaction.ValidatorPublicKey)
Expand Down
2 changes: 2 additions & 0 deletions crypto/fixtures.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ type TestingTransactionFixture struct {

type BLSMultiLangKeyFixture struct {
Mnemonic string `json:"mnemonic"`
Address string `json:"address"`
ChainId int `json:"chainId"`
ValidatorPrivateKey string `json:"validatorPrivateKey"`
ValidatorPublicKey string `json:"validatorPublicKey"`
ValidatorPop string `json:"validatorPop"`
Expand Down
516 changes: 308 additions & 208 deletions crypto/fixtures/bls_multi_lang.json

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions crypto/fixtures/transactions/validator_registration.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
"gasLimit": "200000",
"to": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1",
"value": "0",
"data": "226f2645000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe",
"data": "226f2645000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be4960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000608dff1b303bfacacb2eb716892b79123b256314d8fc91635aae307f0fd7faf58019bba25c494b38eb1adccd91f49923ef00e39947932d7edffe710c48b9ab61ad4a9bd48f41f9babcfdd5c88bf3ad74c4d70d091a407310297b1dc4bc84ec6d5f",
"network": 11812,
"v": 1,
"r": "2ac3550cae0c7749e131b482ea3c5a5d4ca66f4b84e54861ab86cd68340f50a1",
"s": "17101f0c0b91c713db6f79c1aa95c83a2cf7a6c81085692af8526b7b755d5692",
"r": "ea221e5359e4c2dc58d5ae94663596f57d36b4de48588b68866014605382bfcc",
"s": "79cdc46c61665218d9d8320cd863f697ddf98676c49393ef9ca104b154d8cc0d",
"senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
"from": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
"hash": "cc4331ec856b588436e8ba3de8b04175b4537fbe1cc4dd6a6e8a1f92788b206b"
"hash": "70cb48df84bc18a9c83f56cd013ae4179af24ed77aca00c3530bb3b5e790cc6d"
},
"serialized": "f9018d0185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b90124226f2645000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe825c6ca02ac3550cae0c7749e131b482ea3c5a5d4ca66f4b84e54861ab86cd68340f50a1a017101f0c0b91c713db6f79c1aa95c83a2cf7a6c81085692af8526b7b755d5692"
"serialized": "f9018d0185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b90124226f2645000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be4960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000608dff1b303bfacacb2eb716892b79123b256314d8fc91635aae307f0fd7faf58019bba25c494b38eb1adccd91f49923ef00e39947932d7edffe710c48b9ab61ad4a9bd48f41f9babcfdd5c88bf3ad74c4d70d091a407310297b1dc4bc84ec6d5f825c6ca0ea221e5359e4c2dc58d5ae94663596f57d36b4de48588b68866014605382bfcca079cdc46c61665218d9d8320cd863f697ddf98676c49393ef9ca104b154d8cc0d"
}
10 changes: 5 additions & 5 deletions crypto/fixtures/transactions/validator_update.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
"gasLimit": "200000",
"to": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1",
"value": "0",
"data": "8f062626000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe",
"data": "8f062626000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be4960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000608dff1b303bfacacb2eb716892b79123b256314d8fc91635aae307f0fd7faf58019bba25c494b38eb1adccd91f49923ef00e39947932d7edffe710c48b9ab61ad4a9bd48f41f9babcfdd5c88bf3ad74c4d70d091a407310297b1dc4bc84ec6d5f",
"network": 11812,
"v": 0,
"r": "5500089b0b0afbf2a638d7fab985d8def9e44c0087859f6e5e0561e37dccc487",
"s": "219b047c62e0d94b3e834085dc0cd6b5f12c6f27ab058e949dec82f24f29b4fd",
"r": "65d33208546683e1b15a5838e75d6e918d6a0b6a6af249479b1364a3de1c1c16",
"s": "77180f51d14a00eb92c7296aaf31d70ca82ec961f0a0e9c34069ce1d0a278622",
"senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d",
"from": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd",
"hash": "142c471a038d69b7ae7d18c83efa767a16915dc750a380966f50959beec9f9ea"
"hash": "7e84d174ead70741b92adfc3427dd612b70ecd57e8ffe69462f96670f5607be1"
},
"serialized": "f9018d0185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b901248f062626000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe825c6ba05500089b0b0afbf2a638d7fab985d8def9e44c0087859f6e5e0561e37dccc487a0219b047c62e0d94b3e834085dc0cd6b5f12c6f27ab058e949dec82f24f29b4fd"
"serialized": "f9018d0185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b901248f062626000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be4960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000608dff1b303bfacacb2eb716892b79123b256314d8fc91635aae307f0fd7faf58019bba25c494b38eb1adccd91f49923ef00e39947932d7edffe710c48b9ab61ad4a9bd48f41f9babcfdd5c88bf3ad74c4d70d091a407310297b1dc4bc84ec6d5f825c6ba065d33208546683e1b15a5838e75d6e918d6a0b6a6af249479b1364a3de1c1c16a077180f51d14a00eb92c7296aaf31d70ca82ec961f0a0e9c34069ce1d0a278622"
}
23 changes: 18 additions & 5 deletions crypto/proof_of_possession.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@ package crypto
import (
"encoding/hex"
"errors"
"fmt"
"math/big"
"strings"

blst "github.com/supranational/blst/bindings/go"
"github.com/tyler-smith/go-bip39"
)

const popDST = "BLS_POP_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"
const popDST = "MAINSAIL_BLS_POP_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"

var ErrInvalidProofOfPossession = errors.New("crypto: invalid proof of possession")

type ProofOfPossessionResult struct {
PK []byte
Expand All @@ -26,19 +30,28 @@ func DeriveBlsPublicKey(passphrase string) string {
return hex.EncodeToString(pk.Compress())
}

func BuildProofOfPossession(secretKeyBytes []byte) (*ProofOfPossessionResult, error) {
func BuildProofOfPossession(secretKeyBytes []byte, registrantAddress string) (*ProofOfPossessionResult, error) {
if !isChecksumValidAddress(registrantAddress) {
return nil, fmt.Errorf("%w: invalid registrant address %q", ErrInvalidProofOfPossession, registrantAddress)
}
registrantBytes, _ := AddressToBytes(registrantAddress)

sk := new(blst.SecretKey)
if sk.Deserialize(secretKeyBytes) == nil {
return nil, errors.New("invalid secret key bytes")
}
pk := new(blst.P1Affine).From(sk)
pkBytes := pk.Compress()
sig := new(blst.P2Affine).Sign(sk, pkBytes, []byte(popDST))

chainId := abiPadWordLeft(big.NewInt(int64(GetNetwork().ChainId)).Bytes())
message := append(append(chainId, registrantBytes...), pkBytes...)

sig := new(blst.P2Affine).Sign(sk, message, []byte(popDST))
return &ProofOfPossessionResult{PK: pkBytes, POP: sig.Compress()}, nil
}

func FromMnemonic(passphrase string) (*ProofOfPossessionResult, error) {
return BuildProofOfPossession(DeriveBlsPrivateKey(passphrase))
func FromMnemonic(passphrase string, registrantAddress string) (*ProofOfPossessionResult, error) {
return BuildProofOfPossession(DeriveBlsPrivateKey(passphrase), registrantAddress)
}

// Ideographic spaces (U+3000, used to separate words in the Japanese BIP-39
Expand Down
58 changes: 52 additions & 6 deletions crypto/proof_of_possession_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,82 @@ package crypto
import (
"encoding/hex"
"fmt"
"math/big"
"strings"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
blst "github.com/supranational/blst/bindings/go"
)

const (
popTestSecretKeyAHex = "67d53f170b908cabb9eb326c3c337762d59289a8fec79f7bc9254b584b73265c"
popTestSecretKeyBHex = "3325023a5e4e0069558c5bd9eb7eca78b4f4c7711b9b231d9263a8edc33bc510"
popTestRegistrant = "0x75545540230d5c3BEf023202d23CB74cFA723376"
popTestPassphrase = "peasant list dentist thrive guide uncle announce city energy artist basket divert stool glow eternal stove length gun action slice type labor aunt unlock"

popTestExpectedPublicKeyA = "a7e75af9dd4d868a41ad2f5a5b021d653e31084261724fb40ae2f1b1c31c778d3b9464502d599cf6720723ec5c68b59d"
popTestExpectedProofA = "878ad02e1f215d40722bd77a0148adb8dfaad4514157600a0a926cfc58589fa4e79d3d4d579cc4149237b8100efdcff110dd2a251c52543539d499c8f24b142da66d1dc19ec44b3d9c3f71112b2705e5557f932a36bd9cd9b3544ab0d9e6a677"
popTestExpectedProofA = "a892e94d8ed6d0fe8792dcb31b7c5116a7d138ad4bbbd044780a7c314e86673e783850121dc34d0edfa2a2560c2f30a402f4fa5106ff71d5c69bc3027210ef90b3d3ae0a19ffc9f554b37aca72f3bb25788c3177514d94e041441ba9d029b3ba"
popTestExpectedMnemonicPublicKey = "a3b93d0149c9e0ee8c2e734b641d313040b8901fcddbf61a018ae2a4633da49f9b169c0bb6653dee4cdd7dac2631a935"
)

func TestBuildProofOfPossessionDiffersPerSecretKey(t *testing.T) {
a, err := BuildProofOfPossession(HexDecode(popTestSecretKeyAHex))
a, err := BuildProofOfPossession(HexDecode(popTestSecretKeyAHex), popTestRegistrant)
require.NoError(t, err)
b, err := BuildProofOfPossession(HexDecode(popTestSecretKeyBHex))
b, err := BuildProofOfPossession(HexDecode(popTestSecretKeyBHex), popTestRegistrant)
require.NoError(t, err)

assert.NotEqual(t, a.PK, b.PK)
assert.NotEqual(t, a.POP, b.POP)
}

func TestBuildProofOfPossessionMatchesPinnedVector(t *testing.T) {
result, err := BuildProofOfPossession(HexDecode(popTestSecretKeyAHex))
previous := CONFIG_NETWORK
SetNetwork(&Network{ChainId: 10_000})
t.Cleanup(func() { SetNetwork(previous) })

result, err := BuildProofOfPossession(HexDecode(popTestSecretKeyAHex), popTestRegistrant)
require.NoError(t, err)

assert.Equal(t, popTestExpectedPublicKeyA, hex.EncodeToString(result.PK))
assert.Equal(t, popTestExpectedProofA, hex.EncodeToString(result.POP))
}

func TestBuildProofOfPossessionBindsChainIdAndRegistrant(t *testing.T) {
result, err := BuildProofOfPossession(HexDecode(popTestSecretKeyAHex), popTestRegistrant)
require.NoError(t, err)

pk := new(blst.P1Affine).Uncompress(result.PK)
pop := new(blst.P2Affine).Uncompress(result.POP)
verifies := func(chainId int, registrant string) bool {
message := abiPadWordLeft(big.NewInt(int64(chainId)).Bytes())
message = append(message, HexDecode(registrant[2:])...)
message = append(message, result.PK...)
return pop.Verify(true, pk, true, message, []byte(popDST))
}

chainId := GetNetwork().ChainId
assert.True(t, verifies(chainId, popTestRegistrant))
assert.False(t, verifies(chainId+1, popTestRegistrant))
assert.False(t, verifies(chainId, "0xBd6F65c58A46427AF4B257cBE231D0eD69eD5508"))
}

func TestBuildProofOfPossessionRejectsInvalidRegistrant(t *testing.T) {
cases := map[string]string{
"malformed": "0x1234",
"no 0x prefix": "75545540230d5c3BEf023202d23CB74cFA723376",
"wrong checksum": "0x75545540230d5c3bEf023202d23CB74cFA723376",
}

for name, registrant := range cases {
t.Run(name, func(t *testing.T) {
_, err := BuildProofOfPossession(HexDecode(popTestSecretKeyAHex), registrant)
assert.ErrorIs(t, err, ErrInvalidProofOfPossession)
})
}
}

func TestBuildProofOfPossessionRejectsInvalidSecretKeys(t *testing.T) {
cases := map[string][]byte{
"31 bytes": make([]byte, 31),
Expand All @@ -48,7 +89,7 @@ func TestBuildProofOfPossessionRejectsInvalidSecretKeys(t *testing.T) {

for name, secretKeyBytes := range cases {
t.Run(name, func(t *testing.T) {
_, err := BuildProofOfPossession(secretKeyBytes)
_, err := BuildProofOfPossession(secretKeyBytes, popTestRegistrant)
assert.Error(t, err)
})
}
Expand All @@ -62,6 +103,9 @@ func TestFromMnemonicMultiLanguage(t *testing.T) {
fixtures := GetBLSMultiLangKeysFixture()
require.NotEmpty(t, fixtures)

previous := CONFIG_NETWORK
t.Cleanup(func() { SetNetwork(previous) })

for lang, vectors := range fixtures {
for i, vector := range vectors {
t.Run(fmt.Sprintf("%s#%d", lang, i), func(t *testing.T) {
Expand All @@ -70,7 +114,9 @@ func TestFromMnemonicMultiLanguage(t *testing.T) {

assert.Equal(vector.ValidatorPrivateKey, hex.EncodeToString(DeriveBlsPrivateKey(vector.Mnemonic)))

result, err := FromMnemonic(vector.Mnemonic)
SetNetwork(&Network{ChainId: vector.ChainId})

result, err := FromMnemonic(vector.Mnemonic, vector.Address)
require.NoError(err)

assert.Equal(strings.TrimPrefix(vector.ValidatorPublicKey, "0x"), hex.EncodeToString(result.PK))
Expand Down
8 changes: 4 additions & 4 deletions crypto/transaction_data_encoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@ func EncodeUnvoteData() []byte {
return AbiEncodeFunctionCall(AbiSignatureUnvote)
}

func EncodeValidatorRegistrationData(validatorPassphrase string) ([]byte, error) {
pop, err := FromMnemonic(validatorPassphrase)
func EncodeValidatorRegistrationData(validatorPassphrase string, registrantAddress string) ([]byte, error) {
pop, err := FromMnemonic(validatorPassphrase, registrantAddress)
if err != nil {
return nil, err
}
return AbiEncodeFunctionCall(AbiSignatureRegisterValidator, AbiBytes(pop.PK), AbiBytes(pop.POP)), nil
}

func EncodeValidatorUpdateData(validatorPassphrase string) ([]byte, error) {
pop, err := FromMnemonic(validatorPassphrase)
func EncodeValidatorUpdateData(validatorPassphrase string, registrantAddress string) ([]byte, error) {
pop, err := FromMnemonic(validatorPassphrase, registrantAddress)
if err != nil {
return nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions crypto/transaction_data_encoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func TestEncodeDataMatchesFixtures(t *testing.T) {
require := require.New(t)

fixture := GetTransactionFixture("validator_registration")
data, err := EncodeValidatorRegistrationData(validatorPassphraseFixture)
data, err := EncodeValidatorRegistrationData(validatorPassphraseFixture, validatorRegistrantFixture)
require.NoError(err)
assert.Equal(HexDecode(fixture.Data.Data), data)
})
Expand All @@ -42,7 +42,7 @@ func TestEncodeDataMatchesFixtures(t *testing.T) {
require := require.New(t)

fixture := GetTransactionFixture("validator_update")
data, err := EncodeValidatorUpdateData(validatorPassphraseFixture)
data, err := EncodeValidatorUpdateData(validatorPassphraseFixture, validatorRegistrantFixture)
require.NoError(err)
assert.Equal(HexDecode(fixture.Data.Data), data)
})
Expand Down
Loading