forked from cerc-io/laconicd-deprecated
Compare commits
38
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa938e76bb | ||
|
|
3ffff8d992 | ||
|
|
5b25f5df99 | ||
|
|
bbb6d2a7ab | ||
|
|
656b8dc79b | ||
|
|
f827ea46b8 | ||
|
|
5cd07d9104 | ||
|
|
30cbba44e7 | ||
|
|
b59eb6878d | ||
|
|
b90bb05b3f | ||
|
|
beb1ad2df7 | ||
|
|
6025fadc71 | ||
|
|
fa406be65f | ||
|
|
e18541523d | ||
|
|
4d5568bf83 | ||
|
|
ff10aac7d7 | ||
|
|
38c77c10f6 | ||
|
|
bd04a6307e | ||
|
|
6e272334e4 | ||
|
|
bf1670be78 | ||
|
|
67208b08af | ||
|
|
2e986c4d5e | ||
|
|
e38ed67657 | ||
|
|
145d52f92e | ||
|
|
4ba723a384 | ||
|
|
420042b9de | ||
|
|
d44ab22d87 | ||
|
|
66cf0f758c | ||
|
|
c3774a3b96 | ||
|
|
39038980cc | ||
|
|
26300b0738 | ||
|
|
021ab7df1f | ||
|
|
6eeed3de91 | ||
|
|
9e91a70f31 | ||
|
|
961f0f737a | ||
|
|
930cca939f | ||
|
|
e8fe95114a | ||
|
|
82b2c32575 |
+1
-1
@@ -19,7 +19,7 @@ test/
|
|||||||
tests/
|
tests/
|
||||||
*_test.go
|
*_test.go
|
||||||
|
|
||||||
# false positive; TODO: https://github.com/cerc-io/laconicd/issues/104
|
# false positive
|
||||||
testutil/network/network.go
|
testutil/network/network.go
|
||||||
|
|
||||||
# Semgrep rules folder
|
# Semgrep rules folder
|
||||||
|
|||||||
+48
-98
@@ -2,7 +2,6 @@ package eip712
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/base64"
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/big"
|
"math/big"
|
||||||
@@ -10,15 +9,17 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
errorsmod "cosmossdk.io/errors"
|
|
||||||
sdkmath "cosmossdk.io/math"
|
sdkmath "cosmossdk.io/math"
|
||||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
|
||||||
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
||||||
errortypes "github.com/cosmos/cosmos-sdk/types/errors"
|
|
||||||
"golang.org/x/text/cases"
|
"golang.org/x/text/cases"
|
||||||
"golang.org/x/text/language"
|
"golang.org/x/text/language"
|
||||||
|
|
||||||
|
errorsmod "cosmossdk.io/errors"
|
||||||
|
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
errortypes "github.com/cosmos/cosmos-sdk/types/errors"
|
||||||
|
|
||||||
|
registry "github.com/cerc-io/laconicd/x/registry/types"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/math"
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
"github.com/ethereum/go-ethereum/signer/core/apitypes"
|
"github.com/ethereum/go-ethereum/signer/core/apitypes"
|
||||||
@@ -33,6 +34,24 @@ func WrapTxToTypedData(
|
|||||||
data []byte,
|
data []byte,
|
||||||
feeDelegation *FeeDelegationOptions,
|
feeDelegation *FeeDelegationOptions,
|
||||||
) (apitypes.TypedData, error) {
|
) (apitypes.TypedData, error) {
|
||||||
|
txData := make(map[string]interface{})
|
||||||
|
|
||||||
|
if err := json.Unmarshal(data, &txData); err != nil {
|
||||||
|
return apitypes.TypedData{}, errorsmod.Wrap(errortypes.ErrJSONUnmarshal, "failed to JSON unmarshal data")
|
||||||
|
}
|
||||||
|
|
||||||
|
if txData["msgs"].([]interface{})[0].(map[string]interface{})["value"].(map[string]interface{})["payload"] != nil {
|
||||||
|
setRecordMsg := msg.(*registry.MsgSetRecord)
|
||||||
|
var attr []interface{}
|
||||||
|
for _, b := range setRecordMsg.Payload.Record.Attributes.Value {
|
||||||
|
attr = append(attr, fmt.Sprintf("%v", b))
|
||||||
|
}
|
||||||
|
|
||||||
|
txData["msgs"].([]interface{})[0].(map[string]interface{})["value"].(map[string]interface{})["payload"].(map[string]interface{})["record"].(map[string]interface{})["attributes"] = map[string]interface{}{ //nolint:lll
|
||||||
|
"type_url": setRecordMsg.Payload.Record.Attributes.TypeUrl,
|
||||||
|
"value": attr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
domain := apitypes.TypedDataDomain{
|
domain := apitypes.TypedDataDomain{
|
||||||
Name: "Cosmos Web3",
|
Name: "Cosmos Web3",
|
||||||
@@ -47,13 +66,22 @@ func WrapTxToTypedData(
|
|||||||
return apitypes.TypedData{}, err
|
return apitypes.TypedData{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
txData := make(map[string]interface{})
|
if msgTypes["TypePayloadRecord"] != nil {
|
||||||
if err := json.Unmarshal(data, &txData); err != nil {
|
msgTypes["TypePayloadRecord"] = []apitypes.Type{
|
||||||
return apitypes.TypedData{}, errorsmod.Wrap(errortypes.ErrJSONUnmarshal, "failed to JSON unmarshal data")
|
{Name: "id", Type: "string"},
|
||||||
|
{Name: "bond_id", Type: "string"},
|
||||||
|
{Name: "create_time", Type: "string"},
|
||||||
|
{Name: "expiry_time", Type: "string"},
|
||||||
|
{Name: "deleted", Type: "bool"},
|
||||||
|
{Name: "attributes", Type: "TypePayloadRecordAttributes"},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if msgTypes["TypePayloadRecordAttributes"] != nil {
|
||||||
if err := patchTxData(txData, msgTypes, "Tx"); err != nil {
|
msgTypes["TypePayloadRecordAttributes"] = []apitypes.Type{
|
||||||
return apitypes.TypedData{}, errorsmod.Wrap(errortypes.ErrJSONUnmarshal, "failed to patch JSON data")
|
{Name: "type_url", Type: "string"},
|
||||||
|
{Name: "value", Type: "uint8[]"},
|
||||||
|
}
|
||||||
|
delete(msgTypes, "TypePayloadRecordAttributesValue")
|
||||||
}
|
}
|
||||||
|
|
||||||
if feeDelegation != nil {
|
if feeDelegation != nil {
|
||||||
@@ -292,15 +320,10 @@ func traverseFields(
|
|||||||
ethTyp := typToEth(fieldType)
|
ethTyp := typToEth(fieldType)
|
||||||
if len(ethTyp) > 0 {
|
if len(ethTyp) > 0 {
|
||||||
// Support array of uint64
|
// Support array of uint64
|
||||||
if isCollection {
|
if isCollection && fieldType.Kind() != reflect.Slice && fieldType.Kind() != reflect.Array {
|
||||||
if fieldType.Kind() != reflect.Slice && fieldType.Kind() != reflect.Array {
|
ethTyp += "[]"
|
||||||
ethTyp += "[]"
|
|
||||||
}
|
|
||||||
// convert uint8[] to bytes
|
|
||||||
if fieldType.Kind() == reflect.Uint8 {
|
|
||||||
ethTyp = "bytes"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if prefix == typeDefPrefix {
|
if prefix == typeDefPrefix {
|
||||||
typeMap[rootType] = append(typeMap[rootType], apitypes.Type{
|
typeMap[rootType] = append(typeMap[rootType], apitypes.Type{
|
||||||
Name: fieldName,
|
Name: fieldName,
|
||||||
@@ -443,13 +466,14 @@ func typToEth(typ reflect.Type) string {
|
|||||||
return "uint32"
|
return "uint32"
|
||||||
case reflect.Uint64:
|
case reflect.Uint64:
|
||||||
return "uint64"
|
return "uint64"
|
||||||
case reflect.Slice | reflect.Array:
|
case reflect.Slice:
|
||||||
// Note: this case may never be reached due to previous handling in traverseFields
|
ethName := typToEth(typ.Elem())
|
||||||
|
if len(ethName) > 0 {
|
||||||
|
return ethName + "[]"
|
||||||
|
}
|
||||||
|
case reflect.Array:
|
||||||
ethName := typToEth(typ.Elem())
|
ethName := typToEth(typ.Elem())
|
||||||
if len(ethName) > 0 {
|
if len(ethName) > 0 {
|
||||||
if ethName == "uint8" {
|
|
||||||
return "bytes"
|
|
||||||
}
|
|
||||||
return ethName + "[]"
|
return ethName + "[]"
|
||||||
}
|
}
|
||||||
case reflect.Ptr:
|
case reflect.Ptr:
|
||||||
@@ -486,77 +510,3 @@ func doRecover(err *error) {
|
|||||||
*err = fmt.Errorf("%v", r)
|
*err = fmt.Errorf("%v", r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Performs extra type conversions on JSON-decoded data accoding to the provided type definitions
|
|
||||||
// for compatibility with Geth's encoding
|
|
||||||
func patchTxData(data map[string]any, schema apitypes.Types, rootType string) error {
|
|
||||||
// Scan the data for any types that need to be converted.
|
|
||||||
// This is adapted from TypedData.EncodeData
|
|
||||||
for _, field := range schema[rootType] {
|
|
||||||
encType := field.Type
|
|
||||||
encValue := data[field.Name]
|
|
||||||
if encType[len(encType)-1:] == "]" {
|
|
||||||
arrayValue, ok := encValue.([]interface{})
|
|
||||||
if !ok {
|
|
||||||
return dataMismatchError(encType, encValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
parsedType := strings.Split(encType, "[")[0]
|
|
||||||
if schema[parsedType] != nil {
|
|
||||||
for _, item := range arrayValue {
|
|
||||||
mapValue, ok := item.(map[string]interface{})
|
|
||||||
if !ok {
|
|
||||||
return dataMismatchError(parsedType, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
err := patchTxData(mapValue, schema, parsedType)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for i, item := range arrayValue {
|
|
||||||
converted, err := handleConversion(parsedType, item)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
arrayValue[i] = converted
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if schema[encType] != nil {
|
|
||||||
mapValue, ok := encValue.(map[string]interface{})
|
|
||||||
if !ok {
|
|
||||||
return dataMismatchError(encType, encValue)
|
|
||||||
}
|
|
||||||
err := patchTxData(mapValue, schema, encType)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
converted, err := handleConversion(encType, encValue)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
data[field.Name] = converted
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleConversion(encType string, encValue any) (any, error) {
|
|
||||||
switch encType {
|
|
||||||
case "bytes":
|
|
||||||
// Protobuf encodes byte strings in base64
|
|
||||||
if v, ok := encValue.(string); ok {
|
|
||||||
return base64.StdEncoding.DecodeString(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return encValue, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// dataMismatchError generates an error for a mismatch between
|
|
||||||
// the provided type and data
|
|
||||||
func dataMismatchError(encType string, encValue any) error {
|
|
||||||
return fmt.Errorf("provided data '%v' doesn't match type '%s'", encValue, encType)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,25 +4,28 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"cosmossdk.io/math"
|
"cosmossdk.io/math"
|
||||||
registrytypes "github.com/cerc-io/laconicd/x/registry/types"
|
|
||||||
|
"github.com/cerc-io/laconicd/ethereum/eip712"
|
||||||
"github.com/cosmos/cosmos-sdk/client"
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
|
||||||
"github.com/cosmos/cosmos-sdk/simapp/params"
|
"github.com/cosmos/cosmos-sdk/simapp/params"
|
||||||
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
|
||||||
|
"github.com/cerc-io/laconicd/crypto/ethsecp256k1"
|
||||||
|
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
|
||||||
|
"github.com/cerc-io/laconicd/app"
|
||||||
|
"github.com/cerc-io/laconicd/encoding"
|
||||||
|
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||||
|
|
||||||
txtypes "github.com/cosmos/cosmos-sdk/types/tx"
|
txtypes "github.com/cosmos/cosmos-sdk/types/tx"
|
||||||
"github.com/cosmos/cosmos-sdk/types/tx/signing"
|
"github.com/cosmos/cosmos-sdk/types/tx/signing"
|
||||||
authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing"
|
authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing"
|
||||||
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
|
||||||
distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
|
distributiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
|
||||||
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
|
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
|
||||||
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
"github.com/cerc-io/laconicd/app"
|
|
||||||
"github.com/cerc-io/laconicd/crypto/ethsecp256k1"
|
|
||||||
"github.com/cerc-io/laconicd/encoding"
|
|
||||||
"github.com/cerc-io/laconicd/ethereum/eip712"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Unit tests for single-signer EIP-712 signature verification. Multi-signer verification tests are included
|
// Unit tests for single-signer EIP-712 signature verification. Multi-signer verification tests are included
|
||||||
@@ -329,54 +332,6 @@ func (suite *EIP712TestSuite) TestEIP712SignatureVerification() {
|
|||||||
sequence: 78,
|
sequence: 78,
|
||||||
expectSuccess: false,
|
expectSuccess: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
// test laconic registry messages
|
|
||||||
{
|
|
||||||
title: "Succeeds - Standard MsgSetName",
|
|
||||||
fee: txtypes.Fee{
|
|
||||||
Amount: suite.makeCoins("aphoton", math.NewInt(2000)),
|
|
||||||
GasLimit: 100000,
|
|
||||||
},
|
|
||||||
memo: "",
|
|
||||||
msgs: []sdk.Msg{
|
|
||||||
registrytypes.NewMsgSetName(
|
|
||||||
"testcrn",
|
|
||||||
"testcid",
|
|
||||||
suite.createTestAddress(),
|
|
||||||
),
|
|
||||||
},
|
|
||||||
accountNumber: 25,
|
|
||||||
sequence: 78,
|
|
||||||
expectSuccess: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Succeeds - Standard MsgSetRecord",
|
|
||||||
fee: txtypes.Fee{
|
|
||||||
Amount: suite.makeCoins("aphoton", math.NewInt(2000)),
|
|
||||||
GasLimit: 100000,
|
|
||||||
},
|
|
||||||
memo: "",
|
|
||||||
msgs: []sdk.Msg{
|
|
||||||
registrytypes.NewMsgSetRecord(
|
|
||||||
registrytypes.Payload{
|
|
||||||
Record: ®istrytypes.Record{
|
|
||||||
Attributes: []byte("test attributes"),
|
|
||||||
},
|
|
||||||
Signatures: []registrytypes.Signature{
|
|
||||||
{
|
|
||||||
Sig: "fake sig",
|
|
||||||
PubKey: "fake pubkey",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"testbondid",
|
|
||||||
suite.createTestAddress(),
|
|
||||||
),
|
|
||||||
},
|
|
||||||
accountNumber: 25,
|
|
||||||
sequence: 78,
|
|
||||||
expectSuccess: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ require (
|
|||||||
github.com/holiman/uint256 v1.2.1
|
github.com/holiman/uint256 v1.2.1
|
||||||
github.com/improbable-eng/grpc-web v0.15.0
|
github.com/improbable-eng/grpc-web v0.15.0
|
||||||
github.com/ipfs/go-cid v0.3.2
|
github.com/ipfs/go-cid v0.3.2
|
||||||
github.com/ipld/go-ipld-prime v0.19.0
|
github.com/ipld/go-ipld-prime v0.18.0
|
||||||
github.com/miguelmota/go-ethereum-hdwallet v0.1.1
|
github.com/miguelmota/go-ethereum-hdwallet v0.1.1
|
||||||
github.com/onsi/ginkgo/v2 v2.5.1
|
github.com/onsi/ginkgo/v2 v2.5.1
|
||||||
github.com/onsi/gomega v1.24.1
|
github.com/onsi/gomega v1.24.1
|
||||||
@@ -156,7 +156,7 @@ require (
|
|||||||
github.com/multiformats/go-base32 v0.0.3 // indirect
|
github.com/multiformats/go-base32 v0.0.3 // indirect
|
||||||
github.com/multiformats/go-base36 v0.1.0 // indirect
|
github.com/multiformats/go-base36 v0.1.0 // indirect
|
||||||
github.com/multiformats/go-multibase v0.0.3 // indirect
|
github.com/multiformats/go-multibase v0.0.3 // indirect
|
||||||
github.com/multiformats/go-multihash v0.2.1 // indirect
|
github.com/multiformats/go-multihash v0.2.0 // indirect
|
||||||
github.com/multiformats/go-varint v0.0.6 // indirect
|
github.com/multiformats/go-varint v0.0.6 // indirect
|
||||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||||
github.com/pelletier/go-toml v1.9.5 // indirect
|
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||||
|
|||||||
@@ -798,8 +798,8 @@ github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mq
|
|||||||
github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
|
github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po=
|
||||||
github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc=
|
github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc=
|
||||||
github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw=
|
github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw=
|
||||||
github.com/ipld/go-ipld-prime v0.19.0 h1:5axC7rJmPc17Emw6TelxGwnzALk0PdupZ2oj2roDj04=
|
github.com/ipld/go-ipld-prime v0.18.0 h1:xUk7NUBSWHEXdjiOu2sLXouFJOMs0yoYzeI5RAqhYQo=
|
||||||
github.com/ipld/go-ipld-prime v0.19.0/go.mod h1:Q9j3BaVXwaA3o5JUDNvptDDr/x8+F7FG6XJ8WI3ILg4=
|
github.com/ipld/go-ipld-prime v0.18.0/go.mod h1:735yXW548CKrLwVCYXzqx90p5deRJMVVxM9eJ4Qe+qE=
|
||||||
github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
||||||
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
|
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
|
||||||
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
|
||||||
@@ -967,9 +967,9 @@ github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ8
|
|||||||
github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
|
github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
|
||||||
github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk=
|
github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk=
|
||||||
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
|
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
|
||||||
github.com/multiformats/go-multicodec v0.6.0 h1:KhH2kSuCARyuJraYMFxrNO3DqIaYhOdS039kbhgVwpE=
|
github.com/multiformats/go-multicodec v0.5.0 h1:EgU6cBe/D7WRwQb1KmnBvU7lrcFGMggZVTPtOW9dDHs=
|
||||||
github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108=
|
github.com/multiformats/go-multihash v0.2.0 h1:oytJb9ZA1OUW0r0f9ea18GiaPOo4SXyc7p2movyUuo4=
|
||||||
github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc=
|
github.com/multiformats/go-multihash v0.2.0/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc=
|
||||||
github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY=
|
github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY=
|
||||||
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
|
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
|
|||||||
+2267
-4553
File diff suppressed because it is too large
Load Diff
+2
-5
@@ -1,3 +1,5 @@
|
|||||||
|
# .gqlgen.yml example
|
||||||
|
#
|
||||||
# Refer to https://gqlgen.com/config/
|
# Refer to https://gqlgen.com/config/
|
||||||
# for detailed .gqlgen.yml documentation.
|
# for detailed .gqlgen.yml documentation.
|
||||||
|
|
||||||
@@ -10,8 +12,3 @@ model:
|
|||||||
resolver:
|
resolver:
|
||||||
filename: resolver.go
|
filename: resolver.go
|
||||||
type: Resolver
|
type: Resolver
|
||||||
|
|
||||||
models:
|
|
||||||
Link:
|
|
||||||
model:
|
|
||||||
- github.com/cerc-io/laconicd/gql.Link
|
|
||||||
|
|||||||
+37
-70
@@ -2,10 +2,6 @@
|
|||||||
|
|
||||||
package gql
|
package gql
|
||||||
|
|
||||||
type Value interface {
|
|
||||||
IsValue()
|
|
||||||
}
|
|
||||||
|
|
||||||
type Account struct {
|
type Account struct {
|
||||||
Address string `json:"address"`
|
Address string `json:"address"`
|
||||||
PubKey *string `json:"pubKey"`
|
PubKey *string `json:"pubKey"`
|
||||||
@@ -14,17 +10,6 @@ type Account struct {
|
|||||||
Balance []*Coin `json:"balance"`
|
Balance []*Coin `json:"balance"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ArrayValue struct {
|
|
||||||
Value []Value `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ArrayValue) IsValue() {}
|
|
||||||
|
|
||||||
type Attribute struct {
|
|
||||||
Key string `json:"key"`
|
|
||||||
Value Value `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Auction struct {
|
type Auction struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
@@ -68,52 +53,21 @@ type Bond struct {
|
|||||||
Balance []*Coin `json:"balance"`
|
Balance []*Coin `json:"balance"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type BooleanValue struct {
|
|
||||||
Value bool `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (BooleanValue) IsValue() {}
|
|
||||||
|
|
||||||
type BytesValue struct {
|
|
||||||
Value string `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (BytesValue) IsValue() {}
|
|
||||||
|
|
||||||
type Coin struct {
|
type Coin struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Quantity string `json:"quantity"`
|
Quantity string `json:"quantity"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type FloatValue struct {
|
type KeyValue struct {
|
||||||
Value float64 `json:"value"`
|
Key string `json:"key"`
|
||||||
|
Value *Value `json:"value"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (FloatValue) IsValue() {}
|
|
||||||
|
|
||||||
type IntValue struct {
|
|
||||||
Value int `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (IntValue) IsValue() {}
|
|
||||||
|
|
||||||
type KeyValueInput struct {
|
type KeyValueInput struct {
|
||||||
Key string `json:"key"`
|
Key string `json:"key"`
|
||||||
Value *ValueInput `json:"value"`
|
Value *ValueInput `json:"value"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type LinkValue struct {
|
|
||||||
Value Link `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (LinkValue) IsValue() {}
|
|
||||||
|
|
||||||
type MapValue struct {
|
|
||||||
Value []*Attribute `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (MapValue) IsValue() {}
|
|
||||||
|
|
||||||
type NameRecord struct {
|
type NameRecord struct {
|
||||||
Latest *NameRecordEntry `json:"latest"`
|
Latest *NameRecordEntry `json:"latest"`
|
||||||
History []*NameRecordEntry `json:"history"`
|
History []*NameRecordEntry `json:"history"`
|
||||||
@@ -142,14 +96,22 @@ type PeerInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Record struct {
|
type Record struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
Names []string `json:"names"`
|
Names []string `json:"names"`
|
||||||
BondID string `json:"bondId"`
|
BondID string `json:"bondId"`
|
||||||
CreateTime string `json:"createTime"`
|
CreateTime string `json:"createTime"`
|
||||||
ExpiryTime string `json:"expiryTime"`
|
ExpiryTime string `json:"expiryTime"`
|
||||||
Owners []string `json:"owners"`
|
Owners []string `json:"owners"`
|
||||||
Attributes []*Attribute `json:"attributes"`
|
Attributes []*KeyValue `json:"attributes"`
|
||||||
References []*Record `json:"references"`
|
References []*Record `json:"references"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Reference struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReferenceInput struct {
|
||||||
|
ID string `json:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Status struct {
|
type Status struct {
|
||||||
@@ -163,12 +125,6 @@ type Status struct {
|
|||||||
DiskUsage string `json:"disk_usage"`
|
DiskUsage string `json:"disk_usage"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type StringValue struct {
|
|
||||||
Value string `json:"value"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (StringValue) IsValue() {}
|
|
||||||
|
|
||||||
type SyncInfo struct {
|
type SyncInfo struct {
|
||||||
LatestBlockHash string `json:"latest_block_hash"`
|
LatestBlockHash string `json:"latest_block_hash"`
|
||||||
LatestBlockHeight string `json:"latest_block_height"`
|
LatestBlockHeight string `json:"latest_block_height"`
|
||||||
@@ -182,12 +138,23 @@ type ValidatorInfo struct {
|
|||||||
ProposerPriority *string `json:"proposer_priority"`
|
ProposerPriority *string `json:"proposer_priority"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Value struct {
|
||||||
|
Null *bool `json:"null"`
|
||||||
|
Int *int `json:"int"`
|
||||||
|
Float *float64 `json:"float"`
|
||||||
|
String *string `json:"string"`
|
||||||
|
Boolean *bool `json:"boolean"`
|
||||||
|
JSON *string `json:"json"`
|
||||||
|
Reference *Reference `json:"reference"`
|
||||||
|
Values []*Value `json:"values"`
|
||||||
|
}
|
||||||
|
|
||||||
type ValueInput struct {
|
type ValueInput struct {
|
||||||
Int *int `json:"int"`
|
Null *bool `json:"null"`
|
||||||
Float *float64 `json:"float"`
|
Int *int `json:"int"`
|
||||||
String *string `json:"string"`
|
Float *float64 `json:"float"`
|
||||||
Boolean *bool `json:"boolean"`
|
String *string `json:"string"`
|
||||||
Link *Link `json:"link"`
|
Boolean *bool `json:"boolean"`
|
||||||
Array []*ValueInput `json:"array"`
|
Reference *ReferenceInput `json:"reference"`
|
||||||
Map []*KeyValueInput `json:"map"`
|
Values []*ValueInput `json:"values"`
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -121,7 +121,7 @@ func (q queryResolver) QueryRecords(ctx context.Context, attributes []*KeyValueI
|
|||||||
res, err := nsQueryClient.ListRecords(
|
res, err := nsQueryClient.ListRecords(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
®istrytypes.QueryListRecordsRequest{
|
®istrytypes.QueryListRecordsRequest{
|
||||||
Attributes: toRpcAttributes(attributes),
|
Attributes: parseRequestAttributes(attributes),
|
||||||
All: (all != nil && *all),
|
All: (all != nil && *all),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
package gql
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Represents an IPLD link. Links are generally but not necessarily implemented as CIDs
|
|
||||||
type Link string
|
|
||||||
|
|
||||||
func (l Link) String() string {
|
|
||||||
return string(l)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalGQLContext implements the graphql.ContextUnmarshaler interface
|
|
||||||
func (l *Link) UnmarshalGQLContext(_ context.Context, v interface{}) error {
|
|
||||||
s, ok := v.(string)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("Link must be a string")
|
|
||||||
}
|
|
||||||
*l = Link(s)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalGQLContext implements the graphql.ContextMarshaler interface
|
|
||||||
func (l Link) MarshalGQLContext(_ context.Context, w io.Writer) error {
|
|
||||||
encodable := map[string]string{
|
|
||||||
"/": l.String(),
|
|
||||||
}
|
|
||||||
return json.NewEncoder(w).Encode(encodable)
|
|
||||||
}
|
|
||||||
+131
-133
@@ -2,15 +2,15 @@ package gql
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt" // #nosec G702
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect" // #nosec G702
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
auctiontypes "github.com/cerc-io/laconicd/x/auction/types"
|
auctiontypes "github.com/cerc-io/laconicd/x/auction/types"
|
||||||
bondtypes "github.com/cerc-io/laconicd/x/bond/types"
|
bondtypes "github.com/cerc-io/laconicd/x/bond/types"
|
||||||
registrytypes "github.com/cerc-io/laconicd/x/registry/types"
|
registrytypes "github.com/cerc-io/laconicd/x/registry/types"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/ipld/go-ipld-prime"
|
|
||||||
"github.com/ipld/go-ipld-prime/codec/dagjson"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// OwnerAttributeName denotes the owner attribute name for a bond.
|
// OwnerAttributeName denotes the owner attribute name for a bond.
|
||||||
@@ -61,21 +61,13 @@ func getGQLRecord(ctx context.Context, resolver QueryResolver, record registryty
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
node, err := ipld.Decode(record.Attributes, dagjson.Decode)
|
recordType := record.ToRecordType()
|
||||||
if err != nil {
|
attributes, err := getAttributes(&recordType)
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if node.Kind() != ipld.Kind_Map {
|
|
||||||
return nil, fmt.Errorf("invalid record attributes")
|
|
||||||
}
|
|
||||||
|
|
||||||
var links []string
|
|
||||||
attributes, err := resolveIPLDNode(node, &links)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
references, err := resolver.GetRecordsByIds(ctx, links)
|
references, err := getReferences(ctx, resolver, &recordType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -87,96 +79,11 @@ func getGQLRecord(ctx context.Context, resolver QueryResolver, record registryty
|
|||||||
ExpiryTime: record.GetExpiryTime(),
|
ExpiryTime: record.GetExpiryTime(),
|
||||||
Owners: record.GetOwners(),
|
Owners: record.GetOwners(),
|
||||||
Names: record.GetNames(),
|
Names: record.GetNames(),
|
||||||
Attributes: attributes.(MapValue).Value,
|
Attributes: attributes,
|
||||||
References: references,
|
References: references,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func resolveIPLDNode(node ipld.Node, links *[]string) (Value, error) {
|
|
||||||
switch node.Kind() {
|
|
||||||
case ipld.Kind_Map:
|
|
||||||
var entries []*Attribute
|
|
||||||
for itr := node.MapIterator(); !itr.Done(); {
|
|
||||||
k, v, err := itr.Next()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if k.Kind() != ipld.Kind_String {
|
|
||||||
return nil, fmt.Errorf("invalid record attribute key type: %s", k.Kind())
|
|
||||||
}
|
|
||||||
s, err := k.AsString()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
val, err := resolveIPLDNode(v, links)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
entries = append(entries, &Attribute{
|
|
||||||
Key: s,
|
|
||||||
Value: val,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return MapValue{entries}, nil
|
|
||||||
case ipld.Kind_List:
|
|
||||||
var values []Value
|
|
||||||
for itr := node.ListIterator(); !itr.Done(); {
|
|
||||||
_, v, err := itr.Next()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
val, err := resolveIPLDNode(v, links)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
values = append(values, val)
|
|
||||||
}
|
|
||||||
return ArrayValue{values}, nil
|
|
||||||
case ipld.Kind_Null:
|
|
||||||
return nil, nil
|
|
||||||
case ipld.Kind_Bool:
|
|
||||||
val, err := node.AsBool()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return BooleanValue{val}, nil
|
|
||||||
case ipld.Kind_Int:
|
|
||||||
val, err := node.AsInt()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// TODO: handle bigger ints
|
|
||||||
return IntValue{int(val)}, nil
|
|
||||||
case ipld.Kind_Float:
|
|
||||||
val, err := node.AsFloat()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return FloatValue{val}, nil
|
|
||||||
case ipld.Kind_String:
|
|
||||||
val, err := node.AsString()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return StringValue{val}, nil
|
|
||||||
case ipld.Kind_Bytes:
|
|
||||||
val, err := node.AsBytes()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return BytesValue{string(val)}, nil
|
|
||||||
case ipld.Kind_Link:
|
|
||||||
val, err := node.AsLink()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
*links = append(*links, val.String())
|
|
||||||
return LinkValue{Link(val.String())}, nil
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("invalid node kind")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getGQLNameRecord(record *registrytypes.NameRecord) (*NameRecord, error) {
|
func getGQLNameRecord(record *registrytypes.NameRecord) (*NameRecord, error) {
|
||||||
if record == nil {
|
if record == nil {
|
||||||
return nil, fmt.Errorf("got nil record")
|
return nil, fmt.Errorf("got nil record")
|
||||||
@@ -256,47 +163,138 @@ func GetGQLAuction(auction *auctiontypes.Auction, bids []*auctiontypes.Bid) (*Au
|
|||||||
return &gqlAuction, nil
|
return &gqlAuction, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func toRpcValue(value *ValueInput) *registrytypes.QueryListRecordsRequest_ValueInput {
|
func getReferences(ctx context.Context, resolver QueryResolver, r *registrytypes.RecordType) ([]*Record, error) {
|
||||||
var rpcval registrytypes.QueryListRecordsRequest_ValueInput
|
ids := getIds(r.Attributes)
|
||||||
|
return resolver.GetRecordsByIds(ctx, ids)
|
||||||
switch {
|
|
||||||
case value == nil:
|
|
||||||
return nil
|
|
||||||
case value.Int != nil:
|
|
||||||
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Int{int64(*value.Int)}
|
|
||||||
case value.Float != nil:
|
|
||||||
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Float{*value.Float}
|
|
||||||
case value.String != nil:
|
|
||||||
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_String_{*value.String}
|
|
||||||
case value.Boolean != nil:
|
|
||||||
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Boolean{*value.Boolean}
|
|
||||||
case value.Link != nil:
|
|
||||||
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Link{value.Link.String()}
|
|
||||||
case value.Array != nil:
|
|
||||||
var contents registrytypes.QueryListRecordsRequest_ArrayInput
|
|
||||||
for _, val := range value.Array {
|
|
||||||
contents.Values = append(contents.Values, toRpcValue(val))
|
|
||||||
}
|
|
||||||
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Array{&contents}
|
|
||||||
case value.Map != nil:
|
|
||||||
var contents registrytypes.QueryListRecordsRequest_MapInput
|
|
||||||
for _, kv := range value.Map {
|
|
||||||
contents.Values[kv.Key] = toRpcValue(kv.Value)
|
|
||||||
}
|
|
||||||
rpcval.Value = ®istrytypes.QueryListRecordsRequest_ValueInput_Map{&contents}
|
|
||||||
}
|
|
||||||
return &rpcval
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func toRpcAttributes(attrs []*KeyValueInput) []*registrytypes.QueryListRecordsRequest_KeyValueInput {
|
func getIds(obj map[string]interface{}) []string {
|
||||||
|
var ids []string
|
||||||
|
|
||||||
|
// #nosec G705
|
||||||
|
for key := range obj {
|
||||||
|
if innerObj, ok := obj[key].(map[string]interface{}); ok {
|
||||||
|
if _, ok := innerObj["/"]; ok && len(innerObj) == 1 {
|
||||||
|
if _, ok := innerObj["/"].(string); ok {
|
||||||
|
ids = append(ids, innerObj["/"].(string))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ids = append(ids, getIds(innerObj)...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ids
|
||||||
|
}
|
||||||
|
|
||||||
|
func getAttributes(r *registrytypes.RecordType) ([]*KeyValue, error) {
|
||||||
|
return mapToKeyValuePairs(r.Attributes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func mapToKeyValuePairs(attrs map[string]interface{}) ([]*KeyValue, error) {
|
||||||
|
kvPairs := []*KeyValue{}
|
||||||
|
|
||||||
|
trueVal := true
|
||||||
|
falseVal := false
|
||||||
|
|
||||||
|
// #nosec G705
|
||||||
|
for key, value := range attrs {
|
||||||
|
kvPair := &KeyValue{
|
||||||
|
Key: key,
|
||||||
|
Value: &Value{},
|
||||||
|
}
|
||||||
|
|
||||||
|
switch val := value.(type) {
|
||||||
|
case nil:
|
||||||
|
kvPair.Value.Null = &trueVal
|
||||||
|
case int:
|
||||||
|
kvPair.Value.Int = &val
|
||||||
|
case float64:
|
||||||
|
kvPair.Value.Float = &val
|
||||||
|
case string:
|
||||||
|
kvPair.Value.String = &val
|
||||||
|
case bool:
|
||||||
|
kvPair.Value.Boolean = &val
|
||||||
|
case interface{}:
|
||||||
|
if obj, ok := value.(map[string]interface{}); ok {
|
||||||
|
if _, ok := obj["/"]; ok && len(obj) == 1 {
|
||||||
|
if _, ok := obj["/"].(string); ok {
|
||||||
|
kvPair.Value.Reference = &Reference{
|
||||||
|
ID: obj["/"].(string),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bytes, err := json.Marshal(obj)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonStr := string(bytes)
|
||||||
|
kvPair.Value.JSON = &jsonStr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if kvPair.Value.Null == nil {
|
||||||
|
kvPair.Value.Null = &falseVal
|
||||||
|
}
|
||||||
|
|
||||||
|
valueType := reflect.ValueOf(value)
|
||||||
|
if valueType.Kind() == reflect.Slice {
|
||||||
|
bytes, err := json.Marshal(value)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonStr := string(bytes)
|
||||||
|
kvPair.Value.JSON = &jsonStr
|
||||||
|
}
|
||||||
|
|
||||||
|
kvPairs = append(kvPairs, kvPair)
|
||||||
|
}
|
||||||
|
|
||||||
|
return kvPairs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseRequestAttributes(attrs []*KeyValueInput) []*registrytypes.QueryListRecordsRequest_KeyValueInput {
|
||||||
kvPairs := []*registrytypes.QueryListRecordsRequest_KeyValueInput{}
|
kvPairs := []*registrytypes.QueryListRecordsRequest_KeyValueInput{}
|
||||||
|
|
||||||
for _, value := range attrs {
|
for _, value := range attrs {
|
||||||
parsedValue := toRpcValue(value.Value)
|
|
||||||
kvPair := ®istrytypes.QueryListRecordsRequest_KeyValueInput{
|
kvPair := ®istrytypes.QueryListRecordsRequest_KeyValueInput{
|
||||||
Key: value.Key,
|
Key: value.Key,
|
||||||
Value: parsedValue,
|
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if value.Value.String != nil {
|
||||||
|
kvPair.Value.String_ = *value.Value.String
|
||||||
|
kvPair.Value.Type = "string"
|
||||||
|
}
|
||||||
|
|
||||||
|
if value.Value.Int != nil {
|
||||||
|
kvPair.Value.Int = int64(*value.Value.Int)
|
||||||
|
kvPair.Value.Type = "int"
|
||||||
|
}
|
||||||
|
|
||||||
|
if value.Value.Float != nil {
|
||||||
|
kvPair.Value.Float = *value.Value.Float
|
||||||
|
kvPair.Value.Type = "float"
|
||||||
|
}
|
||||||
|
|
||||||
|
if value.Value.Boolean != nil {
|
||||||
|
kvPair.Value.Boolean = *value.Value.Boolean
|
||||||
|
kvPair.Value.Type = "boolean"
|
||||||
|
}
|
||||||
|
|
||||||
|
if value.Value.Reference != nil {
|
||||||
|
reference := ®istrytypes.QueryListRecordsRequest_ReferenceInput{
|
||||||
|
Id: value.Value.Reference.ID,
|
||||||
|
}
|
||||||
|
|
||||||
|
kvPair.Value.Reference = reference
|
||||||
|
kvPair.Value.Type = "reference"
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Handle arrays.
|
||||||
|
|
||||||
kvPairs = append(kvPairs, kvPair)
|
kvPairs = append(kvPairs, kvPair)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
# Reference to another record.
|
# Reference to another record.
|
||||||
scalar Link
|
type Reference {
|
||||||
|
id: String! # ID of linked record.
|
||||||
|
}
|
||||||
|
|
||||||
|
# Reference to another record.
|
||||||
|
input ReferenceInput {
|
||||||
|
id: String!
|
||||||
|
}
|
||||||
|
|
||||||
# Bonds contain funds that are used to pay rent on record registration and renewal.
|
# Bonds contain funds that are used to pay rent on record registration and renewal.
|
||||||
type Bond {
|
type Bond {
|
||||||
@@ -30,71 +37,44 @@ type Account {
|
|||||||
balance: [Coin!] # Current balance for each coin type.
|
balance: [Coin!] # Current balance for each coin type.
|
||||||
}
|
}
|
||||||
|
|
||||||
# Value describes a DAG-JSON compatible value.
|
# Value of a given type.
|
||||||
union Value =
|
type Value {
|
||||||
BooleanValue
|
null: Boolean
|
||||||
| IntValue
|
|
||||||
| FloatValue
|
|
||||||
| StringValue
|
|
||||||
| BytesValue
|
|
||||||
| LinkValue
|
|
||||||
| ArrayValue
|
|
||||||
| MapValue
|
|
||||||
|
|
||||||
type BooleanValue {
|
|
||||||
value: Boolean!
|
|
||||||
}
|
|
||||||
|
|
||||||
type IntValue {
|
|
||||||
value: Int!
|
|
||||||
}
|
|
||||||
|
|
||||||
type FloatValue {
|
|
||||||
value: Float!
|
|
||||||
}
|
|
||||||
|
|
||||||
type StringValue {
|
|
||||||
value: String!
|
|
||||||
}
|
|
||||||
|
|
||||||
type BytesValue {
|
|
||||||
value: String!
|
|
||||||
}
|
|
||||||
|
|
||||||
type ArrayValue {
|
|
||||||
value: [Value]!
|
|
||||||
}
|
|
||||||
|
|
||||||
type LinkValue {
|
|
||||||
value: Link!
|
|
||||||
}
|
|
||||||
|
|
||||||
type MapValue {
|
|
||||||
value: [Attribute!]!
|
|
||||||
}
|
|
||||||
|
|
||||||
# Key/value pair.
|
|
||||||
type Attribute {
|
|
||||||
key: String!
|
|
||||||
value: Value
|
|
||||||
}
|
|
||||||
|
|
||||||
# Value of a given type used as input to queries.
|
|
||||||
# Note: GQL doesn't allow union input types.
|
|
||||||
input ValueInput {
|
|
||||||
int: Int
|
int: Int
|
||||||
float: Float
|
float: Float
|
||||||
string: String
|
string: String
|
||||||
boolean: Boolean
|
boolean: Boolean
|
||||||
link: Link
|
json: String
|
||||||
array: [ValueInput]
|
|
||||||
map: [KeyValueInput!]
|
reference: Reference
|
||||||
|
|
||||||
|
values: [Value]
|
||||||
|
}
|
||||||
|
# Value of a given type used as input to queries.
|
||||||
|
input ValueInput {
|
||||||
|
null: Boolean
|
||||||
|
|
||||||
|
int: Int
|
||||||
|
float: Float
|
||||||
|
string: String
|
||||||
|
boolean: Boolean
|
||||||
|
|
||||||
|
reference: ReferenceInput
|
||||||
|
|
||||||
|
values: [ValueInput]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Key/value pair.
|
||||||
|
type KeyValue {
|
||||||
|
key: String!
|
||||||
|
value: Value!
|
||||||
}
|
}
|
||||||
|
|
||||||
# Key/value pair for inputs.
|
# Key/value pair for inputs.
|
||||||
input KeyValueInput {
|
input KeyValueInput {
|
||||||
key: String!
|
key: String!
|
||||||
value: ValueInput
|
value: ValueInput!
|
||||||
}
|
}
|
||||||
|
|
||||||
# Status information about a node (https://docs.tendermint.com/master/rpc/#/Info/status).
|
# Status information about a node (https://docs.tendermint.com/master/rpc/#/Info/status).
|
||||||
@@ -175,7 +155,7 @@ type Record {
|
|||||||
createTime: String! # Record create time.
|
createTime: String! # Record create time.
|
||||||
expiryTime: String! # Record expiry time.
|
expiryTime: String! # Record expiry time.
|
||||||
owners: [String!] # Addresses of record owners.
|
owners: [String!] # Addresses of record owners.
|
||||||
attributes: [Attribute!] # Record attributes.
|
attributes: [KeyValue] # Record attributes.
|
||||||
references: [Record] # Record references.
|
references: [Record] # Record references.
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,7 +195,7 @@ type Query {
|
|||||||
getBondsByIds(ids: [String!]): [Bond]
|
getBondsByIds(ids: [String!]): [Bond]
|
||||||
|
|
||||||
# Query bonds.
|
# Query bonds.
|
||||||
queryBonds(attributes: [KeyValueInput!]): [Bond]
|
queryBonds(attributes: [KeyValueInput]): [Bond]
|
||||||
|
|
||||||
# Query bonds by owner.
|
# Query bonds by owner.
|
||||||
queryBondsByOwner(ownerAddresses: [String!]): [OwnerBonds]
|
queryBondsByOwner(ownerAddresses: [String!]): [OwnerBonds]
|
||||||
@@ -230,7 +210,7 @@ type Query {
|
|||||||
# Query records.
|
# Query records.
|
||||||
queryRecords(
|
queryRecords(
|
||||||
# Multiple attribute conditions are in a logical AND.
|
# Multiple attribute conditions are in a logical AND.
|
||||||
attributes: [KeyValueInput!]
|
attributes: [KeyValueInput]
|
||||||
|
|
||||||
# Whether to query all records, not just named ones (false by default).
|
# Whether to query all records, not just named ones (false by default).
|
||||||
all: Boolean
|
all: Boolean
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package vulcanize.registry.v1beta1;
|
||||||
|
|
||||||
|
import "gogoproto/gogo.proto";
|
||||||
|
|
||||||
|
option go_package = "github.com/cerc-io/laconicd/x/registry/types";
|
||||||
|
|
||||||
|
message HashReference{
|
||||||
|
string ref =1 [(gogoproto.jsontag) = "/"];
|
||||||
|
}
|
||||||
|
|
||||||
|
message ServiceProviderRecord {
|
||||||
|
string bond_id = 1 [(gogoproto.moretags) = "json:\"bondId\" yaml:\"bondId\""];
|
||||||
|
string laconic_id = 2 [(gogoproto.moretags) = "json:\"laconicId\" yaml:\"laconicId\""];
|
||||||
|
X500 x500 = 3 [(gogoproto.moretags) = "json:\"x500\" yaml:\"x500\""];
|
||||||
|
string type = 4 [(gogoproto.moretags) = "json:\"type\" yaml:\"type\""];
|
||||||
|
string version = 6 [(gogoproto.moretags) = "json:\"version\" yaml:\"version\""];
|
||||||
|
|
||||||
|
message X500 {
|
||||||
|
string common_name = 1 [(gogoproto.moretags) = "json:\"commonName\" yaml:\"commonName\""];
|
||||||
|
string organization_unit = 2 [(gogoproto.moretags) = "json:\"organizationUnit\" yaml:\"organizationUnit\""];
|
||||||
|
string organization_name = 3 [(gogoproto.moretags) = "json:\"organizationName\" yaml:\"organizationName\""];
|
||||||
|
string locality_name = 4 [(gogoproto.moretags) = "json:\"localityName\" yaml:\"localityName\""];
|
||||||
|
string state_name = 5 [(gogoproto.moretags) = "json:\"stateName\" yaml:\"stateName\""];
|
||||||
|
string country = 6 [(gogoproto.moretags) = "json:\"country\" yaml:\"country\""];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
message WebsiteRegistrationRecord {
|
||||||
|
string url = 1 [(gogoproto.moretags) = "json:\"url\" yaml:\"url\""];
|
||||||
|
HashReference repo_reference = 2
|
||||||
|
[(gogoproto.moretags) = "json:\"repoReference\" yaml:\"repoReference\""];
|
||||||
|
HashReference build_artifact_ref = 3 [(gogoproto.moretags) = "json:\"buildArtifactRef\" yaml:\"buildArtifactRef\""];
|
||||||
|
HashReference tls_cert_ref = 4 [(gogoproto.moretags) = "json:\"tlsCertRef\" yaml:\"tlsCertRef\""];
|
||||||
|
string type = 5 [(gogoproto.moretags) = "json:\"type\" yaml:\"type\""];
|
||||||
|
string version = 6 [(gogoproto.moretags) = "json:\"version\" yaml:\"version\""];
|
||||||
|
}
|
||||||
|
|
||||||
|
message GitRepository{
|
||||||
|
string name =1 [(gogoproto.moretags) = "json:\"name\" yaml:\"name\""];
|
||||||
|
string repo_reference=2 [(gogoproto.moretags) = "json:\"repo_reference\" yaml:\"repo_reference\""];
|
||||||
|
string description=3 [(gogoproto.moretags) = "json:\"description\" yaml:\"description\""];
|
||||||
|
string version = 4 [(gogoproto.moretags) = "json:\"version\" yaml:\"version\""];
|
||||||
|
string type =5 [(gogoproto.moretags) = "json:\"type\" yaml:\"type\""];
|
||||||
|
}
|
||||||
|
|
||||||
|
message Binary{
|
||||||
|
HashReference hash_reference=1;
|
||||||
|
string targeted_arch=2;
|
||||||
|
string runtime_version=3;
|
||||||
|
HashReference repo_reference=4;
|
||||||
|
string version=5;
|
||||||
|
string type=6;
|
||||||
|
}
|
||||||
|
|
||||||
|
message DockerImage{
|
||||||
|
string image_id=1;
|
||||||
|
HashReference binary_reference=2;
|
||||||
|
HashReference repo_reference=3;
|
||||||
|
string version=4;
|
||||||
|
string type=5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message WatcherRegistrationRecord{
|
||||||
|
WatcherMetadata metadata =1;
|
||||||
|
HashReference repo_reference=2;
|
||||||
|
WASMBinary wasm=3;
|
||||||
|
string version=4;
|
||||||
|
string type=5;
|
||||||
|
|
||||||
|
message WatcherMetadata{
|
||||||
|
string version=1;
|
||||||
|
HashReference chain_reference=2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message WASMBinary{
|
||||||
|
HashReference hash_reference=1;
|
||||||
|
WASMBinaryMetadata metadata=2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message WASMBinaryMetadata{
|
||||||
|
string compiler_version=1;
|
||||||
|
string execution_engine_version=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message ResponderContract{
|
||||||
|
HashReference service_provider_ref=1;
|
||||||
|
HashReference auction_ref=2;
|
||||||
|
HashReference watcher_ref=3;
|
||||||
|
string version=4;
|
||||||
|
string type=5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message JSPackage{
|
||||||
|
HashReference repo_reference=1;
|
||||||
|
HashReference js_package_ref=2;
|
||||||
|
string version=3;
|
||||||
|
string type=4;
|
||||||
|
string name =5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ChainRegistrationRecord{
|
||||||
|
string name=1;
|
||||||
|
repeated string ipld_types=2;
|
||||||
|
string type=3;
|
||||||
|
string version=4;
|
||||||
|
string chain_id=5;
|
||||||
|
string network_id=6;
|
||||||
|
HashReference genesis_hash=7;
|
||||||
|
}
|
||||||
@@ -67,25 +67,17 @@ message QueryParamsResponse {
|
|||||||
|
|
||||||
// QueryListRecordsRequest is request type for registry records list
|
// QueryListRecordsRequest is request type for registry records list
|
||||||
message QueryListRecordsRequest {
|
message QueryListRecordsRequest {
|
||||||
message LinkInput {
|
message ReferenceInput {
|
||||||
string id = 1;
|
string id = 1;
|
||||||
}
|
}
|
||||||
message ArrayInput {
|
|
||||||
repeated ValueInput values = 1;
|
|
||||||
}
|
|
||||||
message MapInput {
|
|
||||||
map<string, ValueInput> values = 1;
|
|
||||||
}
|
|
||||||
message ValueInput {
|
message ValueInput {
|
||||||
oneof value {
|
string type = 1;
|
||||||
string string = 1;
|
string string = 2;
|
||||||
int64 int = 2;
|
int64 int = 3;
|
||||||
double float = 3;
|
double float = 4;
|
||||||
bool boolean = 4;
|
bool boolean = 5;
|
||||||
string link = 5;
|
ReferenceInput reference = 6;
|
||||||
ArrayInput array = 6;
|
repeated ValueInput values = 7;
|
||||||
MapInput map = 7;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
message KeyValueInput {
|
message KeyValueInput {
|
||||||
string key = 1;
|
string key = 1;
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ message Record {
|
|||||||
string expiry_time = 4 [(gogoproto.moretags) = "json:\"expiryTime\" yaml:\"expiryTime\""];
|
string expiry_time = 4 [(gogoproto.moretags) = "json:\"expiryTime\" yaml:\"expiryTime\""];
|
||||||
bool deleted = 5;
|
bool deleted = 5;
|
||||||
repeated string owners = 6 [(gogoproto.moretags) = "json:\"owners\" yaml:\"owners\""];
|
repeated string owners = 6 [(gogoproto.moretags) = "json:\"owners\" yaml:\"owners\""];
|
||||||
bytes attributes = 7 [(gogoproto.moretags) = "json:\"attributes\" yaml:\"attributes\""];
|
google.protobuf.Any attributes = 7 [(gogoproto.moretags) = "json:\"attributes\" yaml:\"attributes\""];
|
||||||
repeated string names = 8 [(gogoproto.moretags) = "json:\"names\" yaml:\"names\""];
|
repeated string names = 8 [(gogoproto.moretags) = "json:\"names\" yaml:\"names\""];
|
||||||
string type = 9 [(gogoproto.moretags) = "json:\"types\" yaml:\"types\""];
|
string type = 9 [(gogoproto.moretags) = "json:\"types\" yaml:\"types\""];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ import "vulcanize/registry/v1beta1/registry.proto";
|
|||||||
|
|
||||||
option go_package = "github.com/cerc-io/laconicd/x/registry/types";
|
option go_package = "github.com/cerc-io/laconicd/x/registry/types";
|
||||||
|
|
||||||
// Msg is a service which exposes the registry functionality
|
// Msg
|
||||||
service Msg {
|
service Msg {
|
||||||
// SetRecord records a new record with given payload and bond id
|
// SetRecord will records a new record with given payload and bond id
|
||||||
rpc SetRecord(MsgSetRecord) returns (MsgSetRecordResponse) {
|
rpc SetRecord(MsgSetRecord) returns (MsgSetRecordResponse) {
|
||||||
option (google.api.http).post = "/vulcanize/registry/v1beta1/set_record";
|
option (google.api.http).post = "/vulcanize/registry/v1beta1/set_record";
|
||||||
}
|
}
|
||||||
// Renew Record renews an expired record
|
// Renew Record will renew the expire record
|
||||||
rpc RenewRecord(MsgRenewRecord) returns (MsgRenewRecordResponse) {
|
rpc RenewRecord(MsgRenewRecord) returns (MsgRenewRecordResponse) {
|
||||||
option (google.api.http).post = "/vulcanize/registry/v1beta1/renew_record";
|
option (google.api.http).post = "/vulcanize/registry/v1beta1/renew_record";
|
||||||
}
|
}
|
||||||
@@ -66,10 +66,8 @@ message MsgSetRecordResponse {
|
|||||||
// Payload
|
// Payload
|
||||||
message Payload {
|
message Payload {
|
||||||
Record record = 1;
|
Record record = 1;
|
||||||
repeated Signature signatures = 2 [
|
repeated Signature signatures = 2
|
||||||
(gogoproto.nullable) = false,
|
[(gogoproto.nullable) = false, (gogoproto.moretags) = "json:\"signatures\" yaml:\"signatures\""];
|
||||||
(gogoproto.moretags) = "json:\"signatures\" yaml:\"signatures\""
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MsgSetName
|
// MsgSetName
|
||||||
@@ -93,7 +91,7 @@ message MsgReserveAuthority {
|
|||||||
// MsgReserveNameResponse
|
// MsgReserveNameResponse
|
||||||
message MsgReserveAuthorityResponse {}
|
message MsgReserveAuthorityResponse {}
|
||||||
|
|
||||||
// MsgSetAuthorityBond
|
// MsgSetAuthorityBond is SDK message for SetAuthorityBond
|
||||||
message MsgSetAuthorityBond {
|
message MsgSetAuthorityBond {
|
||||||
string name = 1;
|
string name = 1;
|
||||||
string bond_id = 2 [(gogoproto.moretags) = "json:\"bondId\" yaml:\"bondId\""];
|
string bond_id = 2 [(gogoproto.moretags) = "json:\"bondId\" yaml:\"bondId\""];
|
||||||
@@ -103,7 +101,7 @@ message MsgSetAuthorityBond {
|
|||||||
// MsgSetAuthorityBondResponse
|
// MsgSetAuthorityBondResponse
|
||||||
message MsgSetAuthorityBondResponse {}
|
message MsgSetAuthorityBondResponse {}
|
||||||
|
|
||||||
// MsgDeleteNameAuthority
|
// MsgDeleteNameAuthority is SDK message for DeleteNameAuthority
|
||||||
message MsgDeleteNameAuthority {
|
message MsgDeleteNameAuthority {
|
||||||
string crn = 1;
|
string crn = 1;
|
||||||
string signer = 2;
|
string signer = 2;
|
||||||
@@ -112,7 +110,7 @@ message MsgDeleteNameAuthority {
|
|||||||
// MsgDeleteNameAuthorityResponse
|
// MsgDeleteNameAuthorityResponse
|
||||||
message MsgDeleteNameAuthorityResponse {}
|
message MsgDeleteNameAuthorityResponse {}
|
||||||
|
|
||||||
// MsgRenewRecord
|
// MsgRenewRecord is SDK message for Renew a record
|
||||||
message MsgRenewRecord {
|
message MsgRenewRecord {
|
||||||
string record_id = 1 [(gogoproto.moretags) = "json:\"recordId\" yaml:\"recordId\""];
|
string record_id = 1 [(gogoproto.moretags) = "json:\"recordId\" yaml:\"recordId\""];
|
||||||
string signer = 2;
|
string signer = 2;
|
||||||
@@ -131,30 +129,30 @@ message MsgAssociateBond {
|
|||||||
// MsgAssociateBondResponse
|
// MsgAssociateBondResponse
|
||||||
message MsgAssociateBondResponse {}
|
message MsgAssociateBondResponse {}
|
||||||
|
|
||||||
// MsgDissociateBond
|
// MsgDissociateBond is SDK message for Msg/DissociateBond
|
||||||
message MsgDissociateBond {
|
message MsgDissociateBond {
|
||||||
string record_id = 1 [(gogoproto.moretags) = "json:\"recordId\" yaml:\"recordId\""];
|
string record_id = 1 [(gogoproto.moretags) = "json:\"recordId\" yaml:\"recordId\""];
|
||||||
string signer = 2;
|
string signer = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MsgDissociateBondResponse
|
// MsgDissociateBondResponse is response type for MsgDissociateBond
|
||||||
message MsgDissociateBondResponse {}
|
message MsgDissociateBondResponse {}
|
||||||
|
|
||||||
// MsgDissociateRecords
|
// MsgDissociateRecords is SDK message for Msg/DissociateRecords
|
||||||
message MsgDissociateRecords {
|
message MsgDissociateRecords {
|
||||||
string bond_id = 1 [(gogoproto.moretags) = "json:\"bondId\" yaml:\"bondId\""];
|
string bond_id = 1 [(gogoproto.moretags) = "json:\"bondId\" yaml:\"bondId\""];
|
||||||
string signer = 2;
|
string signer = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MsgDissociateRecordsResponse
|
// MsgDissociateRecordsResponse is response type for MsgDissociateRecords
|
||||||
message MsgDissociateRecordsResponse {}
|
message MsgDissociateRecordsResponse {}
|
||||||
|
|
||||||
// MsgReAssociateRecords
|
// MsgReAssociateRecords is SDK message for Msg/ReAssociateRecords
|
||||||
message MsgReAssociateRecords {
|
message MsgReAssociateRecords {
|
||||||
string new_bond_id = 1 [(gogoproto.moretags) = "json:\"newBondId\" yaml:\"newBondId\""];
|
string new_bond_id = 1 [(gogoproto.moretags) = "json:\"newBondId\" yaml:\"newBondId\""];
|
||||||
string old_bond_id = 2 [(gogoproto.moretags) = "json:\"oldBondId\" yaml:\"oldBondId\""];
|
string old_bond_id = 2 [(gogoproto.moretags) = "json:\"oldBondId\" yaml:\"oldBondId\""];
|
||||||
string signer = 3;
|
string signer = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MsgReAssociateRecordsResponse
|
// MsgReAssociateRecordsResponse is response type for MsgReAssociateRecords
|
||||||
message MsgReAssociateRecordsResponse {}
|
message MsgReAssociateRecordsResponse {}
|
||||||
|
|||||||
@@ -161,9 +161,9 @@ $ %s query %s list
|
|||||||
}
|
}
|
||||||
|
|
||||||
recordsList := res.GetRecords()
|
recordsList := res.GetRecords()
|
||||||
records := make([]types.ReadableRecord, len(recordsList))
|
records := make([]types.RecordType, len(recordsList))
|
||||||
for i, record := range res.GetRecords() {
|
for i, record := range res.GetRecords() {
|
||||||
records[i] = record.ToReadableRecord()
|
records[i] = record.ToRecordType()
|
||||||
}
|
}
|
||||||
bytesResult, err := json.Marshal(records)
|
bytesResult, err := json.Marshal(records)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -66,10 +66,17 @@ $ %s tx %s set [payload file path] [bond-id]
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
payload := payloadType.ToPayload()
|
payload, err := payloadType.ToPayload()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
msg := types.NewMsgSetRecord(payload, args[1], clientCtx.GetFromAddress())
|
msg := types.NewMsgSetRecord(payload, args[1], clientCtx.GetFromAddress())
|
||||||
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
|
err = msg.ValidateBasic()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,7 +269,7 @@ $ %s tx %s set-name [crn] [cid]
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
|
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,8 +377,8 @@ $ %s tx %s delete-name [crn]
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetPayloadFromFile Load payload object from YAML file.
|
// GetPayloadFromFile Load payload object from YAML file.
|
||||||
func GetPayloadFromFile(filePath string) (*types.ReadablePayload, error) {
|
func GetPayloadFromFile(filePath string) (*types.PayloadType, error) {
|
||||||
var payload types.ReadablePayload
|
var payload types.PayloadType
|
||||||
|
|
||||||
data, err := os.ReadFile(filePath) // #nosec G304
|
data, err := os.ReadFile(filePath) // #nosec G304
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ func (s *IntegrationTestSuite) TestGRPCQueryParams() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint: all
|
//nolint:all
|
||||||
func (s *IntegrationTestSuite) TestGRPCQueryWhoIs() {
|
func (s *IntegrationTestSuite) TestGRPCQueryWhoIs() {
|
||||||
val := s.network.Validators[0]
|
val := s.network.Validators[0]
|
||||||
sr := s.Require()
|
sr := s.Require()
|
||||||
@@ -180,7 +180,7 @@ func (s *IntegrationTestSuite) TestGRPCQueryLookup() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint: all
|
//nolint:all
|
||||||
func (s *IntegrationTestSuite) TestGRPCQueryRecordExpiryQueue() {
|
func (s *IntegrationTestSuite) TestGRPCQueryRecordExpiryQueue() {
|
||||||
val := s.network.Validators[0]
|
val := s.network.Validators[0]
|
||||||
sr := s.Require()
|
sr := s.Require()
|
||||||
@@ -209,7 +209,7 @@ func (s *IntegrationTestSuite) TestGRPCQueryRecordExpiryQueue() {
|
|||||||
func(bondId string) {
|
func(bondId string) {
|
||||||
dir, err := os.Getwd()
|
dir, err := os.Getwd()
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payloadPath := dir + "/service_provider_example.yml"
|
payloadPath := dir + "/../../helpers/examples/service_provider_example.yml"
|
||||||
args := []string{
|
args := []string{
|
||||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, accountName),
|
fmt.Sprintf("--%s=%s", flags.FlagFrom, accountName),
|
||||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||||
@@ -252,7 +252,7 @@ func (s *IntegrationTestSuite) TestGRPCQueryRecordExpiryQueue() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint: all
|
//nolint:all
|
||||||
func (s *IntegrationTestSuite) TestGRPCQueryAuthorityExpiryQueue() {
|
func (s *IntegrationTestSuite) TestGRPCQueryAuthorityExpiryQueue() {
|
||||||
val := s.network.Validators[0]
|
val := s.network.Validators[0]
|
||||||
sr := s.Require()
|
sr := s.Require()
|
||||||
@@ -324,7 +324,7 @@ func (s *IntegrationTestSuite) TestGRPCQueryAuthorityExpiryQueue() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint: all
|
//nolint:all
|
||||||
func (s *IntegrationTestSuite) TestGRPCQueryListRecords() {
|
func (s *IntegrationTestSuite) TestGRPCQueryListRecords() {
|
||||||
val := s.network.Validators[0]
|
val := s.network.Validators[0]
|
||||||
sr := s.Require()
|
sr := s.Require()
|
||||||
@@ -353,7 +353,7 @@ func (s *IntegrationTestSuite) TestGRPCQueryListRecords() {
|
|||||||
func(bondId string) {
|
func(bondId string) {
|
||||||
dir, err := os.Getwd()
|
dir, err := os.Getwd()
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payloadPath := dir + "/service_provider_example.yml"
|
payloadPath := dir + "/../../helpers/examples/service_provider_example.yml"
|
||||||
args := []string{
|
args := []string{
|
||||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, accountName),
|
fmt.Sprintf("--%s=%s", flags.FlagFrom, accountName),
|
||||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||||
@@ -433,7 +433,7 @@ func (s *IntegrationTestSuite) TestGRPCQueryGetRecordByID() {
|
|||||||
}
|
}
|
||||||
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
var records []nstypes.ReadableRecord
|
var records []nstypes.RecordType
|
||||||
err = json.Unmarshal(out.Bytes(), &records)
|
err = json.Unmarshal(out.Bytes(), &records)
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
return records[0].ID
|
return records[0].ID
|
||||||
@@ -626,7 +626,7 @@ func createRecord(bondID string, s *IntegrationTestSuite) {
|
|||||||
|
|
||||||
dir, err := os.Getwd()
|
dir, err := os.Getwd()
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payloadPath := dir + "/service_provider_example.yml"
|
payloadPath := dir + "/../../helpers/examples/service_provider_example.yml"
|
||||||
args := []string{
|
args := []string{
|
||||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, accountName),
|
fmt.Sprintf("--%s=%s", flags.FlagFrom, accountName),
|
||||||
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryForRecords() {
|
|||||||
bondID := GetBondID(s)
|
bondID := GetBondID(s)
|
||||||
dir, err := os.Getwd()
|
dir, err := os.Getwd()
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payloadPath := dir + "/service_provider_example.yml"
|
payloadPath := dir + "/../../helpers/examples/service_provider_example.yml"
|
||||||
args := []string{
|
args := []string{
|
||||||
payloadPath, bondID,
|
payloadPath, bondID,
|
||||||
fmt.Sprintf("--%s=%s", flags.FlagFrom, accountName),
|
fmt.Sprintf("--%s=%s", flags.FlagFrom, accountName),
|
||||||
@@ -114,7 +114,7 @@ func (s *IntegrationTestSuite) TestGetCmdQueryForRecords() {
|
|||||||
sr.Error(err)
|
sr.Error(err)
|
||||||
} else {
|
} else {
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
var records []types.ReadableRecord
|
var records []types.RecordType
|
||||||
err := json.Unmarshal(out.Bytes(), &records)
|
err := json.Unmarshal(out.Bytes(), &records)
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
sr.Equal(tc.noOfRecords, len(records))
|
sr.Equal(tc.noOfRecords, len(records))
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
|
|
||||||
record:
|
|
||||||
type: ServiceProviderRegistration
|
|
||||||
bond_id: madeUpBondID
|
|
||||||
laconic_id: madeUpLaconicID
|
|
||||||
version: 1.0.0
|
|
||||||
x500:
|
|
||||||
common_name: cerc-io
|
|
||||||
organization_unit: xyz
|
|
||||||
organization_name: abc
|
|
||||||
state_name: california
|
|
||||||
country: US
|
|
||||||
locality_name: local
|
|
||||||
@@ -198,7 +198,7 @@ func (s *IntegrationTestSuite) TestGetCmdSetRecord() {
|
|||||||
bondID := GetBondID(s)
|
bondID := GetBondID(s)
|
||||||
dir, err := os.Getwd()
|
dir, err := os.Getwd()
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payloadPath := dir + "/service_provider_example.yml"
|
payloadPath := dir + "/../../helpers/examples/watcher_registration_example.yml"
|
||||||
|
|
||||||
tc.args = append([]string{payloadPath, bondID}, tc.args...)
|
tc.args = append([]string{payloadPath, bondID}, tc.args...)
|
||||||
}
|
}
|
||||||
@@ -580,7 +580,7 @@ func (s *IntegrationTestSuite) TestGetCmdDissociateBond() {
|
|||||||
bondID := GetBondID(s)
|
bondID := GetBondID(s)
|
||||||
dir, err := os.Getwd()
|
dir, err := os.Getwd()
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payloadPath := dir + "/service_provider_example.yml"
|
payloadPath := dir + "/../../helpers/examples/service_provider_example.yml"
|
||||||
|
|
||||||
args := []string{
|
args := []string{
|
||||||
payloadPath, bondID,
|
payloadPath, bondID,
|
||||||
@@ -606,7 +606,7 @@ func (s *IntegrationTestSuite) TestGetCmdDissociateBond() {
|
|||||||
cmd = cli.GetCmdList()
|
cmd = cli.GetCmdList()
|
||||||
out, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
out, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
var records []nstypes.ReadableRecord
|
var records []nstypes.RecordType
|
||||||
err = json.Unmarshal(out.Bytes(), &records)
|
err = json.Unmarshal(out.Bytes(), &records)
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
return records[0].ID
|
return records[0].ID
|
||||||
@@ -822,7 +822,7 @@ func (s *IntegrationTestSuite) TestGetCmdAssociateBond() {
|
|||||||
bondID := GetBondID(s)
|
bondID := GetBondID(s)
|
||||||
dir, err := os.Getwd()
|
dir, err := os.Getwd()
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payloadPath := dir + "/service_provider_example.yml"
|
payloadPath := dir + "/../../helpers/examples/service_provider_example.yml"
|
||||||
|
|
||||||
txArgs := []string{
|
txArgs := []string{
|
||||||
payloadPath, bondID,
|
payloadPath, bondID,
|
||||||
@@ -848,7 +848,7 @@ func (s *IntegrationTestSuite) TestGetCmdAssociateBond() {
|
|||||||
cmd = cli.GetCmdList()
|
cmd = cli.GetCmdList()
|
||||||
out, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
out, err = clitestutil.ExecTestCLICmd(clientCtx, cmd, args)
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
var records []nstypes.ReadableRecord
|
var records []nstypes.RecordType
|
||||||
err = json.Unmarshal(out.Bytes(), &records)
|
err = json.Unmarshal(out.Bytes(), &records)
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
record:
|
|
||||||
type: WebsiteRegistrationRecord
|
|
||||||
url: https://cerc.io
|
|
||||||
repo_registration_record_cid: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
|
||||||
build_artifact_cid: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
|
||||||
tls_cert_cid: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR
|
|
||||||
version: 1.0.0
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
record:
|
||||||
|
hash_reference:
|
||||||
|
/: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
||||||
|
targeted_arch: x86_64
|
||||||
|
runtime_version: go 1.18
|
||||||
|
repo_reference:
|
||||||
|
/: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
||||||
|
version: 1.0.0
|
||||||
|
type: Binary
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
record:
|
||||||
|
name: Laconic
|
||||||
|
ipld_types:
|
||||||
|
- type3
|
||||||
|
- type11
|
||||||
|
- schema2
|
||||||
|
- codec5
|
||||||
|
type: ChainRegistrationRecord
|
||||||
|
version: 0.11.2
|
||||||
|
chain_id: laconic_9000-1
|
||||||
|
network_id: "1392"
|
||||||
|
genesis_hash:
|
||||||
|
/: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
record:
|
||||||
|
image_id: 77af4d6b9913
|
||||||
|
binary_reference:
|
||||||
|
/: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
||||||
|
repo_reference:
|
||||||
|
/: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
||||||
|
version: 1.0.0
|
||||||
|
type: DockerImage
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
record:
|
||||||
|
name: cosmos-sdk
|
||||||
|
repo_reference: https://github.com/cosmos/cosmos-sdk
|
||||||
|
description: This is a description string
|
||||||
|
version: 0.46.7
|
||||||
|
type: GitRepository
|
||||||
+6
-5
@@ -1,7 +1,8 @@
|
|||||||
record:
|
record:
|
||||||
attr1: value1
|
repo_reference:
|
||||||
attr2: value2
|
|
||||||
link1:
|
|
||||||
/: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
|
||||||
link2:
|
|
||||||
/: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
/: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
||||||
|
js_package_ref:
|
||||||
|
/: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
||||||
|
version: 1.0.0
|
||||||
|
type: JSPackage
|
||||||
|
name: test-JSPackage
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
record:
|
||||||
|
service_provider_ref:
|
||||||
|
/: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
||||||
|
auction_ref:
|
||||||
|
/: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
||||||
|
watcher_ref:
|
||||||
|
/: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR
|
||||||
|
version: 1.0.0
|
||||||
|
type: ResponderContract
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
record:
|
record:
|
||||||
type: ServiceProviderRegistration
|
type: ServiceProviderRecord
|
||||||
bond_id: madeUpBondID
|
bond_id: madeUpBondID
|
||||||
laconic_id: madeUpLaconicID
|
laconic_id: madeUpLaconicID
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
record:
|
||||||
|
metadata:
|
||||||
|
version: 0.32.0
|
||||||
|
chain_reference:
|
||||||
|
/: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
||||||
|
repo_reference:
|
||||||
|
/: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
||||||
|
wasm:
|
||||||
|
hash_reference:
|
||||||
|
/: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR
|
||||||
|
metadata:
|
||||||
|
compiler_version: 1.15.0
|
||||||
|
execution_engine_version: 0.16.1
|
||||||
|
version: 1.0.0
|
||||||
|
type: WatcherRegistrationRecord
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
record:
|
record:
|
||||||
type: WebsiteRegistrationRecord
|
type: WebsiteRegistrationRecord
|
||||||
url: https://cerc.io
|
url: https://cerc.io
|
||||||
repo_registration_record_cid: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
repo_reference:
|
||||||
build_artifact_cid: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
/: QmSnuWmxptJZdLJpKRarxBMS2Ju2oANVrgbr2xWbie9b2D
|
||||||
tls_cerc_cid: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR
|
build_artifact_ref:
|
||||||
|
/: QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9
|
||||||
|
tls_cert_ref:
|
||||||
|
/: QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
@@ -47,20 +47,24 @@ func Int64ToBytes(num int64) []byte {
|
|||||||
return buf.Bytes()
|
return buf.Bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
func MustMarshalJSON[T any](val T) (bytes []byte) {
|
// MarshalMapToJSONBytes converts map[string]interface{} to bytes.
|
||||||
|
func MarshalMapToJSONBytes(val map[string]interface{}) (bytes []byte) {
|
||||||
bytes, err := json.Marshal(val)
|
bytes, err := json.Marshal(val)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("JSON marshal error:" + err.Error())
|
panic("Marshal error.")
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func MustUnmarshalJSON[T any](bytes []byte) T {
|
// UnMarshalMapFromJSONBytes converts bytes to map[string]interface{}.
|
||||||
var val T
|
func UnMarshalMapFromJSONBytes(bytes []byte) map[string]interface{} {
|
||||||
|
var val map[string]interface{}
|
||||||
err := json.Unmarshal(bytes, &val)
|
err := json.Unmarshal(bytes, &val)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("JSON unmarshal error:" + err.Error())
|
panic("Unmarshal error.")
|
||||||
}
|
}
|
||||||
|
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/cerc-io/laconicd/x/registry/client/cli"
|
"github.com/cerc-io/laconicd/x/registry/client/cli"
|
||||||
"github.com/cerc-io/laconicd/x/registry/helpers"
|
"github.com/cerc-io/laconicd/x/registry/helpers"
|
||||||
@@ -37,7 +38,14 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
|
|||||||
sr := suite.Require()
|
sr := suite.Require()
|
||||||
var recordId string
|
var recordId string
|
||||||
examples := []string{
|
examples := []string{
|
||||||
|
"/../helpers/examples/binary_example.yml",
|
||||||
|
"/../helpers/examples/chain_registration_example.yml",
|
||||||
|
"/../helpers/examples/docker_image_example.yml",
|
||||||
|
"/../helpers/examples/git_repo_example.yml",
|
||||||
|
"/../helpers/examples/js_package_example.yml",
|
||||||
|
"/../helpers/examples/responder_contract_example.yml",
|
||||||
"/../helpers/examples/service_provider_example.yml",
|
"/../helpers/examples/service_provider_example.yml",
|
||||||
|
"/../helpers/examples/watcher_registration_example.yml",
|
||||||
"/../helpers/examples/website_registration_example.yml",
|
"/../helpers/examples/website_registration_example.yml",
|
||||||
}
|
}
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
@@ -59,16 +67,17 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
|
|||||||
®istrytypes.QueryListRecordsRequest{},
|
®istrytypes.QueryListRecordsRequest{},
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
2,
|
len(examples),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Filter with type",
|
"Filter with type",
|
||||||
®istrytypes.QueryListRecordsRequest{
|
®istrytypes.QueryListRecordsRequest{
|
||||||
Attributes: []*registrytypes.QueryListRecordsRequest_KeyValueInput{
|
Attributes: []*registrytypes.QueryListRecordsRequest_KeyValueInput{
|
||||||
{
|
{
|
||||||
Key: "type",
|
Key: "type---",
|
||||||
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
||||||
Value: ®istrytypes.QueryListRecordsRequest_ValueInput_String_{"WebsiteRegistrationRecord"},
|
Type: "string",
|
||||||
|
String_: "WebsiteRegistrationRecord",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -79,13 +88,14 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
|
|||||||
1,
|
1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Filter with attributes ServiceProviderRegistration",
|
"Filter with attributes ServiceProviderRecord",
|
||||||
®istrytypes.QueryListRecordsRequest{
|
®istrytypes.QueryListRecordsRequest{
|
||||||
Attributes: []*registrytypes.QueryListRecordsRequest_KeyValueInput{
|
Attributes: []*registrytypes.QueryListRecordsRequest_KeyValueInput{
|
||||||
{
|
{
|
||||||
Key: "x500state_name",
|
Key: "x500---state_name---",
|
||||||
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
||||||
Value: ®istrytypes.QueryListRecordsRequest_ValueInput_String_{"california"},
|
Type: "string",
|
||||||
|
String_: "california",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -95,6 +105,42 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
|
|||||||
false,
|
false,
|
||||||
1,
|
1,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Filter with attributes WatcherRegistrationRecord",
|
||||||
|
®istrytypes.QueryListRecordsRequest{
|
||||||
|
Attributes: []*registrytypes.QueryListRecordsRequest_KeyValueInput{
|
||||||
|
{
|
||||||
|
Key: "metadata---chain_reference---/---",
|
||||||
|
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
||||||
|
Type: "string",
|
||||||
|
String_: "QmP8jTG1m9GSDJLCbeWhVSVgEzCPPwXRdCRuJtQ5Tz9Kc9",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
All: true,
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Filter with attributes version",
|
||||||
|
®istrytypes.QueryListRecordsRequest{
|
||||||
|
Attributes: []*registrytypes.QueryListRecordsRequest_KeyValueInput{
|
||||||
|
{
|
||||||
|
Key: "version---",
|
||||||
|
Value: ®istrytypes.QueryListRecordsRequest_ValueInput{
|
||||||
|
Type: "string",
|
||||||
|
String_: "1.0.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
All: true,
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
7,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
suite.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
suite.Run(fmt.Sprintf("Case %s ", test.msg), func() {
|
||||||
@@ -104,7 +150,8 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
|
|||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payloadType, err := cli.GetPayloadFromFile(fmt.Sprint(dir, example))
|
payloadType, err := cli.GetPayloadFromFile(fmt.Sprint(dir, example))
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payload := payloadType.ToPayload()
|
payload, err := payloadType.ToPayload()
|
||||||
|
sr.NoError(err)
|
||||||
record, err := suite.app.RegistryKeeper.ProcessSetRecord(ctx, registrytypes.MsgSetRecord{
|
record, err := suite.app.RegistryKeeper.ProcessSetRecord(ctx, registrytypes.MsgSetRecord{
|
||||||
BondId: suite.bond.GetId(),
|
BondId: suite.bond.GetId(),
|
||||||
Signer: suite.accounts[0].String(),
|
Signer: suite.accounts[0].String(),
|
||||||
@@ -126,17 +173,11 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
|
|||||||
sr.Equal(resp.GetRecords()[0].GetBondId(), suite.bond.GetId())
|
sr.Equal(resp.GetRecords()[0].GetBondId(), suite.bond.GetId())
|
||||||
|
|
||||||
for _, record := range resp.GetRecords() {
|
for _, record := range resp.GetRecords() {
|
||||||
recAttr := helpers.MustUnmarshalJSON[registrytypes.AttributeMap](record.Attributes)
|
bz, err := registrytypes.GetJSONBytesFromAny(*record.Attributes)
|
||||||
|
sr.NoError(err)
|
||||||
|
recAttr := helpers.UnMarshalMapFromJSONBytes(bz)
|
||||||
for _, attr := range test.req.GetAttributes() {
|
for _, attr := range test.req.GetAttributes() {
|
||||||
enc, err := keeper.QueryValueToJSON(attr.Value)
|
sr.Equal(keeper.GetAttributeValue(attr.Value), getAttributesFromRecord(recAttr, attr.Key))
|
||||||
sr.NoError(err)
|
|
||||||
expected := helpers.MustUnmarshalJSON[any](enc)
|
|
||||||
if attr.Key[:4] == "x500" {
|
|
||||||
sr.Equal(expected, recAttr["x500"].(map[string]interface{})[attr.Key[4:]])
|
|
||||||
} else {
|
|
||||||
sr.Equal(expected, recAttr[attr.Key])
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -227,6 +268,17 @@ func (suite *KeeperTestSuite) TestGrpcGetRecordLists() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getAttributesFromRecord(recordAttr map[string]interface{}, key string) interface{} {
|
||||||
|
keys := strings.Split(key, "---")
|
||||||
|
for i, str := range keys {
|
||||||
|
if i == len(keys)-2 {
|
||||||
|
return recordAttr[str].(string)
|
||||||
|
}
|
||||||
|
recordAttr = recordAttr[str].(map[string]interface{})
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *KeeperTestSuite) TestGrpcQueryRegistryModuleBalance() {
|
func (suite *KeeperTestSuite) TestGrpcQueryRegistryModuleBalance() {
|
||||||
grpcClient, ctx := suite.queryClient, suite.ctx
|
grpcClient, ctx := suite.queryClient, suite.ctx
|
||||||
sr := suite.Require()
|
sr := suite.Require()
|
||||||
@@ -257,7 +309,8 @@ func (suite *KeeperTestSuite) TestGrpcQueryRegistryModuleBalance() {
|
|||||||
for _, example := range examples {
|
for _, example := range examples {
|
||||||
payloadType, err := cli.GetPayloadFromFile(fmt.Sprint(dir, example))
|
payloadType, err := cli.GetPayloadFromFile(fmt.Sprint(dir, example))
|
||||||
sr.NoError(err)
|
sr.NoError(err)
|
||||||
payload := payloadType.ToPayload()
|
payload, err := payloadType.ToPayload()
|
||||||
|
sr.NoError(err)
|
||||||
record, err := suite.app.RegistryKeeper.ProcessSetRecord(ctx, registrytypes.MsgSetRecord{
|
record, err := suite.app.RegistryKeeper.ProcessSetRecord(ctx, registrytypes.MsgSetRecord{
|
||||||
BondId: suite.bond.GetId(),
|
BondId: suite.bond.GetId(),
|
||||||
Signer: suite.accounts[0].String(),
|
Signer: suite.accounts[0].String(),
|
||||||
|
|||||||
+73
-127
@@ -4,10 +4,15 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"reflect" // #nosec G702 This is also used in eip712 antehandler code. No new risk introduced.
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
errorsmod "cosmossdk.io/errors"
|
errorsmod "cosmossdk.io/errors"
|
||||||
|
auctionkeeper "github.com/cerc-io/laconicd/x/auction/keeper"
|
||||||
|
bondkeeper "github.com/cerc-io/laconicd/x/bond/keeper"
|
||||||
|
"github.com/cerc-io/laconicd/x/registry/helpers"
|
||||||
|
"github.com/cerc-io/laconicd/x/registry/types"
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
"github.com/cosmos/cosmos-sdk/codec/legacy"
|
||||||
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
||||||
@@ -16,18 +21,6 @@ import (
|
|||||||
auth "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
auth "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||||
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
bank "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||||
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
|
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
|
||||||
"github.com/gibson042/canonicaljson-go"
|
|
||||||
cid "github.com/ipfs/go-cid"
|
|
||||||
"github.com/ipld/go-ipld-prime"
|
|
||||||
"github.com/ipld/go-ipld-prime/codec/dagjson"
|
|
||||||
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
|
|
||||||
basicnode "github.com/ipld/go-ipld-prime/node/basic"
|
|
||||||
"github.com/tendermint/tendermint/libs/log"
|
|
||||||
|
|
||||||
auctionkeeper "github.com/cerc-io/laconicd/x/auction/keeper"
|
|
||||||
bondkeeper "github.com/cerc-io/laconicd/x/bond/keeper"
|
|
||||||
"github.com/cerc-io/laconicd/x/registry/helpers"
|
|
||||||
"github.com/cerc-io/laconicd/x/registry/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -104,11 +97,6 @@ func NewKeeper(cdc codec.BinaryCodec, accountKeeper auth.AccountKeeper, bankKeep
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// logger returns a module-specific logger.
|
|
||||||
func logger(ctx sdk.Context) log.Logger {
|
|
||||||
return ctx.Logger().With("module", types.ModuleName)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRecordIndexKey Generates Bond ID -> Bond index key.
|
// GetRecordIndexKey Generates Bond ID -> Bond index key.
|
||||||
func GetRecordIndexKey(id string) []byte {
|
func GetRecordIndexKey(id string) []byte {
|
||||||
return append(PrefixCIDToRecordIndex, []byte(id)...)
|
return append(PrefixCIDToRecordIndex, []byte(id)...)
|
||||||
@@ -125,8 +113,7 @@ func (k Keeper) GetRecord(ctx sdk.Context, id string) (record types.Record) {
|
|||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
result := store.Get(GetRecordIndexKey(id))
|
result := store.Get(GetRecordIndexKey(id))
|
||||||
k.cdc.MustUnmarshal(result, &record)
|
k.cdc.MustUnmarshal(result, &record)
|
||||||
decodeRecordNames(store, &record)
|
return recordObjToRecord(store, record)
|
||||||
return record
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListRecords - get all records.
|
// ListRecords - get all records.
|
||||||
@@ -139,25 +126,20 @@ func (k Keeper) ListRecords(ctx sdk.Context) []types.Record {
|
|||||||
for ; itr.Valid(); itr.Next() {
|
for ; itr.Valid(); itr.Next() {
|
||||||
bz := store.Get(itr.Key())
|
bz := store.Get(itr.Key())
|
||||||
if bz != nil {
|
if bz != nil {
|
||||||
var record types.Record
|
var obj types.Record
|
||||||
k.cdc.MustUnmarshal(bz, &record)
|
k.cdc.MustUnmarshal(bz, &obj)
|
||||||
decodeRecordNames(store, &record)
|
records = append(records, recordObjToRecord(store, obj))
|
||||||
records = append(records, record)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return records
|
return records
|
||||||
}
|
}
|
||||||
|
|
||||||
// RecordsFromAttributes gets a list of records whose attributes match all provided values
|
|
||||||
func (k Keeper) RecordsFromAttributes(ctx sdk.Context, attributes []*types.QueryListRecordsRequest_KeyValueInput, all bool) ([]types.Record, error) {
|
func (k Keeper) RecordsFromAttributes(ctx sdk.Context, attributes []*types.QueryListRecordsRequest_KeyValueInput, all bool) ([]types.Record, error) {
|
||||||
resultRecordIds := []string{}
|
resultRecordIds := []string{}
|
||||||
for i, attr := range attributes {
|
for i, attr := range attributes {
|
||||||
suffix, err := QueryValueToJSON(attr.Value)
|
val := GetAttributeValue(attr.Value)
|
||||||
if err != nil {
|
attributeIndex := GetAttributesIndexKey(attr.Key, val)
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
attributeIndex := GetAttributesIndexKey(attr.Key, suffix)
|
|
||||||
recordIds, err := k.GetAttributeMapping(ctx, attributeIndex)
|
recordIds, err := k.GetAttributeMapping(ctx, attributeIndex)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -176,47 +158,32 @@ func (k Keeper) RecordsFromAttributes(ctx sdk.Context, attributes []*types.Query
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
decodeRecordNames(store, &record)
|
recordWithNames := recordObjToRecord(store, record)
|
||||||
if !all && len(record.Names) == 0 {
|
if !all && len(recordWithNames.Names) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
records = append(records, record)
|
records = append(records, recordWithNames)
|
||||||
}
|
}
|
||||||
return records, nil
|
return records, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO not recursive, and only should be if we want to support querying with whole sub-objects,
|
func GetAttributeValue(input *types.QueryListRecordsRequest_ValueInput) interface{} {
|
||||||
// which seems unnecessary.
|
if input.Type == "int" {
|
||||||
func QueryValueToJSON(input *types.QueryListRecordsRequest_ValueInput) ([]byte, error) {
|
return input.GetInt()
|
||||||
np := basicnode.Prototype.Any
|
|
||||||
nb := np.NewBuilder()
|
|
||||||
|
|
||||||
switch value := input.GetValue().(type) {
|
|
||||||
case *types.QueryListRecordsRequest_ValueInput_String_:
|
|
||||||
nb.AssignString(value.String_)
|
|
||||||
case *types.QueryListRecordsRequest_ValueInput_Int:
|
|
||||||
nb.AssignInt(value.Int)
|
|
||||||
case *types.QueryListRecordsRequest_ValueInput_Float:
|
|
||||||
nb.AssignFloat(value.Float)
|
|
||||||
case *types.QueryListRecordsRequest_ValueInput_Boolean:
|
|
||||||
nb.AssignBool(value.Boolean)
|
|
||||||
case *types.QueryListRecordsRequest_ValueInput_Link:
|
|
||||||
link := cidlink.Link{Cid: cid.MustParse(value.Link)}
|
|
||||||
nb.AssignLink(link)
|
|
||||||
case *types.QueryListRecordsRequest_ValueInput_Array:
|
|
||||||
return nil, fmt.Errorf("Recursive query values are not supported")
|
|
||||||
case *types.QueryListRecordsRequest_ValueInput_Map:
|
|
||||||
return nil, fmt.Errorf("Recursive query values are not supported")
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("Value has unexpected type %T", value)
|
|
||||||
}
|
}
|
||||||
|
if input.Type == "float" {
|
||||||
n := nb.Build()
|
return input.GetFloat()
|
||||||
var buf bytes.Buffer
|
|
||||||
if err := dagjson.Encode(n, &buf); err != nil {
|
|
||||||
return nil, fmt.Errorf("encoding value to JSON failed: %w", err)
|
|
||||||
}
|
}
|
||||||
return buf.Bytes(), nil
|
if input.Type == "string" {
|
||||||
|
return input.GetString_()
|
||||||
|
}
|
||||||
|
if input.Type == "boolean" {
|
||||||
|
return input.GetBoolean()
|
||||||
|
}
|
||||||
|
if input.Type == "reference" {
|
||||||
|
return input.GetReference().GetId()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getIntersection(a []string, b []string) []string {
|
func getIntersection(a []string, b []string) []string {
|
||||||
@@ -267,9 +234,9 @@ func (k Keeper) GetRecordExpiryQueue(ctx sdk.Context) []*types.ExpiryQueueRecord
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ProcessSetRecord creates a record.
|
// ProcessSetRecord creates a record.
|
||||||
func (k Keeper) ProcessSetRecord(ctx sdk.Context, msg types.MsgSetRecord) (*types.ReadableRecord, error) {
|
func (k Keeper) ProcessSetRecord(ctx sdk.Context, msg types.MsgSetRecord) (*types.RecordType, error) {
|
||||||
payload := msg.Payload.ToReadablePayload()
|
payload := msg.Payload.ToReadablePayload()
|
||||||
record := types.ReadableRecord{Attributes: payload.RecordAttributes, BondID: msg.BondId}
|
record := types.RecordType{Attributes: payload.Record, BondID: msg.BondId}
|
||||||
|
|
||||||
// Check signatures.
|
// Check signatures.
|
||||||
resourceSignBytes, _ := record.GetSignBytes()
|
resourceSignBytes, _ := record.GetSignBytes()
|
||||||
@@ -289,12 +256,14 @@ func (k Keeper) ProcessSetRecord(ctx sdk.Context, msg types.MsgSetRecord) (*type
|
|||||||
for _, sig := range payload.Signatures {
|
for _, sig := range payload.Signatures {
|
||||||
pubKey, err := legacy.PubKeyFromBytes(helpers.BytesFromBase64(sig.PubKey))
|
pubKey, err := legacy.PubKeyFromBytes(helpers.BytesFromBase64(sig.PubKey))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errorsmod.Wrap(sdkerrors.ErrUnauthorized, fmt.Sprint("Error decoding pubKey from bytes: ", err))
|
fmt.Println("Error decoding pubKey from bytes: ", err)
|
||||||
|
return nil, errorsmod.Wrap(sdkerrors.ErrUnauthorized, "Invalid public key.")
|
||||||
}
|
}
|
||||||
|
|
||||||
sigOK := pubKey.VerifySignature(resourceSignBytes, helpers.BytesFromBase64(sig.Sig))
|
sigOK := pubKey.VerifySignature(resourceSignBytes, helpers.BytesFromBase64(sig.Sig))
|
||||||
if !sigOK {
|
if !sigOK {
|
||||||
return nil, errorsmod.Wrap(sdkerrors.ErrUnauthorized, fmt.Sprint("Signature mismatch: ", sig.PubKey))
|
fmt.Println("Signature mismatch: ", sig.PubKey)
|
||||||
|
return nil, errorsmod.Wrap(sdkerrors.ErrUnauthorized, "Invalid signature.")
|
||||||
}
|
}
|
||||||
record.Owners = append(record.Owners, pubKey.Address().String())
|
record.Owners = append(record.Owners, pubKey.Address().String())
|
||||||
}
|
}
|
||||||
@@ -308,13 +277,11 @@ func (k Keeper) ProcessSetRecord(ctx sdk.Context, msg types.MsgSetRecord) (*type
|
|||||||
return &record, nil
|
return &record, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k Keeper) processRecord(ctx sdk.Context, record *types.ReadableRecord, isRenewal bool) error {
|
func (k Keeper) processRecord(ctx sdk.Context, record *types.RecordType, isRenewal bool) error {
|
||||||
params := k.GetParams(ctx)
|
params := k.GetParams(ctx)
|
||||||
rent := params.RecordRent
|
rent := params.RecordRent
|
||||||
|
|
||||||
err := k.bondKeeper.TransferCoinsToModuleAccount(
|
err := k.bondKeeper.TransferCoinsToModuleAccount(ctx, record.BondID, types.RecordRentModuleAccountName, sdk.NewCoins(rent))
|
||||||
ctx, record.BondID, types.RecordRentModuleAccountName, sdk.NewCoins(rent),
|
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -329,15 +296,7 @@ func (k Keeper) processRecord(ctx sdk.Context, record *types.ReadableRecord, isR
|
|||||||
}
|
}
|
||||||
k.PutRecord(ctx, recordObj)
|
k.PutRecord(ctx, recordObj)
|
||||||
|
|
||||||
// TODO process type here
|
if err := k.ProcessAttributes(ctx, *record); err != nil {
|
||||||
// recordType, ok := record.Attributes["type"].(string)
|
|
||||||
|
|
||||||
if err := k.processAttributes(ctx, record.Attributes, record.ID, ""); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
expiryTimeKey := GetAttributesIndexKey(ExpiryTimeAttributeName, []byte(record.ExpiryTime))
|
|
||||||
if err := k.SetAttributeMapping(ctx, expiryTimeKey, record.ID); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,62 +317,45 @@ func (k Keeper) PutRecord(ctx sdk.Context, record types.Record) {
|
|||||||
k.updateBlockChangeSetForRecord(ctx, record.Id)
|
k.updateBlockChangeSetForRecord(ctx, record.Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k Keeper) processAttributes(ctx sdk.Context, attrs types.AttributeMap, id string, prefix string) error {
|
func (k Keeper) ProcessAttributes(ctx sdk.Context, record types.RecordType) error {
|
||||||
np := basicnode.Prototype.Map
|
if err := k.insertAttributes(ctx, record.ID, record.Attributes, ""); err != nil {
|
||||||
nb := np.NewBuilder()
|
|
||||||
encAttrs, err := canonicaljson.Marshal(attrs)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if len(attrs) == 0 {
|
|
||||||
encAttrs = []byte("{}")
|
expiryTimeKey := GetAttributesIndexKey(ExpiryTimeAttributeName, record.ExpiryTime)
|
||||||
}
|
if err := k.setAttributeMapping(ctx, expiryTimeKey, record.ID); err != nil {
|
||||||
err = dagjson.Decode(nb, bytes.NewReader(encAttrs))
|
return err
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to decode attributes: %w", err)
|
|
||||||
}
|
|
||||||
n := nb.Build()
|
|
||||||
if n.Kind() != ipld.Kind_Map {
|
|
||||||
return fmt.Errorf("Record attributes must be a map, not %T", n.Kind())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return k.processAttributeMap(ctx, n, id, prefix)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (k Keeper) processAttributeMap(ctx sdk.Context, n ipld.Node, id string, prefix string) error {
|
|
||||||
for it := n.MapIterator(); !it.Done(); {
|
|
||||||
keynode, valuenode, err := it.Next()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
key, err := keynode.AsString()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if valuenode.Kind() == ipld.Kind_Map {
|
|
||||||
k.processAttributeMap(ctx, valuenode, id, key)
|
|
||||||
} else {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
if err := dagjson.Encode(valuenode, &buf); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
value := buf.Bytes()
|
|
||||||
indexKey := GetAttributesIndexKey(prefix+key, value)
|
|
||||||
if err := k.SetAttributeMapping(ctx, indexKey, id); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAttributesIndexKey(key string, suffix []byte) []byte {
|
func (k Keeper) insertAttributes(ctx sdk.Context, recordID string, attr interface{}, keyPrefix string) error {
|
||||||
keyString := fmt.Sprintf("%s%s", key, suffix)
|
if reflect.TypeOf(attr).Kind() == reflect.Map {
|
||||||
|
val := attr.(map[string]interface{})
|
||||||
|
// #nosec G705
|
||||||
|
for key := range val {
|
||||||
|
newKeyPrefix := fmt.Sprint(keyPrefix + key + "---")
|
||||||
|
if err := k.insertAttributes(ctx, recordID, val[key], newKeyPrefix); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
indexKey := GetAttributesIndexKey(keyPrefix, attr)
|
||||||
|
if err := k.setAttributeMapping(ctx, indexKey, recordID); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAttributesIndexKey(key string, value interface{}) []byte {
|
||||||
|
keyString := fmt.Sprintf("%s%s", key, value)
|
||||||
return append(PrefixAttributesIndex, []byte(keyString)...)
|
return append(PrefixAttributesIndex, []byte(keyString)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k Keeper) SetAttributeMapping(ctx sdk.Context, key []byte, recordID string) error {
|
func (k Keeper) setAttributeMapping(ctx sdk.Context, key []byte, recordID string) error {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
var recordIds []string
|
var recordIds []string
|
||||||
if store.Has(key) {
|
if store.Has(key) {
|
||||||
@@ -421,6 +363,8 @@ func (k Keeper) SetAttributeMapping(ctx sdk.Context, key []byte, recordID string
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot unmarshal byte array, error, %w", err)
|
return fmt.Errorf("cannot unmarshal byte array, error, %w", err)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
recordIds = []string{}
|
||||||
}
|
}
|
||||||
recordIds = append(recordIds, recordID)
|
recordIds = append(recordIds, recordID)
|
||||||
bz, err := json.Marshal(recordIds)
|
bz, err := json.Marshal(recordIds)
|
||||||
@@ -440,7 +384,7 @@ func (k Keeper) GetAttributeMapping(ctx sdk.Context, key []byte) ([]string, erro
|
|||||||
|
|
||||||
var recordIds []string
|
var recordIds []string
|
||||||
if err := json.Unmarshal(store.Get(key), &recordIds); err != nil {
|
if err := json.Unmarshal(store.Get(key), &recordIds); err != nil {
|
||||||
return nil, fmt.Errorf("cannot unmarshal byte array, error, %w", err)
|
return nil, fmt.Errorf("cannont unmarshal byte array, error, %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return recordIds, nil
|
return recordIds, nil
|
||||||
@@ -618,7 +562,7 @@ func (k Keeper) GetModuleBalances(ctx sdk.Context) []*types.AccountBalance {
|
|||||||
return balances
|
return balances
|
||||||
}
|
}
|
||||||
|
|
||||||
func decodeRecordNames(store sdk.KVStore, record *types.Record) {
|
func recordObjToRecord(store sdk.KVStore, record types.Record) types.Record {
|
||||||
reverseNameIndexKey := GetCIDToNamesIndexKey(record.Id)
|
reverseNameIndexKey := GetCIDToNamesIndexKey(record.Id)
|
||||||
|
|
||||||
if store.Has(reverseNameIndexKey) {
|
if store.Has(reverseNameIndexKey) {
|
||||||
@@ -629,4 +573,6 @@ func decodeRecordNames(store sdk.KVStore, record *types.Record) {
|
|||||||
|
|
||||||
record.Names = names
|
record.Names = names
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return record
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -611,7 +611,7 @@ func (k Keeper) ProcessAuthorityExpiryQueue(ctx sdk.Context) {
|
|||||||
k.SetNameAuthority(ctx, name, &authority)
|
k.SetNameAuthority(ctx, name, &authority)
|
||||||
k.DeleteAuthorityExpiryQueue(ctx, name, authority)
|
k.DeleteAuthorityExpiryQueue(ctx, name, authority)
|
||||||
|
|
||||||
logger(ctx).Info(fmt.Sprintf("Marking authority expired as no bond present: %s", name))
|
ctx.Logger().Info(fmt.Sprintf("Marking authority expired as no bond present: %s", name))
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -672,7 +672,7 @@ func (k Keeper) AuthorityExpiryQueueIterator(ctx sdk.Context, endTime time.Time)
|
|||||||
|
|
||||||
// TryTakeAuthorityRent tries to take rent from the authority bond.
|
// TryTakeAuthorityRent tries to take rent from the authority bond.
|
||||||
func (k Keeper) TryTakeAuthorityRent(ctx sdk.Context, name string, authority types.NameAuthority) {
|
func (k Keeper) TryTakeAuthorityRent(ctx sdk.Context, name string, authority types.NameAuthority) {
|
||||||
logger(ctx).Info(fmt.Sprintf("Trying to take rent for authority: %s", name))
|
ctx.Logger().Info(fmt.Sprintf("Trying to take rent for authority: %s", name))
|
||||||
|
|
||||||
params := k.GetParams(ctx)
|
params := k.GetParams(ctx)
|
||||||
rent := params.AuthorityRent
|
rent := params.AuthorityRent
|
||||||
@@ -684,7 +684,7 @@ func (k Keeper) TryTakeAuthorityRent(ctx sdk.Context, name string, authority typ
|
|||||||
k.SetNameAuthority(ctx, name, &authority)
|
k.SetNameAuthority(ctx, name, &authority)
|
||||||
k.DeleteAuthorityExpiryQueue(ctx, name, authority)
|
k.DeleteAuthorityExpiryQueue(ctx, name, authority)
|
||||||
|
|
||||||
logger(ctx).Info(fmt.Sprintf("Insufficient funds in owner account to pay authority rent, marking as expired: %s", name))
|
ctx.Logger().Info(fmt.Sprintf("Insufficient funds in owner account to pay authority rent, marking as expired: %s", name))
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -699,7 +699,7 @@ func (k Keeper) TryTakeAuthorityRent(ctx sdk.Context, name string, authority typ
|
|||||||
k.SetNameAuthority(ctx, name, &authority)
|
k.SetNameAuthority(ctx, name, &authority)
|
||||||
k.AddBondToAuthorityIndexEntry(ctx, authority.BondId, name)
|
k.AddBondToAuthorityIndexEntry(ctx, authority.BondId, name)
|
||||||
|
|
||||||
logger(ctx).Info(fmt.Sprintf("Authority rent paid successfully: %s", name))
|
ctx.Logger().Info(fmt.Sprintf("Authority rent paid successfully: %s", name))
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListNameAuthorityRecords - get all name authority records.
|
// ListNameAuthorityRecords - get all name authority records.
|
||||||
|
|||||||
@@ -39,14 +39,14 @@ func (k RecordKeeper) OnAuctionWinnerSelected(ctx sdk.Context, auctionID string)
|
|||||||
name := k.GetAuctionToAuthorityMapping(ctx, auctionID)
|
name := k.GetAuctionToAuthorityMapping(ctx, auctionID)
|
||||||
if name == "" {
|
if name == "" {
|
||||||
// We don't know about this auction, ignore.
|
// We don't know about this auction, ignore.
|
||||||
logger(ctx).Info(fmt.Sprintf("Ignoring auction notification, name mapping not found: %s", auctionID))
|
ctx.Logger().Info(fmt.Sprintf("Ignoring auction notification, name mapping not found: %s", auctionID))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
if !HasNameAuthority(store, name) {
|
if !HasNameAuthority(store, name) {
|
||||||
// We don't know about this authority, ignore.
|
// We don't know about this authority, ignore.
|
||||||
logger(ctx).Info(fmt.Sprintf("Ignoring auction notification, authority not found: %s", auctionID))
|
ctx.Logger().Info(fmt.Sprintf("Ignoring auction notification, authority not found: %s", auctionID))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,12 +71,12 @@ func (k RecordKeeper) OnAuctionWinnerSelected(ctx sdk.Context, auctionID string)
|
|||||||
// Can be used to check if names are older than the authority itself (stale names).
|
// Can be used to check if names are older than the authority itself (stale names).
|
||||||
authority.Height = uint64(ctx.BlockHeight())
|
authority.Height = uint64(ctx.BlockHeight())
|
||||||
|
|
||||||
logger(ctx).Info(fmt.Sprintf("Winner selected, marking authority as active: %s", name))
|
ctx.Logger().Info(fmt.Sprintf("Winner selected, marking authority as active: %s", name))
|
||||||
} else {
|
} else {
|
||||||
// Mark as expired.
|
// Mark as expired.
|
||||||
authority.Status = types.AuthorityExpired
|
authority.Status = types.AuthorityExpired
|
||||||
|
|
||||||
logger(ctx).Info(fmt.Sprintf("No winner, marking authority as expired: %s", name))
|
ctx.Logger().Info(fmt.Sprintf("No winner, marking authority as expired: %s", name))
|
||||||
}
|
}
|
||||||
|
|
||||||
authority.AuctionId = ""
|
authority.AuctionId = ""
|
||||||
@@ -85,7 +85,7 @@ func (k RecordKeeper) OnAuctionWinnerSelected(ctx sdk.Context, auctionID string)
|
|||||||
// Forget about this auction now, we no longer need it.
|
// Forget about this auction now, we no longer need it.
|
||||||
removeAuctionToAuthorityMapping(store, auctionID)
|
removeAuctionToAuthorityMapping(store, auctionID)
|
||||||
} else {
|
} else {
|
||||||
logger(ctx).Info(fmt.Sprintf("Ignoring auction notification, status: %s", auctionObj.Status))
|
ctx.Logger().Info(fmt.Sprintf("Ignoring auction notification, status: %s", auctionObj.Status))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,10 +147,9 @@ func (k RecordKeeper) QueryRecordsByBond(ctx sdk.Context, bondID string) []types
|
|||||||
cid := itr.Key()[len(bondIDPrefix):]
|
cid := itr.Key()[len(bondIDPrefix):]
|
||||||
bz := store.Get(append(PrefixCIDToRecordIndex, cid...))
|
bz := store.Get(append(PrefixCIDToRecordIndex, cid...))
|
||||||
if bz != nil {
|
if bz != nil {
|
||||||
var record types.Record
|
var obj types.Record
|
||||||
k.cdc.MustUnmarshal(bz, &record)
|
k.cdc.MustUnmarshal(bz, &obj)
|
||||||
decodeRecordNames(store, &record)
|
records = append(records, recordObjToRecord(store, obj))
|
||||||
records = append(records, record)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,7 +173,7 @@ func (k Keeper) ProcessRenewRecord(ctx sdk.Context, msg types.MsgRenewRecord) er
|
|||||||
return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "Renewal not required.")
|
return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "Renewal not required.")
|
||||||
}
|
}
|
||||||
|
|
||||||
recordType := record.ToReadableRecord()
|
recordType := record.ToRecordType()
|
||||||
err = k.processRecord(ctx, &recordType, true)
|
err = k.processRecord(ctx, &recordType, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
type Attributes interface {
|
||||||
|
GetType() string
|
||||||
|
}
|
||||||
Generated
+5240
File diff suppressed because it is too large
Load Diff
@@ -39,6 +39,59 @@ func RegisterInterfaces(registry types.InterfaceRegistry) {
|
|||||||
&MsgReAssociateRecords{},
|
&MsgReAssociateRecords{},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
registry.RegisterInterface(
|
||||||
|
"vulcanize.registry.v1beta1.ServiceProviderRecord",
|
||||||
|
(*Attributes)(nil),
|
||||||
|
&ServiceProviderRecord{},
|
||||||
|
)
|
||||||
|
|
||||||
|
registry.RegisterInterface(
|
||||||
|
"vulcanize.registry.v1beta1.WebsiteRegistrationRecord",
|
||||||
|
(*Attributes)(nil),
|
||||||
|
&WebsiteRegistrationRecord{},
|
||||||
|
)
|
||||||
|
|
||||||
|
registry.RegisterInterface(
|
||||||
|
"vulcanize.registry.v1beta1.GitRepository",
|
||||||
|
(*Attributes)(nil),
|
||||||
|
&GitRepository{},
|
||||||
|
)
|
||||||
|
|
||||||
|
registry.RegisterInterface(
|
||||||
|
"vulcanize.registry.v1beta1.Binary",
|
||||||
|
(*Attributes)(nil),
|
||||||
|
&Binary{},
|
||||||
|
)
|
||||||
|
|
||||||
|
registry.RegisterInterface(
|
||||||
|
"vulcanize.registry.v1beta1.DockerImage",
|
||||||
|
(*Attributes)(nil),
|
||||||
|
&DockerImage{},
|
||||||
|
)
|
||||||
|
|
||||||
|
registry.RegisterInterface(
|
||||||
|
"vulcanize.registry.v1beta1.WatcherRegistrationRecord",
|
||||||
|
(*Attributes)(nil),
|
||||||
|
&WatcherRegistrationRecord{},
|
||||||
|
)
|
||||||
|
|
||||||
|
registry.RegisterInterface(
|
||||||
|
"vulcanize.registry.v1beta1.ResponderContract",
|
||||||
|
(*Attributes)(nil),
|
||||||
|
&ResponderContract{},
|
||||||
|
)
|
||||||
|
|
||||||
|
registry.RegisterInterface(
|
||||||
|
"vulcanize.registry.v1beta1.JSPackage",
|
||||||
|
(*Attributes)(nil),
|
||||||
|
&JSPackage{},
|
||||||
|
)
|
||||||
|
|
||||||
|
registry.RegisterInterface(
|
||||||
|
"vulcanize.registry.v1beta1.ChainRegistrationRecord",
|
||||||
|
(*Attributes)(nil),
|
||||||
|
&ChainRegistrationRecord{},
|
||||||
|
)
|
||||||
msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc)
|
msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// NewMsgSetName is the constructor function for MsgSetName.
|
// NewMsgSetName is the constructor function for MsgSetName.
|
||||||
func NewMsgSetName(crn string, cid string, signer sdk.AccAddress) *MsgSetName {
|
func NewMsgSetName(crn string, cid string, signer sdk.AccAddress) MsgSetName {
|
||||||
return &MsgSetName{
|
return MsgSetName{
|
||||||
Crn: crn,
|
Crn: crn,
|
||||||
Cid: cid,
|
Cid: cid,
|
||||||
Signer: signer.String(),
|
Signer: signer.String(),
|
||||||
|
|||||||
Generated
+362
-1017
File diff suppressed because it is too large
Load Diff
@@ -2,6 +2,7 @@ package types
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
errorsmod "cosmossdk.io/errors"
|
errorsmod "cosmossdk.io/errors"
|
||||||
|
cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||||
)
|
)
|
||||||
@@ -13,11 +14,13 @@ var (
|
|||||||
_ sdk.Msg = &MsgDissociateBond{}
|
_ sdk.Msg = &MsgDissociateBond{}
|
||||||
_ sdk.Msg = &MsgDissociateRecords{}
|
_ sdk.Msg = &MsgDissociateRecords{}
|
||||||
_ sdk.Msg = &MsgReAssociateRecords{}
|
_ sdk.Msg = &MsgReAssociateRecords{}
|
||||||
|
|
||||||
|
_ cdctypes.UnpackInterfacesMessage = &MsgSetRecord{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewMsgSetRecord is the constructor function for MsgSetRecord.
|
// NewMsgSetRecord is the constructor function for MsgSetRecord.
|
||||||
func NewMsgSetRecord(payload Payload, bondID string, signer sdk.AccAddress) *MsgSetRecord {
|
func NewMsgSetRecord(payload Payload, bondID string, signer sdk.AccAddress) MsgSetRecord {
|
||||||
return &MsgSetRecord{
|
return MsgSetRecord{
|
||||||
Payload: payload,
|
Payload: payload,
|
||||||
BondId: bondID,
|
BondId: bondID,
|
||||||
Signer: signer.String(),
|
Signer: signer.String(),
|
||||||
@@ -58,6 +61,12 @@ func (msg MsgSetRecord) GetSignBytes() []byte {
|
|||||||
return sdk.MustSortJSON(bz)
|
return sdk.MustSortJSON(bz)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces
|
||||||
|
func (msg MsgSetRecord) UnpackInterfaces(unpacker cdctypes.AnyUnpacker) error {
|
||||||
|
var attr Attributes
|
||||||
|
return unpacker.UnpackAny(msg.Payload.Record.Attributes, &attr)
|
||||||
|
}
|
||||||
|
|
||||||
// NewMsgRenewRecord is the constructor function for MsgRenewRecord.
|
// NewMsgRenewRecord is the constructor function for MsgRenewRecord.
|
||||||
func NewMsgRenewRecord(recordID string, signer sdk.AccAddress) MsgRenewRecord {
|
func NewMsgRenewRecord(recordID string, signer sdk.AccAddress) MsgRenewRecord {
|
||||||
return MsgRenewRecord{
|
return MsgRenewRecord{
|
||||||
|
|||||||
Generated
+124
-116
@@ -5,7 +5,7 @@ package types
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
fmt "fmt"
|
fmt "fmt"
|
||||||
_ "github.com/cosmos/cosmos-sdk/codec/types"
|
types1 "github.com/cosmos/cosmos-sdk/codec/types"
|
||||||
types "github.com/cosmos/cosmos-sdk/types"
|
types "github.com/cosmos/cosmos-sdk/types"
|
||||||
_ "github.com/cosmos/gogoproto/gogoproto"
|
_ "github.com/cosmos/gogoproto/gogoproto"
|
||||||
proto "github.com/gogo/protobuf/proto"
|
proto "github.com/gogo/protobuf/proto"
|
||||||
@@ -155,17 +155,17 @@ func (m *Params) GetAuthorityAuctionMinimumBid() types.Coin {
|
|||||||
return types.Coin{}
|
return types.Coin{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Record defines a registry record
|
// Params defines the registry module records
|
||||||
type Record struct {
|
type Record struct {
|
||||||
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" json:"id" yaml:"id"`
|
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" json:"id" yaml:"id"`
|
||||||
BondId string `protobuf:"bytes,2,opt,name=bond_id,json=bondId,proto3" json:"bond_id,omitempty" json:"bondId" yaml:"bondId"`
|
BondId string `protobuf:"bytes,2,opt,name=bond_id,json=bondId,proto3" json:"bond_id,omitempty" json:"bondId" yaml:"bondId"`
|
||||||
CreateTime string `protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty" json:"createTime" yaml:"createTime"`
|
CreateTime string `protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty" json:"createTime" yaml:"createTime"`
|
||||||
ExpiryTime string `protobuf:"bytes,4,opt,name=expiry_time,json=expiryTime,proto3" json:"expiry_time,omitempty" json:"expiryTime" yaml:"expiryTime"`
|
ExpiryTime string `protobuf:"bytes,4,opt,name=expiry_time,json=expiryTime,proto3" json:"expiry_time,omitempty" json:"expiryTime" yaml:"expiryTime"`
|
||||||
Deleted bool `protobuf:"varint,5,opt,name=deleted,proto3" json:"deleted,omitempty"`
|
Deleted bool `protobuf:"varint,5,opt,name=deleted,proto3" json:"deleted,omitempty"`
|
||||||
Owners []string `protobuf:"bytes,6,rep,name=owners,proto3" json:"owners,omitempty" json:"owners" yaml:"owners"`
|
Owners []string `protobuf:"bytes,6,rep,name=owners,proto3" json:"owners,omitempty" json:"owners" yaml:"owners"`
|
||||||
Attributes []byte `protobuf:"bytes,7,opt,name=attributes,proto3" json:"attributes,omitempty" json:"attributes" yaml:"attributes"`
|
Attributes *types1.Any `protobuf:"bytes,7,opt,name=attributes,proto3" json:"attributes,omitempty" json:"attributes" yaml:"attributes"`
|
||||||
Names []string `protobuf:"bytes,8,rep,name=names,proto3" json:"names,omitempty" json:"names" yaml:"names"`
|
Names []string `protobuf:"bytes,8,rep,name=names,proto3" json:"names,omitempty" json:"names" yaml:"names"`
|
||||||
Type string `protobuf:"bytes,9,opt,name=type,proto3" json:"type,omitempty" json:"types" yaml:"types"`
|
Type string `protobuf:"bytes,9,opt,name=type,proto3" json:"type,omitempty" json:"types" yaml:"types"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Record) Reset() { *m = Record{} }
|
func (m *Record) Reset() { *m = Record{} }
|
||||||
@@ -243,7 +243,7 @@ func (m *Record) GetOwners() []string {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Record) GetAttributes() []byte {
|
func (m *Record) GetAttributes() *types1.Any {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Attributes
|
return m.Attributes
|
||||||
}
|
}
|
||||||
@@ -264,7 +264,7 @@ func (m *Record) GetType() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// AuthorityEntry defines a registry authority
|
// AuthorityEntry defines the registry module AuthorityEntries
|
||||||
type AuthorityEntry struct {
|
type AuthorityEntry struct {
|
||||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
||||||
Entry *NameAuthority `protobuf:"bytes,2,opt,name=entry,proto3" json:"entry,omitempty"`
|
Entry *NameAuthority `protobuf:"bytes,2,opt,name=entry,proto3" json:"entry,omitempty"`
|
||||||
@@ -466,7 +466,7 @@ func (m *NameEntry) GetEntry() *NameRecord {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NameRecord defines a versioned name record
|
// NameRecord
|
||||||
type NameRecord struct {
|
type NameRecord struct {
|
||||||
Latest *NameRecordEntry `protobuf:"bytes,1,opt,name=latest,proto3" json:"latest,omitempty"`
|
Latest *NameRecordEntry `protobuf:"bytes,1,opt,name=latest,proto3" json:"latest,omitempty"`
|
||||||
History []*NameRecordEntry `protobuf:"bytes,2,rep,name=history,proto3" json:"history,omitempty"`
|
History []*NameRecordEntry `protobuf:"bytes,2,rep,name=history,proto3" json:"history,omitempty"`
|
||||||
@@ -781,91 +781,92 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var fileDescriptor_5ca0f65a0e7121be = []byte{
|
var fileDescriptor_5ca0f65a0e7121be = []byte{
|
||||||
// 1344 bytes of a gzipped FileDescriptorProto
|
// 1347 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xdd, 0x6e, 0x1b, 0xc5,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xdd, 0x6e, 0x1b, 0x45,
|
||||||
0x17, 0xcf, 0xc6, 0x89, 0x13, 0x9f, 0x34, 0xf9, 0xff, 0x35, 0xa4, 0xad, 0x13, 0xa8, 0x37, 0x18,
|
0x14, 0xce, 0xc6, 0x89, 0x13, 0x9f, 0x34, 0x01, 0x0d, 0x69, 0xeb, 0x04, 0xea, 0x0d, 0x46, 0xa5,
|
||||||
0x95, 0x36, 0x84, 0xda, 0x2a, 0xbd, 0x28, 0x9f, 0x42, 0xd9, 0x24, 0x0d, 0x11, 0x02, 0xc2, 0xb4,
|
0x0d, 0xa1, 0xb6, 0x4a, 0x2f, 0xca, 0xaf, 0x50, 0x36, 0x49, 0x4b, 0x84, 0x80, 0x30, 0xed, 0x0d,
|
||||||
0x37, 0x20, 0x21, 0x6b, 0x76, 0x77, 0x6a, 0x0f, 0xf5, 0xee, 0x5a, 0xbb, 0xb3, 0xa5, 0xe6, 0x0e,
|
0x48, 0x95, 0x35, 0xbb, 0x3b, 0xb5, 0x87, 0x7a, 0x77, 0xad, 0xdd, 0xd9, 0x52, 0x73, 0xc7, 0x1b,
|
||||||
0xf1, 0x02, 0xb9, 0xec, 0x05, 0x6f, 0x00, 0x12, 0x8f, 0x41, 0x2f, 0x7b, 0x89, 0x90, 0x30, 0xa8,
|
0xe4, 0xb2, 0x48, 0xbc, 0x01, 0x48, 0x3c, 0x06, 0xbd, 0xec, 0x25, 0x42, 0xc2, 0xa0, 0xe6, 0x0d,
|
||||||
0x79, 0x03, 0x3f, 0x01, 0xda, 0xf9, 0xd8, 0x2f, 0xdb, 0x75, 0xa1, 0x77, 0x73, 0xbe, 0x7e, 0xf3,
|
0xfc, 0x04, 0x68, 0xe7, 0x67, 0xff, 0x6c, 0xd7, 0x85, 0xde, 0xcd, 0xf9, 0xfb, 0xe6, 0x9b, 0x33,
|
||||||
0x9b, 0x33, 0xe7, 0x9c, 0xd9, 0x85, 0xdd, 0x87, 0x71, 0xdf, 0x21, 0x3e, 0xfb, 0x9e, 0xb6, 0x43,
|
0xe7, 0x9c, 0xd9, 0x85, 0xdd, 0x87, 0x71, 0xdf, 0x21, 0x3e, 0xfb, 0x81, 0xb6, 0x43, 0xda, 0x65,
|
||||||
0xda, 0x65, 0x11, 0x0f, 0x87, 0xed, 0x87, 0x37, 0x6d, 0xca, 0xc9, 0xcd, 0x54, 0xd1, 0x1a, 0x84,
|
0x11, 0x0f, 0x87, 0xed, 0x87, 0xd7, 0x6d, 0xca, 0xc9, 0xf5, 0x54, 0xd1, 0x1a, 0x84, 0x01, 0x0f,
|
||||||
0x01, 0x0f, 0xd0, 0x76, 0xea, 0xda, 0x4a, 0x2d, 0xca, 0x75, 0xbb, 0xd1, 0x0d, 0x82, 0x6e, 0x9f,
|
0xd0, 0x76, 0xea, 0xda, 0x4a, 0x2d, 0xca, 0x75, 0xbb, 0xd1, 0x0d, 0x82, 0x6e, 0x9f, 0xb6, 0x85,
|
||||||
0xb6, 0x85, 0xa7, 0x1d, 0xdf, 0x6f, 0xbb, 0x71, 0x48, 0x38, 0x0b, 0x7c, 0x19, 0xbb, 0x6d, 0x96,
|
0xa7, 0x1d, 0xdf, 0x6f, 0xbb, 0x71, 0x48, 0x38, 0x0b, 0x7c, 0x19, 0xbb, 0x6d, 0x96, 0xed, 0x9c,
|
||||||
0xed, 0x9c, 0x79, 0x34, 0xe2, 0xc4, 0x1b, 0x28, 0x87, 0xcd, 0x6e, 0xd0, 0x0d, 0xc4, 0xb2, 0x9d,
|
0x79, 0x34, 0xe2, 0xc4, 0x1b, 0x28, 0x87, 0xcd, 0x6e, 0xd0, 0x0d, 0xc4, 0xb2, 0x9d, 0xac, 0x94,
|
||||||
0xac, 0x94, 0xb6, 0xe1, 0x04, 0x91, 0x17, 0x44, 0x6d, 0x9b, 0x44, 0x34, 0xa5, 0xe5, 0x04, 0x4c,
|
0xb6, 0xe1, 0x04, 0x91, 0x17, 0x44, 0x6d, 0x9b, 0x44, 0x34, 0xa5, 0xe5, 0x04, 0x4c, 0xc3, 0x6e,
|
||||||
0xc3, 0x6e, 0x95, 0x61, 0x89, 0xaf, 0xd8, 0x36, 0xff, 0x5c, 0x87, 0xea, 0x29, 0x09, 0x89, 0x17,
|
0x95, 0x61, 0x89, 0xaf, 0xd8, 0x36, 0xff, 0x5a, 0x87, 0xea, 0x09, 0x09, 0x89, 0x17, 0x21, 0x06,
|
||||||
0x21, 0x06, 0x6b, 0x21, 0x75, 0x82, 0xd0, 0xed, 0x84, 0xd4, 0xe7, 0x75, 0x63, 0xc7, 0xb8, 0xbe,
|
0x6b, 0x21, 0x75, 0x82, 0xd0, 0xed, 0x84, 0xd4, 0xe7, 0x75, 0x63, 0xc7, 0xb8, 0xba, 0xf6, 0xde,
|
||||||
0xf6, 0xce, 0x56, 0x4b, 0x62, 0xb7, 0x12, 0x6c, 0x7d, 0x8e, 0xd6, 0x41, 0xc0, 0x7c, 0xeb, 0xc6,
|
0x56, 0x4b, 0x62, 0xb7, 0x12, 0x6c, 0x7d, 0x8e, 0xd6, 0x41, 0xc0, 0x7c, 0xeb, 0xda, 0x93, 0x91,
|
||||||
0x93, 0x91, 0xb9, 0x30, 0x1e, 0x99, 0x57, 0xbf, 0x8d, 0x02, 0xff, 0xfd, 0x66, 0x2e, 0xb6, 0xb9,
|
0xb9, 0x30, 0x1e, 0x99, 0x97, 0xbf, 0x8b, 0x02, 0xff, 0xc3, 0x66, 0x2e, 0xb6, 0xb9, 0x33, 0x24,
|
||||||
0x33, 0x24, 0x5e, 0xbf, 0xa8, 0xc2, 0x20, 0x25, 0x4c, 0x7d, 0x8e, 0xce, 0x0c, 0xd8, 0xcc, 0x19,
|
0x5e, 0xbf, 0xa8, 0xc2, 0x20, 0x25, 0x4c, 0x7d, 0x8e, 0x4e, 0x0d, 0xd8, 0xcc, 0x19, 0x3b, 0x3a,
|
||||||
0x3b, 0x3a, 0x0d, 0xf5, 0x45, 0xb5, 0xa9, 0x24, 0xdc, 0xd2, 0x84, 0x5b, 0x87, 0xca, 0xc1, 0x3a,
|
0x0d, 0xf5, 0x45, 0xb5, 0xa9, 0x24, 0xdc, 0xd2, 0x84, 0x5b, 0x87, 0xca, 0xc1, 0x3a, 0x50, 0x9b,
|
||||||
0x50, 0x9b, 0xde, 0x9e, 0xd8, 0x34, 0x05, 0x99, 0xb2, 0x7b, 0x66, 0x7b, 0xfc, 0x97, 0x69, 0x60,
|
0xde, 0x9c, 0xd8, 0x34, 0x05, 0x99, 0xb2, 0x7b, 0x66, 0x7b, 0xfc, 0xb7, 0x69, 0x60, 0x94, 0x51,
|
||||||
0x94, 0x51, 0xd1, 0xc0, 0x28, 0x86, 0x0d, 0x12, 0xf3, 0x5e, 0x10, 0x32, 0x3e, 0x94, 0x09, 0xa8,
|
0xd1, 0xc0, 0x28, 0x86, 0x0d, 0x12, 0xf3, 0x5e, 0x10, 0x32, 0x3e, 0x94, 0x09, 0xa8, 0xcc, 0x4b,
|
||||||
0xcc, 0x4b, 0xc0, 0x2d, 0xc5, 0x65, 0x4f, 0x72, 0x29, 0x86, 0x6b, 0x16, 0x25, 0x2d, 0x5e, 0x4f,
|
0xc0, 0x0d, 0xc5, 0x65, 0x4f, 0x72, 0x29, 0x86, 0x6b, 0x16, 0x25, 0x2d, 0x5e, 0x4f, 0x15, 0x22,
|
||||||
0x15, 0x22, 0x13, 0x3f, 0x19, 0x70, 0xb9, 0xe8, 0x92, 0x25, 0x63, 0x69, 0x5e, 0x32, 0x4e, 0x14,
|
0x13, 0x3f, 0x1b, 0x70, 0xb1, 0xe8, 0x92, 0x25, 0x63, 0x69, 0x5e, 0x32, 0x8e, 0x15, 0x81, 0x4f,
|
||||||
0x81, 0x8f, 0xa6, 0x11, 0x98, 0xc8, 0xc7, 0x2c, 0xb3, 0x48, 0xc9, 0xc5, 0x02, 0xad, 0x34, 0x2b,
|
0xa6, 0x11, 0x98, 0xc8, 0xc7, 0x2c, 0xb3, 0x48, 0xc9, 0xf9, 0x02, 0xad, 0x34, 0x2b, 0x8f, 0x0d,
|
||||||
0x8f, 0x0d, 0xb8, 0x94, 0xc5, 0x75, 0x43, 0xe2, 0xd0, 0xce, 0x80, 0x86, 0x2c, 0x70, 0xeb, 0xcb,
|
0xb8, 0x90, 0xc5, 0x75, 0x43, 0xe2, 0xd0, 0xce, 0x80, 0x86, 0x2c, 0x70, 0xeb, 0xcb, 0xf3, 0xd8,
|
||||||
0xf3, 0xd8, 0x1d, 0x2b, 0x76, 0x1f, 0x94, 0xd9, 0xe5, 0x61, 0x26, 0xc9, 0x15, 0xac, 0x82, 0xdb,
|
0xdd, 0x56, 0xec, 0x3e, 0x2a, 0xb3, 0xcb, 0xc3, 0x4c, 0x92, 0x2b, 0x58, 0x05, 0xb7, 0xcd, 0xd4,
|
||||||
0x66, 0x6a, 0x3c, 0x4e, 0x6c, 0xa7, 0xc2, 0x84, 0x7e, 0x30, 0x60, 0x2b, 0x8b, 0x22, 0xb1, 0x93,
|
0x78, 0x3b, 0xb1, 0x9d, 0x08, 0x13, 0xfa, 0xd1, 0x80, 0xad, 0x2c, 0x8a, 0xc4, 0x4e, 0xb2, 0x69,
|
||||||
0x6c, 0xda, 0xa1, 0x3e, 0xb1, 0xfb, 0xd4, 0xad, 0x57, 0x77, 0x8c, 0xeb, 0xab, 0xd6, 0xd1, 0x78,
|
0x87, 0xfa, 0xc4, 0xee, 0x53, 0xb7, 0x5e, 0xdd, 0x31, 0xae, 0xae, 0x5a, 0x47, 0xe3, 0x91, 0xb9,
|
||||||
0x64, 0xee, 0x97, 0xb7, 0x2f, 0xb9, 0x4e, 0x32, 0x28, 0x3b, 0xe0, 0xec, 0x86, 0xf6, 0xa5, 0xe9,
|
0x5f, 0xde, 0xbe, 0xe4, 0x3a, 0xc9, 0xa0, 0xec, 0x80, 0xb3, 0x1b, 0xda, 0x97, 0xa6, 0x23, 0x69,
|
||||||
0x48, 0x5a, 0xd0, 0x6f, 0x06, 0x4c, 0x89, 0x73, 0x02, 0xcf, 0x63, 0x3c, 0xca, 0x2e, 0x72, 0x65,
|
0x41, 0xbf, 0x1b, 0x30, 0x25, 0xce, 0x09, 0x3c, 0x8f, 0xf1, 0x28, 0xbb, 0xc8, 0x95, 0x79, 0xa9,
|
||||||
0x5e, 0xaa, 0x3a, 0x2a, 0x55, 0x77, 0x67, 0x71, 0x2d, 0x43, 0xce, 0x26, 0x3d, 0xe1, 0x29, 0x52,
|
0xea, 0xa8, 0x54, 0xdd, 0x99, 0xc5, 0xb5, 0x0c, 0x39, 0x9b, 0xf4, 0x84, 0xa7, 0x48, 0xa1, 0x59,
|
||||||
0x68, 0x96, 0x4f, 0x70, 0x20, 0xdd, 0xd2, 0x8b, 0x9e, 0x7e, 0x92, 0x90, 0x3e, 0xa4, 0xa4, 0x9f,
|
0x3e, 0xc1, 0x81, 0x74, 0x4b, 0x2f, 0x7a, 0xfa, 0x49, 0x42, 0xfa, 0x90, 0x92, 0x7e, 0xee, 0x24,
|
||||||
0x3b, 0xc9, 0xea, 0x4b, 0x9f, 0xa4, 0x0c, 0x39, 0xfb, 0x24, 0x13, 0x9e, 0xd3, 0x4f, 0x82, 0xa5,
|
0xab, 0x2f, 0x7d, 0x92, 0x32, 0xe4, 0xec, 0x93, 0x4c, 0x78, 0x4e, 0x3f, 0x09, 0x96, 0x6e, 0xe9,
|
||||||
0x5b, 0x7a, 0x92, 0x9f, 0x0d, 0x78, 0x6d, 0x56, 0x5a, 0x3a, 0xf7, 0x29, 0xad, 0xd7, 0xe6, 0xf5,
|
0x49, 0x7e, 0x31, 0xe0, 0x8d, 0x59, 0x69, 0xe9, 0xdc, 0xa7, 0xb4, 0x5e, 0x9b, 0xd7, 0xd7, 0x5f,
|
||||||
0xf5, 0x17, 0xea, 0x0c, 0xc7, 0xcf, 0xbf, 0x8d, 0x04, 0x6c, 0xde, 0x3d, 0x08, 0x1f, 0xbc, 0x35,
|
0xa9, 0x33, 0xdc, 0x7e, 0xfe, 0x6d, 0x24, 0x60, 0xf3, 0xee, 0x41, 0xf8, 0xe0, 0xad, 0xe9, 0xd9,
|
||||||
0x3d, 0xfb, 0x77, 0x28, 0x9d, 0xc1, 0x56, 0x1e, 0x5d, 0xb0, 0x85, 0x97, 0x66, 0x9b, 0x81, 0xcd,
|
0xbf, 0x45, 0xe9, 0x0c, 0xb6, 0xf2, 0xe8, 0x82, 0x2d, 0xbc, 0x34, 0xdb, 0x0c, 0x6c, 0x5e, 0xae,
|
||||||
0xcb, 0xf5, 0x0c, 0xb6, 0x32, 0xc3, 0x09, 0xdb, 0x5f, 0x0d, 0xb8, 0x32, 0x19, 0xec, 0x31, 0x9f,
|
0x67, 0xb0, 0x95, 0x19, 0x4e, 0xd8, 0xfe, 0x66, 0xc0, 0xa5, 0xc9, 0x60, 0x8f, 0xf9, 0xcc, 0x8b,
|
||||||
0x79, 0xb1, 0xd7, 0xb1, 0x99, 0x5b, 0x5f, 0x9b, 0x47, 0xf7, 0x4b, 0x45, 0xf7, 0x64, 0x16, 0xdd,
|
0xbd, 0x8e, 0xcd, 0xdc, 0xfa, 0xda, 0x3c, 0xba, 0x5f, 0x2b, 0xba, 0xc7, 0xb3, 0xe8, 0xe6, 0xd0,
|
||||||
0x1c, 0xda, 0x6c, 0xbe, 0x79, 0x27, 0xbc, 0x5d, 0x26, 0xfc, 0x99, 0xb4, 0x5a, 0xcc, 0x6d, 0xfe,
|
0x66, 0xf3, 0xcd, 0x3b, 0xe1, 0xed, 0x32, 0xe1, 0x2f, 0xa4, 0xd5, 0x62, 0x6e, 0xf3, 0xa7, 0x25,
|
||||||
0xb8, 0x04, 0x55, 0x2c, 0xa6, 0x3d, 0xba, 0x06, 0x8b, 0xcc, 0x15, 0xcf, 0x5a, 0xcd, 0xba, 0x3c,
|
0xa8, 0x62, 0x31, 0xed, 0xd1, 0x15, 0x58, 0x64, 0xae, 0x78, 0xd6, 0x6a, 0xd6, 0xc5, 0xf1, 0xc8,
|
||||||
0x1e, 0x99, 0xaf, 0x48, 0x06, 0xd9, 0x36, 0x09, 0xd6, 0x22, 0x73, 0xd1, 0xbb, 0xb0, 0x62, 0x07,
|
0x7c, 0x4d, 0x32, 0xc8, 0xb6, 0x49, 0xb0, 0x16, 0x99, 0x8b, 0xde, 0x87, 0x15, 0x3b, 0xf0, 0xdd,
|
||||||
0xbe, 0xdb, 0x61, 0xae, 0x78, 0x8f, 0x6a, 0x96, 0x39, 0x1e, 0x99, 0xaf, 0x4a, 0xef, 0xc4, 0x70,
|
0x0e, 0x73, 0xc5, 0x7b, 0x54, 0xb3, 0xcc, 0xf1, 0xc8, 0x7c, 0x5d, 0x7a, 0x27, 0x86, 0xe3, 0x34,
|
||||||
0x92, 0x46, 0x28, 0x09, 0x57, 0xe5, 0x02, 0x7d, 0x02, 0x6b, 0x4e, 0x48, 0x09, 0xa7, 0x9d, 0xe4,
|
0x42, 0x49, 0xb8, 0x2a, 0x17, 0xe8, 0x33, 0x58, 0x73, 0x42, 0x4a, 0x38, 0xed, 0x24, 0x0f, 0xb7,
|
||||||
0xe1, 0x16, 0x2f, 0x48, 0xcd, 0xba, 0x36, 0x1e, 0x99, 0x6f, 0xc8, 0x68, 0x69, 0xbc, 0xc7, 0xbc,
|
0x78, 0x41, 0x6a, 0xd6, 0x95, 0xf1, 0xc8, 0x7c, 0x4b, 0x46, 0x4b, 0xe3, 0x5d, 0xe6, 0xa5, 0x57,
|
||||||
0xf4, 0x2a, 0x72, 0x1a, 0x0c, 0x99, 0x90, 0x20, 0xd1, 0x47, 0x03, 0x16, 0x0e, 0x25, 0xd2, 0x52,
|
0x91, 0xd3, 0x60, 0xc8, 0x84, 0x04, 0x89, 0x3e, 0x1a, 0xb0, 0x70, 0x28, 0x91, 0x96, 0xca, 0x48,
|
||||||
0x19, 0x49, 0x1a, 0xf3, 0x48, 0x39, 0x0d, 0x86, 0x4c, 0x40, 0x75, 0x58, 0x71, 0x69, 0x9f, 0x72,
|
0xd2, 0x98, 0x47, 0xca, 0x69, 0x30, 0x64, 0x02, 0xaa, 0xc3, 0x8a, 0x4b, 0xfb, 0x94, 0x53, 0x39,
|
||||||
0x2a, 0x47, 0xf6, 0x2a, 0xd6, 0x22, 0xba, 0x0d, 0xd5, 0xe0, 0x3b, 0x9f, 0x86, 0x51, 0xbd, 0xba,
|
0xb2, 0x57, 0xb1, 0x16, 0xd1, 0x4d, 0xa8, 0x06, 0xdf, 0xfb, 0x34, 0x8c, 0xea, 0xd5, 0x9d, 0x4a,
|
||||||
0x53, 0x29, 0x1e, 0x53, 0xea, 0x35, 0xb4, 0x92, 0xb0, 0x72, 0x47, 0xc7, 0x00, 0x84, 0xf3, 0x90,
|
0xf1, 0x98, 0x52, 0xaf, 0xa1, 0x95, 0x84, 0x95, 0x3b, 0xba, 0x07, 0x40, 0x38, 0x0f, 0x99, 0x1d,
|
||||||
0xd9, 0x31, 0xa7, 0x91, 0x98, 0x6e, 0x17, 0xf2, 0xdc, 0x32, 0x5b, 0x7a, 0x81, 0x99, 0x06, 0xe7,
|
0x73, 0x1a, 0xa9, 0xe9, 0xb6, 0x39, 0x31, 0x13, 0xf6, 0xfd, 0x61, 0x9e, 0x71, 0x16, 0x91, 0x5e,
|
||||||
0x42, 0xd1, 0x2d, 0x58, 0xf6, 0x89, 0x47, 0xa3, 0xfa, 0xaa, 0x20, 0x70, 0x65, 0x3c, 0x32, 0xb7,
|
0x6b, 0xa6, 0xc1, 0x39, 0x40, 0x74, 0x03, 0x96, 0x7d, 0xe2, 0xd1, 0xa8, 0xbe, 0x2a, 0x68, 0x5d,
|
||||||
0x24, 0x86, 0x50, 0xeb, 0x70, 0x29, 0x60, 0xe9, 0x8b, 0x6e, 0xc2, 0x12, 0x1f, 0x0e, 0x64, 0x1f,
|
0x1a, 0x8f, 0xcc, 0x2d, 0x89, 0x21, 0xd4, 0x3a, 0x5c, 0x0a, 0x58, 0xfa, 0xa2, 0xeb, 0xb0, 0xc4,
|
||||||
0x17, 0x62, 0x12, 0x6d, 0x1a, 0x23, 0x05, 0x2c, 0x5c, 0x9b, 0x14, 0x36, 0xf6, 0x75, 0x8d, 0x1c,
|
0x87, 0x03, 0xd9, 0xdd, 0x85, 0x98, 0x44, 0x9b, 0xc6, 0x48, 0x01, 0x0b, 0xd7, 0x26, 0x85, 0x8d,
|
||||||
0xf9, 0x3c, 0x1c, 0x22, 0x04, 0x4b, 0x09, 0x9a, 0x2c, 0x07, 0x2c, 0xd6, 0xe8, 0x63, 0x58, 0xa6,
|
0x7d, 0x5d, 0x39, 0x47, 0x3e, 0x0f, 0x87, 0x08, 0xc1, 0x52, 0x82, 0x26, 0x8b, 0x04, 0x8b, 0x35,
|
||||||
0x89, 0x51, 0x7d, 0x85, 0xec, 0xb6, 0x66, 0x7f, 0xc9, 0xb5, 0x3e, 0x27, 0x1e, 0x4d, 0x21, 0xb1,
|
0xfa, 0x14, 0x96, 0x69, 0x62, 0x54, 0xdf, 0x26, 0xbb, 0xad, 0xd9, 0xdf, 0x77, 0xad, 0x2f, 0x89,
|
||||||
0x8c, 0x6b, 0xfe, 0x51, 0x81, 0xf5, 0x82, 0x01, 0x7d, 0x05, 0xff, 0x17, 0x39, 0xeb, 0x0c, 0x62,
|
0x47, 0x53, 0x48, 0x2c, 0xe3, 0x9a, 0x7f, 0x56, 0x60, 0xbd, 0x60, 0x40, 0xdf, 0xc0, 0xab, 0x22,
|
||||||
0xbb, 0xcf, 0x9c, 0xce, 0x03, 0x3a, 0x54, 0x15, 0xd8, 0xce, 0x3e, 0x1c, 0x84, 0xc7, 0xa9, 0x70,
|
0x93, 0x9d, 0x41, 0x6c, 0xf7, 0x99, 0xd3, 0x79, 0x40, 0x87, 0xaa, 0x2e, 0xdb, 0xd9, 0xe7, 0x84,
|
||||||
0xf8, 0x94, 0x0e, 0x0b, 0x49, 0xcf, 0xb4, 0x78, 0xa3, 0xa8, 0x40, 0xa7, 0xb0, 0x2e, 0xa1, 0x89,
|
0xf0, 0x38, 0x11, 0x0e, 0x9f, 0xd3, 0x61, 0xe1, 0x2a, 0x32, 0x2d, 0xde, 0x28, 0x2a, 0xd0, 0x09,
|
||||||
0xeb, 0x86, 0x34, 0x8a, 0x54, 0xad, 0xee, 0x8d, 0x47, 0xe6, 0xb5, 0x1c, 0xee, 0xbe, 0xb4, 0x16,
|
0xac, 0x4b, 0x68, 0xe2, 0xba, 0x21, 0x8d, 0x22, 0x55, 0xc1, 0x7b, 0xe3, 0x91, 0x79, 0x25, 0x87,
|
||||||
0x50, 0xb5, 0x0e, 0x5f, 0xc8, 0x8b, 0xe8, 0x12, 0x54, 0x7b, 0x94, 0x75, 0x7b, 0xf2, 0xd3, 0x67,
|
0xbb, 0x2f, 0xad, 0x05, 0x54, 0xad, 0xc3, 0xe7, 0xf2, 0x22, 0xba, 0x00, 0xd5, 0x1e, 0x65, 0xdd,
|
||||||
0x09, 0x2b, 0x29, 0xd1, 0x47, 0x9c, 0xf0, 0x38, 0x92, 0x65, 0x88, 0x95, 0x84, 0x0e, 0x01, 0x74,
|
0x9e, 0xfc, 0x20, 0x5a, 0xc2, 0x4a, 0x4a, 0xf4, 0x11, 0x27, 0x3c, 0x8e, 0x64, 0x71, 0x62, 0x25,
|
||||||
0x3f, 0x32, 0x59, 0x5c, 0x35, 0xeb, 0xea, 0x78, 0x64, 0xbe, 0xae, 0x5b, 0x5b, 0xd8, 0x4e, 0x0e,
|
0xa1, 0x43, 0x00, 0xdd, 0xa5, 0x4c, 0x96, 0x5c, 0xcd, 0xba, 0x3c, 0x1e, 0x99, 0x6f, 0xea, 0x86,
|
||||||
0xb3, 0x36, 0xd6, 0x0a, 0x5c, 0xd3, 0xeb, 0x42, 0xb7, 0x55, 0xa7, 0x76, 0xdb, 0x61, 0xa1, 0xdb,
|
0x17, 0xb6, 0xe3, 0xc3, 0xac, 0xb9, 0xb5, 0x02, 0xd7, 0xf4, 0xba, 0xd0, 0x83, 0xd5, 0xa9, 0x3d,
|
||||||
0x0e, 0xb3, 0x6e, 0xeb, 0x17, 0x7b, 0x44, 0xbe, 0xb2, 0xdb, 0x13, 0x6f, 0xd3, 0x3d, 0xfd, 0x0d,
|
0x78, 0x58, 0xe8, 0xc1, 0xc3, 0xac, 0x07, 0xfb, 0xc5, 0xce, 0x91, 0xd5, 0xb9, 0x3d, 0x51, 0x9d,
|
||||||
0x6d, 0xb5, 0xd5, 0xec, 0x79, 0x91, 0x1e, 0x3a, 0x4b, 0x1e, 0x9b, 0x5c, 0x1f, 0x35, 0xbf, 0x81,
|
0x77, 0xf5, 0x97, 0xb5, 0xd5, 0x56, 0x13, 0xe9, 0x45, 0x3a, 0xeb, 0x34, 0x79, 0x82, 0x72, 0xdd,
|
||||||
0x5a, 0x72, 0xb7, 0xb3, 0xcb, 0xe7, 0xc3, 0x62, 0xf9, 0xbc, 0x39, 0xaf, 0x7c, 0xe4, 0x58, 0xd2,
|
0xd5, 0xbc, 0x07, 0xb5, 0xe4, 0x6e, 0x67, 0x97, 0xcf, 0xc7, 0xc5, 0xf2, 0x79, 0x7b, 0x5e, 0xf9,
|
||||||
0xb5, 0xf3, 0xd8, 0x00, 0xc8, 0xb4, 0xe8, 0x00, 0xaa, 0x7d, 0xc2, 0x69, 0xa4, 0xbf, 0xc3, 0xf7,
|
0xc8, 0x61, 0xa5, 0x6b, 0xe7, 0xb1, 0x01, 0x90, 0x69, 0xd1, 0x01, 0x54, 0xfb, 0x84, 0xd3, 0x48,
|
||||||
0x5e, 0x0c, 0x4d, 0xb0, 0xc3, 0x2a, 0x14, 0x1d, 0xc1, 0x4a, 0x8f, 0x45, 0x3c, 0x10, 0x9c, 0x2a,
|
0x7f, 0x9d, 0xef, 0xbd, 0x18, 0x9a, 0x60, 0x87, 0x55, 0x28, 0x3a, 0x82, 0x95, 0x1e, 0x8b, 0x78,
|
||||||
0xff, 0x16, 0x45, 0xc7, 0x36, 0xdf, 0x83, 0xff, 0x95, 0x6c, 0x68, 0x23, 0x9b, 0xa5, 0x62, 0x64,
|
0x20, 0x38, 0x55, 0xfe, 0x2b, 0x8a, 0x8e, 0x6d, 0x7e, 0x00, 0xaf, 0x94, 0x6c, 0x68, 0x23, 0x9b,
|
||||||
0x66, 0xa5, 0xb3, 0x98, 0x2f, 0x9d, 0x66, 0x08, 0xb5, 0xbb, 0xac, 0xeb, 0x13, 0x1e, 0x87, 0x14,
|
0xb0, 0x62, 0x90, 0x66, 0xa5, 0xb3, 0x98, 0x2f, 0x9d, 0x66, 0x08, 0xb5, 0x3b, 0xac, 0xeb, 0x13,
|
||||||
0xed, 0x41, 0x25, 0x62, 0x5d, 0x55, 0xff, 0x5b, 0xe3, 0x91, 0x79, 0x51, 0xde, 0x43, 0xc4, 0xba,
|
0x1e, 0x87, 0x14, 0xed, 0x41, 0x25, 0x62, 0x5d, 0x55, 0xff, 0x5b, 0xe3, 0x91, 0x79, 0x5e, 0xde,
|
||||||
0xfa, 0x02, 0x92, 0x25, 0x4e, 0xbc, 0x92, 0xb2, 0x18, 0xc4, 0xb6, 0x68, 0x98, 0x89, 0x21, 0x3c,
|
0x43, 0xc4, 0xba, 0xfa, 0x02, 0x92, 0x25, 0x4e, 0xbc, 0x92, 0xb2, 0x18, 0xc4, 0xb6, 0x68, 0x98,
|
||||||
0x88, 0xed, 0x5c, 0xa3, 0x28, 0x09, 0x57, 0xd5, 0xe2, 0x6c, 0x11, 0x36, 0xac, 0x7e, 0xe0, 0x3c,
|
0x89, 0xd1, 0x3c, 0x88, 0xed, 0x5c, 0xa3, 0x28, 0x09, 0x57, 0xd5, 0xe2, 0x74, 0x11, 0x36, 0xac,
|
||||||
0x38, 0xe8, 0x11, 0xbf, 0x4b, 0xef, 0x52, 0x9e, 0xa3, 0x97, 0x6c, 0x5e, 0x49, 0x2b, 0xbb, 0x0e,
|
0x7e, 0xe0, 0x3c, 0x38, 0xe8, 0x11, 0xbf, 0x4b, 0xef, 0x50, 0x9e, 0xa3, 0x97, 0x6c, 0x5e, 0x49,
|
||||||
0x2b, 0xf2, 0x57, 0x20, 0x12, 0x09, 0xaa, 0x61, 0x2d, 0xa2, 0x6d, 0x58, 0x55, 0x25, 0x1a, 0xd5,
|
0x2b, 0xbb, 0x0e, 0x2b, 0xf2, 0x07, 0x21, 0x12, 0x09, 0xaa, 0x61, 0x2d, 0xa2, 0x6d, 0x58, 0x55,
|
||||||
0x2b, 0xc2, 0x94, 0xca, 0xe8, 0x11, 0x5c, 0xd0, 0x75, 0x6f, 0x33, 0x37, 0xe9, 0x8a, 0x24, 0xb7,
|
0x25, 0x1a, 0xd5, 0x2b, 0xc2, 0x94, 0xca, 0xe8, 0x11, 0x9c, 0xd3, 0x75, 0x6f, 0x33, 0x37, 0xe9,
|
||||||
0x6f, 0x3d, 0x2f, 0xb7, 0xea, 0x61, 0xb2, 0x98, 0x7b, 0xe2, 0xdf, 0x0f, 0xac, 0xdd, 0xec, 0xb7,
|
0x8a, 0x24, 0xb7, 0xef, 0x3c, 0x2f, 0xb7, 0xea, 0xb9, 0xb2, 0x98, 0x7b, 0xec, 0xdf, 0x0f, 0xac,
|
||||||
0x89, 0xa4, 0x96, 0xa8, 0xd4, 0x27, 0x42, 0x85, 0xd7, 0x72, 0x12, 0xda, 0x81, 0x35, 0xfd, 0xd6,
|
0xdd, 0xec, 0x67, 0x8a, 0xa4, 0x96, 0xa8, 0xd4, 0x27, 0x42, 0x85, 0xd7, 0x72, 0x12, 0xda, 0x81,
|
||||||
0x31, 0x1a, 0xd5, 0x97, 0x05, 0xb1, 0xbc, 0x0a, 0x6d, 0xea, 0x89, 0x2a, 0x46, 0xba, 0x1a, 0x99,
|
0x35, 0xfd, 0x02, 0x32, 0x1a, 0xd5, 0x97, 0x05, 0xb1, 0xbc, 0x0a, 0x6d, 0xea, 0x89, 0x2a, 0x06,
|
||||||
0xcd, 0x5f, 0x8c, 0x64, 0x00, 0xe6, 0x29, 0x94, 0x9a, 0xd7, 0xf8, 0x8f, 0xcd, 0x7b, 0x0f, 0x36,
|
0xbd, 0x1a, 0x99, 0xcd, 0x5f, 0x8d, 0x64, 0x00, 0xe6, 0x29, 0x94, 0x9a, 0xd7, 0xf8, 0x9f, 0xcd,
|
||||||
0x6c, 0xe6, 0xba, 0x13, 0x53, 0xe8, 0xc6, 0x78, 0x64, 0xee, 0xaa, 0x1e, 0x16, 0xf6, 0xd2, 0x18,
|
0x7b, 0x17, 0x36, 0x6c, 0xe6, 0xba, 0x13, 0x53, 0xe8, 0xda, 0x78, 0x64, 0xee, 0xaa, 0x1e, 0x16,
|
||||||
0x2a, 0x2a, 0xf1, 0x7a, 0x41, 0xb6, 0xee, 0x3c, 0x79, 0xd6, 0x30, 0x9e, 0x3e, 0x6b, 0x18, 0x7f,
|
0xf6, 0xd2, 0x18, 0x2a, 0x2a, 0xf1, 0x7a, 0x41, 0xb6, 0x6e, 0x3d, 0x79, 0xd6, 0x30, 0x9e, 0x3e,
|
||||||
0x3f, 0x6b, 0x18, 0x67, 0xe7, 0x8d, 0x85, 0xa7, 0xe7, 0x8d, 0x85, 0xdf, 0xcf, 0x1b, 0x0b, 0x5f,
|
0x6b, 0x18, 0xff, 0x3c, 0x6b, 0x18, 0xa7, 0x67, 0x8d, 0x85, 0xa7, 0x67, 0x8d, 0x85, 0x3f, 0xce,
|
||||||
0xbf, 0xdd, 0x65, 0xbc, 0x17, 0xdb, 0x2d, 0x27, 0xf0, 0xda, 0x0e, 0x0d, 0x9d, 0x1b, 0x2c, 0x68,
|
0x1a, 0x0b, 0xdf, 0xbe, 0xdb, 0x65, 0xbc, 0x17, 0xdb, 0x2d, 0x27, 0xf0, 0xda, 0x0e, 0x0d, 0x9d,
|
||||||
0xf7, 0x89, 0x13, 0xf8, 0xcc, 0x71, 0xdb, 0x8f, 0xb2, 0x7f, 0x73, 0x31, 0xfd, 0xed, 0xaa, 0x98,
|
0x6b, 0x2c, 0x68, 0xf7, 0x89, 0x13, 0xf8, 0xcc, 0x71, 0xdb, 0x8f, 0xb2, 0x3f, 0x76, 0x31, 0xfd,
|
||||||
0x01, 0xb7, 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0x03, 0x19, 0xcc, 0xfc, 0xbe, 0x0f, 0x00, 0x00,
|
0xed, 0xaa, 0x98, 0x01, 0x37, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x03, 0x2e, 0xc4, 0xd4,
|
||||||
|
0x0f, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Params) Marshal() (dAtA []byte, err error) {
|
func (m *Params) Marshal() (dAtA []byte, err error) {
|
||||||
@@ -1027,10 +1028,15 @@ func (m *Record) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||||||
dAtA[i] = 0x42
|
dAtA[i] = 0x42
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(m.Attributes) > 0 {
|
if m.Attributes != nil {
|
||||||
i -= len(m.Attributes)
|
{
|
||||||
copy(dAtA[i:], m.Attributes)
|
size, err := m.Attributes.MarshalToSizedBuffer(dAtA[:i])
|
||||||
i = encodeVarintRegistry(dAtA, i, uint64(len(m.Attributes)))
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
i -= size
|
||||||
|
i = encodeVarintRegistry(dAtA, i, uint64(size))
|
||||||
|
}
|
||||||
i--
|
i--
|
||||||
dAtA[i] = 0x3a
|
dAtA[i] = 0x3a
|
||||||
}
|
}
|
||||||
@@ -1146,12 +1152,12 @@ func (m *NameAuthority) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||||||
_ = i
|
_ = i
|
||||||
var l int
|
var l int
|
||||||
_ = l
|
_ = l
|
||||||
n12, err12 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpiryTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpiryTime):])
|
n13, err13 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpiryTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpiryTime):])
|
||||||
if err12 != nil {
|
if err13 != nil {
|
||||||
return 0, err12
|
return 0, err13
|
||||||
}
|
}
|
||||||
i -= n12
|
i -= n13
|
||||||
i = encodeVarintRegistry(dAtA, i, uint64(n12))
|
i = encodeVarintRegistry(dAtA, i, uint64(n13))
|
||||||
i--
|
i--
|
||||||
dAtA[i] = 0x3a
|
dAtA[i] = 0x3a
|
||||||
if len(m.BondId) > 0 {
|
if len(m.BondId) > 0 {
|
||||||
@@ -1549,8 +1555,8 @@ func (m *Record) Size() (n int) {
|
|||||||
n += 1 + l + sovRegistry(uint64(l))
|
n += 1 + l + sovRegistry(uint64(l))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l = len(m.Attributes)
|
if m.Attributes != nil {
|
||||||
if l > 0 {
|
l = m.Attributes.Size()
|
||||||
n += 1 + l + sovRegistry(uint64(l))
|
n += 1 + l + sovRegistry(uint64(l))
|
||||||
}
|
}
|
||||||
if len(m.Names) > 0 {
|
if len(m.Names) > 0 {
|
||||||
@@ -2364,7 +2370,7 @@ func (m *Record) Unmarshal(dAtA []byte) error {
|
|||||||
if wireType != 2 {
|
if wireType != 2 {
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType)
|
return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType)
|
||||||
}
|
}
|
||||||
var byteLen int
|
var msglen int
|
||||||
for shift := uint(0); ; shift += 7 {
|
for shift := uint(0); ; shift += 7 {
|
||||||
if shift >= 64 {
|
if shift >= 64 {
|
||||||
return ErrIntOverflowRegistry
|
return ErrIntOverflowRegistry
|
||||||
@@ -2374,24 +2380,26 @@ func (m *Record) Unmarshal(dAtA []byte) error {
|
|||||||
}
|
}
|
||||||
b := dAtA[iNdEx]
|
b := dAtA[iNdEx]
|
||||||
iNdEx++
|
iNdEx++
|
||||||
byteLen |= int(b&0x7F) << shift
|
msglen |= int(b&0x7F) << shift
|
||||||
if b < 0x80 {
|
if b < 0x80 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if byteLen < 0 {
|
if msglen < 0 {
|
||||||
return ErrInvalidLengthRegistry
|
return ErrInvalidLengthRegistry
|
||||||
}
|
}
|
||||||
postIndex := iNdEx + byteLen
|
postIndex := iNdEx + msglen
|
||||||
if postIndex < 0 {
|
if postIndex < 0 {
|
||||||
return ErrInvalidLengthRegistry
|
return ErrInvalidLengthRegistry
|
||||||
}
|
}
|
||||||
if postIndex > l {
|
if postIndex > l {
|
||||||
return io.ErrUnexpectedEOF
|
return io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
m.Attributes = append(m.Attributes[:0], dAtA[iNdEx:postIndex]...)
|
|
||||||
if m.Attributes == nil {
|
if m.Attributes == nil {
|
||||||
m.Attributes = []byte{}
|
m.Attributes = &types1.Any{}
|
||||||
|
}
|
||||||
|
if err := m.Attributes.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
case 8:
|
case 8:
|
||||||
|
|||||||
Generated
+13
-13
@@ -385,7 +385,7 @@ func (m *MsgReserveAuthorityResponse) XXX_DiscardUnknown() {
|
|||||||
|
|
||||||
var xxx_messageInfo_MsgReserveAuthorityResponse proto.InternalMessageInfo
|
var xxx_messageInfo_MsgReserveAuthorityResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
// MsgSetAuthorityBond
|
// MsgSetAuthorityBond is SDK message for SetAuthorityBond
|
||||||
type MsgSetAuthorityBond struct {
|
type MsgSetAuthorityBond struct {
|
||||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
||||||
BondId string `protobuf:"bytes,2,opt,name=bond_id,json=bondId,proto3" json:"bond_id,omitempty" json:"bondId" yaml:"bondId"`
|
BondId string `protobuf:"bytes,2,opt,name=bond_id,json=bondId,proto3" json:"bond_id,omitempty" json:"bondId" yaml:"bondId"`
|
||||||
@@ -483,7 +483,7 @@ func (m *MsgSetAuthorityBondResponse) XXX_DiscardUnknown() {
|
|||||||
|
|
||||||
var xxx_messageInfo_MsgSetAuthorityBondResponse proto.InternalMessageInfo
|
var xxx_messageInfo_MsgSetAuthorityBondResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
// MsgDeleteNameAuthority
|
// MsgDeleteNameAuthority is SDK message for DeleteNameAuthority
|
||||||
type MsgDeleteNameAuthority struct {
|
type MsgDeleteNameAuthority struct {
|
||||||
Crn string `protobuf:"bytes,1,opt,name=crn,proto3" json:"crn,omitempty"`
|
Crn string `protobuf:"bytes,1,opt,name=crn,proto3" json:"crn,omitempty"`
|
||||||
Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"`
|
Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"`
|
||||||
@@ -573,7 +573,7 @@ func (m *MsgDeleteNameAuthorityResponse) XXX_DiscardUnknown() {
|
|||||||
|
|
||||||
var xxx_messageInfo_MsgDeleteNameAuthorityResponse proto.InternalMessageInfo
|
var xxx_messageInfo_MsgDeleteNameAuthorityResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
// MsgRenewRecord
|
// MsgRenewRecord is SDK message for Renew a record
|
||||||
type MsgRenewRecord struct {
|
type MsgRenewRecord struct {
|
||||||
RecordId string `protobuf:"bytes,1,opt,name=record_id,json=recordId,proto3" json:"record_id,omitempty" json:"recordId" yaml:"recordId"`
|
RecordId string `protobuf:"bytes,1,opt,name=record_id,json=recordId,proto3" json:"record_id,omitempty" json:"recordId" yaml:"recordId"`
|
||||||
Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"`
|
Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"`
|
||||||
@@ -761,7 +761,7 @@ func (m *MsgAssociateBondResponse) XXX_DiscardUnknown() {
|
|||||||
|
|
||||||
var xxx_messageInfo_MsgAssociateBondResponse proto.InternalMessageInfo
|
var xxx_messageInfo_MsgAssociateBondResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
// MsgDissociateBond
|
// MsgDissociateBond is SDK message for Msg/DissociateBond
|
||||||
type MsgDissociateBond struct {
|
type MsgDissociateBond struct {
|
||||||
RecordId string `protobuf:"bytes,1,opt,name=record_id,json=recordId,proto3" json:"record_id,omitempty" json:"recordId" yaml:"recordId"`
|
RecordId string `protobuf:"bytes,1,opt,name=record_id,json=recordId,proto3" json:"record_id,omitempty" json:"recordId" yaml:"recordId"`
|
||||||
Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"`
|
Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"`
|
||||||
@@ -814,7 +814,7 @@ func (m *MsgDissociateBond) GetSigner() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// MsgDissociateBondResponse
|
// MsgDissociateBondResponse is response type for MsgDissociateBond
|
||||||
type MsgDissociateBondResponse struct {
|
type MsgDissociateBondResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -851,7 +851,7 @@ func (m *MsgDissociateBondResponse) XXX_DiscardUnknown() {
|
|||||||
|
|
||||||
var xxx_messageInfo_MsgDissociateBondResponse proto.InternalMessageInfo
|
var xxx_messageInfo_MsgDissociateBondResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
// MsgDissociateRecords
|
// MsgDissociateRecords is SDK message for Msg/DissociateRecords
|
||||||
type MsgDissociateRecords struct {
|
type MsgDissociateRecords struct {
|
||||||
BondId string `protobuf:"bytes,1,opt,name=bond_id,json=bondId,proto3" json:"bond_id,omitempty" json:"bondId" yaml:"bondId"`
|
BondId string `protobuf:"bytes,1,opt,name=bond_id,json=bondId,proto3" json:"bond_id,omitempty" json:"bondId" yaml:"bondId"`
|
||||||
Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"`
|
Signer string `protobuf:"bytes,2,opt,name=signer,proto3" json:"signer,omitempty"`
|
||||||
@@ -904,7 +904,7 @@ func (m *MsgDissociateRecords) GetSigner() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// MsgDissociateRecordsResponse
|
// MsgDissociateRecordsResponse is response type for MsgDissociateRecords
|
||||||
type MsgDissociateRecordsResponse struct {
|
type MsgDissociateRecordsResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -941,7 +941,7 @@ func (m *MsgDissociateRecordsResponse) XXX_DiscardUnknown() {
|
|||||||
|
|
||||||
var xxx_messageInfo_MsgDissociateRecordsResponse proto.InternalMessageInfo
|
var xxx_messageInfo_MsgDissociateRecordsResponse proto.InternalMessageInfo
|
||||||
|
|
||||||
// MsgReAssociateRecords
|
// MsgReAssociateRecords is SDK message for Msg/ReAssociateRecords
|
||||||
type MsgReAssociateRecords struct {
|
type MsgReAssociateRecords struct {
|
||||||
NewBondId string `protobuf:"bytes,1,opt,name=new_bond_id,json=newBondId,proto3" json:"new_bond_id,omitempty" json:"newBondId" yaml:"newBondId"`
|
NewBondId string `protobuf:"bytes,1,opt,name=new_bond_id,json=newBondId,proto3" json:"new_bond_id,omitempty" json:"newBondId" yaml:"newBondId"`
|
||||||
OldBondId string `protobuf:"bytes,2,opt,name=old_bond_id,json=oldBondId,proto3" json:"old_bond_id,omitempty" json:"oldBondId" yaml:"oldBondId"`
|
OldBondId string `protobuf:"bytes,2,opt,name=old_bond_id,json=oldBondId,proto3" json:"old_bond_id,omitempty" json:"oldBondId" yaml:"oldBondId"`
|
||||||
@@ -1002,7 +1002,7 @@ func (m *MsgReAssociateRecords) GetSigner() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// MsgReAssociateRecordsResponse
|
// MsgReAssociateRecordsResponse is response type for MsgReAssociateRecords
|
||||||
type MsgReAssociateRecordsResponse struct {
|
type MsgReAssociateRecordsResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1147,9 +1147,9 @@ const _ = grpc.SupportPackageIsVersion4
|
|||||||
//
|
//
|
||||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
|
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
|
||||||
type MsgClient interface {
|
type MsgClient interface {
|
||||||
// SetRecord records a new record with given payload and bond id
|
// SetRecord will records a new record with given payload and bond id
|
||||||
SetRecord(ctx context.Context, in *MsgSetRecord, opts ...grpc.CallOption) (*MsgSetRecordResponse, error)
|
SetRecord(ctx context.Context, in *MsgSetRecord, opts ...grpc.CallOption) (*MsgSetRecordResponse, error)
|
||||||
// Renew Record renews an expired record
|
// Renew Record will renew the expire record
|
||||||
RenewRecord(ctx context.Context, in *MsgRenewRecord, opts ...grpc.CallOption) (*MsgRenewRecordResponse, error)
|
RenewRecord(ctx context.Context, in *MsgRenewRecord, opts ...grpc.CallOption) (*MsgRenewRecordResponse, error)
|
||||||
// AssociateBond
|
// AssociateBond
|
||||||
AssociateBond(ctx context.Context, in *MsgAssociateBond, opts ...grpc.CallOption) (*MsgAssociateBondResponse, error)
|
AssociateBond(ctx context.Context, in *MsgAssociateBond, opts ...grpc.CallOption) (*MsgAssociateBondResponse, error)
|
||||||
@@ -1269,9 +1269,9 @@ func (c *msgClient) SetAuthorityBond(ctx context.Context, in *MsgSetAuthorityBon
|
|||||||
|
|
||||||
// MsgServer is the server API for Msg service.
|
// MsgServer is the server API for Msg service.
|
||||||
type MsgServer interface {
|
type MsgServer interface {
|
||||||
// SetRecord records a new record with given payload and bond id
|
// SetRecord will records a new record with given payload and bond id
|
||||||
SetRecord(context.Context, *MsgSetRecord) (*MsgSetRecordResponse, error)
|
SetRecord(context.Context, *MsgSetRecord) (*MsgSetRecordResponse, error)
|
||||||
// Renew Record renews an expired record
|
// Renew Record will renew the expire record
|
||||||
RenewRecord(context.Context, *MsgRenewRecord) (*MsgRenewRecordResponse, error)
|
RenewRecord(context.Context, *MsgRenewRecord) (*MsgRenewRecordResponse, error)
|
||||||
// AssociateBond
|
// AssociateBond
|
||||||
AssociateBond(context.Context, *MsgAssociateBond) (*MsgAssociateBondResponse, error)
|
AssociateBond(context.Context, *MsgAssociateBond) (*MsgAssociateBondResponse, error)
|
||||||
|
|||||||
+297
-58
@@ -2,9 +2,14 @@ package types
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/cerc-io/laconicd/x/registry/helpers"
|
"github.com/cerc-io/laconicd/x/registry/helpers"
|
||||||
"github.com/gibson042/canonicaljson-go"
|
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||||
|
canonicalJson "github.com/gibson042/canonicaljson-go"
|
||||||
|
"github.com/gogo/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -13,75 +18,143 @@ const (
|
|||||||
AuthorityUnderAuction = "auction"
|
AuthorityUnderAuction = "auction"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO if schema records are to be more permissive than allowing a map of fields, this type will
|
// PayloadType represents a signed record payload that can be serialized from/to YAML.
|
||||||
// become specific to content records. schema records will either occupy a new message or have new
|
type PayloadType struct {
|
||||||
// more general purpose helper types.
|
Record map[string]interface{} `json:"record"`
|
||||||
|
Signatures []Signature `json:"signatures"`
|
||||||
type AttributeMap map[string]interface{}
|
|
||||||
|
|
||||||
// ReadablePayload represents a signed record payload that can be serialized from/to YAML.
|
|
||||||
type ReadablePayload struct {
|
|
||||||
RecordAttributes AttributeMap `json:"record" yaml:"record"`
|
|
||||||
Signatures []Signature `json:"signatures" yaml:"signatures"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadableRecord represents a WNS record.
|
// ToPayload converts PayloadType to Payload object.
|
||||||
type ReadableRecord struct {
|
|
||||||
ID string `json:"id,omitempty"`
|
|
||||||
Names []string `json:"names,omitempty"`
|
|
||||||
BondID string `json:"bondId,omitempty"`
|
|
||||||
CreateTime string `json:"createTime,omitempty"`
|
|
||||||
ExpiryTime string `json:"expiryTime,omitempty"`
|
|
||||||
Deleted bool `json:"deleted,omitempty"`
|
|
||||||
Owners []string `json:"owners,omitempty"`
|
|
||||||
Attributes AttributeMap `json:"attributes,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ToPayload converts PayloadEncodable to Payload object.
|
|
||||||
// Why? Because go-amino can't handle maps: https://github.com/tendermint/go-amino/issues/4.
|
// Why? Because go-amino can't handle maps: https://github.com/tendermint/go-amino/issues/4.
|
||||||
func (payloadObj *ReadablePayload) ToPayload() Payload {
|
func (payloadObj *PayloadType) ToPayload() (Payload, error) {
|
||||||
// Note: record directly contains the attributes here
|
attributes, err := payLoadAttributes(payloadObj.Record)
|
||||||
attributes := payloadObj.RecordAttributes
|
if err != nil {
|
||||||
|
return Payload{}, err
|
||||||
|
}
|
||||||
payload := Payload{
|
payload := Payload{
|
||||||
Record: &Record{
|
Record: &Record{
|
||||||
Deleted: false,
|
Deleted: false,
|
||||||
Owners: nil,
|
Owners: nil,
|
||||||
Attributes: helpers.MustMarshalJSON(attributes),
|
Attributes: attributes,
|
||||||
},
|
},
|
||||||
Signatures: payloadObj.Signatures,
|
Signatures: payloadObj.Signatures,
|
||||||
}
|
}
|
||||||
return payload
|
return payload, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToReadablePayload converts Payload to a serializable object
|
func payLoadAttributes(recordPayLoad map[string]interface{}) (*codectypes.Any, error) {
|
||||||
func (payload Payload) ToReadablePayload() ReadablePayload {
|
recordType, ok := recordPayLoad["type"]
|
||||||
var encodable ReadablePayload
|
if !ok {
|
||||||
|
return &codectypes.Any{}, fmt.Errorf("cannot get type from payload")
|
||||||
|
}
|
||||||
|
bz := helpers.MarshalMapToJSONBytes(recordPayLoad)
|
||||||
|
|
||||||
encodable.RecordAttributes = helpers.MustUnmarshalJSON[AttributeMap](payload.Record.Attributes)
|
switch recordType.(string) {
|
||||||
encodable.Signatures = payload.Signatures
|
case "ServiceProviderRecord":
|
||||||
|
{
|
||||||
return encodable
|
var attributes ServiceProviderRecord
|
||||||
|
err := json.Unmarshal(bz, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
return &codectypes.Any{}, err
|
||||||
|
}
|
||||||
|
return codectypes.NewAnyWithValue(&attributes)
|
||||||
|
}
|
||||||
|
case "WebsiteRegistrationRecord":
|
||||||
|
{
|
||||||
|
var attributes WebsiteRegistrationRecord
|
||||||
|
err := json.Unmarshal(bz, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
return &codectypes.Any{}, err
|
||||||
|
}
|
||||||
|
return codectypes.NewAnyWithValue(&attributes)
|
||||||
|
}
|
||||||
|
case "GitRepository":
|
||||||
|
{
|
||||||
|
var attributes GitRepository
|
||||||
|
err := json.Unmarshal(bz, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
return &codectypes.Any{}, err
|
||||||
|
}
|
||||||
|
return codectypes.NewAnyWithValue(&attributes)
|
||||||
|
}
|
||||||
|
case "Binary":
|
||||||
|
{
|
||||||
|
var attributes Binary
|
||||||
|
err := json.Unmarshal(bz, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
return &codectypes.Any{}, err
|
||||||
|
}
|
||||||
|
return codectypes.NewAnyWithValue(&attributes)
|
||||||
|
}
|
||||||
|
case "DockerImage":
|
||||||
|
{
|
||||||
|
var attributes DockerImage
|
||||||
|
err := json.Unmarshal(bz, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
return &codectypes.Any{}, err
|
||||||
|
}
|
||||||
|
return codectypes.NewAnyWithValue(&attributes)
|
||||||
|
}
|
||||||
|
case "WatcherRegistrationRecord":
|
||||||
|
{
|
||||||
|
var attributes WatcherRegistrationRecord
|
||||||
|
err := json.Unmarshal(bz, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
return &codectypes.Any{}, err
|
||||||
|
}
|
||||||
|
return codectypes.NewAnyWithValue(&attributes)
|
||||||
|
}
|
||||||
|
case "ResponderContract":
|
||||||
|
{
|
||||||
|
var attributes ResponderContract
|
||||||
|
err := json.Unmarshal(bz, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
return &codectypes.Any{}, err
|
||||||
|
}
|
||||||
|
return codectypes.NewAnyWithValue(&attributes)
|
||||||
|
}
|
||||||
|
case "JSPackage":
|
||||||
|
{
|
||||||
|
var attributes JSPackage
|
||||||
|
err := json.Unmarshal(bz, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
return &codectypes.Any{}, err
|
||||||
|
}
|
||||||
|
return codectypes.NewAnyWithValue(&attributes)
|
||||||
|
}
|
||||||
|
case "ChainRegistrationRecord":
|
||||||
|
{
|
||||||
|
var attributes ChainRegistrationRecord
|
||||||
|
err := json.Unmarshal(bz, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
return &codectypes.Any{}, err
|
||||||
|
}
|
||||||
|
return codectypes.NewAnyWithValue(&attributes)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return &codectypes.Any{}, fmt.Errorf("unsupported record type %s", recordType.(string))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToRecordObj converts Record to RecordObj.
|
// ToReadablePayload converts Payload to PayloadType
|
||||||
// Why? Because go-amino can't handle maps: https://github.com/tendermint/go-amino/issues/4.
|
// It will unmarshal with record attributes
|
||||||
func (r *ReadableRecord) ToRecordObj() (Record, error) {
|
func (payload Payload) ToReadablePayload() PayloadType {
|
||||||
var resourceObj Record
|
var payloadType PayloadType
|
||||||
|
bz, err := GetJSONBytesFromAny(*payload.Record.Attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
resourceObj.Id = r.ID
|
payloadType.Record = helpers.UnMarshalMapFromJSONBytes(bz)
|
||||||
resourceObj.BondId = r.BondID
|
payloadType.Signatures = payload.Signatures
|
||||||
resourceObj.CreateTime = r.CreateTime
|
|
||||||
resourceObj.ExpiryTime = r.ExpiryTime
|
|
||||||
resourceObj.Deleted = r.Deleted
|
|
||||||
resourceObj.Owners = r.Owners
|
|
||||||
resourceObj.Attributes = helpers.MustMarshalJSON(r.Attributes)
|
|
||||||
|
|
||||||
return resourceObj, nil
|
return payloadType
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToReadableRecord converts Record to a serializable object
|
// Record to Record Type for human-readable attributes
|
||||||
func (r *Record) ToReadableRecord() ReadableRecord {
|
|
||||||
var resourceObj ReadableRecord
|
func (r *Record) ToRecordType() RecordType {
|
||||||
|
var resourceObj RecordType
|
||||||
|
|
||||||
resourceObj.ID = r.Id
|
resourceObj.ID = r.Id
|
||||||
resourceObj.BondID = r.BondId
|
resourceObj.BondID = r.BondId
|
||||||
@@ -90,23 +163,189 @@ func (r *Record) ToReadableRecord() ReadableRecord {
|
|||||||
resourceObj.Deleted = r.Deleted
|
resourceObj.Deleted = r.Deleted
|
||||||
resourceObj.Owners = r.Owners
|
resourceObj.Owners = r.Owners
|
||||||
resourceObj.Names = r.Names
|
resourceObj.Names = r.Names
|
||||||
resourceObj.Attributes = helpers.MustUnmarshalJSON[AttributeMap](r.Attributes)
|
|
||||||
|
bz, err := GetJSONBytesFromAny(*r.Attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
resourceObj.Attributes = helpers.UnMarshalMapFromJSONBytes(bz)
|
||||||
|
|
||||||
return resourceObj
|
return resourceObj
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanonicalJSON returns the canonical JSON representation of the record.
|
func GetJSONBytesFromAny(any codectypes.Any) ([]byte, error) {
|
||||||
func (r *ReadableRecord) CanonicalJSON() []byte {
|
var bz []byte
|
||||||
bytes, err := canonicaljson.Marshal(r.Attributes)
|
s := strings.Split(any.TypeUrl, ".")
|
||||||
|
switch s[len(s)-1] {
|
||||||
|
case "ServiceProviderRecord":
|
||||||
|
{
|
||||||
|
var attributes ServiceProviderRecord
|
||||||
|
err := proto.Unmarshal(any.Value, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Proto unmarshal error")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err = json.Marshal(attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("JSON marshal error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "WebsiteRegistrationRecord":
|
||||||
|
{
|
||||||
|
var attributes WebsiteRegistrationRecord
|
||||||
|
err := proto.Unmarshal(any.Value, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Proto unmarshal error")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err = json.Marshal(attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("JSON marshal error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "GitRepository":
|
||||||
|
{
|
||||||
|
var attributes GitRepository
|
||||||
|
err := proto.Unmarshal(any.Value, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Proto unmarshal error")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err = json.Marshal(attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("JSON marshal error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "Binary":
|
||||||
|
{
|
||||||
|
var attributes Binary
|
||||||
|
err := proto.Unmarshal(any.Value, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Proto unmarshal error")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err = json.Marshal(attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("JSON marshal error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "DockerImage":
|
||||||
|
{
|
||||||
|
var attributes DockerImage
|
||||||
|
err := proto.Unmarshal(any.Value, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Proto unmarshal error")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err = json.Marshal(attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("JSON marshal error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "WatcherRegistrationRecord":
|
||||||
|
{
|
||||||
|
var attributes WatcherRegistrationRecord
|
||||||
|
err := proto.Unmarshal(any.Value, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Proto unmarshal error")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err = json.Marshal(attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("JSON marshal error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "ResponderContract":
|
||||||
|
{
|
||||||
|
var attributes ResponderContract
|
||||||
|
err := proto.Unmarshal(any.Value, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Proto unmarshal error")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err = json.Marshal(attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("JSON marshal error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "JSPackage":
|
||||||
|
{
|
||||||
|
var attributes JSPackage
|
||||||
|
err := proto.Unmarshal(any.Value, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Proto unmarshal error")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err = json.Marshal(attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("JSON marshal error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case "ChainRegistrationRecord":
|
||||||
|
{
|
||||||
|
var attributes ChainRegistrationRecord
|
||||||
|
err := proto.Unmarshal(any.Value, &attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Proto unmarshal error")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err = json.Marshal(attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("JSON marshal error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unsupported type %s", s[len(s)-1])
|
||||||
|
}
|
||||||
|
|
||||||
|
return bz, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RecordType represents a WNS record.
|
||||||
|
type RecordType struct {
|
||||||
|
ID string `json:"id,omitempty"`
|
||||||
|
Names []string `json:"names,omitempty"`
|
||||||
|
BondID string `json:"bondId,omitempty"`
|
||||||
|
CreateTime string `json:"createTime,omitempty"`
|
||||||
|
ExpiryTime string `json:"expiryTime,omitempty"`
|
||||||
|
Deleted bool `json:"deleted,omitempty"`
|
||||||
|
Owners []string `json:"owners,omitempty"`
|
||||||
|
Attributes map[string]interface{} `json:"attributes,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToRecordObj converts Record to RecordObj.
|
||||||
|
// Why? Because go-amino can't handle maps: https://github.com/tendermint/go-amino/issues/4.
|
||||||
|
func (r *RecordType) ToRecordObj() (Record, error) {
|
||||||
|
attributes, err := payLoadAttributes(r.Attributes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("error marshalling record: " + err.Error())
|
return Record{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var resourceObj Record
|
||||||
|
|
||||||
|
resourceObj.Id = r.ID
|
||||||
|
resourceObj.BondId = r.BondID
|
||||||
|
resourceObj.CreateTime = r.CreateTime
|
||||||
|
resourceObj.ExpiryTime = r.ExpiryTime
|
||||||
|
resourceObj.Deleted = r.Deleted
|
||||||
|
resourceObj.Owners = r.Owners
|
||||||
|
resourceObj.Attributes = attributes
|
||||||
|
|
||||||
|
return resourceObj, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CanonicalJSON returns the canonical JSON representation of the record.
|
||||||
|
func (r *RecordType) CanonicalJSON() []byte {
|
||||||
|
bytes, err := canonicalJson.Marshal(r.Attributes)
|
||||||
|
if err != nil {
|
||||||
|
panic("Record marshal error.")
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytes
|
return bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSignBytes generates a record hash to be signed.
|
// GetSignBytes generates a record hash to be signed.
|
||||||
func (r *ReadableRecord) GetSignBytes() ([]byte, []byte) {
|
func (r *RecordType) GetSignBytes() ([]byte, []byte) {
|
||||||
// Double SHA256 hash.
|
// Double SHA256 hash.
|
||||||
|
|
||||||
// Input to the first round of hashing.
|
// Input to the first round of hashing.
|
||||||
@@ -126,7 +365,7 @@ func (r *ReadableRecord) GetSignBytes() ([]byte, []byte) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetCID gets the record CID.
|
// GetCID gets the record CID.
|
||||||
func (r *ReadableRecord) GetCID() (string, error) {
|
func (r *RecordType) GetCID() (string, error) {
|
||||||
id, err := helpers.GetCid(r.CanonicalJSON())
|
id, err := helpers.GetCid(r.CanonicalJSON())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|||||||
Reference in New Issue
Block a user