diff --git a/.air.toml b/.air.toml
new file mode 100644
index 000000000..d19d21810
--- /dev/null
+++ b/.air.toml
@@ -0,0 +1,50 @@
+root = "."
+testdata_dir = "testdata"
+tmp_dir = "tmp"
+
+[build]
+delay = 1000
+cmd = "devbox run build:motr"
+exclude_dir = ["assets", "tmp", "vendor", "testdata"]
+exclude_file = []
+exclude_regex = ["_test.go"]
+exclude_unchanged = true
+follow_symlink = false
+full_bin = "bunx wrangler -c ./cmd/motr/wrangler.toml dev"
+include_dir = ["cmd/dwn", "cmd/motr", "internal", "models", "pkl"]
+include_ext = ["go", "templ", "html", "pkl", "js", "mjs"]
+include_file = [
+ "wrangler.toml",
+ "Dockerfile",
+ ".goreleaser.yaml",
+ "go.mod",
+ "devbox.json",
+ ".air.toml",
+]
+kill_delay = "2s"
+log = "build-errors.log"
+poll = false
+poll_interval = 0
+post_cmd = []
+pre_cmd = ["templ generate"]
+rerun = false
+rerun_delay = 500
+send_interrupt = false
+stop_on_error = false
+
+[color]
+build = "yellow"
+main = "magenta"
+runner = "green"
+watcher = "cyan"
+
+[log]
+main_only = true
+time = true
+
+[misc]
+clean_on_exit = true
+
+[screen]
+clear_on_rebuild = true
+keep_scroll = true
diff --git a/.github/workflows/buf-publish.yml b/.github/workflows/buf-publish.yml
index 1c7fe2d07..08792c114 100644
--- a/.github/workflows/buf-publish.yml
+++ b/.github/workflows/buf-publish.yml
@@ -1,6 +1,9 @@
name: Publish to buf.build/didao/sonr
on:
push:
+ branches:
+ - master
+ - develop
permissions:
contents: write
diff --git a/.github/workflows/sync-branches.yml b/.github/workflows/sync-branches.yml
index a06b683eb..99cff56fb 100644
--- a/.github/workflows/sync-branches.yml
+++ b/.github/workflows/sync-branches.yml
@@ -1,45 +1,24 @@
-name: Sync Branches
-
+name: Gitflow Sync
on:
+ # To create pull requests.
push:
- tags:
- - "*"
+ # To merge pull requests if not possible during the push run. Remove if `auto-merge` is `false`.
+ pull_request_review:
+ check_run:
+ types: [completed]
permissions:
- contents: write
+ contents: read
+ pull-requests: write
jobs:
- sync-branches:
+ build:
+ name: Gitflow
runs-on: ubuntu-latest
steps:
- - name: Checkout code
- uses: actions/checkout@v4
+ - uses: Logerfo/gitflow-action@0.0.5
with:
- fetch-depth: 0
-
- - name: Check if tag is on develop or master
- id: check-branch
- run: |
- if git branch -r --contains ${{ github.ref }} | grep -q 'origin/develop\|origin/master'; then
- echo "SYNC_NEEDED=true" >> $GITHUB_OUTPUT
- else
- echo "SYNC_NEEDED=false" >> $GITHUB_OUTPUT
- fi
-
- - name: Sync develop to master
- if: steps.check-branch.outputs.SYNC_NEEDED == 'true'
- uses: devmasx/merge-branch@master
- with:
- type: now
- from_branch: develop
- target_branch: master
- github_token: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Sync master back to develop
- if: steps.check-branch.outputs.SYNC_NEEDED == 'true'
- uses: devmasx/merge-branch@master
- with:
- type: now
- from_branch: master
- target_branch: develop
- github_token: ${{ secrets.GITHUB_TOKEN }}
+ github-token: ${{ secrets.GITHUB_TOKEN }} # The `GITHUB_TOKEN` secret.
+ dev: develop
+ master: master
+ release: release
diff --git a/api/did/v1/genesis.pulsar.go b/api/did/v1/genesis.pulsar.go
index 2185cd597..ebf2f237a 100644
--- a/api/did/v1/genesis.pulsar.go
+++ b/api/did/v1/genesis.pulsar.go
@@ -16,14 +16,16 @@ import (
)
var (
- md_GenesisState protoreflect.MessageDescriptor
- fd_GenesisState_params protoreflect.FieldDescriptor
+ md_GenesisState protoreflect.MessageDescriptor
+ fd_GenesisState_params protoreflect.FieldDescriptor
+ fd_GenesisState_global_integrity protoreflect.FieldDescriptor
)
func init() {
file_did_v1_genesis_proto_init()
md_GenesisState = File_did_v1_genesis_proto.Messages().ByName("GenesisState")
fd_GenesisState_params = md_GenesisState.Fields().ByName("params")
+ fd_GenesisState_global_integrity = md_GenesisState.Fields().ByName("global_integrity")
}
var _ protoreflect.Message = (*fastReflection_GenesisState)(nil)
@@ -97,6 +99,12 @@ func (x *fastReflection_GenesisState) Range(f func(protoreflect.FieldDescriptor,
return
}
}
+ if x.GlobalIntegrity != nil {
+ value := protoreflect.ValueOfMessage(x.GlobalIntegrity.ProtoReflect())
+ if !f(fd_GenesisState_global_integrity, value) {
+ return
+ }
+ }
}
// Has reports whether a field is populated.
@@ -114,6 +122,8 @@ func (x *fastReflection_GenesisState) Has(fd protoreflect.FieldDescriptor) bool
switch fd.FullName() {
case "did.v1.GenesisState.params":
return x.Params != nil
+ case "did.v1.GenesisState.global_integrity":
+ return x.GlobalIntegrity != nil
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GenesisState"))
@@ -132,6 +142,8 @@ func (x *fastReflection_GenesisState) Clear(fd protoreflect.FieldDescriptor) {
switch fd.FullName() {
case "did.v1.GenesisState.params":
x.Params = nil
+ case "did.v1.GenesisState.global_integrity":
+ x.GlobalIntegrity = nil
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GenesisState"))
@@ -151,6 +163,9 @@ func (x *fastReflection_GenesisState) Get(descriptor protoreflect.FieldDescripto
case "did.v1.GenesisState.params":
value := x.Params
return protoreflect.ValueOfMessage(value.ProtoReflect())
+ case "did.v1.GenesisState.global_integrity":
+ value := x.GlobalIntegrity
+ return protoreflect.ValueOfMessage(value.ProtoReflect())
default:
if descriptor.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GenesisState"))
@@ -173,6 +188,8 @@ func (x *fastReflection_GenesisState) Set(fd protoreflect.FieldDescriptor, value
switch fd.FullName() {
case "did.v1.GenesisState.params":
x.Params = value.Message().Interface().(*Params)
+ case "did.v1.GenesisState.global_integrity":
+ x.GlobalIntegrity = value.Message().Interface().(*GlobalIntegrity)
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GenesisState"))
@@ -198,6 +215,11 @@ func (x *fastReflection_GenesisState) Mutable(fd protoreflect.FieldDescriptor) p
x.Params = new(Params)
}
return protoreflect.ValueOfMessage(x.Params.ProtoReflect())
+ case "did.v1.GenesisState.global_integrity":
+ if x.GlobalIntegrity == nil {
+ x.GlobalIntegrity = new(GlobalIntegrity)
+ }
+ return protoreflect.ValueOfMessage(x.GlobalIntegrity.ProtoReflect())
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GenesisState"))
@@ -214,6 +236,9 @@ func (x *fastReflection_GenesisState) NewField(fd protoreflect.FieldDescriptor)
case "did.v1.GenesisState.params":
m := new(Params)
return protoreflect.ValueOfMessage(m.ProtoReflect())
+ case "did.v1.GenesisState.global_integrity":
+ m := new(GlobalIntegrity)
+ return protoreflect.ValueOfMessage(m.ProtoReflect())
default:
if fd.IsExtension() {
panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GenesisState"))
@@ -287,6 +312,10 @@ func (x *fastReflection_GenesisState) ProtoMethods() *protoiface.Methods {
l = options.Size(x.Params)
n += 1 + l + runtime.Sov(uint64(l))
}
+ if x.GlobalIntegrity != nil {
+ l = options.Size(x.GlobalIntegrity)
+ n += 1 + l + runtime.Sov(uint64(l))
+ }
if x.unknownFields != nil {
n += len(x.unknownFields)
}
@@ -316,6 +345,20 @@ func (x *fastReflection_GenesisState) ProtoMethods() *protoiface.Methods {
i -= len(x.unknownFields)
copy(dAtA[i:], x.unknownFields)
}
+ if x.GlobalIntegrity != nil {
+ encoded, err := options.Marshal(x.GlobalIntegrity)
+ if err != nil {
+ return protoiface.MarshalOutput{
+ NoUnkeyedLiterals: input.NoUnkeyedLiterals,
+ Buf: input.Buf,
+ }, err
+ }
+ i -= len(encoded)
+ copy(dAtA[i:], encoded)
+ i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded)))
+ i--
+ dAtA[i] = 0x12
+ }
if x.Params != nil {
encoded, err := options.Marshal(x.Params)
if err != nil {
@@ -415,6 +458,640 @@ func (x *fastReflection_GenesisState) ProtoMethods() *protoiface.Methods {
return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err
}
iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GlobalIntegrity", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
+ }
+ if iNdEx >= l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
+ }
+ if postIndex > l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ if x.GlobalIntegrity == nil {
+ x.GlobalIntegrity = &GlobalIntegrity{}
+ }
+ if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.GlobalIntegrity); err != nil {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := runtime.Skip(dAtA[iNdEx:])
+ if err != nil {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
+ }
+ if (iNdEx + skippy) > l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ if !options.DiscardUnknown {
+ x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil
+ }
+ return &protoiface.Methods{
+ NoUnkeyedLiterals: struct{}{},
+ Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown,
+ Size: size,
+ Marshal: marshal,
+ Unmarshal: unmarshal,
+ Merge: nil,
+ CheckInitialized: nil,
+ }
+}
+
+var (
+ md_GlobalIntegrity protoreflect.MessageDescriptor
+ fd_GlobalIntegrity_controller protoreflect.FieldDescriptor
+ fd_GlobalIntegrity_seed protoreflect.FieldDescriptor
+ fd_GlobalIntegrity_accumulator protoreflect.FieldDescriptor
+ fd_GlobalIntegrity_count protoreflect.FieldDescriptor
+)
+
+func init() {
+ file_did_v1_genesis_proto_init()
+ md_GlobalIntegrity = File_did_v1_genesis_proto.Messages().ByName("GlobalIntegrity")
+ fd_GlobalIntegrity_controller = md_GlobalIntegrity.Fields().ByName("controller")
+ fd_GlobalIntegrity_seed = md_GlobalIntegrity.Fields().ByName("seed")
+ fd_GlobalIntegrity_accumulator = md_GlobalIntegrity.Fields().ByName("accumulator")
+ fd_GlobalIntegrity_count = md_GlobalIntegrity.Fields().ByName("count")
+}
+
+var _ protoreflect.Message = (*fastReflection_GlobalIntegrity)(nil)
+
+type fastReflection_GlobalIntegrity GlobalIntegrity
+
+func (x *GlobalIntegrity) ProtoReflect() protoreflect.Message {
+ return (*fastReflection_GlobalIntegrity)(x)
+}
+
+func (x *GlobalIntegrity) slowProtoReflect() protoreflect.Message {
+ mi := &file_did_v1_genesis_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+var _fastReflection_GlobalIntegrity_messageType fastReflection_GlobalIntegrity_messageType
+var _ protoreflect.MessageType = fastReflection_GlobalIntegrity_messageType{}
+
+type fastReflection_GlobalIntegrity_messageType struct{}
+
+func (x fastReflection_GlobalIntegrity_messageType) Zero() protoreflect.Message {
+ return (*fastReflection_GlobalIntegrity)(nil)
+}
+func (x fastReflection_GlobalIntegrity_messageType) New() protoreflect.Message {
+ return new(fastReflection_GlobalIntegrity)
+}
+func (x fastReflection_GlobalIntegrity_messageType) Descriptor() protoreflect.MessageDescriptor {
+ return md_GlobalIntegrity
+}
+
+// Descriptor returns message descriptor, which contains only the protobuf
+// type information for the message.
+func (x *fastReflection_GlobalIntegrity) Descriptor() protoreflect.MessageDescriptor {
+ return md_GlobalIntegrity
+}
+
+// Type returns the message type, which encapsulates both Go and protobuf
+// type information. If the Go type information is not needed,
+// it is recommended that the message descriptor be used instead.
+func (x *fastReflection_GlobalIntegrity) Type() protoreflect.MessageType {
+ return _fastReflection_GlobalIntegrity_messageType
+}
+
+// New returns a newly allocated and mutable empty message.
+func (x *fastReflection_GlobalIntegrity) New() protoreflect.Message {
+ return new(fastReflection_GlobalIntegrity)
+}
+
+// Interface unwraps the message reflection interface and
+// returns the underlying ProtoMessage interface.
+func (x *fastReflection_GlobalIntegrity) Interface() protoreflect.ProtoMessage {
+ return (*GlobalIntegrity)(x)
+}
+
+// Range iterates over every populated field in an undefined order,
+// calling f for each field descriptor and value encountered.
+// Range returns immediately if f returns false.
+// While iterating, mutating operations may only be performed
+// on the current field descriptor.
+func (x *fastReflection_GlobalIntegrity) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
+ if x.Controller != "" {
+ value := protoreflect.ValueOfString(x.Controller)
+ if !f(fd_GlobalIntegrity_controller, value) {
+ return
+ }
+ }
+ if x.Seed != "" {
+ value := protoreflect.ValueOfString(x.Seed)
+ if !f(fd_GlobalIntegrity_seed, value) {
+ return
+ }
+ }
+ if len(x.Accumulator) != 0 {
+ value := protoreflect.ValueOfBytes(x.Accumulator)
+ if !f(fd_GlobalIntegrity_accumulator, value) {
+ return
+ }
+ }
+ if x.Count != uint64(0) {
+ value := protoreflect.ValueOfUint64(x.Count)
+ if !f(fd_GlobalIntegrity_count, value) {
+ return
+ }
+ }
+}
+
+// Has reports whether a field is populated.
+//
+// Some fields have the property of nullability where it is possible to
+// distinguish between the default value of a field and whether the field
+// was explicitly populated with the default value. Singular message fields,
+// member fields of a oneof, and proto2 scalar fields are nullable. Such
+// fields are populated only if explicitly set.
+//
+// In other cases (aside from the nullable cases above),
+// a proto3 scalar field is populated if it contains a non-zero value, and
+// a repeated field is populated if it is non-empty.
+func (x *fastReflection_GlobalIntegrity) Has(fd protoreflect.FieldDescriptor) bool {
+ switch fd.FullName() {
+ case "did.v1.GlobalIntegrity.controller":
+ return x.Controller != ""
+ case "did.v1.GlobalIntegrity.seed":
+ return x.Seed != ""
+ case "did.v1.GlobalIntegrity.accumulator":
+ return len(x.Accumulator) != 0
+ case "did.v1.GlobalIntegrity.count":
+ return x.Count != uint64(0)
+ default:
+ if fd.IsExtension() {
+ panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GlobalIntegrity"))
+ }
+ panic(fmt.Errorf("message did.v1.GlobalIntegrity does not contain field %s", fd.FullName()))
+ }
+}
+
+// Clear clears the field such that a subsequent Has call reports false.
+//
+// Clearing an extension field clears both the extension type and value
+// associated with the given field number.
+//
+// Clear is a mutating operation and unsafe for concurrent use.
+func (x *fastReflection_GlobalIntegrity) Clear(fd protoreflect.FieldDescriptor) {
+ switch fd.FullName() {
+ case "did.v1.GlobalIntegrity.controller":
+ x.Controller = ""
+ case "did.v1.GlobalIntegrity.seed":
+ x.Seed = ""
+ case "did.v1.GlobalIntegrity.accumulator":
+ x.Accumulator = nil
+ case "did.v1.GlobalIntegrity.count":
+ x.Count = uint64(0)
+ default:
+ if fd.IsExtension() {
+ panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GlobalIntegrity"))
+ }
+ panic(fmt.Errorf("message did.v1.GlobalIntegrity does not contain field %s", fd.FullName()))
+ }
+}
+
+// Get retrieves the value for a field.
+//
+// For unpopulated scalars, it returns the default value, where
+// the default value of a bytes scalar is guaranteed to be a copy.
+// For unpopulated composite types, it returns an empty, read-only view
+// of the value; to obtain a mutable reference, use Mutable.
+func (x *fastReflection_GlobalIntegrity) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
+ switch descriptor.FullName() {
+ case "did.v1.GlobalIntegrity.controller":
+ value := x.Controller
+ return protoreflect.ValueOfString(value)
+ case "did.v1.GlobalIntegrity.seed":
+ value := x.Seed
+ return protoreflect.ValueOfString(value)
+ case "did.v1.GlobalIntegrity.accumulator":
+ value := x.Accumulator
+ return protoreflect.ValueOfBytes(value)
+ case "did.v1.GlobalIntegrity.count":
+ value := x.Count
+ return protoreflect.ValueOfUint64(value)
+ default:
+ if descriptor.IsExtension() {
+ panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GlobalIntegrity"))
+ }
+ panic(fmt.Errorf("message did.v1.GlobalIntegrity does not contain field %s", descriptor.FullName()))
+ }
+}
+
+// Set stores the value for a field.
+//
+// For a field belonging to a oneof, it implicitly clears any other field
+// that may be currently set within the same oneof.
+// For extension fields, it implicitly stores the provided ExtensionType.
+// When setting a composite type, it is unspecified whether the stored value
+// aliases the source's memory in any way. If the composite value is an
+// empty, read-only value, then it panics.
+//
+// Set is a mutating operation and unsafe for concurrent use.
+func (x *fastReflection_GlobalIntegrity) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) {
+ switch fd.FullName() {
+ case "did.v1.GlobalIntegrity.controller":
+ x.Controller = value.Interface().(string)
+ case "did.v1.GlobalIntegrity.seed":
+ x.Seed = value.Interface().(string)
+ case "did.v1.GlobalIntegrity.accumulator":
+ x.Accumulator = value.Bytes()
+ case "did.v1.GlobalIntegrity.count":
+ x.Count = value.Uint()
+ default:
+ if fd.IsExtension() {
+ panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GlobalIntegrity"))
+ }
+ panic(fmt.Errorf("message did.v1.GlobalIntegrity does not contain field %s", fd.FullName()))
+ }
+}
+
+// Mutable returns a mutable reference to a composite type.
+//
+// If the field is unpopulated, it may allocate a composite value.
+// For a field belonging to a oneof, it implicitly clears any other field
+// that may be currently set within the same oneof.
+// For extension fields, it implicitly stores the provided ExtensionType
+// if not already stored.
+// It panics if the field does not contain a composite type.
+//
+// Mutable is a mutating operation and unsafe for concurrent use.
+func (x *fastReflection_GlobalIntegrity) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
+ switch fd.FullName() {
+ case "did.v1.GlobalIntegrity.controller":
+ panic(fmt.Errorf("field controller of message did.v1.GlobalIntegrity is not mutable"))
+ case "did.v1.GlobalIntegrity.seed":
+ panic(fmt.Errorf("field seed of message did.v1.GlobalIntegrity is not mutable"))
+ case "did.v1.GlobalIntegrity.accumulator":
+ panic(fmt.Errorf("field accumulator of message did.v1.GlobalIntegrity is not mutable"))
+ case "did.v1.GlobalIntegrity.count":
+ panic(fmt.Errorf("field count of message did.v1.GlobalIntegrity is not mutable"))
+ default:
+ if fd.IsExtension() {
+ panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GlobalIntegrity"))
+ }
+ panic(fmt.Errorf("message did.v1.GlobalIntegrity does not contain field %s", fd.FullName()))
+ }
+}
+
+// NewField returns a new value that is assignable to the field
+// for the given descriptor. For scalars, this returns the default value.
+// For lists, maps, and messages, this returns a new, empty, mutable value.
+func (x *fastReflection_GlobalIntegrity) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
+ switch fd.FullName() {
+ case "did.v1.GlobalIntegrity.controller":
+ return protoreflect.ValueOfString("")
+ case "did.v1.GlobalIntegrity.seed":
+ return protoreflect.ValueOfString("")
+ case "did.v1.GlobalIntegrity.accumulator":
+ return protoreflect.ValueOfBytes(nil)
+ case "did.v1.GlobalIntegrity.count":
+ return protoreflect.ValueOfUint64(uint64(0))
+ default:
+ if fd.IsExtension() {
+ panic(fmt.Errorf("proto3 declared messages do not support extensions: did.v1.GlobalIntegrity"))
+ }
+ panic(fmt.Errorf("message did.v1.GlobalIntegrity does not contain field %s", fd.FullName()))
+ }
+}
+
+// WhichOneof reports which field within the oneof is populated,
+// returning nil if none are populated.
+// It panics if the oneof descriptor does not belong to this message.
+func (x *fastReflection_GlobalIntegrity) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
+ switch d.FullName() {
+ default:
+ panic(fmt.Errorf("%s is not a oneof field in did.v1.GlobalIntegrity", d.FullName()))
+ }
+ panic("unreachable")
+}
+
+// GetUnknown retrieves the entire list of unknown fields.
+// The caller may only mutate the contents of the RawFields
+// if the mutated bytes are stored back into the message with SetUnknown.
+func (x *fastReflection_GlobalIntegrity) GetUnknown() protoreflect.RawFields {
+ return x.unknownFields
+}
+
+// SetUnknown stores an entire list of unknown fields.
+// The raw fields must be syntactically valid according to the wire format.
+// An implementation may panic if this is not the case.
+// Once stored, the caller must not mutate the content of the RawFields.
+// An empty RawFields may be passed to clear the fields.
+//
+// SetUnknown is a mutating operation and unsafe for concurrent use.
+func (x *fastReflection_GlobalIntegrity) SetUnknown(fields protoreflect.RawFields) {
+ x.unknownFields = fields
+}
+
+// IsValid reports whether the message is valid.
+//
+// An invalid message is an empty, read-only value.
+//
+// An invalid message often corresponds to a nil pointer of the concrete
+// message type, but the details are implementation dependent.
+// Validity is not part of the protobuf data model, and may not
+// be preserved in marshaling or other operations.
+func (x *fastReflection_GlobalIntegrity) IsValid() bool {
+ return x != nil
+}
+
+// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations.
+// This method may return nil.
+//
+// The returned methods type is identical to
+// "google.golang.org/protobuf/runtime/protoiface".Methods.
+// Consult the protoiface package documentation for details.
+func (x *fastReflection_GlobalIntegrity) ProtoMethods() *protoiface.Methods {
+ size := func(input protoiface.SizeInput) protoiface.SizeOutput {
+ x := input.Message.Interface().(*GlobalIntegrity)
+ if x == nil {
+ return protoiface.SizeOutput{
+ NoUnkeyedLiterals: input.NoUnkeyedLiterals,
+ Size: 0,
+ }
+ }
+ options := runtime.SizeInputToOptions(input)
+ _ = options
+ var n int
+ var l int
+ _ = l
+ l = len(x.Controller)
+ if l > 0 {
+ n += 1 + l + runtime.Sov(uint64(l))
+ }
+ l = len(x.Seed)
+ if l > 0 {
+ n += 1 + l + runtime.Sov(uint64(l))
+ }
+ l = len(x.Accumulator)
+ if l > 0 {
+ n += 1 + l + runtime.Sov(uint64(l))
+ }
+ if x.Count != 0 {
+ n += 1 + runtime.Sov(uint64(x.Count))
+ }
+ if x.unknownFields != nil {
+ n += len(x.unknownFields)
+ }
+ return protoiface.SizeOutput{
+ NoUnkeyedLiterals: input.NoUnkeyedLiterals,
+ Size: n,
+ }
+ }
+
+ marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) {
+ x := input.Message.Interface().(*GlobalIntegrity)
+ if x == nil {
+ return protoiface.MarshalOutput{
+ NoUnkeyedLiterals: input.NoUnkeyedLiterals,
+ Buf: input.Buf,
+ }, nil
+ }
+ options := runtime.MarshalInputToOptions(input)
+ _ = options
+ size := options.Size(x)
+ dAtA := make([]byte, size)
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if x.unknownFields != nil {
+ i -= len(x.unknownFields)
+ copy(dAtA[i:], x.unknownFields)
+ }
+ if x.Count != 0 {
+ i = runtime.EncodeVarint(dAtA, i, uint64(x.Count))
+ i--
+ dAtA[i] = 0x20
+ }
+ if len(x.Accumulator) > 0 {
+ i -= len(x.Accumulator)
+ copy(dAtA[i:], x.Accumulator)
+ i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Accumulator)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if len(x.Seed) > 0 {
+ i -= len(x.Seed)
+ copy(dAtA[i:], x.Seed)
+ i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Seed)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(x.Controller) > 0 {
+ i -= len(x.Controller)
+ copy(dAtA[i:], x.Controller)
+ i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Controller)))
+ i--
+ dAtA[i] = 0xa
+ }
+ if input.Buf != nil {
+ input.Buf = append(input.Buf, dAtA...)
+ } else {
+ input.Buf = dAtA
+ }
+ return protoiface.MarshalOutput{
+ NoUnkeyedLiterals: input.NoUnkeyedLiterals,
+ Buf: input.Buf,
+ }, nil
+ }
+ unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) {
+ x := input.Message.Interface().(*GlobalIntegrity)
+ if x == nil {
+ return protoiface.UnmarshalOutput{
+ NoUnkeyedLiterals: input.NoUnkeyedLiterals,
+ Flags: input.Flags,
+ }, nil
+ }
+ options := runtime.UnmarshalInputToOptions(input)
+ _ = options
+ dAtA := input.Buf
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
+ }
+ if iNdEx >= l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: GlobalIntegrity: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: GlobalIntegrity: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Controller", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
+ }
+ if iNdEx >= l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
+ }
+ if postIndex > l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ x.Controller = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Seed", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
+ }
+ if iNdEx >= l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
+ }
+ if postIndex > l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ x.Seed = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Accumulator", wireType)
+ }
+ var byteLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
+ }
+ if iNdEx >= l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ byteLen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if byteLen < 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
+ }
+ postIndex := iNdEx + byteLen
+ if postIndex < 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength
+ }
+ if postIndex > l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ x.Accumulator = append(x.Accumulator[:0], dAtA[iNdEx:postIndex]...)
+ if x.Accumulator == nil {
+ x.Accumulator = []byte{}
+ }
+ iNdEx = postIndex
+ case 4:
+ if wireType != 0 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Count", wireType)
+ }
+ x.Count = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow
+ }
+ if iNdEx >= l {
+ return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ x.Count |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
default:
iNdEx = preIndex
skippy, err := runtime.Skip(dAtA[iNdEx:])
@@ -667,7 +1344,7 @@ func (x *Params) ProtoReflect() protoreflect.Message {
}
func (x *Params) slowProtoReflect() protoreflect.Message {
- mi := &file_did_v1_genesis_proto_msgTypes[1]
+ mi := &file_did_v1_genesis_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -6936,6 +7613,8 @@ type GenesisState struct {
// Params defines all the parameters of the module.
Params *Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"`
+ // GlobalIntegrity defines a zkp integrity proof for the entire DID namespace
+ GlobalIntegrity *GlobalIntegrity `protobuf:"bytes,2,opt,name=global_integrity,json=globalIntegrity,proto3" json:"global_integrity,omitempty"`
}
func (x *GenesisState) Reset() {
@@ -6965,6 +7644,73 @@ func (x *GenesisState) GetParams() *Params {
return nil
}
+func (x *GenesisState) GetGlobalIntegrity() *GlobalIntegrity {
+ if x != nil {
+ return x.GlobalIntegrity
+ }
+ return nil
+}
+
+// GlobalIntegrity defines a zkp integrity proof for the entire DID namespace
+type GlobalIntegrity struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Controller string `protobuf:"bytes,1,opt,name=controller,proto3" json:"controller,omitempty"`
+ Seed string `protobuf:"bytes,2,opt,name=seed,proto3" json:"seed,omitempty"`
+ Accumulator []byte `protobuf:"bytes,3,opt,name=accumulator,proto3" json:"accumulator,omitempty"`
+ Count uint64 `protobuf:"varint,4,opt,name=count,proto3" json:"count,omitempty"`
+}
+
+func (x *GlobalIntegrity) Reset() {
+ *x = GlobalIntegrity{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_did_v1_genesis_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GlobalIntegrity) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GlobalIntegrity) ProtoMessage() {}
+
+// Deprecated: Use GlobalIntegrity.ProtoReflect.Descriptor instead.
+func (*GlobalIntegrity) Descriptor() ([]byte, []int) {
+ return file_did_v1_genesis_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GlobalIntegrity) GetController() string {
+ if x != nil {
+ return x.Controller
+ }
+ return ""
+}
+
+func (x *GlobalIntegrity) GetSeed() string {
+ if x != nil {
+ return x.Seed
+ }
+ return ""
+}
+
+func (x *GlobalIntegrity) GetAccumulator() []byte {
+ if x != nil {
+ return x.Accumulator
+ }
+ return nil
+}
+
+func (x *GlobalIntegrity) GetCount() uint64 {
+ if x != nil {
+ return x.Count
+ }
+ return 0
+}
+
// Params defines the set of module parameters.
type Params struct {
state protoimpl.MessageState
@@ -6988,7 +7734,7 @@ type Params struct {
func (x *Params) Reset() {
*x = Params{}
if protoimpl.UnsafeEnabled {
- mi := &file_did_v1_genesis_proto_msgTypes[1]
+ mi := &file_did_v1_genesis_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -7002,7 +7748,7 @@ func (*Params) ProtoMessage() {}
// Deprecated: Use Params.ProtoReflect.Descriptor instead.
func (*Params) Descriptor() ([]byte, []int) {
- return file_did_v1_genesis_proto_rawDescGZIP(), []int{1}
+ return file_did_v1_genesis_proto_rawDescGZIP(), []int{2}
}
func (x *Params) GetWhitelistedAssets() []*AssetInfo {
@@ -7718,6 +8464,18 @@ func file_did_v1_genesis_proto_init() {
}
}
file_did_v1_genesis_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GlobalIntegrity); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_did_v1_genesis_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Params); i {
case 0:
return &v.state
diff --git a/api/did/v1/tx.pulsar.go b/api/did/v1/tx.pulsar.go
index 6ac071d4e..f7e93460b 100644
--- a/api/did/v1/tx.pulsar.go
+++ b/api/did/v1/tx.pulsar.go
@@ -31,15 +31,15 @@ func init() {
fd_MsgUpdateParams_token = md_MsgUpdateParams.Fields().ByName("token")
}
-var _ protoreflect.Message = (*fastReflection_MsgUpdateParams)(nil)
+var _ protoreflect.Message = (*fastReflection_MsgAllocateVault)(nil)
-type fastReflection_MsgUpdateParams MsgUpdateParams
+type fastReflection_MsgAllocateVault MsgAllocateVault
-func (x *MsgUpdateParams) ProtoReflect() protoreflect.Message {
- return (*fastReflection_MsgUpdateParams)(x)
+func (x *MsgAllocateVault) ProtoReflect() protoreflect.Message {
+ return (*fastReflection_MsgAllocateVault)(x)
}
-func (x *MsgUpdateParams) slowProtoReflect() protoreflect.Message {
+func (x *MsgAllocateVault) slowProtoReflect() protoreflect.Message {
mi := &file_did_v1_tx_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -51,43 +51,43 @@ func (x *MsgUpdateParams) slowProtoReflect() protoreflect.Message {
return mi.MessageOf(x)
}
-var _fastReflection_MsgUpdateParams_messageType fastReflection_MsgUpdateParams_messageType
-var _ protoreflect.MessageType = fastReflection_MsgUpdateParams_messageType{}
+var _fastReflection_MsgAllocateVault_messageType fastReflection_MsgAllocateVault_messageType
+var _ protoreflect.MessageType = fastReflection_MsgAllocateVault_messageType{}
-type fastReflection_MsgUpdateParams_messageType struct{}
+type fastReflection_MsgAllocateVault_messageType struct{}
-func (x fastReflection_MsgUpdateParams_messageType) Zero() protoreflect.Message {
- return (*fastReflection_MsgUpdateParams)(nil)
+func (x fastReflection_MsgAllocateVault_messageType) Zero() protoreflect.Message {
+ return (*fastReflection_MsgAllocateVault)(nil)
}
-func (x fastReflection_MsgUpdateParams_messageType) New() protoreflect.Message {
- return new(fastReflection_MsgUpdateParams)
+func (x fastReflection_MsgAllocateVault_messageType) New() protoreflect.Message {
+ return new(fastReflection_MsgAllocateVault)
}
-func (x fastReflection_MsgUpdateParams_messageType) Descriptor() protoreflect.MessageDescriptor {
- return md_MsgUpdateParams
+func (x fastReflection_MsgAllocateVault_messageType) Descriptor() protoreflect.MessageDescriptor {
+ return md_MsgAllocateVault
}
// Descriptor returns message descriptor, which contains only the protobuf
// type information for the message.
-func (x *fastReflection_MsgUpdateParams) Descriptor() protoreflect.MessageDescriptor {
- return md_MsgUpdateParams
+func (x *fastReflection_MsgAllocateVault) Descriptor() protoreflect.MessageDescriptor {
+ return md_MsgAllocateVault
}
// Type returns the message type, which encapsulates both Go and protobuf
// type information. If the Go type information is not needed,
// it is recommended that the message descriptor be used instead.
-func (x *fastReflection_MsgUpdateParams) Type() protoreflect.MessageType {
- return _fastReflection_MsgUpdateParams_messageType
+func (x *fastReflection_MsgAllocateVault) Type() protoreflect.MessageType {
+ return _fastReflection_MsgAllocateVault_messageType
}
// New returns a newly allocated and mutable empty message.
-func (x *fastReflection_MsgUpdateParams) New() protoreflect.Message {
- return new(fastReflection_MsgUpdateParams)
+func (x *fastReflection_MsgAllocateVault) New() protoreflect.Message {
+ return new(fastReflection_MsgAllocateVault)
}
// Interface unwraps the message reflection interface and
// returns the underlying ProtoMessage interface.
-func (x *fastReflection_MsgUpdateParams) Interface() protoreflect.ProtoMessage {
- return (*MsgUpdateParams)(x)
+func (x *fastReflection_MsgAllocateVault) Interface() protoreflect.ProtoMessage {
+ return (*MsgAllocateVault)(x)
}
// Range iterates over every populated field in an undefined order,
@@ -95,10 +95,10 @@ func (x *fastReflection_MsgUpdateParams) Interface() protoreflect.ProtoMessage {
// Range returns immediately if f returns false.
// While iterating, mutating operations may only be performed
// on the current field descriptor.
-func (x *fastReflection_MsgUpdateParams) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
+func (x *fastReflection_MsgAllocateVault) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
if x.Authority != "" {
value := protoreflect.ValueOfString(x.Authority)
- if !f(fd_MsgUpdateParams_authority, value) {
+ if !f(fd_MsgAllocateVault_authority, value) {
return
}
}
@@ -5951,15 +5951,13 @@ const (
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
-// MsgUpdateParams is the Msg/UpdateParams request type.
-//
-// Since: cosmos-sdk 0.47
-type MsgUpdateParams struct {
+// MsgAllocateVault is the message type for the AllocateVault RPC.
+type MsgAllocateVault struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- // authority is the address of the governance account.
+ // authority is the address of the service account.
Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"`
// params defines the parameters to update.
Params *Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"`
@@ -5967,8 +5965,8 @@ type MsgUpdateParams struct {
Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"`
}
-func (x *MsgUpdateParams) Reset() {
- *x = MsgUpdateParams{}
+func (x *MsgAllocateVault) Reset() {
+ *x = MsgAllocateVault{}
if protoimpl.UnsafeEnabled {
mi := &file_did_v1_tx_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -5976,29 +5974,29 @@ func (x *MsgUpdateParams) Reset() {
}
}
-func (x *MsgUpdateParams) String() string {
+func (x *MsgAllocateVault) String() string {
return protoimpl.X.MessageStringOf(x)
}
-func (*MsgUpdateParams) ProtoMessage() {}
+func (*MsgAllocateVault) ProtoMessage() {}
-// Deprecated: Use MsgUpdateParams.ProtoReflect.Descriptor instead.
-func (*MsgUpdateParams) Descriptor() ([]byte, []int) {
+// Deprecated: Use MsgAllocateVault.ProtoReflect.Descriptor instead.
+func (*MsgAllocateVault) Descriptor() ([]byte, []int) {
return file_did_v1_tx_proto_rawDescGZIP(), []int{0}
}
-func (x *MsgUpdateParams) GetAuthority() string {
+func (x *MsgAllocateVault) GetAuthority() string {
if x != nil {
return x.Authority
}
return ""
}
-func (x *MsgUpdateParams) GetParams() *Params {
+func (x *MsgAllocateVault) GetSubject() string {
if x != nil {
- return x.Params
+ return x.Subject
}
- return nil
+ return ""
}
func (x *MsgUpdateParams) GetToken() string {
@@ -6016,10 +6014,19 @@ type MsgUpdateParamsResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
+
+ // CID is the content identifier of the vault.
+ Cid string `protobuf:"bytes,1,opt,name=cid,proto3" json:"cid,omitempty"`
+ // ExpiryBlock is the block number at which the vault will expire.
+ ExpiryBlock int64 `protobuf:"varint,2,opt,name=expiry_block,json=expiryBlock,proto3" json:"expiry_block,omitempty"`
+ // RegistrationOptions is a json string of the PublicKeyCredentialCreationOptions for WebAuthn
+ Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"`
+ // IsLocalhost is a flag to indicate if the vault is localhost
+ Localhost bool `protobuf:"varint,4,opt,name=localhost,proto3" json:"localhost,omitempty"`
}
-func (x *MsgUpdateParamsResponse) Reset() {
- *x = MsgUpdateParamsResponse{}
+func (x *MsgAllocateVaultResponse) Reset() {
+ *x = MsgAllocateVaultResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_did_v1_tx_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -6027,14 +6034,14 @@ func (x *MsgUpdateParamsResponse) Reset() {
}
}
-func (x *MsgUpdateParamsResponse) String() string {
+func (x *MsgAllocateVaultResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
-func (*MsgUpdateParamsResponse) ProtoMessage() {}
+func (*MsgAllocateVaultResponse) ProtoMessage() {}
-// Deprecated: Use MsgUpdateParamsResponse.ProtoReflect.Descriptor instead.
-func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) {
+// Deprecated: Use MsgAllocateVaultResponse.ProtoReflect.Descriptor instead.
+func (*MsgAllocateVaultResponse) Descriptor() ([]byte, []int) {
return file_did_v1_tx_proto_rawDescGZIP(), []int{1}
}
@@ -6675,7 +6682,7 @@ func file_did_v1_tx_proto_init() {
file_did_v1_genesis_proto_init()
if !protoimpl.UnsafeEnabled {
file_did_v1_tx_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*MsgUpdateParams); i {
+ switch v := v.(*MsgAllocateVault); i {
case 0:
return &v.state
case 1:
@@ -6687,7 +6694,7 @@ func file_did_v1_tx_proto_init() {
}
}
file_did_v1_tx_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*MsgUpdateParamsResponse); i {
+ switch v := v.(*MsgAllocateVaultResponse); i {
case 0:
return &v.state
case 1:
@@ -6794,6 +6801,30 @@ func file_did_v1_tx_proto_init() {
return nil
}
}
+ file_did_v1_tx_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*MsgUpdateParams); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_did_v1_tx_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*MsgUpdateParamsResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
}
type x struct{}
out := protoimpl.TypeBuilder{
diff --git a/cmd/dwn/main.go b/cmd/dwn/main.go
new file mode 100644
index 000000000..51a42fc4c
--- /dev/null
+++ b/cmd/dwn/main.go
@@ -0,0 +1,40 @@
+//go:build js && wasm
+// +build js,wasm
+
+package main
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/vfs/wasm"
+
+ "github.com/onsonr/sonr/internal/db"
+)
+
+var dwn *DWN
+
+type DWN struct {
+ *echo.Echo
+ DB *db.DB
+}
+
+func main() {
+ dwn = initRails()
+ wasm.Serve(dwn.Echo)
+}
+
+// initRails initializes the Rails application
+func initRails() *DWN {
+ // Open the database
+ e := echo.New()
+ db, err := db.New()
+ if err != nil {
+ panic(err.Error())
+ }
+ db.ServeEcho(e.Group("/dwn"))
+
+ // Initialize the htmx handler
+ return &DWN{
+ Echo: e,
+ DB: db,
+ }
+}
diff --git a/cmd/motr/main.go b/cmd/motr/main.go
new file mode 100644
index 000000000..8fdf0d6ba
--- /dev/null
+++ b/cmd/motr/main.go
@@ -0,0 +1,61 @@
+//go:build wasm
+
+package main
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/syumai/workers"
+
+ "github.com/onsonr/sonr/internal/db"
+
+ "github.com/onsonr/sonr/internal/gui/views"
+ "github.com/onsonr/sonr/internal/mdw"
+ "github.com/onsonr/sonr/internal/svc"
+)
+
+func main() {
+ // Configure the server
+ e := echo.New()
+
+ // Use Middlewares
+ e.Use(mdw.UseSession)
+
+ // Setup routes
+ registerFrontend(e)
+ registerOpenID(e.Group("/authorize"))
+ registerVault(e.Group("/vault"))
+
+ // Serve Worker
+ workers.Serve(e)
+}
+
+func registerFrontend(e *echo.Echo) {
+ // Add Public Pages
+ e.GET("/", views.HomeView)
+ e.GET("/login", views.LoginView)
+ e.POST("/login/:identifier", svc.HandleCredentialAssertion)
+ e.GET("/register", views.RegisterView)
+ e.POST("/register/:subject", svc.HandleCredentialCreation)
+ e.POST("/register/:subject/check", svc.CheckSubjectIsValid)
+ e.GET("/profile", views.ProfileView)
+}
+
+func registerOpenID(g *echo.Group) {
+ // Add Authenticated Pages
+ g.Use(mdw.MacaroonMiddleware("test", "test"))
+ g.GET("/", views.AuthorizeView)
+ g.GET("/discovery", svc.GetDiscovery)
+ g.GET("/jwks", svc.GetJWKS)
+ g.GET("/token", svc.GetToken)
+ g.POST("/:origin/grant/:subject", svc.GrantAuthorization)
+}
+
+func registerVault(g *echo.Group) {
+ // Add Authenticated Pages
+ g.Use(mdw.MacaroonMiddleware("test", "test"))
+ vault, err := db.New(db.WitDir("vault"))
+ if err != nil {
+ // panic(err)
+ }
+ vault.ServeEcho(g)
+}
diff --git a/cmd/motr/wrangler.toml b/cmd/motr/wrangler.toml
new file mode 100644
index 000000000..10bce7926
--- /dev/null
+++ b/cmd/motr/wrangler.toml
@@ -0,0 +1,10 @@
+name = "sonr-id"
+main = "./build/worker.mjs"
+compatibility_date = "2024-07-26"
+
+[dev]
+ip = "localhost"
+port = 4202
+
+[build]
+command = "devbox run build:motr"
diff --git a/docker-compose.yaml b/docker-compose.yaml
new file mode 100644
index 000000000..9b7687ed8
--- /dev/null
+++ b/docker-compose.yaml
@@ -0,0 +1,30 @@
+version: "3"
+
+services:
+ sonr-node:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ volumes:
+ - /home/prad/.scnr:/root/.sonr
+ ports:
+ - "26657:26657"
+ - "1317:1317"
+ - "9090:9090"
+ environment:
+ - CHAIN_ID=local-1
+ - MONIKER=localvalidator
+ - KEYRING=test
+ - KEY=user1
+ - KEY2=user2
+ - DENOM=usnr
+ - CLEAN=true
+ - BLOCK_TIME=5s
+ command: "start --pruning=nothing"
+ restart: always
+ networks:
+ - sonr-network
+
+networks:
+ sonr-network:
+ name: sonr-network
diff --git a/go.mod b/go.mod
index 6b3704989..65608f681 100644
--- a/go.mod
+++ b/go.mod
@@ -54,6 +54,7 @@ require (
github.com/charmbracelet/huh v0.5.3
github.com/charmbracelet/lipgloss v0.13.0
github.com/cometbft/cometbft v0.38.8
+ github.com/cosmos/btcutil v1.0.5
github.com/cosmos/cosmos-db v1.0.2
github.com/cosmos/cosmos-proto v1.0.0-beta.5
github.com/cosmos/cosmos-sdk v0.50.5
@@ -95,6 +96,7 @@ require (
cloud.google.com/go/iam v1.1.6 // indirect
cloud.google.com/go/storage v1.38.0 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
+ git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9 // indirect
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
github.com/99designs/keyring v1.2.1 // indirect
github.com/DataDog/datadog-go v3.2.0+incompatible // indirect
@@ -129,7 +131,6 @@ require (
github.com/cometbft/cometbft-db v0.9.1 // indirect
github.com/consensys/bavard v0.1.13 // indirect
github.com/consensys/gnark-crypto v0.12.1 // indirect
- github.com/cosmos/btcutil v1.0.5 // indirect
github.com/cosmos/go-bip39 v1.0.0 // indirect
github.com/cosmos/gogogateway v1.2.0 // indirect
github.com/cosmos/iavl v1.1.2 // indirect
@@ -226,6 +227,8 @@ require (
github.com/ipld/go-codec-dagpb v1.6.0 // indirect
github.com/ipld/go-ipld-prime v0.21.0 // indirect
github.com/jbenet/goprocess v0.1.4 // indirect
+ github.com/jinzhu/inflection v1.0.0 // indirect
+ github.com/jinzhu/now v1.1.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/jmhodges/levigo v1.0.0 // indirect
github.com/klauspost/compress v1.17.9 // indirect
@@ -261,7 +264,6 @@ require (
github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mmcloughlin/addchain v0.4.0 // indirect
- github.com/mr-tron/base58 v1.2.0 // indirect
github.com/mtibben/percent v0.2.1 // indirect
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
github.com/muesli/cancelreader v0.2.2 // indirect
@@ -275,6 +277,7 @@ require (
github.com/multiformats/go-multihash v0.2.3 // indirect
github.com/multiformats/go-multistream v0.5.0 // indirect
github.com/multiformats/go-varint v0.0.7 // indirect
+ github.com/ncruces/julianday v1.0.0 // indirect
github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect
github.com/oklog/run v1.1.0 // indirect
github.com/onsi/ginkgo v1.16.5 // indirect
@@ -306,6 +309,7 @@ require (
github.com/subosito/gotenv v1.6.0 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
github.com/tendermint/go-amino v0.16.0 // indirect
+ github.com/tetratelabs/wazero v1.8.0 // indirect
github.com/tidwall/btree v1.7.0 // indirect
github.com/ulikunitz/xz v0.5.11 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
@@ -344,11 +348,11 @@ require (
google.golang.org/api v0.169.0 // indirect
google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4 // indirect
+ gopkg.in/errgo.v1 v1.0.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gotest.tools/v3 v3.5.1 // indirect
- lukechampine.com/blake3 v1.3.0 // indirect
nhooyr.io/websocket v1.8.10 // indirect
pgregory.net/rapid v1.1.0 // indirect
rsc.io/tmplfunc v0.0.3 // indirect
diff --git a/go.sum b/go.sum
index 29da40697..b44bf1f17 100644
--- a/go.sum
+++ b/go.sum
@@ -803,6 +803,9 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
+git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw=
+git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9 h1:Ahny8Ud1LjVMMAlt8utUFKhhxJtwBAualvsbc/Sk7cE=
+git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA=
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs=
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4=
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M=
@@ -1192,6 +1195,7 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-macaroon-bakery/macaroonpb v1.0.0/go.mod h1:UzrGOcbiwTXISFP2XDLDPjfhMINZa+fX/7A2lMd31zc=
github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
@@ -1278,6 +1282,7 @@ github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -1578,6 +1583,10 @@ github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls=
github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
@@ -1594,6 +1603,12 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/juju/mgotest v1.0.1/go.mod h1:vTaDufYul+Ps8D7bgseHjq87X8eu0ivlKLp9mVc/Bfc=
+github.com/juju/postgrestest v1.1.0/go.mod h1:/n17Y2T6iFozzXwSCO0JYJ5gSiz2caEtSwAjh/uLXDM=
+github.com/juju/qthttptest v0.0.1/go.mod h1://LCf/Ls22/rPw2u1yWukUJvYtfPY4nYpWUl2uZhryo=
+github.com/juju/schema v1.0.0/go.mod h1:Y+ThzXpUJ0E7NYYocAbuvJ7vTivXfrof/IfRPq/0abI=
+github.com/juju/webbrowser v0.0.0-20160309143629-54b8c57083b4/go.mod h1:G6PCelgkM6cuvyD10iYJsjLBsSadVXtJ+nBxFAxE2BU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
@@ -1636,6 +1651,8 @@ github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3
github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c=
github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8=
@@ -1806,6 +1823,12 @@ github.com/nats-io/nats.go v1.30.2/go.mod h1:dcfhUgmQNN4GJEfIb2f9R7Fow+gzBF4emzD
github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64=
github.com/nats-io/nkeys v0.4.5/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/ncruces/go-sqlite3 v0.18.2 h1:m7QXhBWIwXsp84HE11t+ze0n1v3LRU+zGFg4uHjBeFA=
+github.com/ncruces/go-sqlite3 v0.18.2/go.mod h1:4sZHOm+b/FM8FJRVGN4TemkPPDq5JXGK/1EHIEWxsYo=
+github.com/ncruces/go-sqlite3/gormlite v0.18.0 h1:KqP9a9wlX/Ba+yG+aeVX4pnNBNdaSO6xHdNDWzPxPnk=
+github.com/ncruces/go-sqlite3/gormlite v0.18.0/go.mod h1:RXeT1hknrz3A0tBDL6IfluDHuNkHdJeImn5TBMQg9zc=
+github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M=
+github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nlepage/go-js-promise v1.0.0 h1:K7OmJ3+0BgWJ2LfXchg2sI6RDr7AW/KWR8182epFwGQ=
github.com/nlepage/go-js-promise v1.0.0/go.mod h1:bdOP0wObXu34euibyK39K1hoBCtlgTKXGc56AGflaRo=
@@ -2052,6 +2075,8 @@ github.com/syumai/workers v0.26.3 h1:AF+IBaRccbR4JIj2kNJLJblruPFMD/pAbzkopejGcP8
github.com/syumai/workers v0.26.3/go.mod h1:ZnqmdiHNBrbxOLrZ/HJ5jzHy6af9cmiNZk10R9NrIEA=
github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E=
github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
+github.com/tetratelabs/wazero v1.8.0 h1:iEKu0d4c2Pd+QSRieYbnQC9yiFlMS9D+Jr0LsRmcF4g=
+github.com/tetratelabs/wazero v1.8.0/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs=
github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=
github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
@@ -2186,6 +2211,7 @@ go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEb
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -2421,6 +2447,7 @@ golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -3007,8 +3034,12 @@ gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
+gopkg.in/errgo.v1 v1.0.0/go.mod h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk=
+gopkg.in/errgo.v1 v1.0.1 h1:oQFRXzZ7CkBGdm1XZm/EbQYaYNNEElNBOd09M6cqNso=
+gopkg.in/errgo.v1 v1.0.1/go.mod h1:3NjfXwocQRYAPTq4/fzX+CwUhPRcR/azYRhj8G+LqMo=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/httprequest.v1 v1.2.0/go.mod h1:T61ZUaJLpMnzvoJDO03ZD8yRXD4nZzBeDoW5e9sffjg=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/macaroon.v2 v2.1.0 h1:HZcsjBCzq9t0eBPMKqTN/uSN6JOm78ZJ2INbqcBQOUI=
@@ -3029,6 +3060,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg=
+gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -3039,6 +3072,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
+lukechampine.com/adiantum v1.1.1 h1:4fp6gTxWCqpEbLy40ExiYDDED3oUNWx5cTqBCtPdZqA=
+lukechampine.com/adiantum v1.1.1/go.mod h1:LrAYVnTYLnUtE/yMp5bQr0HstAf060YUF8nM0B6+rUw=
lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE=
lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
diff --git a/internal/db/actions.go b/internal/db/actions.go
new file mode 100644
index 000000000..cf0354acf
--- /dev/null
+++ b/internal/db/actions.go
@@ -0,0 +1,330 @@
+package db
+
+import (
+ "fmt"
+
+ "github.com/onsonr/sonr/internal/db/orm"
+ "gorm.io/gorm"
+)
+
+// createInitialTables creates the initial tables in the database.
+func createInitialTables(db *gorm.DB) (*DB, error) {
+ err := db.AutoMigrate(
+ &orm.Account{},
+ &orm.Asset{},
+ &orm.Credential{},
+ &orm.Keyshare{},
+ &orm.Permission{},
+ &orm.Profile{},
+ &orm.Property{},
+ )
+ if err != nil {
+ return nil, fmt.Errorf("failed to create table: %w", err)
+ }
+
+ return &DB{db}, nil
+}
+
+// AddAccount adds a new account to the database
+func (db *DB) AddAccount(account *orm.Account) error {
+ tx := db.Create(account)
+ if tx.Error != nil {
+ return fmt.Errorf("failed to add account: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// GetAccount gets an account from the database
+func (db *DB) GetAccount(account *orm.Account) error {
+ tx := db.First(account)
+ if tx.Error != nil {
+ return fmt.Errorf("failed to get account: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// UpdateAccount updates an existing account in the database
+func (db *DB) UpdateAccount(account *orm.Account) error {
+ tx := db.Save(account)
+ if tx.Error != nil {
+ return fmt.Errorf("failed to update account: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// DeleteAccount deletes an existing account from the database
+func (db *DB) DeleteAccount(account *orm.Account) error {
+ tx := db.Delete(account)
+ if tx.Error != nil {
+ return fmt.Errorf("failed to delete account: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// AddAsset adds a new asset to the database
+func (db *DB) AddAsset(asset *orm.Asset) error {
+ tx := db.Create(asset)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to add asset: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// GetAsset gets an asset from the database
+func (db *DB) GetAsset(asset *orm.Asset) error {
+ tx := db.First(asset)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to get asset: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// UpdateAsset updates an existing asset in the database
+func (db *DB) UpdateAsset(asset *orm.Asset) error {
+ tx := db.Save(asset)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to update asset: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// DeleteAsset deletes an existing asset from the database
+func (db *DB) DeleteAsset(asset *orm.Asset) error {
+ tx := db.Delete(asset)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to delete asset: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// AddCredential adds a new credential to the database
+func (db *DB) AddCredential(credential *orm.Credential) error {
+ tx := db.Create(credential)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to add credential: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// GetCredential gets an credential from the database
+func (db *DB) GetCredential(credential *orm.Credential) error {
+ tx := db.First(credential)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to get credential: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// UpdateCredential updates an existing credential in the database
+func (db *DB) UpdateCredential(credential *orm.Credential) error {
+ tx := db.Save(credential)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to update credential: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// DeleteCredential deletes an existing credential from the database
+func (db *DB) DeleteCredential(credential *orm.Credential) error {
+ tx := db.Delete(credential)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to delete credential: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// AddKeyshare adds a new keyshare to the database
+func (db *DB) AddKeyshare(keyshare *orm.Keyshare) error {
+ tx := db.Create(keyshare)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to add keyshare: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// GetKeyshare gets an keyshare from the database
+func (db *DB) GetKeyshare(keyshare *orm.Keyshare) error {
+ tx := db.First(keyshare)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to get keyshare: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// UpdateKeyshare updates an existing keyshare in the database
+func (db *DB) UpdateKeyshare(keyshare *orm.Keyshare) error {
+ tx := db.Save(keyshare)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to update keyshare: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// DeleteKeyshare deletes an existing keyshare from the database
+func (db *DB) DeleteKeyshare(keyshare *orm.Keyshare) error {
+ tx := db.Delete(keyshare)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to delete keyshare: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// AddPermission adds a new permission to the database
+func (db *DB) AddPermission(permission *orm.Permission) error {
+ tx := db.Create(permission)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to add permission: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// GetPermission gets an permission from the database
+func (db *DB) GetPermission(permission *orm.Permission) error {
+ tx := db.First(permission)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to get permission: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// UpdatePermission updates an existing permission in the database
+func (db *DB) UpdatePermission(permission *orm.Permission) error {
+ tx := db.Save(permission)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to update permission: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// DeletePermission deletes an existing permission from the database
+func (db *DB) DeletePermission(permission *orm.Permission) error {
+ tx := db.Delete(permission)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to delete permission: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// AddProfile adds a new profile to the database
+func (db *DB) AddProfile(profile *orm.Profile) error {
+ tx := db.Create(profile)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to add profile: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// GetProfile gets an profile from the database
+func (db *DB) GetProfile(profile *orm.Profile) error {
+ tx := db.First(profile)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to get profile: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// UpdateProfile updates an existing profile in the database
+func (db *DB) UpdateProfile(profile *orm.Profile) error {
+ tx := db.Save(profile)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to update profile: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// DeleteProfile deletes an existing profile from the database
+func (db *DB) DeleteProfile(profile *orm.Profile) error {
+ tx := db.Delete(profile)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to delete profile: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// AddProperty adds a new property to the database
+func (db *DB) AddProperty(property *orm.Property) error {
+ tx := db.Create(property)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to add property: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// GetProperty gets an property from the database
+func (db *DB) GetProperty(property *orm.Property) error {
+ tx := db.First(property)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to get property: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// UpdateProperty updates an existing property in the database
+func (db *DB) UpdateProperty(property *orm.Property) error {
+ tx := db.Save(property)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to update property: %w", tx.Error)
+ }
+
+ return nil
+}
+
+// DeleteProperty deletes an existing property from the database
+func (db *DB) DeleteProperty(property *orm.Property) error {
+ tx := db.Delete(property)
+
+ if tx.Error != nil {
+ return fmt.Errorf("failed to delete property: %w", tx.Error)
+ }
+
+ return nil
+}
diff --git a/internal/db/database.go b/internal/db/database.go
new file mode 100644
index 000000000..12bb158ed
--- /dev/null
+++ b/internal/db/database.go
@@ -0,0 +1,54 @@
+package db
+
+import (
+ "crypto/rand"
+
+ "github.com/ncruces/go-sqlite3/gormlite"
+ "golang.org/x/crypto/argon2"
+ "gorm.io/gorm"
+ "lukechampine.com/adiantum/hbsh"
+ "lukechampine.com/adiantum/hpolyc"
+)
+
+type DB struct {
+ *gorm.DB
+}
+
+func New(opts ...DBOption) (*DB, error) {
+ config := &DBConfig{
+ fileName: "vault.db",
+ }
+ for _, opt := range opts {
+ opt(config)
+ }
+ gormdb, err := gorm.Open(gormlite.Open(config.ConnectionString()))
+ if err != nil {
+ return nil, err
+ }
+ db, err := createInitialTables(gormdb)
+ if err != nil {
+ return nil, err
+ }
+ return db, nil
+}
+
+// HBSH creates an HBSH cipher given a key.
+func (c *DB) HBSH(key []byte) *hbsh.HBSH {
+ if len(key) != 32 {
+ // Key is not appropriate, return nil.
+ return nil
+ }
+ return hpolyc.New(key)
+}
+
+// KDF gets a key from a secret.
+func (c *DB) KDF(secret string) []byte {
+ if secret == "" {
+ // No secret is given, generate a random key.
+ key := make([]byte, 32)
+ n, _ := rand.Read(key)
+ return key[:n]
+ }
+ // Hash the secret with a KDF.
+ return argon2.IDKey([]byte(secret), []byte("hpolyc"), 3, 64*1024, 4, 32)
+}
diff --git a/internal/db/handlers.go b/internal/db/handlers.go
new file mode 100644
index 000000000..e4f739c77
--- /dev/null
+++ b/internal/db/handlers.go
@@ -0,0 +1,195 @@
+package db
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/db/orm"
+)
+
+func (db *DB) ServeEcho(e *echo.Group) {
+ e.GET("/accounts", db.HandleAccount)
+ e.GET("/assets", db.HandleAsset)
+ e.GET("/credentials", db.HandleCredential)
+ e.GET("/keyshares", db.HandleKeyshare)
+ e.GET("/permissions", db.HandlePermission)
+ e.GET("/profiles", db.HandleProfile)
+ e.GET("/properties", db.HandleProperty)
+}
+
+func (db *DB) HandleAccount(c echo.Context) error {
+ data := new(orm.Account)
+ if err := c.Bind(data); err != nil {
+ return err
+ }
+ // Check the method for GET, POST, PUT, DELETE
+ switch c.Request().Method {
+ case echo.POST:
+
+ if err := db.AddAccount(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.PUT:
+
+ if err := db.UpdateAccount(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.DELETE:
+ if err := db.DeleteAccount(data); err != nil {
+ return err
+ }
+ return c.JSON(200, nil)
+ }
+ return c.JSON(200, data)
+}
+
+func (db *DB) HandleAsset(c echo.Context) error {
+ data := new(orm.Asset)
+ if err := c.Bind(data); err != nil {
+ return err
+ }
+
+ switch c.Request().Method {
+ case echo.POST:
+ if err := db.AddAsset(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.PUT:
+ if err := db.UpdateAsset(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.DELETE:
+ if err := db.DeleteAsset(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ }
+ return c.JSON(200, data)
+}
+
+func (db *DB) HandleCredential(c echo.Context) error {
+ data := new(orm.Credential)
+ if err := c.Bind(data); err != nil {
+ return err
+ }
+
+ switch c.Request().Method {
+ case echo.POST:
+ if err := db.AddCredential(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.PUT:
+ if err := db.UpdateCredential(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.DELETE:
+ if err := db.DeleteCredential(data); err != nil {
+ return err
+ }
+ }
+ return c.JSON(200, data)
+}
+
+func (db *DB) HandleKeyshare(c echo.Context) error {
+ data := new(orm.Keyshare)
+ if err := c.Bind(data); err != nil {
+ return err
+ }
+
+ switch c.Request().Method {
+ case echo.POST:
+ if err := db.AddKeyshare(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.PUT:
+ if err := db.UpdateKeyshare(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.DELETE:
+ if err := db.DeleteKeyshare(data); err != nil {
+ return err
+ }
+ }
+ return c.JSON(200, data)
+}
+
+func (db *DB) HandlePermission(c echo.Context) error {
+ data := new(orm.Permission)
+ if err := c.Bind(data); err != nil {
+ return err
+ }
+
+ switch c.Request().Method {
+ case echo.POST:
+ if err := db.AddPermission(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.PUT:
+ if err := db.UpdatePermission(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.DELETE:
+ if err := db.DeletePermission(data); err != nil {
+ return err
+ }
+ }
+ return c.JSON(200, data)
+}
+
+func (db *DB) HandleProfile(c echo.Context) error {
+ data := new(orm.Profile)
+ if err := c.Bind(data); err != nil {
+ return err
+ }
+
+ switch c.Request().Method {
+ case echo.POST:
+ if err := db.AddProfile(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.PUT:
+ if err := db.UpdateProfile(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.DELETE:
+ if err := db.DeleteProfile(data); err != nil {
+ return err
+ }
+ }
+ return c.JSON(200, data)
+}
+
+func (db *DB) HandleProperty(c echo.Context) error {
+ data := new(orm.Property)
+ if err := c.Bind(data); err != nil {
+ return err
+ }
+
+ switch c.Request().Method {
+ case echo.POST:
+ if err := db.AddProperty(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.PUT:
+ if err := db.UpdateProperty(data); err != nil {
+ return err
+ }
+ return c.JSON(200, "OK")
+ case echo.DELETE:
+ if err := db.DeleteProperty(data); err != nil {
+ return err
+ }
+ }
+ return c.JSON(200, data)
+}
diff --git a/internal/db/idb/idb.go b/internal/db/idb/idb.go
new file mode 100644
index 000000000..5dab6c074
--- /dev/null
+++ b/internal/db/idb/idb.go
@@ -0,0 +1,131 @@
+//go:build js && wasm
+// +build js,wasm
+
+package idb
+
+import (
+ "context"
+ "encoding/json"
+ "errors"
+ "syscall/js"
+
+ "github.com/hack-pad/go-indexeddb/idb"
+)
+
+// Model is an interface that must be implemented by types used with Table
+type Model interface {
+ Table() string
+}
+
+// Table is a generic wrapper around IDB for easier database operations on a specific table
+type Table[T Model] struct {
+ db *idb.Database
+ dbName string
+ keyPath string
+}
+
+// NewTable creates a new Table instance
+func NewTable[T Model](dbName string, version uint, keyPath string) (*Table[T], error) {
+ ctx := context.Background()
+ factory := idb.Global()
+
+ var model T
+ tableName := model.Table()
+
+ openRequest, err := factory.Open(ctx, dbName, version, func(db *idb.Database, oldVersion, newVersion uint) error {
+ _, err := db.CreateObjectStore(tableName, idb.ObjectStoreOptions{
+ KeyPath: js.ValueOf(keyPath),
+ })
+ return err
+ })
+ if err != nil {
+ return nil, err
+ }
+ db, err := openRequest.Await(ctx)
+ if err != nil {
+ return nil, err
+ }
+ return &Table[T]{
+ db: db,
+ dbName: dbName,
+ keyPath: keyPath,
+ }, nil
+}
+
+// Insert adds a new record to the table
+func (t *Table[T]) Insert(data T) error {
+ tx, err := t.db.Transaction(idb.TransactionReadWrite, data.Table())
+ if err != nil {
+ return err
+ }
+ defer tx.Commit()
+
+ objectStore, err := tx.ObjectStore(data.Table())
+ if err != nil {
+ return err
+ }
+
+ jsonData, err := json.Marshal(data)
+ if err != nil {
+ return err
+ }
+
+ _, err = objectStore.Add(js.ValueOf(string(jsonData)))
+ return err
+}
+
+// Query retrieves a record from the table based on a key
+func (t *Table[T]) Query(key interface{}) (T, error) {
+ var result T
+
+ tx, err := t.db.Transaction(idb.TransactionReadOnly, result.Table())
+ if err != nil {
+ return result, err
+ }
+ defer tx.Commit()
+
+ objectStore, err := tx.ObjectStore(result.Table())
+ if err != nil {
+ return result, err
+ }
+
+ request, err := objectStore.Get(js.ValueOf(key))
+ if err != nil {
+ return result, err
+ }
+
+ value, err := request.Await(context.Background())
+ if err != nil {
+ return result, err
+ }
+
+ if value.IsUndefined() || value.IsNull() {
+ return result, errors.New("record not found")
+ }
+
+ err = json.Unmarshal([]byte(value.String()), &result)
+ return result, err
+}
+
+// Delete removes a record from the table based on a key
+func (t *Table[T]) Delete(key interface{}) error {
+ var model T
+ tx, err := t.db.Transaction(idb.TransactionReadWrite, model.Table())
+ if err != nil {
+ return err
+ }
+ defer tx.Commit()
+
+ objectStore, err := tx.ObjectStore(model.Table())
+ if err != nil {
+ return err
+ }
+
+ _, err = objectStore.Delete(js.ValueOf(key))
+ return err
+}
+
+// Close closes the database connection
+func (t *Table[T]) Close() error {
+ return t.db.Close()
+}
diff --git a/internal/db/options.go b/internal/db/options.go
new file mode 100644
index 000000000..47f2e1f31
--- /dev/null
+++ b/internal/db/options.go
@@ -0,0 +1,40 @@
+package db
+
+import (
+ _ "github.com/ncruces/go-sqlite3/embed"
+ "github.com/onsonr/sonr/internal/db/orm"
+)
+
+type DBOption func(config *DBConfig)
+
+func WitDir(dir string) DBOption {
+ return func(config *DBConfig) {
+ config.Dir = dir
+ }
+}
+
+func WithSecretKey(secretKey string) DBOption {
+ return func(config *DBConfig) {
+ config.SecretKey = secretKey
+ }
+}
+
+type DBConfig struct {
+ Dir string
+ SecretKey string
+
+ fileName string
+ initialAccounts []*orm.Account
+ initialAssets []*orm.Asset
+ initialCredentials []*orm.Credential
+ initialKeyshares []*orm.Keyshare
+ initialPermissions []*orm.Permission
+ initialProfiles []*orm.Profile
+ initialProperties []*orm.Property
+}
+
+func (config *DBConfig) ConnectionString() string {
+ connStr := "file:"
+ connStr += config.fileName
+ return connStr
+}
diff --git a/internal/db/orm/Account.pkl.go b/internal/db/orm/Account.pkl.go
new file mode 100644
index 000000000..09a4e0b1a
--- /dev/null
+++ b/internal/db/orm/Account.pkl.go
@@ -0,0 +1,14 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+type Account struct {
+ Id uint `pkl:"id" gorm:"primaryKey,autoIncrement" json:"id,omitempty" query:"id"`
+
+ Name string `pkl:"name" json:"name,omitempty" param:"name"`
+
+ Address string `pkl:"address" json:"address,omitempty" param:"address"`
+
+ PublicKey string `pkl:"publicKey" json:"publicKey,omitempty" param:"publicKey"`
+
+ CreatedAt *string `pkl:"createdAt" json:"createdAt,omitempty" param:"createdAt"`
+}
diff --git a/internal/db/orm/Asset.pkl.go b/internal/db/orm/Asset.pkl.go
new file mode 100644
index 000000000..fd28cc9f7
--- /dev/null
+++ b/internal/db/orm/Asset.pkl.go
@@ -0,0 +1,16 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+type Asset struct {
+ Id uint `pkl:"id" gorm:"primaryKey,autoIncrement" json:"id,omitempty" query:"id"`
+
+ Name string `pkl:"name" json:"name,omitempty" param:"name"`
+
+ Symbol string `pkl:"symbol" json:"symbol,omitempty" param:"symbol"`
+
+ Decimals int `pkl:"decimals" json:"decimals,omitempty" param:"decimals"`
+
+ ChainId *int `pkl:"chainId" json:"chainId,omitempty" param:"chainId"`
+
+ CreatedAt *string `pkl:"createdAt" json:"createdAt,omitempty" param:"createdAt"`
+}
diff --git a/internal/db/orm/Chain.pkl.go b/internal/db/orm/Chain.pkl.go
new file mode 100644
index 000000000..6b3544d18
--- /dev/null
+++ b/internal/db/orm/Chain.pkl.go
@@ -0,0 +1,12 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+type Chain struct {
+ Id uint `pkl:"id" gorm:"primaryKey,autoIncrement" json:"id,omitempty" query:"id"`
+
+ Name string `pkl:"name" json:"name,omitempty" param:"name"`
+
+ NetworkId string `pkl:"networkId" json:"networkId,omitempty" param:"networkId"`
+
+ CreatedAt *string `pkl:"createdAt" json:"createdAt,omitempty" param:"createdAt"`
+}
diff --git a/internal/db/orm/Credential.pkl.go b/internal/db/orm/Credential.pkl.go
new file mode 100644
index 000000000..b05f04c9b
--- /dev/null
+++ b/internal/db/orm/Credential.pkl.go
@@ -0,0 +1,36 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+type Credential struct {
+ Id uint `pkl:"id" gorm:"primaryKey,autoIncrement" json:"id,omitempty" query:"id"`
+
+ Subject string `pkl:"subject" json:"subject,omitempty" param:"subject"`
+
+ Controller string `pkl:"controller" json:"controller,omitempty" param:"controller"`
+
+ AttestationType string `pkl:"attestationType" json:"attestationType,omitempty" param:"attestationType"`
+
+ Origin string `pkl:"origin" json:"origin,omitempty" param:"origin"`
+
+ CredentialId string `pkl:"credentialId" json:"credentialId,omitempty" param:"credentialId"`
+
+ PublicKey string `pkl:"publicKey" json:"publicKey,omitempty" param:"publicKey"`
+
+ Transport string `pkl:"transport" json:"transport,omitempty" param:"transport"`
+
+ SignCount uint `pkl:"signCount" json:"signCount,omitempty" param:"signCount"`
+
+ UserPresent bool `pkl:"userPresent" json:"userPresent,omitempty" param:"userPresent"`
+
+ UserVerified bool `pkl:"userVerified" json:"userVerified,omitempty" param:"userVerified"`
+
+ BackupEligible bool `pkl:"backupEligible" json:"backupEligible,omitempty" param:"backupEligible"`
+
+ BackupState bool `pkl:"backupState" json:"backupState,omitempty" param:"backupState"`
+
+ CloneWarning bool `pkl:"cloneWarning" json:"cloneWarning,omitempty" param:"cloneWarning"`
+
+ CreatedAt *string `pkl:"createdAt" json:"createdAt,omitempty" param:"createdAt"`
+
+ UpdatedAt *string `pkl:"updatedAt" json:"updatedAt,omitempty" param:"updatedAt"`
+}
diff --git a/internal/db/orm/Keyshare.pkl.go b/internal/db/orm/Keyshare.pkl.go
new file mode 100644
index 000000000..ed51e7a94
--- /dev/null
+++ b/internal/db/orm/Keyshare.pkl.go
@@ -0,0 +1,12 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+type Keyshare struct {
+ Id uint `pkl:"id" gorm:"primaryKey,autoIncrement" json:"id,omitempty" query:"id"`
+
+ Data string `pkl:"data" json:"data,omitempty" param:"data"`
+
+ Role int `pkl:"role" json:"role,omitempty" param:"role"`
+
+ CreatedAt *string `pkl:"createdAt" json:"createdAt,omitempty" param:"createdAt"`
+}
diff --git a/internal/db/orm/Orm.pkl.go b/internal/db/orm/Orm.pkl.go
new file mode 100644
index 000000000..8c2222fb0
--- /dev/null
+++ b/internal/db/orm/Orm.pkl.go
@@ -0,0 +1,36 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+import (
+ "context"
+
+ "github.com/apple/pkl-go/pkl"
+)
+
+type Orm struct {
+}
+
+// LoadFromPath loads the pkl module at the given path and evaluates it into a Orm
+func LoadFromPath(ctx context.Context, path string) (ret *Orm, err error) {
+ evaluator, err := pkl.NewEvaluator(ctx, pkl.PreconfiguredOptions)
+ if err != nil {
+ return nil, err
+ }
+ defer func() {
+ cerr := evaluator.Close()
+ if err == nil {
+ err = cerr
+ }
+ }()
+ ret, err = Load(ctx, evaluator, pkl.FileSource(path))
+ return ret, err
+}
+
+// Load loads the pkl module at the given source and evaluates it with the given evaluator into a Orm
+func Load(ctx context.Context, evaluator pkl.Evaluator, source *pkl.ModuleSource) (*Orm, error) {
+ var ret Orm
+ if err := evaluator.EvaluateModule(ctx, source, &ret); err != nil {
+ return nil, err
+ }
+ return &ret, nil
+}
diff --git a/internal/db/orm/Permission.pkl.go b/internal/db/orm/Permission.pkl.go
new file mode 100644
index 000000000..0e93df3c3
--- /dev/null
+++ b/internal/db/orm/Permission.pkl.go
@@ -0,0 +1,16 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+type Permission struct {
+ Id uint `pkl:"id" gorm:"primaryKey,autoIncrement" json:"id,omitempty" query:"id"`
+
+ ServiceId string `pkl:"serviceId" json:"serviceId,omitempty" param:"serviceId"`
+
+ Grants string `pkl:"grants" json:"grants,omitempty" param:"grants"`
+
+ Scopes string `pkl:"scopes" json:"scopes,omitempty" param:"scopes"`
+
+ CreatedAt *string `pkl:"createdAt" json:"createdAt,omitempty" param:"createdAt"`
+
+ UpdatedAt *string `pkl:"updatedAt" json:"updatedAt,omitempty" param:"updatedAt"`
+}
diff --git a/internal/db/orm/Profile.pkl.go b/internal/db/orm/Profile.pkl.go
new file mode 100644
index 000000000..c0153cc3c
--- /dev/null
+++ b/internal/db/orm/Profile.pkl.go
@@ -0,0 +1,20 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+type Profile struct {
+ Id string `pkl:"id" gorm:"primaryKey,autoIncrement" json:"id,omitempty" query:"id"`
+
+ Subject string `pkl:"subject" json:"subject,omitempty" param:"subject"`
+
+ Controller string `pkl:"controller" json:"controller,omitempty" param:"controller"`
+
+ OriginUri *string `pkl:"originUri" json:"originUri,omitempty" param:"originUri"`
+
+ PublicMetadata *string `pkl:"publicMetadata" json:"publicMetadata,omitempty" param:"publicMetadata"`
+
+ PrivateMetadata *string `pkl:"privateMetadata" json:"privateMetadata,omitempty" param:"privateMetadata"`
+
+ CreatedAt *string `pkl:"createdAt" json:"createdAt,omitempty" param:"createdAt"`
+
+ UpdatedAt *string `pkl:"updatedAt" json:"updatedAt,omitempty" param:"updatedAt"`
+}
diff --git a/internal/db/orm/Property.pkl.go b/internal/db/orm/Property.pkl.go
new file mode 100644
index 000000000..937b6209a
--- /dev/null
+++ b/internal/db/orm/Property.pkl.go
@@ -0,0 +1,14 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+type Property struct {
+ Id uint `pkl:"id" gorm:"primaryKey,autoIncrement" json:"id,omitempty" query:"id"`
+
+ ProfileId string `pkl:"profileId" json:"profileId,omitempty" param:"profileId"`
+
+ Key string `pkl:"key" json:"key,omitempty" param:"key"`
+
+ Accumulator string `pkl:"accumulator" json:"accumulator,omitempty" param:"accumulator"`
+
+ PropertyKey string `pkl:"propertyKey" json:"propertyKey,omitempty" param:"propertyKey"`
+}
diff --git a/internal/db/orm/init.pkl.go b/internal/db/orm/init.pkl.go
new file mode 100644
index 000000000..817be2b7c
--- /dev/null
+++ b/internal/db/orm/init.pkl.go
@@ -0,0 +1,16 @@
+// Code generated from Pkl module `orm`. DO NOT EDIT.
+package orm
+
+import "github.com/apple/pkl-go/pkl"
+
+func init() {
+ pkl.RegisterMapping("orm", Orm{})
+ pkl.RegisterMapping("orm#Account", Account{})
+ pkl.RegisterMapping("orm#Asset", Asset{})
+ pkl.RegisterMapping("orm#Chain", Chain{})
+ pkl.RegisterMapping("orm#Credential", Credential{})
+ pkl.RegisterMapping("orm#Profile", Profile{})
+ pkl.RegisterMapping("orm#Property", Property{})
+ pkl.RegisterMapping("orm#Keyshare", Keyshare{})
+ pkl.RegisterMapping("orm#Permission", Permission{})
+}
diff --git a/internal/db/orm/orm.go b/internal/db/orm/orm.go
new file mode 100644
index 000000000..1b1266bf1
--- /dev/null
+++ b/internal/db/orm/orm.go
@@ -0,0 +1,29 @@
+package orm
+
+func (a *Account) Table() string {
+ return "accounts"
+}
+
+func (a *Asset) Table() string {
+ return "assets"
+}
+
+func (a *Credential) Table() string {
+ return "credentials"
+}
+
+func (a *Keyshare) Table() string {
+ return "keyshares"
+}
+
+func (a *Permission) Table() string {
+ return "permissions"
+}
+
+func (a *Profile) Table() string {
+ return "profiles"
+}
+
+func (a *Property) Table() string {
+ return "properties"
+}
diff --git a/internal/gui/elements/alert.templ b/internal/gui/elements/alert.templ
new file mode 100644
index 000000000..89f977aea
--- /dev/null
+++ b/internal/gui/elements/alert.templ
@@ -0,0 +1,67 @@
+package elements
+
+func Alert(variant Variant, icon Icon, title, message string) templ.Component {
+ return alertElement(variant.Attributes(), title, message, icon.Render())
+}
+
+templ alertElement(attrs templ.Attributes, title, message string, icon templ.Component) {
+
+ @icon
+
{ title }
+
{ message }
+
+}
+
+type AlertVariant int
+
+const (
+ AlertVariant_Default AlertVariant = iota
+ AlertVariant_Info
+ AlertVariant_Error
+ AlertVariant_Success
+ AlertVariant_Warning
+ AlertVariant_Subtle_Info
+ AlertVariant_Subtle_Error
+ AlertVariant_Subtle_Success
+ AlertVariant_Subtle_Warning
+)
+
+func (v AlertVariant) Attributes() templ.Attributes {
+ switch v {
+ case AlertVariant_Info:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-blue-600 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-white",
+ }
+ case AlertVariant_Error:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-red-600 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-white",
+ }
+ case AlertVariant_Success:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-green-500 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-white",
+ }
+ case AlertVariant_Warning:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-yellow-500 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-white",
+ }
+ case AlertVariant_Subtle_Info:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-blue-50 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-blue-600",
+ }
+ case AlertVariant_Subtle_Error:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-red-50 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-red-600",
+ }
+ case AlertVariant_Subtle_Success:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-green-50 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-green-600",
+ }
+ case AlertVariant_Subtle_Warning:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-yellow-50 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-yellow-600",
+ }
+ }
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border bg-white p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-neutral-900",
+ }
+}
diff --git a/internal/gui/elements/alert_templ.go b/internal/gui/elements/alert_templ.go
new file mode 100644
index 000000000..0a95440bb
--- /dev/null
+++ b/internal/gui/elements/alert_templ.go
@@ -0,0 +1,140 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+func Alert(variant Variant, icon Icon, title, message string) templ.Component {
+ return alertElement(variant.Attributes(), title, message, icon.Render())
+}
+
+func alertElement(attrs templ.Attributes, title, message string, icon templ.Component) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = icon.Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var2 string
+ templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(title)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/alert.templ`, Line: 10, Col: 66}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var3 string
+ templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(message)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/alert.templ`, Line: 11, Col: 43}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+type AlertVariant int
+
+const (
+ AlertVariant_Default AlertVariant = iota
+ AlertVariant_Info
+ AlertVariant_Error
+ AlertVariant_Success
+ AlertVariant_Warning
+ AlertVariant_Subtle_Info
+ AlertVariant_Subtle_Error
+ AlertVariant_Subtle_Success
+ AlertVariant_Subtle_Warning
+)
+
+func (v AlertVariant) Attributes() templ.Attributes {
+ switch v {
+ case AlertVariant_Info:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-blue-600 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-white",
+ }
+ case AlertVariant_Error:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-red-600 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-white",
+ }
+ case AlertVariant_Success:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-green-500 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-white",
+ }
+ case AlertVariant_Warning:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-yellow-500 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-white",
+ }
+ case AlertVariant_Subtle_Info:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-blue-50 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-blue-600",
+ }
+ case AlertVariant_Subtle_Error:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-red-50 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-red-600",
+ }
+ case AlertVariant_Subtle_Success:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-green-50 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-green-600",
+ }
+ case AlertVariant_Subtle_Warning:
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border border-transparent bg-yellow-50 p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-yellow-600",
+ }
+ }
+ return templ.Attributes{
+ "class": "relative w-full rounded-lg border bg-white p-4 [&>svg]:absolute [&>svg]:text-foreground [&>svg]:left-4 [&>svg]:top-4 [&>svg+div]:translate-y-[-3px] [&:has(svg)]:pl-11 text-neutral-900",
+ }
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/animation.templ b/internal/gui/elements/animation.templ
new file mode 100644
index 000000000..9d7f988ff
--- /dev/null
+++ b/internal/gui/elements/animation.templ
@@ -0,0 +1,5 @@
+package elements
+
+templ Animation() {
+
+}
diff --git a/internal/gui/elements/animation_templ.go b/internal/gui/elements/animation_templ.go
new file mode 100644
index 000000000..523e659da
--- /dev/null
+++ b/internal/gui/elements/animation_templ.go
@@ -0,0 +1,40 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+func Animation() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/badge.templ b/internal/gui/elements/badge.templ
new file mode 100644
index 000000000..af512f4ac
--- /dev/null
+++ b/internal/gui/elements/badge.templ
@@ -0,0 +1,59 @@
+package elements
+
+templ PoweredBySonr() {
+
+
+
+
+ Powered by
+
+
+
+
+

+
+
The creative platform for developers. Community, tools, products, and more
+
+
+ Joined June 2020
+
+
+
+
+
+
+
+}
diff --git a/internal/gui/elements/badge_templ.go b/internal/gui/elements/badge_templ.go
new file mode 100644
index 000000000..c7dd81760
--- /dev/null
+++ b/internal/gui/elements/badge_templ.go
@@ -0,0 +1,40 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+func PoweredBySonr() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Powered by 
The creative platform for developers. Community, tools, products, and more
Joined June 2020
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/breadcrumbs.templ b/internal/gui/elements/breadcrumbs.templ
new file mode 100644
index 000000000..45eed0d78
--- /dev/null
+++ b/internal/gui/elements/breadcrumbs.templ
@@ -0,0 +1,35 @@
+package elements
+
+templ Breadcrumbs() {
+
+}
+
+templ breadcrumbItem(title string, active bool) {
+ if (active) {
+ { title }
+ } else {
+ { title }
+ }
+}
+
+templ breadcrumbIcon() {
+
+}
diff --git a/internal/gui/elements/breadcrumbs_templ.go b/internal/gui/elements/breadcrumbs_templ.go
new file mode 100644
index 000000000..219bb897f
--- /dev/null
+++ b/internal/gui/elements/breadcrumbs_templ.go
@@ -0,0 +1,163 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+func Breadcrumbs() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func breadcrumbItem(title string, active bool) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var2 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var2 == nil {
+ templ_7745c5c3_Var2 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ if active {
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var3 string
+ templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(title)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/breadcrumbs.templ`, Line: 23, Col: 126}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ } else {
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var4 string
+ templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(title)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/breadcrumbs.templ`, Line: 25, Col: 118}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func breadcrumbIcon() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var5 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var5 == nil {
+ templ_7745c5c3_Var5 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/button.templ b/internal/gui/elements/button.templ
new file mode 100644
index 000000000..12b58480b
--- /dev/null
+++ b/internal/gui/elements/button.templ
@@ -0,0 +1,218 @@
+package elements
+
+type button struct {
+ variant Variant
+ hxGet string
+ hxPost string
+ hxTarget string
+ hxTrigger string
+ hxSwap string
+}
+
+type ButtonOpt func(button *button)
+
+func PrimaryButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantPrimary
+ }
+}
+
+func InfoButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantInfo
+ }
+}
+
+func ErrorButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantError
+ }
+}
+
+func SuccessButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantSuccess
+ }
+}
+
+func WarningButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantWarning
+ }
+}
+
+func GET(action string, target string) ButtonOpt {
+ return func(button *button) {
+ button.hxGet = action
+ button.hxTarget = target
+ button.hxTrigger = "click"
+ button.hxSwap = "outerHTML"
+ }
+}
+
+func POST(action string, target string) ButtonOpt {
+ return func(button *button) {
+ button.hxPost = action
+ button.hxTarget = target
+ button.hxTrigger = "click"
+ button.hxSwap = "outerHTML"
+ }
+}
+
+func Button(opts ...ButtonOpt) templ.Component {
+ button := button{
+ variant: ButtonVariantDefault,
+ }
+ for _, opt := range opts {
+ opt(&button)
+ }
+ if button.hxGet != "" {
+ return renderHxGetButton(&button, button.variant.Attributes())
+ }
+
+ if button.hxPost != "" {
+ return renderHxPostButton(&button, button.variant.Attributes())
+ }
+ return renderButton(button.variant.Attributes())
+}
+
+templ renderButton(attrs templ.Attributes) {
+
+}
+
+templ renderHxGetButton(c *button, attrs templ.Attributes) {
+
+}
+
+templ renderHxPostButton(c *button, attrs templ.Attributes) {
+
+}
+
+type ButtonVariant int
+
+const (
+ ButtonVariantDefault ButtonVariant = iota
+ ButtonVariantPrimary
+ ButtonVariantInfo
+ ButtonVariantError
+ ButtonVariantSuccess
+ ButtonVariantWarning
+)
+
+func (v ButtonVariant) Attributes() templ.Attributes {
+ switch v {
+ case ButtonVariantPrimary:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 rounded-md bg-neutral-950 hover:bg-neutral-900 focus:ring-2 focus:ring-offset-2 focus:ring-neutral-900 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ case ButtonVariantInfo:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 bg-blue-600 rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-offset-2 focus:ring-blue-700 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ case ButtonVariantError:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 rounded-md bg-red-600 hover:bg-red-700 focus:ring-2 focus:ring-offset-2 focus:ring-red-700 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ case ButtonVariantSuccess:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 rounded-md bg-green-600 hover:bg-green-700 focus:ring-2 focus:ring-offset-2 focus:ring-green-700 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ case ButtonVariantWarning:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 rounded-md bg-yellow-600 hover:bg-yellow-700 focus:ring-2 focus:ring-offset-2 focus:ring-yellow-700 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ }
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide transition-colors duration-200 bg-white border rounded-md text-neutral-500 hover:text-neutral-700 border-neutral-200/70 hover:bg-neutral-100 active:bg-white focus:bg-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-neutral-200/60 focus:shadow-outline",
+ "type": "button",
+ }
+}
+
+type SubtleButtonVariant int
+
+const (
+ SubtleButtonVariantDefault SubtleButtonVariant = iota
+ SubtleButtonVariantInfo
+ SubtleButtonVariantError
+ SubtleButtonVariantSuccess
+ SubtleButtonVariantWarning
+)
+
+func (v SubtleButtonVariant) Attributes() templ.Attributes {
+ switch v {
+ case SubtleButtonVariantInfo:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-blue-500 transition-colors duration-100 rounded-md focus:ring-2 focus:ring-offset-2 focus:ring-blue-100 bg-blue-50 hover:text-blue-600 hover:bg-blue-100",
+ "type": "button",
+ }
+ case SubtleButtonVariantError:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-red-500 transition-colors duration-100 rounded-md focus:ring-2 focus:ring-offset-2 focus:ring-red-100 bg-red-50 hover:text-red-600 hover:bg-red-100",
+ "type": "button",
+ }
+ case SubtleButtonVariantSuccess:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-green-500 transition-colors duration-100 rounded-md focus:ring-2 focus:ring-offset-2 focus:ring-green-100 bg-green-50 hover:text-green-600 hover:bg-green-100",
+ "type": "button",
+ }
+ case SubtleButtonVariantWarning:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-yellow-600 transition-colors duration-100 rounded-md focus:ring-2 focus:ring-offset-2 focus:ring-yellow-100 bg-yellow-50 hover:text-yellow-700 hover:bg-yellow-100",
+ "type": "button",
+ }
+ }
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide transition-colors duration-100 rounded-md text-neutral-500 bg-neutral-50 focus:ring-2 focus:ring-offset-2 focus:ring-neutral-100 hover:text-neutral-600 hover:bg-neutral-100",
+ "type": "button",
+ }
+}
+
+type OutlineButtonVariant int
+
+const (
+ OutlineButtonVariantDefault OutlineButtonVariant = iota
+ OutlineButtonVariantInfo
+ OutlineButtonVariantError
+ OutlineButtonVariantSuccess
+ OutlineButtonVariantWarning
+)
+
+func (v OutlineButtonVariant) Attributes() templ.Attributes {
+ switch v {
+ case OutlineButtonVariantInfo:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-blue-600 transition-colors duration-100 bg-white border-2 border-blue-600 rounded-md hover:text-white hover:bg-blue-600",
+ "type": "button",
+ }
+ case OutlineButtonVariantError:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-red-600 transition-colors duration-100 bg-white border-2 border-red-600 rounded-md hover:text-white hover:bg-red-600",
+ "type": "button",
+ }
+ case OutlineButtonVariantSuccess:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-green-600 transition-colors duration-100 bg-white border-2 border-green-600 rounded-md hover:text-white hover:bg-green-600",
+ "type": "button",
+ }
+ case OutlineButtonVariantWarning:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-yellow-600 transition-colors duration-100 bg-white border-2 border-yellow-500 rounded-md hover:text-white hover:bg-yellow-500",
+ "type": "button",
+ }
+ }
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide transition-colors duration-100 bg-white border-2 rounded-md text-neutral-900 hover:text-white border-neutral-900 hover:bg-neutral-900",
+ "type": "button",
+ }
+}
diff --git a/internal/gui/elements/button_templ.go b/internal/gui/elements/button_templ.go
new file mode 100644
index 000000000..ad66da28e
--- /dev/null
+++ b/internal/gui/elements/button_templ.go
@@ -0,0 +1,449 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+type button struct {
+ variant Variant
+ hxGet string
+ hxPost string
+ hxTarget string
+ hxTrigger string
+ hxSwap string
+}
+
+type ButtonOpt func(button *button)
+
+func PrimaryButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantPrimary
+ }
+}
+
+func InfoButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantInfo
+ }
+}
+
+func ErrorButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantError
+ }
+}
+
+func SuccessButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantSuccess
+ }
+}
+
+func WarningButtonStyle() ButtonOpt {
+ return func(button *button) {
+ button.variant = ButtonVariantWarning
+ }
+}
+
+func GET(action string, target string) ButtonOpt {
+ return func(button *button) {
+ button.hxGet = action
+ button.hxTarget = target
+ button.hxTrigger = "click"
+ button.hxSwap = "outerHTML"
+ }
+}
+
+func POST(action string, target string) ButtonOpt {
+ return func(button *button) {
+ button.hxPost = action
+ button.hxTarget = target
+ button.hxTrigger = "click"
+ button.hxSwap = "outerHTML"
+ }
+}
+
+func Button(opts ...ButtonOpt) templ.Component {
+ button := button{
+ variant: ButtonVariantDefault,
+ }
+ for _, opt := range opts {
+ opt(&button)
+ }
+ if button.hxGet != "" {
+ return renderHxGetButton(&button, button.variant.Attributes())
+ }
+
+ if button.hxPost != "" {
+ return renderHxPostButton(&button, button.variant.Attributes())
+ }
+ return renderButton(button.variant.Attributes())
+}
+
+func renderButton(attrs templ.Attributes) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func renderHxGetButton(c *button, attrs templ.Attributes) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var2 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var2 == nil {
+ templ_7745c5c3_Var2 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func renderHxPostButton(c *button, attrs templ.Attributes) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var7 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var7 == nil {
+ templ_7745c5c3_Var7 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+type ButtonVariant int
+
+const (
+ ButtonVariantDefault ButtonVariant = iota
+ ButtonVariantPrimary
+ ButtonVariantInfo
+ ButtonVariantError
+ ButtonVariantSuccess
+ ButtonVariantWarning
+)
+
+func (v ButtonVariant) Attributes() templ.Attributes {
+ switch v {
+ case ButtonVariantPrimary:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 rounded-md bg-neutral-950 hover:bg-neutral-900 focus:ring-2 focus:ring-offset-2 focus:ring-neutral-900 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ case ButtonVariantInfo:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 bg-blue-600 rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-offset-2 focus:ring-blue-700 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ case ButtonVariantError:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 rounded-md bg-red-600 hover:bg-red-700 focus:ring-2 focus:ring-offset-2 focus:ring-red-700 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ case ButtonVariantSuccess:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 rounded-md bg-green-600 hover:bg-green-700 focus:ring-2 focus:ring-offset-2 focus:ring-green-700 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ case ButtonVariantWarning:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-white transition-colors duration-200 rounded-md bg-yellow-600 hover:bg-yellow-700 focus:ring-2 focus:ring-offset-2 focus:ring-yellow-700 focus:shadow-outline focus:outline-none",
+ "type": "button",
+ }
+ }
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide transition-colors duration-200 bg-white border rounded-md text-neutral-500 hover:text-neutral-700 border-neutral-200/70 hover:bg-neutral-100 active:bg-white focus:bg-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-neutral-200/60 focus:shadow-outline",
+ "type": "button",
+ }
+}
+
+type SubtleButtonVariant int
+
+const (
+ SubtleButtonVariantDefault SubtleButtonVariant = iota
+ SubtleButtonVariantInfo
+ SubtleButtonVariantError
+ SubtleButtonVariantSuccess
+ SubtleButtonVariantWarning
+)
+
+func (v SubtleButtonVariant) Attributes() templ.Attributes {
+ switch v {
+ case SubtleButtonVariantInfo:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-blue-500 transition-colors duration-100 rounded-md focus:ring-2 focus:ring-offset-2 focus:ring-blue-100 bg-blue-50 hover:text-blue-600 hover:bg-blue-100",
+ "type": "button",
+ }
+ case SubtleButtonVariantError:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-red-500 transition-colors duration-100 rounded-md focus:ring-2 focus:ring-offset-2 focus:ring-red-100 bg-red-50 hover:text-red-600 hover:bg-red-100",
+ "type": "button",
+ }
+ case SubtleButtonVariantSuccess:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-green-500 transition-colors duration-100 rounded-md focus:ring-2 focus:ring-offset-2 focus:ring-green-100 bg-green-50 hover:text-green-600 hover:bg-green-100",
+ "type": "button",
+ }
+ case SubtleButtonVariantWarning:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-yellow-600 transition-colors duration-100 rounded-md focus:ring-2 focus:ring-offset-2 focus:ring-yellow-100 bg-yellow-50 hover:text-yellow-700 hover:bg-yellow-100",
+ "type": "button",
+ }
+ }
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide transition-colors duration-100 rounded-md text-neutral-500 bg-neutral-50 focus:ring-2 focus:ring-offset-2 focus:ring-neutral-100 hover:text-neutral-600 hover:bg-neutral-100",
+ "type": "button",
+ }
+}
+
+type OutlineButtonVariant int
+
+const (
+ OutlineButtonVariantDefault OutlineButtonVariant = iota
+ OutlineButtonVariantInfo
+ OutlineButtonVariantError
+ OutlineButtonVariantSuccess
+ OutlineButtonVariantWarning
+)
+
+func (v OutlineButtonVariant) Attributes() templ.Attributes {
+ switch v {
+ case OutlineButtonVariantInfo:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-blue-600 transition-colors duration-100 bg-white border-2 border-blue-600 rounded-md hover:text-white hover:bg-blue-600",
+ "type": "button",
+ }
+ case OutlineButtonVariantError:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-red-600 transition-colors duration-100 bg-white border-2 border-red-600 rounded-md hover:text-white hover:bg-red-600",
+ "type": "button",
+ }
+ case OutlineButtonVariantSuccess:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-green-600 transition-colors duration-100 bg-white border-2 border-green-600 rounded-md hover:text-white hover:bg-green-600",
+ "type": "button",
+ }
+ case OutlineButtonVariantWarning:
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide text-yellow-600 transition-colors duration-100 bg-white border-2 border-yellow-500 rounded-md hover:text-white hover:bg-yellow-500",
+ "type": "button",
+ }
+ }
+ return templ.Attributes{
+ "class": "inline-flex items-center justify-center px-4 py-2 text-sm font-medium tracking-wide transition-colors duration-100 bg-white border-2 rounded-md text-neutral-900 hover:text-white border-neutral-900 hover:bg-neutral-900",
+ "type": "button",
+ }
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/card.templ b/internal/gui/elements/card.templ
new file mode 100644
index 000000000..59113a1a9
--- /dev/null
+++ b/internal/gui/elements/card.templ
@@ -0,0 +1,47 @@
+package elements
+
+func Card(id string, size Size) templ.Component {
+ return renderCard(id, size.CardAttributes())
+}
+
+templ renderCard(id string, attrs templ.Attributes) {
+
+}
+
+templ ProfileCard() {
+
+

+
+
+
Creator of @tailwindcss. Listener of Slayer. Austin 3:16. BTW, Pines UI is super cool!
+
+
+
+}
diff --git a/internal/gui/elements/card_templ.go b/internal/gui/elements/card_templ.go
new file mode 100644
index 000000000..6e086c670
--- /dev/null
+++ b/internal/gui/elements/card_templ.go
@@ -0,0 +1,102 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+func Card(id string, size Size) templ.Component {
+ return renderCard(id, size.CardAttributes())
+}
+
+func renderCard(id string, attrs templ.Attributes) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templ_7745c5c3_Var1.Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func ProfileCard() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var3 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var3 == nil {
+ templ_7745c5c3_Var3 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
Creator of @tailwindcss. Listener of Slayer. Austin 3:16. BTW, Pines UI is super cool!
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/elements.go b/internal/gui/elements/elements.go
new file mode 100644
index 000000000..a923c57c7
--- /dev/null
+++ b/internal/gui/elements/elements.go
@@ -0,0 +1,47 @@
+package elements
+
+import (
+ "strings"
+
+ "github.com/a-h/templ"
+)
+
+type Icon interface {
+ Render() templ.Component
+}
+
+type Variant interface {
+ Attributes() templ.Attributes
+}
+
+func clsxMerge(variants ...Variant) templ.Attributes {
+ combinedAttrs := templ.Attributes{}
+ var classElements []string
+
+ for _, variant := range variants {
+ attrs := variant.Attributes()
+ if class, ok := attrs["class"].(string); ok {
+ classElements = append(classElements, strings.Fields(class)...)
+ }
+ for key, value := range attrs {
+ if key != "class" {
+ combinedAttrs[key] = value
+ }
+ }
+ }
+
+ if len(classElements) > 0 {
+ combinedAttrs["class"] = strings.Join(classElements, " ")
+ }
+ return combinedAttrs
+}
+
+func clsxBuilder(classes ...string) templ.Attributes {
+ if len(classes) == 0 {
+ return templ.Attributes{}
+ }
+ class := strings.Join(classes, " ")
+ return templ.Attributes{
+ "class": class,
+ }
+}
diff --git a/internal/gui/elements/fonts.templ b/internal/gui/elements/fonts.templ
new file mode 100644
index 000000000..f05d49f83
--- /dev/null
+++ b/internal/gui/elements/fonts.templ
@@ -0,0 +1,62 @@
+package elements
+
+func H1(content string) templ.Component {
+ return renderText(1, content)
+}
+
+func H2(content string) templ.Component {
+ return renderText(2, content)
+}
+
+func H3(content string) templ.Component {
+ return renderText(3, content)
+}
+
+func Text(content string) templ.Component {
+ return renderText(0, content)
+}
+
+templ renderText(level int, text string) {
+ switch level {
+ case 1:
+
+ { text }
+
+ case 2:
+
+ { text }
+
+ case 3:
+
+ { text }
+
+ default:
+
+ { text }
+
+ }
+}
+
+templ renderLink(attrs templ.Attributes, text string) {
+
+ { text }
+
+}
+
+templ renderStrong(attrs templ.Attributes, text string) {
+
+ { text }
+
+}
+
+templ renderEmphasis(attrs templ.Attributes, text string) {
+
+ { text }
+
+}
+
+templ renderCode(attrs templ.Attributes, text string) {
+
+ { text }
+
+}
diff --git a/internal/gui/elements/fonts_templ.go b/internal/gui/elements/fonts_templ.go
new file mode 100644
index 000000000..4022c9887
--- /dev/null
+++ b/internal/gui/elements/fonts_templ.go
@@ -0,0 +1,326 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+func H1(content string) templ.Component {
+ return renderText(1, content)
+}
+
+func H2(content string) templ.Component {
+ return renderText(2, content)
+}
+
+func H3(content string) templ.Component {
+ return renderText(3, content)
+}
+
+func Text(content string) templ.Component {
+ return renderText(0, content)
+}
+
+func renderText(level int, text string) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ switch level {
+ case 1:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var2 string
+ templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(text)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/fonts.templ`, Line: 23, Col: 10}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ case 2:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var3 string
+ templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(text)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/fonts.templ`, Line: 27, Col: 10}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ case 3:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var4 string
+ templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(text)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/fonts.templ`, Line: 31, Col: 10}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ default:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var5 string
+ templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(text)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/fonts.templ`, Line: 35, Col: 10}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func renderLink(attrs templ.Attributes, text string) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var6 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var6 == nil {
+ templ_7745c5c3_Var6 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var7 string
+ templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(text)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/fonts.templ`, Line: 42, Col: 8}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func renderStrong(attrs templ.Attributes, text string) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var8 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var8 == nil {
+ templ_7745c5c3_Var8 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var9 string
+ templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(text)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/fonts.templ`, Line: 48, Col: 8}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func renderEmphasis(attrs templ.Attributes, text string) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var10 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var10 == nil {
+ templ_7745c5c3_Var10 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var11 string
+ templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(text)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/fonts.templ`, Line: 54, Col: 8}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func renderCode(attrs templ.Attributes, text string) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var12 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var12 == nil {
+ templ_7745c5c3_Var12 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var13 string
+ templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(text)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/fonts.templ`, Line: 60, Col: 8}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/global.templ b/internal/gui/elements/global.templ
new file mode 100644
index 000000000..3ae2a3c3a
--- /dev/null
+++ b/internal/gui/elements/global.templ
@@ -0,0 +1,54 @@
+package elements
+
+templ Layout(title string) {
+
+
+
+ @defaultStyles()
+ { title }
+
+
+
+ { children... }
+
+
+
+}
+
+templ Spacer() {
+
+}
+
+templ ServiceWorker(path string) {
+
+}
+
+templ defaultStyles() {
+
+
+
+
+
+
+
+
+
+}
+
+templ Rows() {
+
+ { children... }
+
+}
+
+templ Columns() {
+
+ { children... }
+
+}
+
+css main() {
+ font-family: R-Flex, system-ui, Avenir, Helvetica, Arial, sans-serif;
+}
diff --git a/internal/gui/elements/global_templ.go b/internal/gui/elements/global_templ.go
new file mode 100644
index 000000000..d9a36c6e7
--- /dev/null
+++ b/internal/gui/elements/global_templ.go
@@ -0,0 +1,240 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+func Layout(title string) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = defaultStyles().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var2 string
+ templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(title)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/gui/elements/global.templ`, Line: 8, Col: 17}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templ_7745c5c3_Var1.Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func Spacer() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var3 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var3 == nil {
+ templ_7745c5c3_Var3 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func ServiceWorker(path string) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var4 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var4 == nil {
+ templ_7745c5c3_Var4 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func defaultStyles() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var5 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var5 == nil {
+ templ_7745c5c3_Var5 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func Rows() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var6 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var6 == nil {
+ templ_7745c5c3_Var6 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templ_7745c5c3_Var6.Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func Columns() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var7 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var7 == nil {
+ templ_7745c5c3_Var7 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templ_7745c5c3_Var7.Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func main() templ.CSSClass {
+ templ_7745c5c3_CSSBuilder := templruntime.GetBuilder()
+ templ_7745c5c3_CSSBuilder.WriteString(`font-family:R-Flex, system-ui, Avenir, Helvetica, Arial, sans-serif;`)
+ templ_7745c5c3_CSSID := templ.CSSID(`main`, templ_7745c5c3_CSSBuilder.String())
+ return templ.ComponentCSSClass{
+ ID: templ_7745c5c3_CSSID,
+ Class: templ.SafeCSS(`.` + templ_7745c5c3_CSSID + `{` + templ_7745c5c3_CSSBuilder.String() + `}`),
+ }
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/icons.templ b/internal/gui/elements/icons.templ
new file mode 100644
index 000000000..b13e3fd4a
--- /dev/null
+++ b/internal/gui/elements/icons.templ
@@ -0,0 +1,31 @@
+package elements
+
+type Icons int
+
+const (
+ Icons_Info Icons = iota
+ Icons_Error
+ Icons_Success
+ Icons_Warning
+)
+
+func (v Icons) Render() templ.Component {
+ return renderIconVariant(v)
+}
+
+templ renderIconVariant(v Icons) {
+ switch v {
+ case Icons_Info:
+
+ case Icons_Error:
+
+ case Icons_Success:
+
+ case Icons_Warning:
+
+ }
+
+}
+
+templ SonrIcon() {
+}
diff --git a/internal/gui/elements/icons_templ.go b/internal/gui/elements/icons_templ.go
new file mode 100644
index 000000000..1b45bb48f
--- /dev/null
+++ b/internal/gui/elements/icons_templ.go
@@ -0,0 +1,100 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+type Icons int
+
+const (
+ Icons_Info Icons = iota
+ Icons_Error
+ Icons_Success
+ Icons_Warning
+)
+
+func (v Icons) Render() templ.Component {
+ return renderIconVariant(v)
+}
+
+func renderIconVariant(v Icons) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ switch v {
+ case Icons_Info:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ case Icons_Error:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ case Icons_Success:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ case Icons_Warning:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func SonrIcon() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var2 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var2 == nil {
+ templ_7745c5c3_Var2 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/inputs.templ b/internal/gui/elements/inputs.templ
new file mode 100644
index 000000000..73227660a
--- /dev/null
+++ b/internal/gui/elements/inputs.templ
@@ -0,0 +1,29 @@
+package elements
+
+type InputState int
+
+const (
+ InputStateDefault InputState = iota
+ InputStateError
+ InputStateSuccess
+)
+
+templ TextInput(state InputState, label string, placeholder string) {
+ switch (state) {
+ case InputStateDefault:
+
+
+
+
+ case InputStateError:
+
+
+
+
+ case InputStateSuccess:
+
+
+
+
+ }
+}
diff --git a/internal/gui/elements/inputs_templ.go b/internal/gui/elements/inputs_templ.go
new file mode 100644
index 000000000..545265f72
--- /dev/null
+++ b/internal/gui/elements/inputs_templ.go
@@ -0,0 +1,100 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+type InputState int
+
+const (
+ InputStateDefault InputState = iota
+ InputStateError
+ InputStateSuccess
+)
+
+func TextInput(state InputState, label string, placeholder string) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ switch state {
+ case InputStateDefault:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ case InputStateError:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ case InputStateSuccess:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/radios.templ b/internal/gui/elements/radios.templ
new file mode 100644
index 000000000..0200e04cd
--- /dev/null
+++ b/internal/gui/elements/radios.templ
@@ -0,0 +1,37 @@
+package elements
+
+templ RadioGroup() {
+
+
+
+
+
+}
diff --git a/internal/gui/elements/radios_templ.go b/internal/gui/elements/radios_templ.go
new file mode 100644
index 000000000..0f69a82fa
--- /dev/null
+++ b/internal/gui/elements/radios_templ.go
@@ -0,0 +1,40 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+func RadioGroup() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/sizes.templ b/internal/gui/elements/sizes.templ
new file mode 100644
index 000000000..40e70998d
--- /dev/null
+++ b/internal/gui/elements/sizes.templ
@@ -0,0 +1,61 @@
+package elements
+
+type Size int
+
+const (
+ SizeDefault Size = iota
+ SizeSmall
+ SizeMedium
+ SizeLarge
+)
+
+func (s Size) CardAttributes() templ.Attributes {
+ switch s {
+ case SizeSmall:
+ return templ.Attributes{
+ "class": "max-w-lg bg-white border rounded-lg shadow-sm p-7 border-neutral-200/60",
+ }
+ case SizeLarge:
+ return templ.Attributes{
+ "class": "max-w-2xl bg-white border rounded-lg shadow-sm p-7 border-neutral-200/60",
+ }
+ }
+ return templ.Attributes{
+ "class": "max-w-xl bg-white border rounded-lg shadow-sm p-7 border-neutral-200/60",
+ }
+}
+
+func (s Size) SvgAttributes() templ.Attributes {
+ switch s {
+ case SizeSmall:
+ return templ.Attributes{
+ "height": "16",
+ "width": "16",
+ }
+ case SizeLarge:
+ return templ.Attributes{
+ "height": "32",
+ "width": "32",
+ }
+ }
+ return templ.Attributes{
+ "height": "24",
+ "width": "24",
+ }
+}
+
+func (s Size) TextAttributes() templ.Attributes {
+ switch s {
+ case SizeSmall:
+ return templ.Attributes{
+ "class": "text-sm",
+ }
+ case SizeLarge:
+ return templ.Attributes{
+ "class": "text-lg",
+ }
+ }
+ return templ.Attributes{
+ "class": "text-md",
+ }
+}
diff --git a/internal/gui/elements/sizes_templ.go b/internal/gui/elements/sizes_templ.go
new file mode 100644
index 000000000..5a60b8fef
--- /dev/null
+++ b/internal/gui/elements/sizes_templ.go
@@ -0,0 +1,71 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+type Size int
+
+const (
+ SizeDefault Size = iota
+ SizeSmall
+ SizeMedium
+ SizeLarge
+)
+
+func (s Size) CardAttributes() templ.Attributes {
+ switch s {
+ case SizeSmall:
+ return templ.Attributes{
+ "class": "max-w-lg bg-white border rounded-lg shadow-sm p-7 border-neutral-200/60",
+ }
+ case SizeLarge:
+ return templ.Attributes{
+ "class": "max-w-2xl bg-white border rounded-lg shadow-sm p-7 border-neutral-200/60",
+ }
+ }
+ return templ.Attributes{
+ "class": "max-w-xl bg-white border rounded-lg shadow-sm p-7 border-neutral-200/60",
+ }
+}
+
+func (s Size) SvgAttributes() templ.Attributes {
+ switch s {
+ case SizeSmall:
+ return templ.Attributes{
+ "height": "16",
+ "width": "16",
+ }
+ case SizeLarge:
+ return templ.Attributes{
+ "height": "32",
+ "width": "32",
+ }
+ }
+ return templ.Attributes{
+ "height": "24",
+ "width": "24",
+ }
+}
+
+func (s Size) TextAttributes() templ.Attributes {
+ switch s {
+ case SizeSmall:
+ return templ.Attributes{
+ "class": "text-sm",
+ }
+ case SizeLarge:
+ return templ.Attributes{
+ "class": "text-lg",
+ }
+ }
+ return templ.Attributes{
+ "class": "text-md",
+ }
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/elements/tabs.templ b/internal/gui/elements/tabs.templ
new file mode 100644
index 000000000..8b478f482
--- /dev/null
+++ b/internal/gui/elements/tabs.templ
@@ -0,0 +1,109 @@
+package elements
+
+templ Tabs() {
+
+
+
+
+ @Table()
+
+
+ And, this is the content for Tab2
+
+
+ Finally, this is the content for Tab3
+
+
+
+}
+
+templ Table() {
+
+
+
+
+
+
+
+ Name |
+ Age |
+ Address |
+ Action |
+
+
+
+
+ Richard Hendricks |
+ 30 |
+ Pied Piper HQ, Palo Alto |
+
+ Edit
+ |
+
+
+ Erlich Bachman |
+ 40 |
+ 5230 Penfield Ave, Woodland Hills |
+
+ Edit
+ |
+
+
+ Monica Hall |
+ 35 |
+ 2030 Stewart Drive, Sunnyvale |
+
+ Edit
+ |
+
+
+ Dinesh Chugtai |
+ 28 |
+ Pied Piper HQ, Palo Alto |
+
+ Edit
+ |
+
+
+ Gilfoyle |
+ 32 |
+ Pied Piper HQ, Palo Alto |
+
+ Edit
+ |
+
+
+
+
+
+
+
+}
diff --git a/internal/gui/elements/tabs_templ.go b/internal/gui/elements/tabs_templ.go
new file mode 100644
index 000000000..9b974744e
--- /dev/null
+++ b/internal/gui/elements/tabs_templ.go
@@ -0,0 +1,77 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package elements
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+func Tabs() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = Table().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
And, this is the content for Tab2
Finally, this is the content for Tab3
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func Table() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var2 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var2 == nil {
+ templ_7745c5c3_Var2 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Name | Age | Address | Action |
Richard Hendricks | 30 | Pied Piper HQ, Palo Alto | Edit |
Erlich Bachman | 40 | 5230 Penfield Ave, Woodland Hills | Edit |
Monica Hall | 35 | 2030 Stewart Drive, Sunnyvale | Edit |
Dinesh Chugtai | 28 | Pied Piper HQ, Palo Alto | Edit |
Gilfoyle | 32 | Pied Piper HQ, Palo Alto | Edit |
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/forms/forms.go b/internal/gui/forms/forms.go
new file mode 100644
index 000000000..0b7e1ad5f
--- /dev/null
+++ b/internal/gui/forms/forms.go
@@ -0,0 +1,41 @@
+package forms
+
+import (
+ "bytes"
+
+ "github.com/a-h/templ"
+ "github.com/labstack/echo/v4"
+)
+
+func echoFormResponse(c echo.Context, cmp templ.Component, state FormState) error {
+ // Create a buffer to store the rendered HTML
+ buf := &bytes.Buffer{}
+ // Render the component to the buffer
+ err := cmp.Render(c.Request().Context(), buf)
+ if err != nil {
+ return err
+ }
+
+ // Set the content type
+ c.Response().Header().Set(echo.HeaderContentType, echo.MIMETextHTML)
+ c.Response().Header().Set("X-Status", string(state))
+
+ // Write the buffered content to the response
+ _, err = c.Response().Write(buf.Bytes())
+ return err
+}
+
+type FormState string
+
+const (
+ InitialForm FormState = "initial"
+ ErrorForm FormState = "error"
+ SuccessForm FormState = "success"
+ WarningForm FormState = "warning"
+)
+
+type Form struct {
+ State FormState
+ Title string
+ Description string
+}
diff --git a/internal/gui/forms/register.templ b/internal/gui/forms/register.templ
new file mode 100644
index 000000000..76b0c1d99
--- /dev/null
+++ b/internal/gui/forms/register.templ
@@ -0,0 +1,25 @@
+package forms
+
+import "github.com/labstack/echo/v4"
+
+templ BasicInfo(c echo.Context, state FormState) {
+ switch (state) {
+ default:
+
+
+
Account
+
Make changes to your account here. Click save when you're done.
+
+
+
+ }
+}
+
+templ CreateCredentials(state FormState) {
+}
+
+templ PrivacyTerms(state FormState) {
+}
diff --git a/internal/gui/forms/register_templ.go b/internal/gui/forms/register_templ.go
new file mode 100644
index 000000000..a9309199a
--- /dev/null
+++ b/internal/gui/forms/register_templ.go
@@ -0,0 +1,95 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package forms
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+import "github.com/labstack/echo/v4"
+
+func BasicInfo(c echo.Context, state FormState) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ switch state {
+ default:
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("Account
Make changes to your account here. Click save when you're done.
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+func CreateCredentials(state FormState) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var2 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var2 == nil {
+ templ_7745c5c3_Var2 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ return templ_7745c5c3_Err
+ })
+}
+
+func PrivacyTerms(state FormState) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var3 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var3 == nil {
+ templ_7745c5c3_Var3 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/views/home.templ b/internal/gui/views/home.templ
new file mode 100644
index 000000000..34b505522
--- /dev/null
+++ b/internal/gui/views/home.templ
@@ -0,0 +1,29 @@
+package views
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+)
+
+func HomeView(c echo.Context) error {
+ return echoComponentResponse(c, renderHomeView())
+}
+
+templ renderHomeView() {
+ @elements.Layout("Sonr.ID") {
+ @elements.Card("home-view", elements.SizeLarge) {
+ @elements.H1("Sonr.ID")
+ @elements.Text("A Decentralized Web Node Client for the Sonr Network.")
+ @elements.Spacer()
+
+ @elements.Button(elements.GET("/register", "#home-view"), elements.PrimaryButtonStyle()) {
+ @elements.Text("Get Started")
+ }
+ @elements.Button(elements.GET("/login", "#home-view")) {
+ @elements.Text("Login")
+ }
+
+ @elements.PoweredBySonr()
+ }
+ }
+}
diff --git a/internal/gui/views/home_templ.go b/internal/gui/views/home_templ.go
new file mode 100644
index 000000000..1254e7d14
--- /dev/null
+++ b/internal/gui/views/home_templ.go
@@ -0,0 +1,157 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package views
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+)
+
+func HomeView(c echo.Context) error {
+ return echoComponentResponse(c, renderHomeView())
+}
+
+func renderHomeView() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var3 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Err = elements.H1("Sonr.ID").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Text("A Decentralized Web Node Client for the Sonr Network.").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Spacer().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Var4 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Err = elements.Text("Get Started").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Button(elements.GET("/register", "#home-view"), elements.PrimaryButtonStyle()).Render(templ.WithChildren(ctx, templ_7745c5c3_Var4), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Var5 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Err = elements.Text("Login").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Button(elements.GET("/login", "#home-view")).Render(templ.WithChildren(ctx, templ_7745c5c3_Var5), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.PoweredBySonr().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Card("home-view", elements.SizeLarge).Render(templ.WithChildren(ctx, templ_7745c5c3_Var3), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Layout("Sonr.ID").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/views/login.templ b/internal/gui/views/login.templ
new file mode 100644
index 000000000..601dc0aae
--- /dev/null
+++ b/internal/gui/views/login.templ
@@ -0,0 +1,25 @@
+package views
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+)
+
+func LoginView(c echo.Context) error {
+ return echoComponentResponse(c, renderLoginView())
+}
+
+templ renderLoginView() {
+ @elements.Layout("Login | Sonr.ID") {
+ @elements.Card("login-view", elements.SizeLarge) {
+ @elements.H1("Sonr.ID")
+ @elements.Text("Neo-tree is a file manager for NeoFS.")
+ @elements.Spacer()
+ @elements.RadioGroup()
+ @elements.Spacer()
+ @elements.Button(elements.GET("/", "#login-view")) {
+ @elements.Text("Cancel")
+ }
+ }
+ }
+}
diff --git a/internal/gui/views/login_templ.go b/internal/gui/views/login_templ.go
new file mode 100644
index 000000000..87d103eb0
--- /dev/null
+++ b/internal/gui/views/login_templ.go
@@ -0,0 +1,143 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package views
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+)
+
+func LoginView(c echo.Context) error {
+ return echoComponentResponse(c, renderLoginView())
+}
+
+func renderLoginView() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var3 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Err = elements.H1("Sonr.ID").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Text("Neo-tree is a file manager for NeoFS.").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Spacer().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.RadioGroup().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Spacer().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Var4 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Err = elements.Text("Cancel").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Button(elements.GET("/", "#login-view")).Render(templ.WithChildren(ctx, templ_7745c5c3_Var4), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Card("login-view", elements.SizeLarge).Render(templ.WithChildren(ctx, templ_7745c5c3_Var3), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Layout("Login | Sonr.ID").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/views/openid.templ b/internal/gui/views/openid.templ
new file mode 100644
index 000000000..f09cdc270
--- /dev/null
+++ b/internal/gui/views/openid.templ
@@ -0,0 +1,19 @@
+package views
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+)
+
+func AuthorizeView(c echo.Context) error {
+ return echoComponentResponse(c, renderAuthorizeView())
+}
+
+templ renderAuthorizeView() {
+ @elements.Layout("Login | Sonr.ID") {
+ @elements.Card("authorize-view", elements.SizeMedium) {
+ @elements.H1("Sonr.ID")
+ @elements.Text("Neo-tree is a file manager for NeoFS.")
+ }
+ }
+}
diff --git a/internal/gui/views/openid_templ.go b/internal/gui/views/openid_templ.go
new file mode 100644
index 000000000..d0c6a899a
--- /dev/null
+++ b/internal/gui/views/openid_templ.go
@@ -0,0 +1,93 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package views
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+)
+
+func AuthorizeView(c echo.Context) error {
+ return echoComponentResponse(c, renderAuthorizeView())
+}
+
+func renderAuthorizeView() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var3 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Err = elements.H1("Sonr.ID").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Text("Neo-tree is a file manager for NeoFS.").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Card("authorize-view", elements.SizeMedium).Render(templ.WithChildren(ctx, templ_7745c5c3_Var3), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Layout("Login | Sonr.ID").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/views/profile.templ b/internal/gui/views/profile.templ
new file mode 100644
index 000000000..25c272e99
--- /dev/null
+++ b/internal/gui/views/profile.templ
@@ -0,0 +1,19 @@
+package views
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+)
+
+func ProfileView(c echo.Context) error {
+ return echoComponentResponse(c, renderProfileView())
+}
+
+templ renderProfileView() {
+ @elements.Layout("Profile | Sonr.ID") {
+ @elements.Card("profile-view", elements.SizeLarge) {
+ @elements.ProfileCard()
+ @elements.Tabs()
+ }
+ }
+}
diff --git a/internal/gui/views/profile_templ.go b/internal/gui/views/profile_templ.go
new file mode 100644
index 000000000..08af9920c
--- /dev/null
+++ b/internal/gui/views/profile_templ.go
@@ -0,0 +1,93 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package views
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+)
+
+func ProfileView(c echo.Context) error {
+ return echoComponentResponse(c, renderProfileView())
+}
+
+func renderProfileView() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var3 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Err = elements.ProfileCard().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Tabs().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Card("profile-view", elements.SizeLarge).Render(templ.WithChildren(ctx, templ_7745c5c3_Var3), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Layout("Profile | Sonr.ID").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/views/register.templ b/internal/gui/views/register.templ
new file mode 100644
index 000000000..076d4d992
--- /dev/null
+++ b/internal/gui/views/register.templ
@@ -0,0 +1,26 @@
+package views
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+ "github.com/onsonr/sonr/internal/gui/forms"
+)
+
+func RegisterView(c echo.Context) error {
+ return echoComponentResponse(c, renderRegisterView(c))
+}
+
+templ renderRegisterView(c echo.Context) {
+ @elements.Layout("Register | Sonr.ID") {
+ @elements.Card("register-view", elements.SizeMedium) {
+ @elements.H2("Account Registration")
+ @elements.Spacer()
+ @elements.Breadcrumbs()
+ @forms.BasicInfo(c, forms.InitialForm)
+ @elements.Spacer()
+ @elements.Button(elements.GET("/", "#register-view")) {
+ @elements.Text("Cancel")
+ }
+ }
+ }
+}
diff --git a/internal/gui/views/register_templ.go b/internal/gui/views/register_templ.go
new file mode 100644
index 000000000..d54ee67bd
--- /dev/null
+++ b/internal/gui/views/register_templ.go
@@ -0,0 +1,144 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.2.778
+package views
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+import (
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/gui/elements"
+ "github.com/onsonr/sonr/internal/gui/forms"
+)
+
+func RegisterView(c echo.Context) error {
+ return echoComponentResponse(c, renderRegisterView(c))
+}
+
+func renderRegisterView(c echo.Context) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var3 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Err = elements.H2("Account Registration").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Spacer().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Breadcrumbs().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = forms.BasicInfo(c, forms.InitialForm).Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = elements.Spacer().Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Var4 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Err = elements.Text("Cancel").Render(ctx, templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Button(elements.GET("/", "#register-view")).Render(templ.WithChildren(ctx, templ_7745c5c3_Var4), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Card("register-view", elements.SizeMedium).Render(templ.WithChildren(ctx, templ_7745c5c3_Var3), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+ templ_7745c5c3_Err = elements.Layout("Register | Sonr.ID").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return templ_7745c5c3_Err
+ })
+}
+
+var _ = templruntime.GeneratedTemplate
diff --git a/internal/gui/views/views.go b/internal/gui/views/views.go
new file mode 100644
index 000000000..cc62f7aed
--- /dev/null
+++ b/internal/gui/views/views.go
@@ -0,0 +1,27 @@
+package views
+
+import (
+ "bytes"
+
+ "github.com/a-h/templ"
+ "github.com/labstack/echo/v4"
+)
+
+// render renders a templ.Component
+func echoComponentResponse(c echo.Context, cmp templ.Component) error {
+ // Create a buffer to store the rendered HTML
+ buf := &bytes.Buffer{}
+
+ // Render the component to the buffer
+ err := cmp.Render(c.Request().Context(), buf)
+ if err != nil {
+ return err
+ }
+
+ // Set the content type
+ c.Response().Header().Set(echo.HeaderContentType, echo.MIMETextHTML)
+
+ // Write the buffered content to the response
+ _, err = c.Response().Write(buf.Bytes())
+ return err
+}
diff --git a/internal/mdw/authz.go b/internal/mdw/authz.go
new file mode 100644
index 000000000..c9fcc5153
--- /dev/null
+++ b/internal/mdw/authz.go
@@ -0,0 +1,95 @@
+package mdw
+
+import (
+ "fmt"
+ "net/http"
+ "time"
+
+ "github.com/labstack/echo/v4"
+ "gopkg.in/macaroon.v2"
+)
+
+const (
+ OriginMacroonCaveat MacroonCaveat = "origin"
+ ScopesMacroonCaveat MacroonCaveat = "scopes"
+ SubjectMacroonCaveat MacroonCaveat = "subject"
+ ExpMacroonCaveat MacroonCaveat = "exp"
+ TokenMacroonCaveat MacroonCaveat = "token"
+)
+
+type MacroonCaveat string
+
+func (c MacroonCaveat) Equal(other string) bool {
+ return string(c) == other
+}
+
+func (c MacroonCaveat) String() string {
+ return string(c)
+}
+
+func (c MacroonCaveat) Verify(value string) error {
+ switch c {
+ case OriginMacroonCaveat:
+ return nil
+ case ScopesMacroonCaveat:
+ return nil
+ case SubjectMacroonCaveat:
+ return nil
+ case ExpMacroonCaveat:
+ // Check if the expiration time is still valid
+ exp, err := time.Parse(time.RFC3339, value)
+ if err != nil {
+ return err
+ }
+ if time.Now().After(exp) {
+ return fmt.Errorf("expired")
+ }
+ return nil
+ case TokenMacroonCaveat:
+ return nil
+ default:
+ return fmt.Errorf("unknown caveat: %s", c)
+ }
+}
+
+var MacroonCaveats = []MacroonCaveat{OriginMacroonCaveat, ScopesMacroonCaveat, SubjectMacroonCaveat, ExpMacroonCaveat, TokenMacroonCaveat}
+
+func MacaroonMiddleware(secretKeyStr string, location string) echo.MiddlewareFunc {
+ secretKey := []byte(secretKeyStr)
+ return func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ // Extract the macaroon from the Authorization header
+ auth := c.Request().Header.Get("Authorization")
+ if auth == "" {
+ return c.JSON(http.StatusUnauthorized, map[string]string{"error": "Missing Authorization header"})
+ }
+
+ // Decode the macaroon
+ mac, err := macaroon.Base64Decode([]byte(auth))
+ if err != nil {
+ return c.JSON(http.StatusBadRequest, map[string]string{"error": "Invalid macaroon encoding"})
+ }
+
+ token, err := macaroon.New(secretKey, mac, location, macaroon.LatestVersion)
+ if err != nil {
+ return c.JSON(http.StatusBadRequest, map[string]string{"error": "Invalid macaroon"})
+ }
+
+ // Verify the macaroon
+ err = token.Verify(secretKey, func(caveat string) error {
+ for _, c := range MacroonCaveats {
+ if c.String() == caveat {
+ return nil
+ }
+ }
+ return nil // Return nil if the caveat is valid
+ }, nil)
+ if err != nil {
+ return c.JSON(http.StatusUnauthorized, map[string]string{"error": "Invalid macaroon"})
+ }
+
+ // Macaroon is valid, proceed to the next handler
+ return next(c)
+ }
+ }
+}
diff --git a/internal/mdw/client.go b/internal/mdw/client.go
new file mode 100644
index 000000000..c7be79ac1
--- /dev/null
+++ b/internal/mdw/client.go
@@ -0,0 +1,3 @@
+package mdw
+
+type AuthClient struct{}
diff --git a/internal/mdw/headers.go b/internal/mdw/headers.go
new file mode 100644
index 000000000..68fa253ed
--- /dev/null
+++ b/internal/mdw/headers.go
@@ -0,0 +1,55 @@
+package mdw
+
+type RequestHeaders struct {
+ Authorization *string `header:"Authorization"`
+ CacheControl *string `header:"Cache-Control"`
+ DeviceMemory *string `header:"Device-Memory"`
+ Forwarded *string `header:"Forwarded"`
+ From *string `header:"From"`
+ Host *string `header:"Host"`
+ Link *string `header:"Link"`
+ PermissionsPolicy *string `header:"Permissions-Policy"`
+ ProxyAuthorization *string `header:"Proxy-Authorization"`
+ Referer *string `header:"Referer"`
+ UserAgent *string `header:"User-Agent"`
+ ViewportWidth *string `header:"Viewport-Width"`
+ Width *string `header:"Width"`
+ WWWAuthenticate *string `header:"WWW-Authenticate"`
+
+ // HTMX Specific
+ HXBoosted *string `header:"HX-Boosted"`
+ HXCurrentURL *string `header:"HX-Current-URL"`
+ HXHistoryRestoreRequest *string `header:"HX-History-Restore-Request"`
+ HXPrompt *string `header:"HX-Prompt"`
+ HXRequest *string `header:"HX-Request"`
+ HXTarget *string `header:"HX-Target"`
+ HXTriggerName *string `header:"HX-Trigger-Name"`
+ HXTrigger *string `header:"HX-Trigger"`
+}
+
+type ResponseHeaders struct {
+ AcceptCH *string `header:"Accept-CH"`
+ AccessControlAllowCredentials *string `header:"Access-Control-Allow-Credentials"`
+ AccessControlAllowHeaders *string `header:"Access-Control-Allow-Headers"`
+ AccessControlAllowMethods *string `header:"Access-Control-Allow-Methods"`
+ AccessControlExposeHeaders *string `header:"Access-Control-Expose-Headers"`
+ AccessControlRequestHeaders *string `header:"Access-Control-Request-Headers"`
+ ContentSecurityPolicy *string `header:"Content-Security-Policy"`
+ CrossOriginEmbedderPolicy *string `header:"Cross-Origin-Embedder-Policy"`
+ PermissionsPolicy *string `header:"Permissions-Policy"`
+ ProxyAuthorization *string `header:"Proxy-Authorization"`
+ WWWAuthenticate *string `header:"WWW-Authenticate"`
+
+ // HTMX Specific
+ HXLocation *string `header:"HX-Location"`
+ HXPushURL *string `header:"HX-Push-Url"`
+ HXRedirect *string `header:"HX-Redirect"`
+ HXRefresh *string `header:"HX-Refresh"`
+ HXReplaceURL *string `header:"HX-Replace-Url"`
+ HXReswap *string `header:"HX-Reswap"`
+ HXRetarget *string `header:"HX-Retarget"`
+ HXReselect *string `header:"HX-Reselect"`
+ HXTrigger *string `header:"HX-Trigger"`
+ HXTriggerAfterSettle *string `header:"HX-Trigger-After-Settle"`
+ HXTriggerAfterSwap *string `header:"HX-Trigger-After-Swap"`
+}
diff --git a/internal/mdw/session.go b/internal/mdw/session.go
new file mode 100644
index 000000000..8907bc1e2
--- /dev/null
+++ b/internal/mdw/session.go
@@ -0,0 +1,72 @@
+package mdw
+
+import (
+ "net/http"
+ "time"
+
+ "github.com/donseba/go-htmx"
+ "github.com/labstack/echo/v4"
+ "github.com/onsonr/sonr/internal/db"
+ "github.com/segmentio/ksuid"
+)
+
+type Session struct {
+ echo.Context
+ htmx *htmx.HTMX
+ dB *db.DB
+}
+
+// GetSession returns the current Session
+func GetSession(c echo.Context) *Session {
+ return c.(*Session)
+}
+
+// UseSession establishes a Session Cookie.
+func UseSession(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ sc := initSession(c)
+ headers := new(RequestHeaders)
+ sc.Bind(headers)
+ return next(sc)
+ }
+}
+
+func (c *Session) DB() *db.DB {
+ return c.dB
+}
+
+func (c *Session) Htmx() *htmx.HTMX {
+ return c.htmx
+}
+
+func (c *Session) ID() string {
+ return readCookie(c, "session")
+}
+
+func initSession(c echo.Context) *Session {
+ s := &Session{Context: c}
+ if val := readCookie(c, "session"); val == "" {
+ id := ksuid.New().String()
+ writeCookie(c, "session", id)
+ }
+ return s
+}
+
+func readCookie(c echo.Context, key string) string {
+ cookie, err := c.Cookie(key)
+ if err != nil {
+ return ""
+ }
+ if cookie == nil {
+ return ""
+ }
+ return cookie.Value
+}
+
+func writeCookie(c echo.Context, key string, value string) {
+ cookie := new(http.Cookie)
+ cookie.Name = key
+ cookie.Value = value
+ cookie.Expires = time.Now().Add(24 * time.Hour)
+ c.SetCookie(cookie)
+}
diff --git a/internal/svc/openid.go b/internal/svc/openid.go
new file mode 100644
index 000000000..78b97119f
--- /dev/null
+++ b/internal/svc/openid.go
@@ -0,0 +1,46 @@
+package svc
+
+import (
+ "fmt"
+
+ "github.com/labstack/echo/v4"
+ oidc "github.com/onsonr/sonr/x/did/types/oidc"
+)
+
+func GrantAuthorization(e echo.Context) error {
+ // Implement authorization endpoint using passkey authentication
+ // Store session data in cache
+ return nil
+}
+
+func GetJWKS(e echo.Context) error {
+ // Implement token endpoint
+ // Use cached session data for validation
+ return nil
+}
+
+func GetToken(e echo.Context) error {
+ // Implement token endpoint
+ // Use cached session data for validation
+ return nil
+}
+
+func GetDiscovery(e echo.Context) error {
+ baseURL := "https://" + e.Request().Host // Ensure this is the correct base URL for your service
+ discoveryDoc := &oidc.DiscoveryDocument{
+ Issuer: baseURL,
+ AuthorizationEndpoint: fmt.Sprintf("%s/auth", baseURL),
+ TokenEndpoint: fmt.Sprintf("%s/token", baseURL),
+ UserinfoEndpoint: fmt.Sprintf("%s/userinfo", baseURL),
+ JwksUri: fmt.Sprintf("%s/jwks", baseURL),
+ RegistrationEndpoint: fmt.Sprintf("%s/register", baseURL),
+ ScopesSupported: []string{"openid", "profile", "email", "web3", "sonr"},
+ ResponseTypesSupported: []string{"code"},
+ ResponseModesSupported: []string{"query", "form_post"},
+ GrantTypesSupported: []string{"authorization_code", "refresh_token"},
+ AcrValuesSupported: []string{"passkey"},
+ SubjectTypesSupported: []string{"public"},
+ ClaimsSupported: []string{"sub", "iss", "name", "email"},
+ }
+ return e.JSON(200, discoveryDoc)
+}
diff --git a/internal/svc/webauth.go b/internal/svc/webauth.go
new file mode 100644
index 000000000..ac08255c7
--- /dev/null
+++ b/internal/svc/webauth.go
@@ -0,0 +1,43 @@
+package svc
+
+import (
+ "encoding/json"
+ "fmt"
+
+ "github.com/go-webauthn/webauthn/protocol"
+ "github.com/labstack/echo/v4"
+)
+
+func CheckSubjectIsValid(e echo.Context) error {
+ credentialID := e.FormValue("credentialID")
+ return e.JSON(200, credentialID)
+}
+
+func HandleCredentialAssertion(e echo.Context) error {
+ return e.JSON(200, "HandleCredentialAssertion")
+}
+
+func HandleCredentialCreation(e echo.Context) error {
+ // Get the serialized credential data from the form
+ credentialDataJSON := e.FormValue("credentialData")
+
+ // Deserialize the JSON into a temporary struct
+ var ccr protocol.CredentialCreationResponse
+ err := json.Unmarshal([]byte(credentialDataJSON), &ccr)
+ if err != nil {
+ return e.JSON(500, err.Error())
+ }
+ //
+ // // Parse the CredentialCreationResponse
+ // parsedData, err := ccr.Parse()
+ // if err != nil {
+ // return e.JSON(500, err.Error())
+ // }
+ //
+ // // Create the Credential
+ // // credential := orm.NewCredential(parsedData, e.Request().Host, "")
+ //
+ // // Set additional fields
+ // credential.Controller = "" // Set this to the appropriate controller value
+ return e.JSON(200, fmt.Sprintf("REGISTER: %s", string(ccr.ID)))
+}
diff --git a/internal/tui/authmodel/authmodel.go b/internal/tui/authmodel/authmodel.go
new file mode 100644
index 000000000..2f83c115f
--- /dev/null
+++ b/internal/tui/authmodel/authmodel.go
@@ -0,0 +1,322 @@
+package txmodel
+
+import (
+ "fmt"
+ "strings"
+
+ tea "github.com/charmbracelet/bubbletea"
+ "github.com/charmbracelet/huh"
+ "github.com/charmbracelet/lipgloss"
+ "github.com/cosmos/cosmos-sdk/codec"
+ codectypes "github.com/cosmos/cosmos-sdk/codec/types"
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ "github.com/cosmos/cosmos-sdk/types/tx"
+ banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
+)
+
+const maxWidth = 100
+
+var (
+ red = lipgloss.AdaptiveColor{Light: "#FE5F86", Dark: "#FE5F86"}
+ indigo = lipgloss.AdaptiveColor{Light: "#5A56E0", Dark: "#7571F9"}
+ green = lipgloss.AdaptiveColor{Light: "#02BA84", Dark: "#02BF87"}
+)
+
+type Styles struct {
+ Base,
+ HeaderText,
+ Status,
+ StatusHeader,
+ Highlight,
+ ErrorHeaderText,
+ Help lipgloss.Style
+}
+
+func NewStyles(lg *lipgloss.Renderer) *Styles {
+ s := Styles{}
+ s.Base = lg.NewStyle().
+ Padding(1, 2, 0, 1)
+ s.HeaderText = lg.NewStyle().
+ Foreground(indigo).
+ Bold(true).
+ Padding(0, 1, 0, 1)
+ s.Status = lg.NewStyle().
+ Border(lipgloss.RoundedBorder()).
+ BorderForeground(indigo).
+ PaddingLeft(1).
+ MarginTop(1)
+ s.StatusHeader = lg.NewStyle().
+ Foreground(green).
+ Bold(true)
+ s.Highlight = lg.NewStyle().
+ Foreground(lipgloss.Color("212"))
+ s.ErrorHeaderText = s.HeaderText.
+ Foreground(red)
+ s.Help = lg.NewStyle().
+ Foreground(lipgloss.Color("240"))
+ return &s
+}
+
+type state int
+
+const (
+ statusNormal state = iota
+ stateDone
+)
+
+type Model struct {
+ state state
+ lg *lipgloss.Renderer
+ styles *Styles
+ form *huh.Form
+ width int
+ message *tx.TxBody
+}
+
+func NewModel() Model {
+ m := Model{width: maxWidth}
+ m.lg = lipgloss.DefaultRenderer()
+ m.styles = NewStyles(m.lg)
+
+ m.form = huh.NewForm(
+ huh.NewGroup(
+ huh.NewInput().
+ Key("from").
+ Title("From Address").
+ Placeholder("cosmos1...").
+ Validate(func(s string) error {
+ if !strings.HasPrefix(s, "cosmos1") {
+ return fmt.Errorf("invalid address format")
+ }
+ return nil
+ }),
+
+ huh.NewInput().
+ Key("to").
+ Title("To Address").
+ Placeholder("cosmos1...").
+ Validate(func(s string) error {
+ if !strings.HasPrefix(s, "cosmos1") {
+ return fmt.Errorf("invalid address format")
+ }
+ return nil
+ }),
+
+ huh.NewInput().
+ Key("amount").
+ Title("Amount").
+ Placeholder("100").
+ Validate(func(s string) error {
+ if _, err := sdk.ParseCoinNormalized(s + "atom"); err != nil {
+ return fmt.Errorf("invalid coin amount")
+ }
+ return nil
+ }),
+
+ huh.NewSelect[string]().
+ Key("denom").
+ Title("Denom").
+ Options(huh.NewOptions("atom", "osmo", "usnr", "snr")...),
+
+ huh.NewInput().
+ Key("memo").
+ Title("Memo").
+ Placeholder("Optional"),
+
+ huh.NewConfirm().
+ Key("done").
+ Title("Ready to convert?").
+ Validate(func(v bool) error {
+ if !v {
+ return fmt.Errorf("Please confirm when you're ready to convert")
+ }
+ return nil
+ }).
+ Affirmative("Yes, convert!").
+ Negative("Not yet"),
+ ),
+ ).
+ WithWidth(60).
+ WithShowHelp(false).
+ WithShowErrors(false)
+
+ return m
+}
+
+func (m Model) Init() tea.Cmd {
+ return m.form.Init()
+}
+
+func min(x, y int) int {
+ if x > y {
+ return y
+ }
+ return x
+}
+
+func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+ switch msg := msg.(type) {
+ case tea.WindowSizeMsg:
+ m.width = min(msg.Width, maxWidth) - m.styles.Base.GetHorizontalFrameSize()
+ case tea.KeyMsg:
+ switch msg.String() {
+ case "esc", "ctrl+c", "q":
+ return m, tea.Quit
+ }
+ }
+
+ var cmds []tea.Cmd
+
+ form, cmd := m.form.Update(msg)
+ if f, ok := form.(*huh.Form); ok {
+ m.form = f
+ cmds = append(cmds, cmd)
+ }
+
+ if m.form.State == huh.StateCompleted {
+ m.buildMessage()
+ cmds = append(cmds, tea.Quit)
+ }
+
+ return m, tea.Batch(cmds...)
+}
+
+func (m Model) View() string {
+ s := m.styles
+
+ switch m.form.State {
+ case huh.StateCompleted:
+ pklCode := m.generatePkl()
+ messageView := m.getMessageView()
+ var b strings.Builder
+ fmt.Fprintf(&b, "Final Tx:\n\n%s\n\n%s", pklCode, messageView)
+ return s.Status.Margin(0, 1).Padding(1, 2).Width(80).Render(b.String()) + "\n\n"
+ default:
+ var schemaType string
+ if m.form.GetString("schemaType") != "" {
+ schemaType = "Schema Type: " + m.form.GetString("schemaType")
+ }
+
+ v := strings.TrimSuffix(m.form.View(), "\n\n")
+ form := m.lg.NewStyle().Margin(1, 0).Render(v)
+
+ var status string
+ {
+ preview := "(Preview will appear here)"
+ if m.form.GetString("schema") != "" {
+ preview = m.generatePkl()
+ }
+
+ const statusWidth = 40
+ statusMarginLeft := m.width - statusWidth - lipgloss.Width(form) - s.Status.GetMarginRight()
+ status = s.Status.
+ Height(lipgloss.Height(form)).
+ Width(statusWidth).
+ MarginLeft(statusMarginLeft).
+ Render(s.StatusHeader.Render("Pkl Preview") + "\n" +
+ schemaType + "\n\n" +
+ preview)
+ }
+
+ errors := m.form.Errors()
+ header := m.appBoundaryView("Sonr TX Builder")
+ if len(errors) > 0 {
+ header = m.appErrorBoundaryView(m.errorView())
+ }
+ body := lipgloss.JoinHorizontal(lipgloss.Top, form, status)
+
+ footer := m.appBoundaryView(m.form.Help().ShortHelpView(m.form.KeyBinds()))
+ if len(errors) > 0 {
+ footer = m.appErrorBoundaryView("")
+ }
+
+ return s.Base.Render(header + "\n" + body + "\n\n" + footer)
+ }
+}
+
+func (m Model) errorView() string {
+ var s string
+ for _, err := range m.form.Errors() {
+ s += err.Error()
+ }
+ return s
+}
+
+func (m Model) appBoundaryView(text string) string {
+ return lipgloss.PlaceHorizontal(
+ m.width,
+ lipgloss.Left,
+ m.styles.HeaderText.Render(text),
+ lipgloss.WithWhitespaceChars("="),
+ lipgloss.WithWhitespaceForeground(indigo),
+ )
+}
+
+func (m Model) appErrorBoundaryView(text string) string {
+ return lipgloss.PlaceHorizontal(
+ m.width,
+ lipgloss.Left,
+ m.styles.ErrorHeaderText.Render(text),
+ lipgloss.WithWhitespaceChars("="),
+ lipgloss.WithWhitespaceForeground(red),
+ )
+}
+
+func (m Model) generatePkl() string {
+ schemaType := m.form.GetString("schemaType")
+ schema := m.form.GetString("schema")
+
+ // This is a placeholder for the actual conversion logic
+ // In a real implementation, you would parse the schema and generate Pkl code
+ return fmt.Sprintf("// Converted from %s\n\nclass ConvertedSchema {\n // TODO: Implement conversion from %s\n // Original schema:\n /*\n%s\n */\n}", schemaType, schemaType, schema)
+}
+
+func (m *Model) buildMessage() {
+ from := m.form.GetString("from")
+ to := m.form.GetString("to")
+ amount := m.form.GetString("amount")
+ denom := m.form.GetString("denom")
+ memo := m.form.GetString("memo")
+
+ coin, _ := sdk.ParseCoinNormalized(fmt.Sprintf("%s%s", amount, denom))
+ sendMsg := &banktypes.MsgSend{
+ FromAddress: from,
+ ToAddress: to,
+ Amount: sdk.NewCoins(coin),
+ }
+
+ anyMsg, _ := codectypes.NewAnyWithValue(sendMsg)
+ m.message = &tx.TxBody{
+ Messages: []*codectypes.Any{anyMsg},
+ Memo: memo,
+ }
+}
+
+func (m Model) getMessageView() string {
+ if m.message == nil {
+ return "Current Message: None"
+ }
+
+ interfaceRegistry := codectypes.NewInterfaceRegistry()
+ marshaler := codec.NewProtoCodec(interfaceRegistry)
+ jsonBytes, _ := marshaler.MarshalJSON(m.message)
+
+ return fmt.Sprintf("Current Message:\n%s", string(jsonBytes))
+}
+
+func RunTUIForm() (*tx.TxBody, error) {
+ m := NewModel()
+ p := tea.NewProgram(m)
+
+ finalModel, err := p.Run()
+ if err != nil {
+ return nil, fmt.Errorf("failed to run program: %w", err)
+ }
+
+ finalM, ok := finalModel.(Model)
+ if !ok || finalM.message == nil {
+ return nil, fmt.Errorf("form not completed")
+ }
+
+ return finalM.message, nil
+}
diff --git a/internal/tui/dexmodel/dexmodel.go b/internal/tui/dexmodel/dexmodel.go
new file mode 100644
index 000000000..c6a77a8d8
--- /dev/null
+++ b/internal/tui/dexmodel/dexmodel.go
@@ -0,0 +1,165 @@
+package dexmodel
+
+import (
+ "fmt"
+ "time"
+
+ "github.com/charmbracelet/bubbles/table"
+ tea "github.com/charmbracelet/bubbletea"
+ "github.com/charmbracelet/lipgloss"
+ "github.com/spf13/cobra"
+)
+
+var (
+ subtle = lipgloss.AdaptiveColor{Light: "#D9DCCF", Dark: "#383838"}
+ highlight = lipgloss.AdaptiveColor{Light: "#874BFD", Dark: "#7D56F4"}
+ special = lipgloss.AdaptiveColor{Light: "#43BF6D", Dark: "#73F59F"}
+
+ titleStyle = lipgloss.NewStyle().
+ MarginLeft(1).
+ MarginRight(5).
+ Padding(0, 1).
+ Italic(true).
+ Foreground(lipgloss.Color("#FFF7DB")).
+ SetString("Cosmos Block Explorer")
+
+ infoStyle = lipgloss.NewStyle().
+ BorderStyle(lipgloss.NormalBorder()).
+ BorderTop(true).
+ BorderForeground(subtle)
+)
+
+type model struct {
+ blocks []string
+ transactionTable table.Model
+ stats map[string]string
+ width int
+ height int
+}
+
+func initialModel() model {
+ columns := []table.Column{
+ {Title: "Hash", Width: 10},
+ {Title: "Type", Width: 15},
+ {Title: "Height", Width: 10},
+ {Title: "Time", Width: 20},
+ }
+
+ rows := []table.Row{
+ {"abc123", "Transfer", "1000", time.Now().Format(time.RFC3339)},
+ {"def456", "Delegate", "999", time.Now().Add(-1 * time.Minute).Format(time.RFC3339)},
+ {"ghi789", "Vote", "998", time.Now().Add(-2 * time.Minute).Format(time.RFC3339)},
+ }
+
+ t := table.New(
+ table.WithColumns(columns),
+ table.WithRows(rows),
+ table.WithFocused(true),
+ table.WithHeight(7),
+ )
+
+ s := table.DefaultStyles()
+ s.Header = s.Header.
+ BorderStyle(lipgloss.NormalBorder()).
+ BorderForeground(lipgloss.Color("240")).
+ BorderBottom(true).
+ Bold(false)
+ s.Selected = s.Selected.
+ Foreground(lipgloss.Color("229")).
+ Background(lipgloss.Color("57")).
+ Bold(false)
+ t.SetStyles(s)
+
+ return model{
+ blocks: []string{"Block 1", "Block 2", "Block 3"},
+ transactionTable: t,
+ stats: map[string]string{
+ "Latest Block": "1000",
+ "Validators": "100",
+ "Bonded Tokens": "1,000,000",
+ },
+ }
+}
+
+func (m model) Init() tea.Cmd {
+ return tick
+}
+
+func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+ var cmd tea.Cmd
+ switch msg := msg.(type) {
+ case tea.KeyMsg:
+ switch msg.String() {
+ case "q", "ctrl+c":
+ return m, tea.Quit
+ case "enter":
+ return m, tea.Batch(
+ tea.Printf("Selected transaction: %s", m.transactionTable.SelectedRow()[0]),
+ )
+ }
+ case tea.WindowSizeMsg:
+ m.height = msg.Height
+ m.width = msg.Width
+ case tickMsg:
+ // Update data here
+ m.blocks = append([]string{"New Block"}, m.blocks...)
+ if len(m.blocks) > 5 {
+ m.blocks = m.blocks[:5]
+ }
+
+ // Add a new transaction to the table
+ newRow := table.Row{
+ fmt.Sprintf("tx%d", time.Now().Unix()),
+ "NewTxType",
+ fmt.Sprintf("%d", 1000+len(m.transactionTable.Rows())),
+ time.Now().Format(time.RFC3339),
+ }
+ m.transactionTable.SetRows(append([]table.Row{newRow}, m.transactionTable.Rows()...))
+ if len(m.transactionTable.Rows()) > 10 {
+ m.transactionTable.SetRows(m.transactionTable.Rows()[:10])
+ }
+
+ return m, tick
+ }
+ m.transactionTable, cmd = m.transactionTable.Update(msg)
+ return m, cmd
+}
+
+func (m model) View() string {
+ s := titleStyle.Render("Cosmos Block Explorer")
+ s += "\n\n"
+
+ // Blocks
+ s += lipgloss.NewStyle().Bold(true).Render("Recent Blocks") + "\n"
+ for _, block := range m.blocks {
+ s += "• " + block + "\n"
+ }
+ s += "\n"
+
+ // Transactions
+ s += lipgloss.NewStyle().Bold(true).Render("Recent Transactions") + "\n"
+ s += m.transactionTable.View() + "\n\n"
+
+ // Stats
+ s += lipgloss.NewStyle().Bold(true).Render("Network Statistics") + "\n"
+ for key, value := range m.stats {
+ s += fmt.Sprintf("%s: %s\n", key, value)
+ }
+
+ return s
+}
+
+type tickMsg time.Time
+
+func tick() tea.Msg {
+ time.Sleep(time.Second)
+ return tickMsg{}
+}
+
+func RunExplorerTUI(cmd *cobra.Command, args []string) error {
+ p := tea.NewProgram(initialModel(), tea.WithAltScreen())
+ if _, err := p.Run(); err != nil {
+ return fmt.Errorf("error running explorer: %v", err)
+ }
+ return nil
+}
diff --git a/internal/tui/tui.go b/internal/tui/tui.go
new file mode 100644
index 000000000..0ac4d76c0
--- /dev/null
+++ b/internal/tui/tui.go
@@ -0,0 +1,49 @@
+package tui
+
+import (
+ "fmt"
+
+ "github.com/cosmos/cosmos-sdk/codec"
+ codectypes "github.com/cosmos/cosmos-sdk/codec/types"
+ "github.com/onsonr/sonr/internal/tui/dexmodel"
+ "github.com/onsonr/sonr/internal/tui/txmodel"
+ "github.com/spf13/cobra"
+)
+
+func AddTUICmds(rootCmd *cobra.Command) {
+ rootCmd.AddCommand(newBuildTxnTUICmd())
+ rootCmd.AddCommand(newExplorerTUICmd())
+}
+
+func newBuildTxnTUICmd() *cobra.Command {
+ return &cobra.Command{
+ Use: "dash",
+ Short: "TUI for managing the local Sonr validator node",
+ RunE: func(cmd *cobra.Command, args []string) error {
+ txBody, err := txmodel.RunBuildTxnTUI()
+ if err != nil {
+ return err
+ }
+
+ interfaceRegistry := codectypes.NewInterfaceRegistry()
+ marshaler := codec.NewProtoCodec(interfaceRegistry)
+ jsonBytes, err := marshaler.MarshalJSON(txBody)
+ if err != nil {
+ return fmt.Errorf("failed to marshal tx body: %w", err)
+ }
+
+ fmt.Println("Generated Protobuf Message (JSON format):")
+ fmt.Println(string(jsonBytes))
+
+ return nil
+ },
+ }
+}
+
+func newExplorerTUICmd() *cobra.Command {
+ return &cobra.Command{
+ Use: "cosmos-explorer",
+ Short: "A terminal-based Cosmos blockchain explorer",
+ RunE: dexmodel.RunExplorerTUI,
+ }
+}
diff --git a/internal/tui/txmodel/txmodel.go b/internal/tui/txmodel/txmodel.go
new file mode 100644
index 000000000..4c493ad24
--- /dev/null
+++ b/internal/tui/txmodel/txmodel.go
@@ -0,0 +1,322 @@
+package txmodel
+
+import (
+ "fmt"
+ "strings"
+
+ tea "github.com/charmbracelet/bubbletea"
+ "github.com/charmbracelet/huh"
+ "github.com/charmbracelet/lipgloss"
+ "github.com/cosmos/cosmos-sdk/codec"
+ codectypes "github.com/cosmos/cosmos-sdk/codec/types"
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ "github.com/cosmos/cosmos-sdk/types/tx"
+ banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
+)
+
+const maxWidth = 100
+
+var (
+ red = lipgloss.AdaptiveColor{Light: "#FE5F86", Dark: "#FE5F86"}
+ indigo = lipgloss.AdaptiveColor{Light: "#5A56E0", Dark: "#7571F9"}
+ green = lipgloss.AdaptiveColor{Light: "#02BA84", Dark: "#02BF87"}
+)
+
+type Styles struct {
+ Base,
+ HeaderText,
+ Status,
+ StatusHeader,
+ Highlight,
+ ErrorHeaderText,
+ Help lipgloss.Style
+}
+
+func NewStyles(lg *lipgloss.Renderer) *Styles {
+ s := Styles{}
+ s.Base = lg.NewStyle().
+ Padding(1, 2, 0, 1)
+ s.HeaderText = lg.NewStyle().
+ Foreground(indigo).
+ Bold(true).
+ Padding(0, 1, 0, 1)
+ s.Status = lg.NewStyle().
+ Border(lipgloss.RoundedBorder()).
+ BorderForeground(indigo).
+ PaddingLeft(1).
+ MarginTop(1)
+ s.StatusHeader = lg.NewStyle().
+ Foreground(green).
+ Bold(true)
+ s.Highlight = lg.NewStyle().
+ Foreground(lipgloss.Color("212"))
+ s.ErrorHeaderText = s.HeaderText.
+ Foreground(red)
+ s.Help = lg.NewStyle().
+ Foreground(lipgloss.Color("240"))
+ return &s
+}
+
+type state int
+
+const (
+ statusNormal state = iota
+ stateDone
+)
+
+type Model struct {
+ state state
+ lg *lipgloss.Renderer
+ styles *Styles
+ form *huh.Form
+ width int
+ message *tx.TxBody
+}
+
+func NewModel() Model {
+ m := Model{width: maxWidth}
+ m.lg = lipgloss.DefaultRenderer()
+ m.styles = NewStyles(m.lg)
+
+ m.form = huh.NewForm(
+ huh.NewGroup(
+ huh.NewInput().
+ Key("from").
+ Title("From Address").
+ Placeholder("cosmos1...").
+ Validate(func(s string) error {
+ if !strings.HasPrefix(s, "cosmos1") {
+ return fmt.Errorf("invalid address format")
+ }
+ return nil
+ }),
+
+ huh.NewInput().
+ Key("to").
+ Title("To Address").
+ Placeholder("cosmos1...").
+ Validate(func(s string) error {
+ if !strings.HasPrefix(s, "cosmos1") {
+ return fmt.Errorf("invalid address format")
+ }
+ return nil
+ }),
+
+ huh.NewInput().
+ Key("amount").
+ Title("Amount").
+ Placeholder("100").
+ Validate(func(s string) error {
+ if _, err := sdk.ParseCoinNormalized(s + "atom"); err != nil {
+ return fmt.Errorf("invalid coin amount")
+ }
+ return nil
+ }),
+
+ huh.NewSelect[string]().
+ Key("denom").
+ Title("Denom").
+ Options(huh.NewOptions("atom", "osmo", "usnr", "snr")...),
+
+ huh.NewInput().
+ Key("memo").
+ Title("Memo").
+ Placeholder("Optional"),
+
+ huh.NewConfirm().
+ Key("done").
+ Title("Ready to convert?").
+ Validate(func(v bool) error {
+ if !v {
+ return fmt.Errorf("Please confirm when you're ready to convert")
+ }
+ return nil
+ }).
+ Affirmative("Yes, convert!").
+ Negative("Not yet"),
+ ),
+ ).
+ WithWidth(60).
+ WithShowHelp(false).
+ WithShowErrors(false)
+
+ return m
+}
+
+func (m Model) Init() tea.Cmd {
+ return m.form.Init()
+}
+
+func min(x, y int) int {
+ if x > y {
+ return y
+ }
+ return x
+}
+
+func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+ switch msg := msg.(type) {
+ case tea.WindowSizeMsg:
+ m.width = min(msg.Width, maxWidth) - m.styles.Base.GetHorizontalFrameSize()
+ case tea.KeyMsg:
+ switch msg.String() {
+ case "esc", "ctrl+c", "q":
+ return m, tea.Quit
+ }
+ }
+
+ var cmds []tea.Cmd
+
+ form, cmd := m.form.Update(msg)
+ if f, ok := form.(*huh.Form); ok {
+ m.form = f
+ cmds = append(cmds, cmd)
+ }
+
+ if m.form.State == huh.StateCompleted {
+ m.buildMessage()
+ cmds = append(cmds, tea.Quit)
+ }
+
+ return m, tea.Batch(cmds...)
+}
+
+func (m Model) View() string {
+ s := m.styles
+
+ switch m.form.State {
+ case huh.StateCompleted:
+ pklCode := m.generatePkl()
+ messageView := m.getMessageView()
+ var b strings.Builder
+ fmt.Fprintf(&b, "Final Tx:\n\n%s\n\n%s", pklCode, messageView)
+ return s.Status.Margin(0, 1).Padding(1, 2).Width(80).Render(b.String()) + "\n\n"
+ default:
+ var schemaType string
+ if m.form.GetString("schemaType") != "" {
+ schemaType = "Schema Type: " + m.form.GetString("schemaType")
+ }
+
+ v := strings.TrimSuffix(m.form.View(), "\n\n")
+ form := m.lg.NewStyle().Margin(1, 0).Render(v)
+
+ var status string
+ {
+ preview := "(Preview will appear here)"
+ if m.form.GetString("schema") != "" {
+ preview = m.generatePkl()
+ }
+
+ const statusWidth = 40
+ statusMarginLeft := m.width - statusWidth - lipgloss.Width(form) - s.Status.GetMarginRight()
+ status = s.Status.
+ Height(lipgloss.Height(form)).
+ Width(statusWidth).
+ MarginLeft(statusMarginLeft).
+ Render(s.StatusHeader.Render("Pkl Preview") + "\n" +
+ schemaType + "\n\n" +
+ preview)
+ }
+
+ errors := m.form.Errors()
+ header := m.appBoundaryView("Sonr TX Builder")
+ if len(errors) > 0 {
+ header = m.appErrorBoundaryView(m.errorView())
+ }
+ body := lipgloss.JoinHorizontal(lipgloss.Top, form, status)
+
+ footer := m.appBoundaryView(m.form.Help().ShortHelpView(m.form.KeyBinds()))
+ if len(errors) > 0 {
+ footer = m.appErrorBoundaryView("")
+ }
+
+ return s.Base.Render(header + "\n" + body + "\n\n" + footer)
+ }
+}
+
+func (m Model) errorView() string {
+ var s string
+ for _, err := range m.form.Errors() {
+ s += err.Error()
+ }
+ return s
+}
+
+func (m Model) appBoundaryView(text string) string {
+ return lipgloss.PlaceHorizontal(
+ m.width,
+ lipgloss.Left,
+ m.styles.HeaderText.Render(text),
+ lipgloss.WithWhitespaceChars("="),
+ lipgloss.WithWhitespaceForeground(indigo),
+ )
+}
+
+func (m Model) appErrorBoundaryView(text string) string {
+ return lipgloss.PlaceHorizontal(
+ m.width,
+ lipgloss.Left,
+ m.styles.ErrorHeaderText.Render(text),
+ lipgloss.WithWhitespaceChars("="),
+ lipgloss.WithWhitespaceForeground(red),
+ )
+}
+
+func (m Model) generatePkl() string {
+ schemaType := m.form.GetString("schemaType")
+ schema := m.form.GetString("schema")
+
+ // This is a placeholder for the actual conversion logic
+ // In a real implementation, you would parse the schema and generate Pkl code
+ return fmt.Sprintf("// Converted from %s\n\nclass ConvertedSchema {\n // TODO: Implement conversion from %s\n // Original schema:\n /*\n%s\n */\n}", schemaType, schemaType, schema)
+}
+
+func (m *Model) buildMessage() {
+ from := m.form.GetString("from")
+ to := m.form.GetString("to")
+ amount := m.form.GetString("amount")
+ denom := m.form.GetString("denom")
+ memo := m.form.GetString("memo")
+
+ coin, _ := sdk.ParseCoinNormalized(fmt.Sprintf("%s%s", amount, denom))
+ sendMsg := &banktypes.MsgSend{
+ FromAddress: from,
+ ToAddress: to,
+ Amount: sdk.NewCoins(coin),
+ }
+
+ anyMsg, _ := codectypes.NewAnyWithValue(sendMsg)
+ m.message = &tx.TxBody{
+ Messages: []*codectypes.Any{anyMsg},
+ Memo: memo,
+ }
+}
+
+func (m Model) getMessageView() string {
+ if m.message == nil {
+ return "Current Message: None"
+ }
+
+ interfaceRegistry := codectypes.NewInterfaceRegistry()
+ marshaler := codec.NewProtoCodec(interfaceRegistry)
+ jsonBytes, _ := marshaler.MarshalJSON(m.message)
+
+ return fmt.Sprintf("Current Message:\n%s", string(jsonBytes))
+}
+
+func RunBuildTxnTUI() (*tx.TxBody, error) {
+ m := NewModel()
+ p := tea.NewProgram(m)
+
+ finalModel, err := p.Run()
+ if err != nil {
+ return nil, fmt.Errorf("failed to run program: %w", err)
+ }
+
+ finalM, ok := finalModel.(Model)
+ if !ok || finalM.message == nil {
+ return nil, fmt.Errorf("form not completed")
+ }
+
+ return finalM.message, nil
+}
diff --git a/internal/vfs/assemble.go b/internal/vfs/assemble.go
new file mode 100644
index 000000000..07545ebc7
--- /dev/null
+++ b/internal/vfs/assemble.go
@@ -0,0 +1,20 @@
+package vfs
+
+import (
+ "github.com/ipfs/boxo/files"
+)
+
+var (
+ kServiceWorkerFileName = "server/sw.js"
+ kVaultFileName = "server/vault.wasm"
+ kIndexFileName = "index.html"
+)
+
+func AssembleDirectory() files.Directory {
+ fileMap := map[string]files.Node{
+ kVaultFileName: DWNWasmFile(),
+ kServiceWorkerFileName: SWJSFile(),
+ }
+
+ return files.NewMapDirectory(fileMap)
+}
diff --git a/internal/vfs/dwn.wasm b/internal/vfs/dwn.wasm
new file mode 100755
index 000000000..272ccbefa
Binary files /dev/null and b/internal/vfs/dwn.wasm differ
diff --git a/internal/vfs/embed.go b/internal/vfs/embed.go
new file mode 100644
index 000000000..d7dcc4db6
--- /dev/null
+++ b/internal/vfs/embed.go
@@ -0,0 +1,22 @@
+package vfs
+
+import (
+ _ "embed"
+
+ "github.com/ipfs/boxo/files"
+)
+
+//go:embed dwn.wasm
+var dwnWasmData []byte
+
+//go:embed sw.js
+var swJSData []byte
+
+func DWNWasmFile() files.Node {
+ return files.NewBytesFile(dwnWasmData)
+}
+
+// Use ServiceWorkerJS template to generate the service worker file
+func SWJSFile() files.Node {
+ return files.NewBytesFile(swJSData)
+}
diff --git a/internal/vfs/sw.js b/internal/vfs/sw.js
new file mode 100644
index 000000000..a5654ed5d
--- /dev/null
+++ b/internal/vfs/sw.js
@@ -0,0 +1,8 @@
+importScripts(
+ "https://cdn.jsdelivr.net/gh/golang/go@go1.18.4/misc/wasm/wasm_exec.js",
+ "https://cdn.jsdelivr.net/gh/nlepage/go-wasm-http-server@v1.1.0/sw.js",
+ "https://cdn.jsdelivr.net/npm/htmx.org@1.9.12/dist/htmx.min.js",
+ "https://cdn.jsdelivr.net/npm/alpinejs@3.14.1/dist/cdn.min.js",
+);
+
+registerWasmHTTPListener("dwn.wasm");
diff --git a/internal/vfs/wasm/request.go b/internal/vfs/wasm/request.go
new file mode 100644
index 000000000..c7aeb7d5a
--- /dev/null
+++ b/internal/vfs/wasm/request.go
@@ -0,0 +1,37 @@
+//go:build js && wasm
+
+package wasm
+
+import (
+ "bytes"
+ "net/http"
+ "net/http/httptest"
+ "syscall/js"
+
+ promise "github.com/nlepage/go-js-promise"
+)
+
+// Request builds and returns the equivalent http.Request
+func Request(r js.Value) *http.Request {
+ jsBody := js.Global().Get("Uint8Array").New(promise.Await(r.Call("arrayBuffer")))
+ body := make([]byte, jsBody.Get("length").Int())
+ js.CopyBytesToGo(body, jsBody)
+
+ req := httptest.NewRequest(
+ r.Get("method").String(),
+ r.Get("url").String(),
+ bytes.NewBuffer(body),
+ )
+
+ headersIt := r.Get("headers").Call("entries")
+ for {
+ e := headersIt.Call("next")
+ if e.Get("done").Bool() {
+ break
+ }
+ v := e.Get("value")
+ req.Header.Set(v.Index(0).String(), v.Index(1).String())
+ }
+
+ return req
+}
diff --git a/internal/vfs/wasm/response.go b/internal/vfs/wasm/response.go
new file mode 100644
index 000000000..632538b87
--- /dev/null
+++ b/internal/vfs/wasm/response.go
@@ -0,0 +1,50 @@
+//go:build js && wasm
+
+package wasm
+
+import (
+ "io"
+ "net/http/httptest"
+ "syscall/js"
+)
+
+// ResponseRecorder uses httptest.ResponseRecorder to build a JS Response
+type ResponseRecorder struct {
+ *httptest.ResponseRecorder
+}
+
+// NewResponseRecorder returns a new ResponseRecorder
+func NewResponseRecorder() ResponseRecorder {
+ return ResponseRecorder{httptest.NewRecorder()}
+}
+
+// JSResponse builds and returns the equivalent JS Response
+func (rr ResponseRecorder) JSResponse() js.Value {
+ res := rr.Result()
+
+ body := js.Undefined()
+ if res.ContentLength != 0 {
+ b, err := io.ReadAll(res.Body)
+ if err != nil {
+ panic(err)
+ }
+ body = js.Global().Get("Uint8Array").New(len(b))
+ js.CopyBytesToJS(body, b)
+ }
+
+ init := make(map[string]interface{}, 2)
+
+ if res.StatusCode != 0 {
+ init["status"] = res.StatusCode
+ }
+
+ if len(res.Header) != 0 {
+ headers := make(map[string]interface{}, len(res.Header))
+ for k := range res.Header {
+ headers[k] = res.Header.Get(k)
+ }
+ init["headers"] = headers
+ }
+
+ return js.Global().Get("Response").New(body, init)
+}
diff --git a/internal/vfs/wasm/serve.go b/internal/vfs/wasm/serve.go
new file mode 100644
index 000000000..846280928
--- /dev/null
+++ b/internal/vfs/wasm/serve.go
@@ -0,0 +1,59 @@
+//go:build js && wasm
+
+package wasm
+
+import (
+ "fmt"
+ "net/http"
+ "strings"
+ "syscall/js"
+
+ promise "github.com/nlepage/go-js-promise"
+)
+
+// Serve serves HTTP requests using handler or http.DefaultServeMux if handler is nil.
+func Serve(handler http.Handler) func() {
+ h := handler
+ if h == nil {
+ h = http.DefaultServeMux
+ }
+
+ prefix := js.Global().Get("wasmhttp").Get("path").String()
+ for strings.HasSuffix(prefix, "/") {
+ prefix = strings.TrimSuffix(prefix, "/")
+ }
+
+ if prefix != "" {
+ mux := http.NewServeMux()
+ mux.Handle(prefix+"/", http.StripPrefix(prefix, h))
+ h = mux
+ }
+
+ cb := js.FuncOf(func(_ js.Value, args []js.Value) interface{} {
+ resPromise, resolve, reject := promise.New()
+
+ go func() {
+ defer func() {
+ if r := recover(); r != nil {
+ if err, ok := r.(error); ok {
+ reject(fmt.Sprintf("wasmhttp: panic: %+v\n", err))
+ } else {
+ reject(fmt.Sprintf("wasmhttp: panic: %v\n", r))
+ }
+ }
+ }()
+
+ res := NewResponseRecorder()
+
+ h.ServeHTTP(res, Request(args[0]))
+
+ resolve(res.JSResponse())
+ }()
+
+ return resPromise
+ })
+
+ js.Global().Get("wasmhttp").Call("setHandler", cb)
+
+ return cb.Release
+}
diff --git a/pkl/api.pkl b/pkl/api.pkl
new file mode 100644
index 000000000..f18251ac6
--- /dev/null
+++ b/pkl/api.pkl
@@ -0,0 +1,37 @@
+@go.Package { name = "github.com/onsonr/sonr/motr/api" }
+
+module api
+
+import "package://pkg.pkl-lang.org/pkl-go/pkl.golang@0.5.0#/go.pkl"
+
+class JsonField extends go.Field {
+ structTags {
+ ["json"] = "%{name},omitempty"
+ }
+}
+
+abstract class Request {
+ route: String
+ method: String
+ headers: Map
+ origin: String?
+ userAgent: String?
+ body: Dynamic
+}
+
+abstract class Response {
+ statusCode: Int
+ headers: Map
+ body: Dynamic
+}
+
+class GetAccountsRequest extends Request {
+ route = "/accounts"
+ method = "GET"
+ headers = {
+ "Content-Type" = "application/json"
+ }
+ origin = null
+ userAgent = null
+ body = null
+}
diff --git a/pkl/bake.pkl b/pkl/bake.pkl
new file mode 100644
index 000000000..927e5ea37
--- /dev/null
+++ b/pkl/bake.pkl
@@ -0,0 +1,30 @@
+@go.Package { name = "github.com/onsonr/sonr/motr/api/bake" }
+
+module bake
+
+import "package://pkg.pkl-lang.org/pkl-go/pkl.golang@0.5.0#/go.pkl"
+
+class JsonField extends go.Field {
+ structTags {
+ ["json"] = "%{name},omitempty"
+ }
+}
+
+abstract class Macroon {
+ id: String
+ location: String
+}
+
+abstract class FirstPartyCaveats {
+ scope: String
+ exp: Int
+ cnf: String
+ aud: String
+}
+
+abstract class ThirdPartyCaveats {
+ scope: String
+ exp: Int
+ cnf: String
+ aud: String
+}
diff --git a/pkl/oidc.pkl b/pkl/oidc.pkl
new file mode 100644
index 000000000..2437be298
--- /dev/null
+++ b/pkl/oidc.pkl
@@ -0,0 +1,59 @@
+@go.Package { name = "github.com/onsonr/sonr/x/did/types/oidc" }
+
+module oidc
+
+import "package://pkg.pkl-lang.org/pkl-go/pkl.golang@0.5.0#/go.pkl"
+
+class JsonField extends go.Field {
+ structTags {
+ ["json"] = "%{name},omitempty"
+ ["param"] = "%{name}"
+ }
+}
+
+class DiscoveryDocument {
+ @JsonField
+ issuer: String
+
+ @JsonField
+ authorization_endpoint: String
+
+ @JsonField
+ token_endpoint: String
+
+ @JsonField
+ userinfo_endpoint: String
+
+ @JsonField
+ jwks_uri: String
+
+ @JsonField
+ registration_endpoint: String
+
+ @JsonField
+ scopes_supported: List
+
+ @JsonField
+ response_types_supported: List
+
+ @JsonField
+ response_modes_supported: List
+
+ @JsonField
+ subject_types_supported: List
+
+ @JsonField
+ id_token_signing_alg_values_supported: List
+
+ @JsonField
+ claims_supported: List
+
+ @JsonField
+ grant_types_supported: List
+
+ @JsonField
+ acr_values_supported: List
+
+ @JsonField
+ token_endpoint_auth_methods_supported: List
+}
diff --git a/pkl/orm.pkl b/pkl/orm.pkl
new file mode 100644
index 000000000..86bc5e06f
--- /dev/null
+++ b/pkl/orm.pkl
@@ -0,0 +1,227 @@
+@go.Package { name = "github.com/onsonr/sonr/internal/db/orm" }
+
+module orm
+
+import "package://pkg.pkl-lang.org/pkl-go/pkl.golang@0.5.0#/go.pkl"
+
+class PrimaryKey extends go.Field {
+ structTags {
+ ["gorm"] = "primaryKey,autoIncrement"
+ ["json"] = "%{name},omitempty"
+ ["query"] = "%{name}"
+ }
+}
+
+class Unique extends go.Field {
+ structTags {
+ ["gorm"] = "unique"
+ ["json"] = "%{name},omitempty"
+ }
+}
+
+class Default extends go.Field {
+ defaultValue: String
+ structTags {
+ ["gorm"] = "default:%{defaultValue}"
+ ["json"] = "%{name},omitempty"
+ }
+}
+
+class NotNull extends go.Field {
+ structTags {
+ ["gorm"] = "not null"
+ }
+}
+
+class ForeignKey extends go.Field {
+ references: String
+ structTags {
+ ["gorm"] = "foreignKey:%{references}"
+ }
+}
+
+class JsonField extends go.Field {
+ structTags {
+ ["json"] = "%{name},omitempty"
+ ["param"] = "%{name}"
+ }
+}
+
+class Account {
+ @PrimaryKey
+ id: UInt
+
+ @JsonField
+ name: String
+
+ @JsonField
+ address: String
+
+ @JsonField
+ publicKey: String
+
+ @JsonField
+ createdAt: String?
+}
+
+class Asset {
+ @PrimaryKey
+ id: UInt
+
+ @JsonField
+ name: String
+
+ @JsonField
+ symbol: String
+
+ @JsonField
+ decimals: Int
+
+ @JsonField
+ chainId: Int?
+
+ @JsonField
+ createdAt: String?
+}
+
+class Chain {
+ @PrimaryKey
+ id: UInt
+
+ @JsonField
+ name: String
+
+ @JsonField
+ networkId: String
+
+ @JsonField
+ createdAt: String?
+}
+
+class Credential {
+ @PrimaryKey
+ id: UInt
+
+ @JsonField
+ subject: String
+
+ @JsonField
+ controller: String
+
+ @JsonField
+ attestationType: String
+
+ @JsonField
+ origin: String
+
+ @JsonField
+ credentialId: String
+
+ @JsonField
+ publicKey: String
+
+ @JsonField
+ transport: String
+
+ @JsonField
+ signCount: UInt
+
+ @JsonField
+ userPresent: Boolean
+
+ @JsonField
+ userVerified: Boolean
+
+ @JsonField
+ backupEligible: Boolean
+
+ @JsonField
+ backupState: Boolean
+
+ @JsonField
+ cloneWarning: Boolean
+
+ @JsonField
+ createdAt: String?
+
+ @JsonField
+ updatedAt: String?
+}
+
+class Profile {
+ @PrimaryKey
+ id: String
+
+ @JsonField
+ subject: String
+
+ @JsonField
+ controller: String
+
+ @JsonField
+ originUri: String?
+
+ @JsonField
+ publicMetadata: String?
+
+ @JsonField
+ privateMetadata: String?
+
+ @JsonField
+ createdAt: String?
+
+ @JsonField
+ updatedAt: String?
+}
+
+class Property {
+ @PrimaryKey
+ id: UInt
+
+ @JsonField
+ profileId: String
+
+ @JsonField
+ key: String
+
+ @JsonField
+ accumulator: String
+
+ @JsonField
+ propertyKey: String
+}
+
+class Keyshare {
+ @PrimaryKey
+ id: UInt
+
+ @JsonField
+ data: String
+
+ @JsonField
+ role: Int
+
+ @JsonField
+ createdAt: String?
+}
+
+class Permission {
+ @PrimaryKey
+ id: UInt
+
+ @JsonField
+ serviceId: String
+
+ @JsonField
+ grants: String
+
+ @JsonField
+ scopes: String
+
+ @JsonField
+ createdAt: String?
+
+ @JsonField
+ updatedAt: String?
+}
+
diff --git a/pkl/txns.pkl b/pkl/txns.pkl
new file mode 100644
index 000000000..beda46381
--- /dev/null
+++ b/pkl/txns.pkl
@@ -0,0 +1,175 @@
+@go.Package { name = "github.com/onsonr/sonr/x/did/types/txns" }
+
+module txns
+
+import "package://pkg.pkl-lang.org/pkl-go/pkl.golang@0.5.0#/go.pkl"
+
+/// Common Cosmos SDK types
+typealias Coin = Dynamic
+typealias AccAddress = String
+typealias ValAddress = String
+typealias Timestamp = String
+
+/// Base class for all messages
+abstract class Msg {
+ /// The type URL for the message
+ typeUrl: String
+}
+
+/// Base class for all proposals
+class Proposal {
+ /// The title of the proposal
+ title: String
+
+ /// The description of the proposal
+ description: String
+}
+
+
+/// Gov module messages
+class MsgGovSubmitProposal extends Msg {
+ typeUrl = "/cosmos.gov.v1beta1.MsgSubmitProposal"
+ content: Proposal
+ initialDeposit: List
+ proposer: AccAddress
+}
+
+class MsgGovVote extends Msg {
+ typeUrl = "/cosmos.gov.v1beta1.MsgVote"
+ proposalId: Int
+ voter: AccAddress
+ option: Int
+}
+
+class MsgGovDeposit extends Msg {
+ typeUrl = "/cosmos.gov.v1beta1.MsgDeposit"
+ proposalId: Int
+ depositor: AccAddress
+ amount: List
+}
+
+/// Group module messages
+ class MsgGroupCreateGroup extends Msg {
+ typeUrl = "/cosmos.group.v1.MsgCreateGroup"
+ admin: AccAddress
+ members: List
+ metadata: String
+ }
+
+ class MsgGroupSubmitProposal extends Msg {
+ typeUrl = "/cosmos.group.v1.MsgSubmitProposal"
+ groupPolicyAddress: AccAddress
+ proposers: List
+ metadata: String
+ messages: List
+ exec: Int
+ }
+
+ class MsgGroupVote extends Msg {
+ typeUrl = "/cosmos.group.v1.MsgVote"
+ proposalId: Int
+ voter: AccAddress
+ option: Int
+ metadata: String
+ exec: Int
+ }
+
+/// Staking module messages
+ class MsgStakingCreateValidator extends Msg {
+ typeUrl = "/cosmos.staking.v1beta1.MsgCreateValidator"
+ description: Dynamic
+ commission: Dynamic
+ minSelfDelegation: String
+ delegatorAddress: AccAddress
+ validatorAddress: ValAddress
+ pubkey: Dynamic
+ value: Coin
+ }
+
+ class MsgStakingDelegate extends Msg {
+ typeUrl = "/cosmos.staking.v1beta1.MsgDelegate"
+ delegatorAddress: AccAddress
+ validatorAddress: ValAddress
+ amount: Coin
+ }
+
+ class MsgStakingUndelegate extends Msg {
+ typeUrl = "/cosmos.staking.v1beta1.MsgUndelegate"
+ delegatorAddress: AccAddress
+ validatorAddress: ValAddress
+ amount: Coin
+ }
+
+ class MsgStakingBeginRedelegate extends Msg {
+ typeUrl = "/cosmos.staking.v1beta1.MsgBeginRedelegate"
+ delegatorAddress: AccAddress
+ validatorSrcAddress: ValAddress
+ validatorDstAddress: ValAddress
+ amount: Coin
+ }
+ class MsgDidUpdateParams extends Msg {
+ typeUrl = "/sonr.did.v1.MsgUpdateParams"
+ authority: AccAddress
+ params: Dynamic
+ token: Dynamic
+ }
+
+ class MsgDidAllocateVault extends Msg {
+ typeUrl = "/sonr.did.v1.MsgAllocateVault"
+ authority: AccAddress
+ subject: String
+ token: Dynamic
+ }
+
+ class MsgDidProveWitness extends Msg {
+ typeUrl = "/sonr.did.v1.MsgProveWitness"
+ authority: AccAddress
+ property: String
+ witness: Listing
+ token: Dynamic
+ }
+
+ class MsgDidSyncVault extends Msg {
+ typeUrl = "/sonr.did.v1.MsgSyncVault"
+ controller: AccAddress
+ token: Dynamic
+ }
+
+class MsgDidRegisterController extends Msg {
+ typeUrl = "/sonr.did.v1.MsgRegisterController"
+ authority: AccAddress
+ cid: String
+ origin: String
+ authentication: List
+ token: Dynamic
+ }
+
+class MsgDidAuthorize extends Msg {
+ typeUrl = "/sonr.did.v1.MsgAuthorize"
+ authority: AccAddress
+ controller: AccAddress
+ address: AccAddress
+ origin: String
+ token: Dynamic
+ }
+
+class MsgDidRegisterService extends Msg {
+ typeUrl = "/sonr.did.v1.MsgRegisterService"
+ controller: AccAddress
+ originUri: String
+ scopes: Dynamic
+ description: String
+ serviceEndpoints: Map
+ metadata: Dynamic
+ token: Dynamic
+ }
+
+/// Represents a transaction body
+class TxBody {
+ messages: List
+ memo: String?
+ timeoutHeight: Int?
+ extensionOptions: List?
+ nonCriticalExtensionOptions: List?
+}
+
diff --git a/process-compose.yaml b/process-compose.yaml
new file mode 100644
index 000000000..62f947ffe
--- /dev/null
+++ b/process-compose.yaml
@@ -0,0 +1,18 @@
+version: "0.6"
+
+processes:
+ ipfs:
+ namespace: testnet
+ command: "ipfs-cluster-service init --consensus crdt && ipfs-cluster-service daemon"
+ background: true
+ availability:
+ restart: on_failure
+ max_restarts: 3
+
+ sonr:
+ namespace: testnet
+ command: "make sh-testnet"
+ restart: on_failure
+ max_restarts: 3
+ depends:
+ - ipfs
diff --git a/proto/did/v1/genesis.proto b/proto/did/v1/genesis.proto
index 65e92ed09..03e7f69be 100644
--- a/proto/did/v1/genesis.proto
+++ b/proto/did/v1/genesis.proto
@@ -10,6 +10,17 @@ option go_package = "github.com/onsonr/sonr/x/did/types";
message GenesisState {
// Params defines all the parameters of the module.
Params params = 1 [(gogoproto.nullable) = false];
+
+ // GlobalIntegrity defines a zkp integrity proof for the entire DID namespace
+ GlobalIntegrity global_integrity = 2;
+}
+
+// GlobalIntegrity defines a zkp integrity proof for the entire DID namespace
+message GlobalIntegrity {
+ string controller = 1;
+ string seed = 2;
+ bytes accumulator = 3;
+ uint64 count = 4;
}
// Params defines the set of module parameters.
diff --git a/proto/did/v1/state.proto b/proto/did/v1/state.proto
index ccfa723d3..4c40b7627 100644
--- a/proto/did/v1/state.proto
+++ b/proto/did/v1/state.proto
@@ -92,7 +92,7 @@ message Controller {
// Verification reprsents a method of verifying membership in a DID
message Verification {
option (cosmos.orm.v1.table) = {
- id: 5
+ id: 4
primary_key: {fields: "id"}
index: {
id: 1
diff --git a/x/did/builder/api.go b/x/did/builder/api.go
new file mode 100644
index 000000000..d042ba441
--- /dev/null
+++ b/x/did/builder/api.go
@@ -0,0 +1,251 @@
+package builder
+
+import (
+ "encoding/base64"
+ "fmt"
+
+ "github.com/go-webauthn/webauthn/protocol"
+
+ "github.com/go-webauthn/webauthn/protocol/webauthncose"
+ didv1 "github.com/onsonr/sonr/api/did/v1"
+ "github.com/onsonr/sonr/x/did/types"
+)
+
+func APIFormatDIDNamespace(namespace types.DIDNamespace) didv1.DIDNamespace {
+ return didv1.DIDNamespace(namespace)
+}
+
+func APIFormatDIDNamespaces(namespaces []types.DIDNamespace) []didv1.DIDNamespace {
+ var s []didv1.DIDNamespace
+ for _, namespace := range namespaces {
+ s = append(s, APIFormatDIDNamespace(namespace))
+ }
+ return s
+}
+
+func APIFormatKeyRole(role types.KeyRole) didv1.KeyRole {
+ return didv1.KeyRole(role)
+}
+
+func APIFormatKeyAlgorithm(algorithm types.KeyAlgorithm) didv1.KeyAlgorithm {
+ return didv1.KeyAlgorithm(algorithm)
+}
+
+func APIFormatKeyEncoding(encoding types.KeyEncoding) didv1.KeyEncoding {
+ return didv1.KeyEncoding(encoding)
+}
+
+func APIFormatKeyCurve(curve types.KeyCurve) didv1.KeyCurve {
+ return didv1.KeyCurve(curve)
+}
+
+func APIFormatKeyType(keyType types.KeyType) didv1.KeyType {
+ return didv1.KeyType(keyType)
+}
+
+func APIFormatPermissions(permissions *types.Permissions) *didv1.Permissions {
+ if permissions == nil {
+ return nil
+ }
+ p := didv1.Permissions{
+ Grants: APIFormatDIDNamespaces(permissions.Grants),
+ Scopes: APIFormatPermissionScopes(permissions.Scopes),
+ }
+ return &p
+}
+
+func APIFormatPermissionScope(scope types.PermissionScope) didv1.PermissionScope {
+ return didv1.PermissionScope(scope)
+}
+
+func APIFormatPermissionScopes(scopes []types.PermissionScope) []didv1.PermissionScope {
+ var s []didv1.PermissionScope
+ for _, scope := range scopes {
+ s = append(s, APIFormatPermissionScope(scope))
+ }
+ return s
+}
+
+func APIFormatServiceRecord(service *types.Service) *didv1.ServiceRecord {
+ return &didv1.ServiceRecord{
+ Id: service.Id,
+ ServiceType: service.ServiceType,
+ Authority: service.Authority,
+ Origin: service.Origin,
+ Description: service.Description,
+ ServiceEndpoints: service.ServiceEndpoints,
+ Permissions: APIFormatPermissions(service.Permissions),
+ }
+}
+
+func APIFormatPubKeyJWK(jwk *types.PubKey_JWK) *didv1.PubKey_JWK {
+ return &didv1.PubKey_JWK{
+ Kty: jwk.Kty,
+ Crv: jwk.Crv,
+ X: jwk.X,
+ Y: jwk.Y,
+ N: jwk.N,
+ E: jwk.E,
+ }
+}
+
+func APIFormatPubKey(key *types.PubKey) *didv1.PubKey {
+ return &didv1.PubKey{
+ Role: APIFormatKeyRole(key.GetRole()),
+ Algorithm: APIFormatKeyAlgorithm(key.GetAlgorithm()),
+ Encoding: APIFormatKeyEncoding(key.GetEncoding()),
+ Curve: APIFormatKeyCurve(key.GetCurve()),
+ KeyType: APIFormatKeyType(key.GetKeyType()),
+ Raw: key.GetRaw(),
+ }
+}
+
+func FormatEC2PublicKey(key *webauthncose.EC2PublicKeyData) (*types.PubKey_JWK, error) {
+ curve, err := GetCOSECurveName(key.Curve)
+ if err != nil {
+ return nil, err
+ }
+
+ jwkMap := map[string]interface{}{
+ "kty": "EC",
+ "crv": curve,
+ "x": base64.RawURLEncoding.EncodeToString(key.XCoord),
+ "y": base64.RawURLEncoding.EncodeToString(key.YCoord),
+ }
+
+ return MapToJWK(jwkMap)
+}
+
+func FormatRSAPublicKey(key *webauthncose.RSAPublicKeyData) (*types.PubKey_JWK, error) {
+ jwkMap := map[string]interface{}{
+ "kty": "RSA",
+ "n": base64.RawURLEncoding.EncodeToString(key.Modulus),
+ "e": base64.RawURLEncoding.EncodeToString(key.Exponent),
+ }
+
+ return MapToJWK(jwkMap)
+}
+
+func FormatOKPPublicKey(key *webauthncose.OKPPublicKeyData) (*types.PubKey_JWK, error) {
+ curve, err := GetOKPCurveName(key.Curve)
+ if err != nil {
+ return nil, err
+ }
+
+ jwkMap := map[string]interface{}{
+ "kty": "OKP",
+ "crv": curve,
+ "x": base64.RawURLEncoding.EncodeToString(key.XCoord),
+ }
+
+ return MapToJWK(jwkMap)
+}
+
+func MapToJWK(m map[string]interface{}) (*types.PubKey_JWK, error) {
+ jwk := &types.PubKey_JWK{}
+ for k, v := range m {
+ switch k {
+ case "kty":
+ jwk.Kty = v.(string)
+ case "crv":
+ jwk.Crv = v.(string)
+ case "x":
+ jwk.X = v.(string)
+ case "y":
+ jwk.Y = v.(string)
+ case "n":
+ jwk.N = v.(string)
+ case "e":
+ jwk.E = v.(string)
+ }
+ }
+ return jwk, nil
+}
+
+func GetCOSECurveName(curveID int64) (string, error) {
+ switch curveID {
+ case int64(webauthncose.P256):
+ return "P-256", nil
+ case int64(webauthncose.P384):
+ return "P-384", nil
+ case int64(webauthncose.P521):
+ return "P-521", nil
+ default:
+ return "", fmt.Errorf("unknown curve ID: %d", curveID)
+ }
+}
+
+func GetOKPCurveName(curveID int64) (string, error) {
+ switch curveID {
+ case int64(webauthncose.Ed25519):
+ return "Ed25519", nil
+ default:
+ return "", fmt.Errorf("unknown OKP curve ID: %d", curveID)
+ }
+}
+
+// NormalizeTransports returns the transports as strings
+func NormalizeTransports(transports []protocol.AuthenticatorTransport) []string {
+ tss := make([]string, len(transports))
+ for i, t := range transports {
+ tss[i] = string(t)
+ }
+ return tss
+}
+
+// GetTransports returns the protocol.AuthenticatorTransport
+func ModuleTransportsToProtocol(transport []string) []protocol.AuthenticatorTransport {
+ tss := make([]protocol.AuthenticatorTransport, len(transport))
+ for i, t := range transport {
+ tss[i] = protocol.AuthenticatorTransport(t)
+ }
+ return tss
+}
+
+// ModuleFormatAPIServiceRecord formats a service record for the module
+func ModuleFormatAPIServiceRecord(service *didv1.ServiceRecord) *types.Service {
+ return &types.Service{
+ Id: service.Id,
+ ServiceType: service.ServiceType,
+ Authority: service.Authority,
+ Origin: service.Origin,
+ Description: service.Description,
+ ServiceEndpoints: service.ServiceEndpoints,
+ Permissions: ModuleFormatAPIPermissions(service.Permissions),
+ }
+}
+
+func ModuleFormatAPIPermissions(permissions *didv1.Permissions) *types.Permissions {
+ if permissions == nil {
+ return nil
+ }
+ p := types.Permissions{
+ Grants: ModuleFormatAPIDIDNamespaces(permissions.Grants),
+ Scopes: ModuleFormatAPIPermissionScopes(permissions.Scopes),
+ }
+ return &p
+}
+
+func ModuleFormatAPIPermissionScope(scope didv1.PermissionScope) types.PermissionScope {
+ return types.PermissionScope(scope)
+}
+
+func ModuleFormatAPIPermissionScopes(scopes []didv1.PermissionScope) []types.PermissionScope {
+ var s []types.PermissionScope
+ for _, scope := range scopes {
+ s = append(s, ModuleFormatAPIPermissionScope(scope))
+ }
+ return s
+}
+
+func ModuleFormatAPIDIDNamespace(namespace didv1.DIDNamespace) types.DIDNamespace {
+ return types.DIDNamespace(namespace)
+}
+
+func ModuleFormatAPIDIDNamespaces(namespaces []didv1.DIDNamespace) []types.DIDNamespace {
+ var s []types.DIDNamespace
+ for _, namespace := range namespaces {
+ s = append(s, ModuleFormatAPIDIDNamespace(namespace))
+ }
+ return s
+}
diff --git a/x/did/builder/chains.go b/x/did/builder/chains.go
new file mode 100644
index 000000000..eb3cf805a
--- /dev/null
+++ b/x/did/builder/chains.go
@@ -0,0 +1,70 @@
+package builder
+
+import (
+ "crypto/hmac"
+ "crypto/sha512"
+ "encoding/binary"
+ "errors"
+ "math/big"
+
+ "github.com/btcsuite/btcd/btcec/v2"
+ "github.com/onsonr/sonr/x/did/types"
+)
+
+// ComputeAccountPublicKey computes the public key of a child key given the extended public key, chain code, and index.
+func computeBip32AccountPublicKey(extPubKey PublicKey, chainCode types.ChainCode, index int) (*types.PubKey, error) {
+ // Check if the index is a hardened child key
+ if chainCode&0x80000000 != 0 && index < 0 {
+ return nil, errors.New("invalid index")
+ }
+
+ // Serialize the public key
+ pubKey, err := btcec.ParsePubKey(extPubKey.GetRaw())
+ if err != nil {
+ return nil, err
+ }
+ pubKeyBytes := pubKey.SerializeCompressed()
+
+ // Serialize the index
+ indexBytes := make([]byte, 4)
+ binary.BigEndian.PutUint32(indexBytes, uint32(index))
+
+ // Compute the HMAC-SHA512
+ mac := hmac.New(sha512.New, []byte{byte(chainCode)})
+ mac.Write(pubKeyBytes)
+ mac.Write(indexBytes)
+ I := mac.Sum(nil)
+
+ // Split I into two 32-byte sequences
+ IL := I[:32]
+
+ // Convert IL to a big integer
+ ilNum := new(big.Int).SetBytes(IL)
+
+ // Check if parse256(IL) >= n
+ curve := btcec.S256()
+ if ilNum.Cmp(curve.N) >= 0 {
+ return nil, errors.New("invalid child key")
+ }
+
+ // Compute the child public key
+ ilx, ily := curve.ScalarBaseMult(IL)
+ childX, childY := curve.Add(ilx, ily, pubKey.X(), pubKey.Y())
+ lx := newBigIntFieldVal(childX)
+ ly := newBigIntFieldVal(childY)
+
+ // Create the child public key
+ childPubKey := btcec.NewPublicKey(lx, ly)
+ pk, err := types.NewPublicKey(childPubKey.SerializeCompressed(), types.ChainCodeKeyInfos[chainCode])
+ if err != nil {
+ return nil, err
+ }
+ return pk, nil
+}
+
+// newBigIntFieldVal creates a new field value from a big integer.
+func newBigIntFieldVal(val *big.Int) *btcec.FieldVal {
+ lx := new(btcec.FieldVal)
+ lx.SetByteSlice(val.Bytes())
+ return lx
+}
diff --git a/x/did/builder/constants.go b/x/did/builder/constants.go
new file mode 100644
index 000000000..be06402c8
--- /dev/null
+++ b/x/did/builder/constants.go
@@ -0,0 +1,334 @@
+package builder
+
+import (
+ "github.com/onsonr/sonr/x/did/types"
+)
+
+type (
+ AuthenticatorAttachment string
+ AuthenticatorTransport string
+)
+
+const (
+ // Platform represents a platform authenticator is attached using a client device-specific transport, called
+ // platform attachment, and is usually not removable from the client device. A public key credential bound to a
+ // platform authenticator is called a platform credential.
+ Platform AuthenticatorAttachment = "platform"
+
+ // CrossPlatform represents a roaming authenticator is attached using cross-platform transports, called
+ // cross-platform attachment. Authenticators of this class are removable from, and can "roam" among, client devices.
+ // A public key credential bound to a roaming authenticator is called a roaming credential.
+ CrossPlatform AuthenticatorAttachment = "cross-platform"
+)
+
+func ParseAuthenticatorAttachment(s string) AuthenticatorAttachment {
+ switch s {
+ case "platform":
+ return Platform
+ default:
+ return CrossPlatform
+ }
+}
+
+const (
+ // USB indicates the respective authenticator can be contacted over removable USB.
+ USB AuthenticatorTransport = "usb"
+
+ // NFC indicates the respective authenticator can be contacted over Near Field Communication (NFC).
+ NFC AuthenticatorTransport = "nfc"
+
+ // BLE indicates the respective authenticator can be contacted over Bluetooth Smart (Bluetooth Low Energy / BLE).
+ BLE AuthenticatorTransport = "ble"
+
+ // SmartCard indicates the respective authenticator can be contacted over ISO/IEC 7816 smart card with contacts.
+ //
+ // WebAuthn Level 3.
+ SmartCard AuthenticatorTransport = "smart-card"
+
+ // Hybrid indicates the respective authenticator can be contacted using a combination of (often separate)
+ // data-transport and proximity mechanisms. This supports, for example, authentication on a desktop computer using
+ // a smartphone.
+ //
+ // WebAuthn Level 3.
+ Hybrid AuthenticatorTransport = "hybrid"
+
+ // Internal indicates the respective authenticator is contacted using a client device-specific transport, i.e., it
+ // is a platform authenticator. These authenticators are not removable from the client device.
+ Internal AuthenticatorTransport = "internal"
+)
+
+func ParseAuthenticatorTransport(s string) AuthenticatorTransport {
+ switch s {
+ case "usb":
+ return USB
+ case "nfc":
+ return NFC
+ case "ble":
+ return BLE
+ case "smart-card":
+ return SmartCard
+ case "hybrid":
+ return Hybrid
+ default:
+ return Internal
+ }
+}
+
+type AuthenticatorFlags byte
+
+const (
+ // FlagUserPresent Bit 00000001 in the byte sequence. Tells us if user is present. Also referred to as the UP flag.
+ FlagUserPresent AuthenticatorFlags = 1 << iota // Referred to as UP
+
+ // FlagRFU1 is a reserved for future use flag.
+ FlagRFU1
+
+ // FlagUserVerified Bit 00000100 in the byte sequence. Tells us if user is verified
+ // by the authenticator using a biometric or PIN. Also referred to as the UV flag.
+ FlagUserVerified
+
+ // FlagBackupEligible Bit 00001000 in the byte sequence. Tells us if a backup is eligible for device. Also referred
+ // to as the BE flag.
+ FlagBackupEligible // Referred to as BE
+
+ // FlagBackupState Bit 00010000 in the byte sequence. Tells us if a backup state for device. Also referred to as the
+ // BS flag.
+ FlagBackupState
+
+ // FlagRFU2 is a reserved for future use flag.
+ FlagRFU2
+
+ // FlagAttestedCredentialData Bit 01000000 in the byte sequence. Indicates whether
+ // the authenticator added attested credential data. Also referred to as the AT flag.
+ FlagAttestedCredentialData
+
+ // FlagHasExtensions Bit 10000000 in the byte sequence. Indicates if the authenticator data has extensions. Also
+ // referred to as the ED flag.
+ FlagHasExtensions
+)
+
+type AttestationFormat string
+
+const (
+ // AttestationFormatPacked is the "packed" attestation statement format is a WebAuthn-optimized format for
+ // attestation. It uses a very compact but still extensible encoding method. This format is implementable by
+ // authenticators with limited resources (e.g., secure elements).
+ AttestationFormatPacked AttestationFormat = "packed"
+
+ // AttestationFormatTPM is the TPM attestation statement format returns an attestation statement in the same format
+ // as the packed attestation statement format, although the rawData and signature fields are computed differently.
+ AttestationFormatTPM AttestationFormat = "tpm"
+
+ // AttestationFormatAndroidKey is the attestation statement format for platform authenticators on versions "N", and
+ // later, which may provide this proprietary "hardware attestation" statement.
+ AttestationFormatAndroidKey AttestationFormat = "android-key"
+
+ // AttestationFormatAndroidSafetyNet is the attestation statement format that Android-based platform authenticators
+ // MAY produce an attestation statement based on the Android SafetyNet API.
+ AttestationFormatAndroidSafetyNet AttestationFormat = "android-safetynet"
+
+ // AttestationFormatFIDOUniversalSecondFactor is the attestation statement format that is used with FIDO U2F
+ // authenticators.
+ AttestationFormatFIDOUniversalSecondFactor AttestationFormat = "fido-u2f"
+
+ // AttestationFormatApple is the attestation statement format that is used with Apple devices' platform
+ // authenticators.
+ AttestationFormatApple AttestationFormat = "apple"
+
+ // AttestationFormatNone is the attestation statement format that is used to replace any authenticator-provided
+ // attestation statement when a WebAuthn Relying Party indicates it does not wish to receive attestation information.
+ AttestationFormatNone AttestationFormat = "none"
+)
+
+func ExtractAttestationFormats(p *types.Params) []AttestationFormat {
+ var formats []AttestationFormat
+ for _, v := range p.AttestationFormats {
+ formats = append(formats, parseAttestationFormat(v))
+ }
+ return formats
+}
+
+func parseAttestationFormat(s string) AttestationFormat {
+ switch s {
+ case "packed":
+ return AttestationFormatPacked
+ case "tpm":
+ return AttestationFormatTPM
+ case "android-key":
+ return AttestationFormatAndroidKey
+ case "android-safetynet":
+ return AttestationFormatAndroidSafetyNet
+ case "fido-u2f":
+ return AttestationFormatFIDOUniversalSecondFactor
+ case "apple":
+ return AttestationFormatApple
+ case "none":
+ return AttestationFormatNone
+ default:
+ return AttestationFormatPacked
+ }
+}
+
+type CredentialType string
+
+const (
+ CredentialTypePublicKeyCredential CredentialType = "public-key"
+)
+
+type ConveyancePreference string
+
+const (
+ // PreferNoAttestation is a ConveyancePreference value.
+ //
+ // This value indicates that the Relying Party is not interested in authenticator attestation. For example, in order
+ // to potentially avoid having to obtain user consent to relay identifying information to the Relying Party, or to
+ // save a round trip to an Attestation CA or Anonymization CA.
+ //
+ // This is the default value.
+ //
+ // Specification: §5.4.7. Attestation Conveyance Preference Enumeration (https://www.w3.org/TR/webauthn/#dom-attestationconveyancepreference-none)
+ PreferNoAttestation ConveyancePreference = "none"
+
+ // PreferIndirectAttestation is a ConveyancePreference value.
+ //
+ // This value indicates that the Relying Party prefers an attestation conveyance yielding verifiable attestation
+ // statements, but allows the client to decide how to obtain such attestation statements. The client MAY replace the
+ // authenticator-generated attestation statements with attestation statements generated by an Anonymization CA, in
+ // order to protect the user’s privacy, or to assist Relying Parties with attestation verification in a
+ // heterogeneous ecosystem.
+ //
+ // Note: There is no guarantee that the Relying Party will obtain a verifiable attestation statement in this case.
+ // For example, in the case that the authenticator employs self attestation.
+ //
+ // Specification: §5.4.7. Attestation Conveyance Preference Enumeration (https://www.w3.org/TR/webauthn/#dom-attestationconveyancepreference-indirect)
+ PreferIndirectAttestation ConveyancePreference = "indirect"
+
+ // PreferDirectAttestation is a ConveyancePreference value.
+ //
+ // This value indicates that the Relying Party wants to receive the attestation statement as generated by the
+ // authenticator.
+ //
+ // Specification: §5.4.7. Attestation Conveyance Preference Enumeration (https://www.w3.org/TR/webauthn/#dom-attestationconveyancepreference-direct)
+ PreferDirectAttestation ConveyancePreference = "direct"
+
+ // PreferEnterpriseAttestation is a ConveyancePreference value.
+ //
+ // This value indicates that the Relying Party wants to receive an attestation statement that may include uniquely
+ // identifying information. This is intended for controlled deployments within an enterprise where the organization
+ // wishes to tie registrations to specific authenticators. User agents MUST NOT provide such an attestation unless
+ // the user agent or authenticator configuration permits it for the requested RP ID.
+ //
+ // If permitted, the user agent SHOULD signal to the authenticator (at invocation time) that enterprise
+ // attestation is requested, and convey the resulting AAGUID and attestation statement, unaltered, to the Relying
+ // Party.
+ //
+ // Specification: §5.4.7. Attestation Conveyance Preference Enumeration (https://www.w3.org/TR/webauthn/#dom-attestationconveyancepreference-enterprise)
+ PreferEnterpriseAttestation ConveyancePreference = "enterprise"
+)
+
+func ExtractConveyancePreference(p *types.Params) ConveyancePreference {
+ switch p.ConveyancePreference {
+ case "none":
+ return PreferNoAttestation
+ case "indirect":
+ return PreferIndirectAttestation
+ case "direct":
+ return PreferDirectAttestation
+ case "enterprise":
+ return PreferEnterpriseAttestation
+ default:
+ return PreferNoAttestation
+ }
+}
+
+type PublicKeyCredentialHints string
+
+const (
+ // PublicKeyCredentialHintSecurityKey is a PublicKeyCredentialHint that indicates that the Relying Party believes
+ // that users will satisfy this request with a physical security key. For example, an enterprise Relying Party may
+ // set this hint if they have issued security keys to their employees and will only accept those authenticators for
+ // registration and authentication.
+ //
+ // For compatibility with older user agents, when this hint is used in PublicKeyCredentialCreationOptions, the
+ // authenticatorAttachment SHOULD be set to cross-platform.
+ PublicKeyCredentialHintSecurityKey PublicKeyCredentialHints = "security-key"
+
+ // PublicKeyCredentialHintClientDevice is a PublicKeyCredentialHint that indicates that the Relying Party believes
+ // that users will satisfy this request with a platform authenticator attached to the client device.
+ //
+ // For compatibility with older user agents, when this hint is used in PublicKeyCredentialCreationOptions, the
+ // authenticatorAttachment SHOULD be set to platform.
+ PublicKeyCredentialHintClientDevice PublicKeyCredentialHints = "client-device"
+
+ // PublicKeyCredentialHintHybrid is a PublicKeyCredentialHint that indicates that the Relying Party believes that
+ // users will satisfy this request with general-purpose authenticators such as smartphones. For example, a consumer
+ // Relying Party may believe that only a small fraction of their customers possesses dedicated security keys. This
+ // option also implies that the local platform authenticator should not be promoted in the UI.
+ //
+ // For compatibility with older user agents, when this hint is used in PublicKeyCredentialCreationOptions, the
+ // authenticatorAttachment SHOULD be set to cross-platform.
+ PublicKeyCredentialHintHybrid PublicKeyCredentialHints = "hybrid"
+)
+
+func ParsePublicKeyCredentialHints(s string) PublicKeyCredentialHints {
+ switch s {
+ case "security-key":
+ return PublicKeyCredentialHintSecurityKey
+ case "client-device":
+ return PublicKeyCredentialHintClientDevice
+ case "hybrid":
+ return PublicKeyCredentialHintHybrid
+ default:
+ return ""
+ }
+}
+
+type AttestedCredentialData struct {
+ AAGUID []byte `json:"aaguid"`
+ CredentialID []byte `json:"credential_id"`
+
+ // The raw credential public key bytes received from the attestation data.
+ CredentialPublicKey []byte `json:"public_key"`
+}
+
+type ResidentKeyRequirement string
+
+const (
+ // ResidentKeyRequirementDiscouraged indicates the Relying Party prefers creating a server-side credential, but will
+ // accept a client-side discoverable credential. This is the default.
+ ResidentKeyRequirementDiscouraged ResidentKeyRequirement = "discouraged"
+
+ // ResidentKeyRequirementPreferred indicates to the client we would prefer a discoverable credential.
+ ResidentKeyRequirementPreferred ResidentKeyRequirement = "preferred"
+
+ // ResidentKeyRequirementRequired indicates the Relying Party requires a client-side discoverable credential, and is
+ // prepared to receive an error if a client-side discoverable credential cannot be created.
+ ResidentKeyRequirementRequired ResidentKeyRequirement = "required"
+)
+
+func ParseResidentKeyRequirement(s string) ResidentKeyRequirement {
+ switch s {
+ case "discouraged":
+ return ResidentKeyRequirementDiscouraged
+ case "preferred":
+ return ResidentKeyRequirementPreferred
+ default:
+ return ResidentKeyRequirementRequired
+ }
+}
+
+type (
+ AuthenticationExtensions map[string]any
+ UserVerificationRequirement string
+)
+
+const (
+ // VerificationRequired User verification is required to create/release a credential
+ VerificationRequired UserVerificationRequirement = "required"
+
+ // VerificationPreferred User verification is preferred to create/release a credential
+ VerificationPreferred UserVerificationRequirement = "preferred" // This is the default
+
+ // VerificationDiscouraged The authenticator should not verify the user for the credential
+ VerificationDiscouraged UserVerificationRequirement = "discouraged"
+)
diff --git a/x/did/builder/macroon.go b/x/did/builder/macroon.go
new file mode 100644
index 000000000..aacdbfb2a
--- /dev/null
+++ b/x/did/builder/macroon.go
@@ -0,0 +1,48 @@
+package builder
+
+import (
+ "net/http"
+
+ "github.com/labstack/echo/v4"
+ "gopkg.in/macaroon.v2"
+
+ "gopkg.in/macaroon-bakery.v2/bakery/checkers"
+)
+
+var PermissionNamespace *checkers.Namespace
+
+func ValidateMacaroonMiddleware(secretKey []byte, location string) echo.MiddlewareFunc {
+ return func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ // Extract the macaroon from the Authorization header
+ auth := c.Request().Header.Get("Authorization")
+ if auth == "" {
+ return c.JSON(http.StatusUnauthorized, map[string]string{"error": "Missing Authorization header"})
+ }
+
+ // Decode the macaroon
+ mac, err := macaroon.Base64Decode([]byte(auth))
+ if err != nil {
+ return c.JSON(http.StatusBadRequest, map[string]string{"error": "Invalid macaroon encoding"})
+ }
+
+ token, err := macaroon.New(secretKey, mac, location, macaroon.LatestVersion)
+ if err != nil {
+ return c.JSON(http.StatusBadRequest, map[string]string{"error": "Invalid macaroon"})
+ }
+
+ // Verify the macaroon
+ err = token.Verify(secretKey, func(caveat string) error {
+ // Implement your caveat verification logic here
+ // For example, you might check if the caveat is still valid (e.g., not expired)
+ return nil // Return nil if the caveat is valid
+ }, nil)
+ if err != nil {
+ return c.JSON(http.StatusUnauthorized, map[string]string{"error": "Invalid macaroon"})
+ }
+
+ // Macaroon is valid, proceed to the next handler
+ return next(c)
+ }
+ }
+}
diff --git a/x/did/builder/openid.go b/x/did/builder/openid.go
new file mode 100644
index 000000000..acd3ba380
--- /dev/null
+++ b/x/did/builder/openid.go
@@ -0,0 +1,27 @@
+package builder
+
+import (
+ "fmt"
+
+ "github.com/onsonr/sonr/x/did/types/oidc"
+)
+
+func GetDiscovery(origin string) *oidc.DiscoveryDocument {
+ baseURL := "https://" + origin // Ensure this is the correct base URL for your service
+ discoveryDoc := &oidc.DiscoveryDocument{
+ Issuer: baseURL,
+ AuthorizationEndpoint: fmt.Sprintf("%s/auth", baseURL),
+ TokenEndpoint: fmt.Sprintf("%s/token", baseURL),
+ UserinfoEndpoint: fmt.Sprintf("%s/userinfo", baseURL),
+ JwksUri: fmt.Sprintf("%s/jwks", baseURL),
+ RegistrationEndpoint: fmt.Sprintf("%s/register", baseURL),
+ ScopesSupported: []string{"openid", "profile", "email", "web3", "sonr"},
+ ResponseTypesSupported: []string{"code"},
+ ResponseModesSupported: []string{"query", "form_post"},
+ GrantTypesSupported: []string{"authorization_code", "refresh_token"},
+ AcrValuesSupported: []string{"passkey"},
+ SubjectTypesSupported: []string{"public"},
+ ClaimsSupported: []string{"sub", "iss", "name", "email"},
+ }
+ return discoveryDoc
+}
diff --git a/x/did/builder/options.go b/x/did/builder/options.go
new file mode 100644
index 000000000..828af608e
--- /dev/null
+++ b/x/did/builder/options.go
@@ -0,0 +1,82 @@
+package builder
+
+import (
+ "encoding/json"
+
+ "github.com/onsonr/sonr/x/did/types"
+)
+
+type AuthenticatorResponse struct {
+ // From the spec https://www.w3.org/TR/webauthn/#dom-authenticatorresponse-clientdatajson
+ // This attribute contains a JSON serialization of the client data passed to the authenticator
+ // by the client in its call to either create() or get().
+ ClientDataJSON URLEncodedBase64 `json:"clientDataJSON"`
+}
+
+type AuthenticatorAttestationResponse struct {
+ // The byte slice of clientDataJSON, which becomes CollectedClientData
+ AuthenticatorResponse
+
+ Transports []string `json:"transports,omitempty"`
+
+ AuthenticatorData URLEncodedBase64 `json:"authenticatorData"`
+
+ PublicKey URLEncodedBase64 `json:"publicKey"`
+
+ PublicKeyAlgorithm int64 `json:"publicKeyAlgorithm"`
+
+ // AttestationObject is the byte slice version of attestationObject.
+ // This attribute contains an attestation object, which is opaque to, and
+ // cryptographically protected against tampering by, the client. The
+ // attestation object contains both authenticator data and an attestation
+ // statement. The former contains the AAGUID, a unique credential ID, and
+ // the credential public key. The contents of the attestation statement are
+ // determined by the attestation statement format used by the authenticator.
+ // It also contains any additional information that the Relying Party's server
+ // requires to validate the attestation statement, as well as to decode and
+ // validate the authenticator data along with the JSON-serialized client data.
+ AttestationObject URLEncodedBase64 `json:"attestationObject"`
+}
+
+type PublicKeyCredentialCreationOptions struct {
+ RelyingParty RelyingPartyEntity `json:"rp"`
+ User UserEntity `json:"user"`
+ Challenge URLEncodedBase64 `json:"challenge"`
+ Parameters []CredentialParameter `json:"pubKeyCredParams,omitempty"`
+ Timeout int `json:"timeout,omitempty"`
+ CredentialExcludeList []CredentialDescriptor `json:"excludeCredentials,omitempty"`
+ AuthenticatorSelection AuthenticatorSelection `json:"authenticatorSelection,omitempty"`
+ Hints []PublicKeyCredentialHints `json:"hints,omitempty"`
+ Attestation ConveyancePreference `json:"attestation,omitempty"`
+ AttestationFormats []AttestationFormat `json:"attestationFormats,omitempty"`
+ Extensions AuthenticationExtensions `json:"extensions,omitempty"`
+}
+
+func GetPublicKeyCredentialCreationOptions(origin string, subject string, vaultCID string, params *types.Params) (*PublicKeyCredentialCreationOptions, error) {
+ chal, err := CreateChallenge()
+ if err != nil {
+ return nil, err
+ }
+ return &PublicKeyCredentialCreationOptions{
+ RelyingParty: NewRelayingParty(origin, subject),
+ User: NewUserEntity(subject, subject, vaultCID),
+ Parameters: ExtractCredentialParameters(params),
+ Timeout: 20,
+ CredentialExcludeList: nil,
+ Challenge: chal,
+ AuthenticatorSelection: AuthenticatorSelection{},
+ Hints: nil,
+ Attestation: ExtractConveyancePreference(params),
+ AttestationFormats: ExtractAttestationFormats(params),
+ Extensions: nil,
+ }, nil
+}
+
+func UnmarshalAuthenticatorResponse(data []byte) (*AuthenticatorResponse, error) {
+ var ar AuthenticatorResponse
+ err := json.Unmarshal(data, &ar)
+ if err != nil {
+ return nil, err
+ }
+ return &ar, nil
+}
diff --git a/x/did/builder/pubkey.go b/x/did/builder/pubkey.go
new file mode 100644
index 000000000..2c408b1ab
--- /dev/null
+++ b/x/did/builder/pubkey.go
@@ -0,0 +1,81 @@
+package builder
+
+import (
+ "fmt"
+
+ cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
+ didv1 "github.com/onsonr/sonr/api/did/v1"
+ "github.com/onsonr/sonr/x/did/types"
+
+ "github.com/go-webauthn/webauthn/protocol/webauthncose"
+)
+
+// PublicKey is an interface for a public key
+type PublicKey interface {
+ cryptotypes.PubKey
+ Clone() cryptotypes.PubKey
+ GetRaw() []byte
+ GetRole() types.KeyRole
+ GetAlgorithm() types.KeyAlgorithm
+ GetEncoding() types.KeyEncoding
+ GetCurve() types.KeyCurve
+ GetKeyType() types.KeyType
+}
+
+// CreateAuthnVerification creates a new verification method for an authn method
+func CreateAuthnVerification(namespace types.DIDNamespace, issuer string, controller string, pubkey *types.PubKey, identifier string) *types.VerificationMethod {
+ return &types.VerificationMethod{
+ Method: namespace,
+ Controller: controller,
+ PublicKey: pubkey,
+ Id: identifier,
+ Issuer: issuer,
+ }
+}
+
+// CreateWalletVerification creates a new verification method for a wallet
+func CreateWalletVerification(namespace types.DIDNamespace, controller string, pubkey *types.PubKey, identifier string) *didv1.VerificationMethod {
+ return &didv1.VerificationMethod{
+ Method: APIFormatDIDNamespace(namespace),
+ Controller: controller,
+ PublicKey: APIFormatPubKey(pubkey),
+ Id: identifier,
+ }
+}
+
+// ExtractWebAuthnPublicKey parses the raw public key bytes and returns a JWK representation
+func ExtractWebAuthnPublicKey(keyBytes []byte) (*types.PubKey_JWK, error) {
+ key, err := webauthncose.ParsePublicKey(keyBytes)
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse public key: %w", err)
+ }
+
+ switch k := key.(type) {
+ case *webauthncose.EC2PublicKeyData:
+ return FormatEC2PublicKey(k)
+ case *webauthncose.RSAPublicKeyData:
+ return FormatRSAPublicKey(k)
+ case *webauthncose.OKPPublicKeyData:
+ return FormatOKPPublicKey(k)
+ default:
+ return nil, fmt.Errorf("unsupported key type")
+ }
+}
+
+// NewInitialWalletAccounts creates a new set of verification methods for a wallet
+func NewInitialWalletAccounts(controller string, pubkey *types.PubKey) ([]*didv1.VerificationMethod, error) {
+ var verificationMethods []*didv1.VerificationMethod
+ for method, chain := range types.InitialChainCodes {
+ nk, err := computeBip32AccountPublicKey(pubkey, chain, 0)
+ if err != nil {
+ return nil, err
+ }
+
+ addr, err := chain.FormatAddress(nk)
+ if err != nil {
+ return nil, nil
+ }
+ verificationMethods = append(verificationMethods, CreateWalletVerification(method, controller, nk, method.FormatDID(addr)))
+ }
+ return verificationMethods, nil
+}
diff --git a/x/did/builder/scopes.go b/x/did/builder/scopes.go
new file mode 100644
index 000000000..2635d6204
--- /dev/null
+++ b/x/did/builder/scopes.go
@@ -0,0 +1,56 @@
+package builder
+
+import (
+ "github.com/onsonr/sonr/x/did/types"
+ "gopkg.in/macaroon-bakery.v2/bakery/checkers"
+)
+
+var (
+ GenericPermissionScopeStrings = [...]string{
+ "profile.name",
+ "identifiers.email",
+ "identifiers.phone",
+ "transactions.read",
+ "transactions.write",
+ "wallets.read",
+ "wallets.create",
+ "wallets.subscribe",
+ "wallets.update",
+ "transactions.verify",
+ "transactions.broadcast",
+ "admin.user",
+ "admin.validator",
+ }
+
+ StringToModulePermissionScope = map[string]types.PermissionScope{
+ "PERMISSION_SCOPE_UNSPECIFIED": types.PermissionScope_PERMISSION_SCOPE_UNSPECIFIED,
+ "PERMISSION_SCOPE_BASIC_INFO": types.PermissionScope_PERMISSION_SCOPE_BASIC_INFO,
+ "PERMISSION_SCOPE_IDENTIFIERS_EMAIL": types.PermissionScope_PERMISSION_SCOPE_PERMISSIONS_READ,
+ "PERMISSION_SCOPE_IDENTIFIERS_PHONE": types.PermissionScope_PERMISSION_SCOPE_PERMISSIONS_WRITE,
+ "PERMISSION_SCOPE_TRANSACTIONS_READ": types.PermissionScope_PERMISSION_SCOPE_TRANSACTIONS_READ,
+ "PERMISSION_SCOPE_TRANSACTIONS_WRITE": types.PermissionScope_PERMISSION_SCOPE_TRANSACTIONS_WRITE,
+ "PERMISSION_SCOPE_WALLETS_READ": types.PermissionScope_PERMISSION_SCOPE_WALLETS_READ,
+ "PERMISSION_SCOPE_WALLETS_CREATE": types.PermissionScope_PERMISSION_SCOPE_WALLETS_CREATE,
+ "PERMISSION_SCOPE_WALLETS_SUBSCRIBE": types.PermissionScope_PERMISSION_SCOPE_WALLETS_SUBSCRIBE,
+ "PERMISSION_SCOPE_WALLETS_UPDATE": types.PermissionScope_PERMISSION_SCOPE_WALLETS_UPDATE,
+ "PERMISSION_SCOPE_TRANSACTIONS_VERIFY": types.PermissionScope_PERMISSION_SCOPE_TRANSACTIONS_VERIFY,
+ "PERMISSION_SCOPE_TRANSACTIONS_BROADCAST": types.PermissionScope_PERMISSION_SCOPE_TRANSACTIONS_BROADCAST,
+ "PERMISSION_SCOPE_ADMIN_USER": types.PermissionScope_PERMISSION_SCOPE_ADMIN_USER,
+ "PERMISSION_SCOPE_ADMIN_VALIDATOR": types.PermissionScope_PERMISSION_SCOPE_ADMIN_VALIDATOR,
+ }
+)
+
+func ResolvePermissionScope(scope string) (types.PermissionScope, bool) {
+ uriToPrefix := make(map[string]string)
+ for _, scope := range GenericPermissionScopeStrings {
+ uriToPrefix["https://example.com/auth/"+scope] = scope
+ }
+ PermissionNamespace := checkers.NewNamespace(uriToPrefix)
+
+ prefix, ok := PermissionNamespace.Resolve("https://example.com/auth/" + scope)
+ if !ok {
+ return 0, false
+ }
+ permScope, ok := StringToModulePermissionScope[prefix]
+ return permScope, ok
+}
diff --git a/x/did/builder/service.go b/x/did/builder/service.go
new file mode 100644
index 000000000..b5e33a96f
--- /dev/null
+++ b/x/did/builder/service.go
@@ -0,0 +1,103 @@
+package builder
+
+import (
+ "crypto/rand"
+ "strings"
+
+ "github.com/onsonr/sonr/x/did/types"
+)
+
+// ChallengeLength - Length of bytes to generate for a challenge.
+const ChallengeLength = 32
+
+// CreateChallenge creates a new challenge that should be signed and returned by the authenticator. The spec recommends
+// using at least 16 bytes with 100 bits of entropy. We use 32 bytes.
+func CreateChallenge() (challenge URLEncodedBase64, err error) {
+ challenge = make([]byte, ChallengeLength)
+
+ if _, err = rand.Read(challenge); err != nil {
+ return nil, err
+ }
+
+ return challenge, nil
+}
+
+type CredentialEntity struct {
+ // A human-palatable name for the entity. Its function depends on what the PublicKeyCredentialEntity represents:
+ //
+ // When inherited by PublicKeyCredentialRpEntity it is a human-palatable identifier for the Relying Party,
+ // intended only for display. For example, "ACME Corporation", "Wonderful Widgets, Inc." or "ОАО Примертех".
+ //
+ // When inherited by PublicKeyCredentialUserEntity, it is a human-palatable identifier for a user account. It is
+ // intended only for display, i.e., aiding the user in determining the difference between user accounts with similar
+ // displayNames. For example, "alexm", "alex.p.mueller@example.com" or "+14255551234".
+ Name string `json:"name"`
+}
+
+func NewCredentialEntity(name string) CredentialEntity {
+ return CredentialEntity{
+ Name: name,
+ }
+}
+
+type CredentialParameter struct {
+ Type CredentialType `json:"type"`
+ Algorithm types.COSEAlgorithmIdentifier `json:"alg"`
+}
+
+func NewCredentialParameter(ki *types.KeyInfo) CredentialParameter {
+ return CredentialParameter{
+ Type: CredentialTypePublicKeyCredential,
+ Algorithm: ki.Algorithm.CoseIdentifier(),
+ }
+}
+
+func ExtractCredentialParameters(p *types.Params) []CredentialParameter {
+ var keys []*types.KeyInfo
+ for k, v := range p.AllowedPublicKeys {
+ if strings.Contains(k, "webauthn") {
+ keys = append(keys, v)
+ }
+ }
+ var cparams []CredentialParameter
+ for _, ki := range keys {
+ cparams = append(cparams, NewCredentialParameter(ki))
+ }
+ return cparams
+}
+
+type RelyingPartyEntity struct {
+ CredentialEntity
+
+ // A unique identifier for the Relying Party entity, which sets the RP ID.
+ ID string `json:"id"`
+}
+
+func NewRelayingParty(name string, origin string) RelyingPartyEntity {
+ return RelyingPartyEntity{
+ CredentialEntity: NewCredentialEntity(origin),
+ ID: origin,
+ }
+}
+
+type UserEntity struct {
+ CredentialEntity
+ // A human-palatable name for the user account, intended only for display.
+ // For example, "Alex P. Müller" or "田中 倫". The Relying Party SHOULD let
+ // the user choose this, and SHOULD NOT restrict the choice more than necessary.
+ DisplayName string `json:"displayName"`
+
+ // ID is the user handle of the user account entity. To ensure secure operation,
+ // authentication and authorization decisions MUST be made on the basis of this id
+ // member, not the displayName nor name members. See Section 6.1 of
+ // [RFC8266](https://www.w3.org/TR/webauthn/#biblio-rfc8266).
+ ID any `json:"id"`
+}
+
+func NewUserEntity(name string, subject string, cid string) UserEntity {
+ return UserEntity{
+ CredentialEntity: NewCredentialEntity(name),
+ DisplayName: subject,
+ ID: cid,
+ }
+}
diff --git a/x/did/builder/signer.go b/x/did/builder/signer.go
new file mode 100644
index 000000000..b7b3fc33a
--- /dev/null
+++ b/x/did/builder/signer.go
@@ -0,0 +1,59 @@
+package builder
+
+import (
+ "github.com/onsonr/crypto"
+ "github.com/onsonr/sonr/x/did/types"
+)
+
+type Signer interface {
+ Sign(msg []byte) ([]byte, error)
+ Verify(msg []byte, sig []byte) error
+ PublicKey() []byte
+}
+
+type signer struct {
+ user *types.Keyshare
+ val *types.Keyshare
+}
+
+func (k signer) Sign(msg []byte) ([]byte, error) {
+ valSignFunc, err := crypto.GetSignFunc(k.val, msg)
+ if err != nil {
+ return nil, err
+ }
+ usrSignFunc, err := crypto.GetSignFunc(k.user, msg)
+ if err != nil {
+ return nil, err
+ }
+ sig, err := crypto.RunMPCSign(valSignFunc, usrSignFunc)
+ if err != nil {
+ return nil, err
+ }
+ return crypto.SerializeMPCSignature(sig)
+}
+
+func (k signer) Verify(msg []byte, sig []byte) error {
+ sigMpc, err := crypto.DeserializeMPCSignature(sig)
+ if err != nil {
+ return err
+ }
+ pk, err := crypto.GetECDSAPublicKey(k.val)
+ if err != nil {
+ return err
+ }
+ ok := crypto.VerifyMPCSignature(sigMpc, msg, pk)
+ if !ok {
+ return types.ErrInvalidSignature
+ }
+ return nil
+}
+
+func (k signer) PublicKey() []byte {
+ if k.user != nil {
+ return k.user.PublicKey
+ }
+ if k.val != nil {
+ return k.val.PublicKey
+ }
+ return nil
+}
diff --git a/x/did/builder/webauthn.go b/x/did/builder/webauthn.go
new file mode 100644
index 000000000..098f91356
--- /dev/null
+++ b/x/did/builder/webauthn.go
@@ -0,0 +1,169 @@
+package builder
+
+import (
+ "bytes"
+ "encoding/base64"
+ "reflect"
+
+ "github.com/go-webauthn/webauthn/protocol"
+)
+
+// Credential contains all needed information about a WebAuthn credential for storage.
+type Credential struct {
+ Subject string `json:"handle"`
+ AttestationType string `json:"attestationType"`
+ Origin string `json:"origin"`
+ CredentialID []byte `json:"id"`
+ PublicKey []byte `json:"publicKey"`
+ Transport []string `json:"transport"`
+ SignCount uint32 `json:"signCount"`
+ UserPresent bool `json:"userPresent"`
+ UserVerified bool `json:"userVerified"`
+ BackupEligible bool `json:"backupEligible"`
+ BackupState bool `json:"backupState"`
+ CloneWarning bool `json:"cloneWarning"`
+}
+
+// NewCredential will return a credential pointer on successful validation of a registration response.
+func NewCredential(c *protocol.ParsedCredentialCreationData, origin, handle string) *Credential {
+ return &Credential{
+ Subject: handle,
+ Origin: origin,
+ AttestationType: c.Response.AttestationObject.Format,
+ CredentialID: c.Response.AttestationObject.AuthData.AttData.CredentialID,
+ PublicKey: c.Response.AttestationObject.AuthData.AttData.CredentialPublicKey,
+ Transport: NormalizeTransports(c.Response.Transports),
+ SignCount: c.Response.AttestationObject.AuthData.Counter,
+ UserPresent: c.Response.AttestationObject.AuthData.Flags.HasUserPresent(),
+ UserVerified: c.Response.AttestationObject.AuthData.Flags.HasUserVerified(),
+ BackupEligible: c.Response.AttestationObject.AuthData.Flags.HasBackupEligible(),
+ BackupState: c.Response.AttestationObject.AuthData.Flags.HasAttestedCredentialData(),
+ }
+}
+
+// Descriptor converts a Credential into a protocol.CredentialDescriptor.
+func (c *Credential) Descriptor() protocol.CredentialDescriptor {
+ return protocol.CredentialDescriptor{
+ Type: protocol.PublicKeyCredentialType,
+ CredentialID: c.CredentialID,
+ Transport: ModuleTransportsToProtocol(c.Transport),
+ AttestationType: c.AttestationType,
+ }
+}
+
+// This is a signal that the authenticator may be cloned, see CloneWarning above for more information.
+func (a *Credential) UpdateCounter(authDataCount uint32) {
+ if authDataCount <= a.SignCount && (authDataCount != 0 || a.SignCount != 0) {
+ a.CloneWarning = true
+ return
+ }
+
+ a.SignCount = authDataCount
+}
+
+type CredentialDescriptor struct {
+ // The valid credential types.
+ Type CredentialType `json:"type"`
+
+ // CredentialID The ID of a credential to allow/disallow.
+ CredentialID URLEncodedBase64 `json:"id"`
+
+ // The authenticator transports that can be used.
+ Transport []AuthenticatorTransport `json:"transports,omitempty"`
+
+ // The AttestationType from the Credential. Used internally only.
+ AttestationType string `json:"-"`
+}
+
+func NewCredentialDescriptor(credentialID string, transports []AuthenticatorTransport, attestationType string) *CredentialDescriptor {
+ return &CredentialDescriptor{
+ CredentialID: URLEncodedBase64(credentialID),
+ Transport: transports,
+ AttestationType: attestationType,
+ Type: CredentialTypePublicKeyCredential,
+ }
+}
+
+type AuthenticatorSelection struct {
+ // AuthenticatorAttachment If this member is present, eligible authenticators are filtered to only
+ // authenticators attached with the specified AuthenticatorAttachment enum.
+ AuthenticatorAttachment AuthenticatorAttachment `json:"authenticatorAttachment,omitempty"`
+
+ // RequireResidentKey this member describes the Relying Party's requirements regarding resident
+ // credentials. If the parameter is set to true, the authenticator MUST create a client-side-resident
+ // public key credential source when creating a public key credential.
+ RequireResidentKey *bool `json:"requireResidentKey,omitempty"`
+
+ // ResidentKey this member describes the Relying Party's requirements regarding resident
+ // credentials per Webauthn Level 2.
+ ResidentKey ResidentKeyRequirement `json:"residentKey,omitempty"`
+
+ // UserVerification This member describes the Relying Party's requirements regarding user verification for
+ // the create() operation. Eligible authenticators are filtered to only those capable of satisfying this
+ // requirement.
+ UserVerification UserVerificationRequirement `json:"userVerification,omitempty"`
+}
+
+type AuthenticatorData struct {
+ RPIDHash []byte `json:"rpid"`
+ Flags AuthenticatorFlags `json:"flags"`
+ Counter uint32 `json:"sign_count"`
+ AttData AttestedCredentialData `json:"att_data"`
+ ExtData []byte `json:"ext_data"`
+}
+
+type AttestationObject struct {
+ // The authenticator data, including the newly created public key. See AuthenticatorData for more info
+ AuthData AuthenticatorData
+
+ // The byteform version of the authenticator data, used in part for signature validation
+ RawAuthData []byte `json:"authData"`
+
+ // The format of the Attestation data.
+ Format string `json:"fmt"`
+
+ // The attestation statement data sent back if attestation is requested.
+ AttStatement map[string]any `json:"attStmt,omitempty"`
+}
+
+type URLEncodedBase64 []byte
+
+func (e URLEncodedBase64) String() string {
+ return base64.RawURLEncoding.EncodeToString(e)
+}
+
+// UnmarshalJSON base64 decodes a URL-encoded value, storing the result in the
+// provided byte slice.
+func (e *URLEncodedBase64) UnmarshalJSON(data []byte) error {
+ if bytes.Equal(data, []byte("null")) {
+ return nil
+ }
+
+ // Trim the leading spaces.
+ data = bytes.Trim(data, "\"")
+
+ // Trim the trailing equal characters.
+ data = bytes.TrimRight(data, "=")
+
+ out := make([]byte, base64.RawURLEncoding.DecodedLen(len(data)))
+
+ n, err := base64.RawURLEncoding.Decode(out, data)
+ if err != nil {
+ return err
+ }
+
+ v := reflect.ValueOf(e).Elem()
+ v.SetBytes(out[:n])
+
+ return nil
+}
+
+// MarshalJSON base64 encodes a non URL-encoded value, storing the result in the
+// provided byte slice.
+func (e URLEncodedBase64) MarshalJSON() ([]byte, error) {
+ if e == nil {
+ return []byte("null"), nil
+ }
+
+ return []byte(`"` + base64.RawURLEncoding.EncodeToString(e) + `"`), nil
+}
diff --git a/x/did/keeper/genesis.go b/x/did/keeper/genesis.go
index a1b904878..c1ff8a62a 100644
--- a/x/did/keeper/genesis.go
+++ b/x/did/keeper/genesis.go
@@ -2,6 +2,7 @@ package keeper
import (
"context"
+ "time"
"cosmossdk.io/log"
sdk "github.com/cosmos/cosmos-sdk/types"
diff --git a/x/did/keeper/ipfs.go b/x/did/keeper/ipfs.go
new file mode 100644
index 000000000..c02b39dea
--- /dev/null
+++ b/x/did/keeper/ipfs.go
@@ -0,0 +1,106 @@
+package keeper
+
+import (
+ "context"
+ "fmt"
+ "time"
+
+ sdk "github.com/cosmos/cosmos-sdk/types"
+ "github.com/ipfs/boxo/files"
+ "github.com/ipfs/boxo/path"
+ "github.com/ipfs/kubo/client/rpc"
+ "github.com/ipfs/kubo/core/coreiface/options"
+ "github.com/onsonr/sonr/internal/vfs"
+)
+
+// assembleInitialVault assembles the initial vault
+func (k Keeper) assembleInitialVault(ctx sdk.Context) (string, int64, error) {
+ cid, err := k.ipfsClient.Unixfs().Add(context.Background(), vfs.AssembleDirectory())
+ if err != nil {
+ return "", 0, err
+ }
+ return cid.String(), k.GetExpirationBlockHeight(ctx, time.Second*15), nil
+}
+
+// pinInitialVault pins the initial vault to the local IPFS node
+func (k Keeper) pinInitialVault(_ sdk.Context, cid string, address string) (bool, error) {
+ // Resolve the path
+ path, err := path.NewPath(cid)
+ if err != nil {
+ return false, err
+ }
+
+ // 1. Initialize vault.db sqlite database in local IPFS with Mount
+
+ // 2. Insert the InitialWalletAccounts
+
+ // 3. Publish the path to the IPNS
+ _, err = k.ipfsClient.Name().Publish(context.Background(), path, options.Name.Key(address))
+ if err != nil {
+ return false, err
+ }
+
+ // 4. Insert the accounts into x/auth
+
+ // 5. Insert the controller into state
+ return true, nil
+}
+
+// GetFromIPFS gets a file from the local IPFS node
+func (k Keeper) GetFromIPFS(ctx sdk.Context, cid string) (files.Directory, error) {
+ path, err := path.NewPath(cid)
+ if err != nil {
+ return nil, err
+ }
+ node, err := k.ipfsClient.Unixfs().Get(ctx, path)
+ if err != nil {
+ return nil, err
+ }
+ dir, ok := node.(files.Directory)
+ if !ok {
+ return nil, fmt.Errorf("retrieved node is not a directory")
+ }
+ return dir, nil
+}
+
+// HasIPFSConnection returns true if the IPFS client is initialized
+func (k *Keeper) HasIPFSConnection() bool {
+ if k.ipfsClient == nil {
+ ipfsClient, err := rpc.NewLocalApi()
+ if err != nil {
+ return false
+ }
+ k.ipfsClient = ipfsClient
+ }
+ return k.ipfsClient != nil
+}
+
+// HasPathInIPFS checks if a file is in the local IPFS node
+func (k Keeper) HasPathInIPFS(ctx sdk.Context, cid string) (bool, error) {
+ path, err := path.NewPath(cid)
+ if err != nil {
+ return false, err
+ }
+ v, err := k.ipfsClient.Unixfs().Get(ctx, path)
+ if err != nil {
+ return false, err
+ }
+
+ if v == nil {
+ return false, nil
+ }
+ return true, nil
+}
+
+// PinToIPFS pins a file to the local IPFS node
+func (k Keeper) PinToIPFS(ctx sdk.Context, cid string, name string) error {
+ path, err := path.NewPath(cid)
+ if err != nil {
+ return err
+ }
+ err = k.ipfsClient.Pin().Add(ctx, path, options.Pin.Name(name))
+ if err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/x/did/keeper/server.go b/x/did/keeper/server.go
index 1b87e9e79..7abf637a2 100644
--- a/x/did/keeper/server.go
+++ b/x/did/keeper/server.go
@@ -2,6 +2,7 @@ package keeper
import (
"context"
+ "encoding/json"
"cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
diff --git a/x/did/keeper/state.go b/x/did/keeper/state.go
new file mode 100644
index 000000000..f8d8ac04b
--- /dev/null
+++ b/x/did/keeper/state.go
@@ -0,0 +1,37 @@
+package keeper
+
+import (
+ sdk "github.com/cosmos/cosmos-sdk/types"
+
+ "github.com/onsonr/sonr/x/did/builder"
+ "github.com/onsonr/sonr/x/did/types"
+)
+
+// insertService inserts a service record into the database
+func (k Keeper) insertService(
+ ctx sdk.Context,
+ svc *types.Service,
+) (*types.MsgRegisterServiceResponse, error) {
+ record := builder.APIFormatServiceRecord(svc)
+ err := k.OrmDB.ServiceRecordTable().Insert(ctx, record)
+ if err != nil {
+ return nil, err
+ }
+ return &types.MsgRegisterServiceResponse{
+ Success: true,
+ Did: record.Id,
+ }, nil
+func (k Keeper) insertAliasFromDisplayName() {
+}
+
+func (k Keeper) insertAssertionFromIdentity() {
+}
+
+func (k Keeper) insertAuthenticationFromCredential() {
+}
+
+func (k Keeper) insertControllerFromMotrVault() {
+}
+
+func (k Keeper) insertDelegationFromAccount() {
+}
diff --git a/x/did/module.go b/x/did/module.go
index 95e5090aa..606c2b5b1 100644
--- a/x/did/module.go
+++ b/x/did/module.go
@@ -67,7 +67,8 @@ func (a AppModuleBasic) Name() string {
func (a AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage {
return cdc.MustMarshalJSON(&types.GenesisState{
- Params: types.DefaultParams(),
+ GlobalIntegrity: types.DefaultGlobalIntegrity(),
+ Params: types.DefaultParams(),
})
}
@@ -103,7 +104,11 @@ func (a AppModule) InitGenesis(ctx sdk.Context, marshaler codec.JSONCodec, messa
if err := a.keeper.Params.Set(ctx, didGenesisState.Params); err != nil {
panic(err)
}
-
+ nftGenesisState := nft.DefaultGenesisState()
+ if err := types.DefaultNFTClasses(nftGenesisState); err != nil {
+ panic(err)
+ }
+ a.nftKeeper.InitGenesis(ctx, nftGenesisState)
return nil
}
diff --git a/x/did/types/accounts.pb.go b/x/did/types/accounts.pb.go
new file mode 100644
index 000000000..4b9328774
--- /dev/null
+++ b/x/did/types/accounts.pb.go
@@ -0,0 +1,634 @@
+// Code generated by protoc-gen-gogo. DO NOT EDIT.
+// source: did/v1/accounts.proto
+
+package types
+
+import (
+ fmt "fmt"
+ proto "github.com/cosmos/gogoproto/proto"
+ io "io"
+ math "math"
+ math_bits "math/bits"
+ math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
+
+type BtcAccount struct {
+}
+
+func (m *BtcAccount) Reset() { *m = BtcAccount{} }
+func (m *BtcAccount) String() string { return proto.CompactTextString(m) }
+func (*BtcAccount) ProtoMessage() {}
+func (*BtcAccount) Descriptor() ([]byte, []int) {
+ return fileDescriptor_2125a09fb14c3bc3, []int{0}
+}
+func (m *BtcAccount) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *BtcAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_BtcAccount.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *BtcAccount) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_BtcAccount.Merge(m, src)
+}
+func (m *BtcAccount) XXX_Size() int {
+ return m.Size()
+}
+func (m *BtcAccount) XXX_DiscardUnknown() {
+ xxx_messageInfo_BtcAccount.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BtcAccount proto.InternalMessageInfo
+
+type EthAccount struct {
+}
+
+func (m *EthAccount) Reset() { *m = EthAccount{} }
+func (m *EthAccount) String() string { return proto.CompactTextString(m) }
+func (*EthAccount) ProtoMessage() {}
+func (*EthAccount) Descriptor() ([]byte, []int) {
+ return fileDescriptor_2125a09fb14c3bc3, []int{1}
+}
+func (m *EthAccount) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *EthAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_EthAccount.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *EthAccount) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_EthAccount.Merge(m, src)
+}
+func (m *EthAccount) XXX_Size() int {
+ return m.Size()
+}
+func (m *EthAccount) XXX_DiscardUnknown() {
+ xxx_messageInfo_EthAccount.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EthAccount proto.InternalMessageInfo
+
+type IBCAccount struct {
+}
+
+func (m *IBCAccount) Reset() { *m = IBCAccount{} }
+func (m *IBCAccount) String() string { return proto.CompactTextString(m) }
+func (*IBCAccount) ProtoMessage() {}
+func (*IBCAccount) Descriptor() ([]byte, []int) {
+ return fileDescriptor_2125a09fb14c3bc3, []int{2}
+}
+func (m *IBCAccount) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *IBCAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_IBCAccount.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *IBCAccount) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_IBCAccount.Merge(m, src)
+}
+func (m *IBCAccount) XXX_Size() int {
+ return m.Size()
+}
+func (m *IBCAccount) XXX_DiscardUnknown() {
+ xxx_messageInfo_IBCAccount.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_IBCAccount proto.InternalMessageInfo
+
+type SnrAccount struct {
+}
+
+func (m *SnrAccount) Reset() { *m = SnrAccount{} }
+func (m *SnrAccount) String() string { return proto.CompactTextString(m) }
+func (*SnrAccount) ProtoMessage() {}
+func (*SnrAccount) Descriptor() ([]byte, []int) {
+ return fileDescriptor_2125a09fb14c3bc3, []int{3}
+}
+func (m *SnrAccount) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *SnrAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_SnrAccount.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *SnrAccount) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_SnrAccount.Merge(m, src)
+}
+func (m *SnrAccount) XXX_Size() int {
+ return m.Size()
+}
+func (m *SnrAccount) XXX_DiscardUnknown() {
+ xxx_messageInfo_SnrAccount.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SnrAccount proto.InternalMessageInfo
+
+func init() {
+ proto.RegisterType((*BtcAccount)(nil), "did.v1.BtcAccount")
+ proto.RegisterType((*EthAccount)(nil), "did.v1.EthAccount")
+ proto.RegisterType((*IBCAccount)(nil), "did.v1.IBCAccount")
+ proto.RegisterType((*SnrAccount)(nil), "did.v1.SnrAccount")
+}
+
+func init() { proto.RegisterFile("did/v1/accounts.proto", fileDescriptor_2125a09fb14c3bc3) }
+
+var fileDescriptor_2125a09fb14c3bc3 = []byte{
+ // 145 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0xc9, 0x4c, 0xd1,
+ 0x2f, 0x33, 0xd4, 0x4f, 0x4c, 0x4e, 0xce, 0x2f, 0xcd, 0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f,
+ 0xc9, 0x17, 0x62, 0x4b, 0xc9, 0x4c, 0xd1, 0x2b, 0x33, 0x54, 0xe2, 0xe1, 0xe2, 0x72, 0x2a, 0x49,
+ 0x76, 0x84, 0x48, 0x82, 0x78, 0xae, 0x25, 0x19, 0x48, 0x3c, 0x4f, 0x27, 0x67, 0x24, 0x5e, 0x70,
+ 0x5e, 0x11, 0x94, 0xe7, 0x64, 0x73, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e,
+ 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51,
+ 0x4a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xf9, 0x79, 0xc5, 0xf9,
+ 0x79, 0x45, 0xfa, 0x60, 0xa2, 0x42, 0x1f, 0xe4, 0x92, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36,
+ 0xb0, 0x23, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0x82, 0x7e, 0x89, 0x0a, 0x9d, 0x00, 0x00,
+ 0x00,
+}
+
+func (m *BtcAccount) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *BtcAccount) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *BtcAccount) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ return len(dAtA) - i, nil
+}
+
+func (m *EthAccount) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *EthAccount) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *EthAccount) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ return len(dAtA) - i, nil
+}
+
+func (m *IBCAccount) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *IBCAccount) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *IBCAccount) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ return len(dAtA) - i, nil
+}
+
+func (m *SnrAccount) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *SnrAccount) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *SnrAccount) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ return len(dAtA) - i, nil
+}
+
+func encodeVarintAccounts(dAtA []byte, offset int, v uint64) int {
+ offset -= sovAccounts(v)
+ base := offset
+ for v >= 1<<7 {
+ dAtA[offset] = uint8(v&0x7f | 0x80)
+ v >>= 7
+ offset++
+ }
+ dAtA[offset] = uint8(v)
+ return base
+}
+func (m *BtcAccount) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ return n
+}
+
+func (m *EthAccount) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ return n
+}
+
+func (m *IBCAccount) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ return n
+}
+
+func (m *SnrAccount) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ return n
+}
+
+func sovAccounts(x uint64) (n int) {
+ return (math_bits.Len64(x|1) + 6) / 7
+}
+func sozAccounts(x uint64) (n int) {
+ return sovAccounts(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (m *BtcAccount) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAccounts
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: BtcAccount: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: BtcAccount: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ default:
+ iNdEx = preIndex
+ skippy, err := skipAccounts(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthAccounts
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *EthAccount) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAccounts
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: EthAccount: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: EthAccount: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ default:
+ iNdEx = preIndex
+ skippy, err := skipAccounts(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthAccounts
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *IBCAccount) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAccounts
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: IBCAccount: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: IBCAccount: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ default:
+ iNdEx = preIndex
+ skippy, err := skipAccounts(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthAccounts
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *SnrAccount) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowAccounts
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: SnrAccount: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: SnrAccount: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ default:
+ iNdEx = preIndex
+ skippy, err := skipAccounts(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthAccounts
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func skipAccounts(dAtA []byte) (n int, err error) {
+ l := len(dAtA)
+ iNdEx := 0
+ depth := 0
+ for iNdEx < l {
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowAccounts
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ wireType := int(wire & 0x7)
+ switch wireType {
+ case 0:
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowAccounts
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ iNdEx++
+ if dAtA[iNdEx-1] < 0x80 {
+ break
+ }
+ }
+ case 1:
+ iNdEx += 8
+ case 2:
+ var length int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowAccounts
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ length |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if length < 0 {
+ return 0, ErrInvalidLengthAccounts
+ }
+ iNdEx += length
+ case 3:
+ depth++
+ case 4:
+ if depth == 0 {
+ return 0, ErrUnexpectedEndOfGroupAccounts
+ }
+ depth--
+ case 5:
+ iNdEx += 4
+ default:
+ return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+ }
+ if iNdEx < 0 {
+ return 0, ErrInvalidLengthAccounts
+ }
+ if depth == 0 {
+ return iNdEx, nil
+ }
+ }
+ return 0, io.ErrUnexpectedEOF
+}
+
+var (
+ ErrInvalidLengthAccounts = fmt.Errorf("proto: negative length found during unmarshaling")
+ ErrIntOverflowAccounts = fmt.Errorf("proto: integer overflow")
+ ErrUnexpectedEndOfGroupAccounts = fmt.Errorf("proto: unexpected end of group")
+)
+func init() { proto.RegisterFile("did/v1/accounts.proto", fileDescriptor_2125a09fb14c3bc3) }
+
+var fileDescriptor_2125a09fb14c3bc3 = []byte{
+ // 122 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0xc9, 0x4c, 0xd1,
+ 0x2f, 0x33, 0xd4, 0x4f, 0x4c, 0x4e, 0xce, 0x2f, 0xcd, 0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f,
+ 0xc9, 0x17, 0x62, 0x4b, 0xc9, 0x4c, 0xd1, 0x2b, 0x33, 0x74, 0xb2, 0x39, 0xf1, 0x48, 0x8e, 0xf1,
+ 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e,
+ 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xa5, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc,
+ 0x5c, 0xfd, 0xfc, 0xbc, 0xe2, 0xfc, 0xbc, 0x22, 0xfd, 0x8c, 0xf2, 0xc4, 0x4a, 0xfd, 0x0a, 0x7d,
+ 0x90, 0x89, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, 0x6c, 0x60, 0xc3, 0x8c, 0x01, 0x01, 0x00, 0x00,
+ 0xff, 0xff, 0x28, 0xd1, 0x54, 0x54, 0x65, 0x00, 0x00, 0x00,
+}
diff --git a/x/did/types/codec.go b/x/did/types/codec.go
index c2913f290..c883ac6aa 100644
--- a/x/did/types/codec.go
+++ b/x/did/types/codec.go
@@ -13,6 +13,8 @@ import (
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/msgservice"
+ "github.com/mr-tron/base58/base58"
+ "github.com/onsonr/crypto"
// this line is used by starport scaffolding # 1
)
diff --git a/x/did/types/coins.go b/x/did/types/coins.go
new file mode 100644
index 000000000..f5e03ab09
--- /dev/null
+++ b/x/did/types/coins.go
@@ -0,0 +1,31 @@
+package types
+
+// Coin represents a cryptocurrency
+type Coin interface {
+ // FormatAddress formats a public key into an address
+ FormatAddress(pubKey []byte) (string, error)
+
+ // GetIndex returns the coin type index
+ GetIndex() int64
+
+ // GetPath returns the coin component path
+ GetPath() uint32
+
+ // GetSymbol returns the coin symbol
+ GetSymbol() string
+
+ // GetMethod returns the coin DID method
+ GetMethod() string
+
+ // GetName returns the coin name
+ GetName() string
+}
+
+// CoinBTCType is the coin type for BTC
+const CoinBTCType = int64(0)
+
+// CoinETHType is the coin type for ETH
+const CoinETHType = int64(60)
+
+// CoinSNRType is the coin type for SNR
+const CoinSNRType = int64(703)
diff --git a/x/did/types/genesis.go b/x/did/types/genesis.go
index 2a4ea7fc6..34da6e029 100644
--- a/x/did/types/genesis.go
+++ b/x/did/types/genesis.go
@@ -41,7 +41,8 @@ const DefaultIndex uint64 = 1
func DefaultGenesis() *GenesisState {
return &GenesisState{
// this line is used by starport scaffolding # genesis/types/default
- Params: DefaultParams(),
+ GlobalIntegrity: DefaultGlobalIntegrity(),
+ Params: DefaultParams(),
}
}
@@ -49,7 +50,9 @@ func DefaultGenesis() *GenesisState {
// failure.
func (gs GenesisState) Validate() error {
// this line is used by starport scaffolding # genesis/types/validate
-
+ if gs.GlobalIntegrity == nil {
+ return fmt.Errorf("global integrity proof is nil")
+ }
return gs.Params.Validate()
}
diff --git a/x/did/types/genesis.pb.go b/x/did/types/genesis.pb.go
index 24b1d6dce..f0a9d2267 100644
--- a/x/did/types/genesis.pb.go
+++ b/x/did/types/genesis.pb.go
@@ -28,6 +28,8 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
type GenesisState struct {
// Params defines all the parameters of the module.
Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"`
+ // GlobalIntegrity defines a zkp integrity proof for the entire DID namespace
+ GlobalIntegrity *GlobalIntegrity `protobuf:"bytes,2,opt,name=global_integrity,json=globalIntegrity,proto3" json:"global_integrity,omitempty"`
}
func (m *GenesisState) Reset() { *m = GenesisState{} }
@@ -70,6 +72,82 @@ func (m *GenesisState) GetParams() Params {
return Params{}
}
+func (m *GenesisState) GetGlobalIntegrity() *GlobalIntegrity {
+ if m != nil {
+ return m.GlobalIntegrity
+ }
+ return nil
+}
+
+// GlobalIntegrity defines a zkp integrity proof for the entire DID namespace
+type GlobalIntegrity struct {
+ Controller string `protobuf:"bytes,1,opt,name=controller,proto3" json:"controller,omitempty"`
+ Seed string `protobuf:"bytes,2,opt,name=seed,proto3" json:"seed,omitempty"`
+ Accumulator []byte `protobuf:"bytes,3,opt,name=accumulator,proto3" json:"accumulator,omitempty"`
+ Count uint64 `protobuf:"varint,4,opt,name=count,proto3" json:"count,omitempty"`
+}
+
+func (m *GlobalIntegrity) Reset() { *m = GlobalIntegrity{} }
+func (m *GlobalIntegrity) String() string { return proto.CompactTextString(m) }
+func (*GlobalIntegrity) ProtoMessage() {}
+func (*GlobalIntegrity) Descriptor() ([]byte, []int) {
+ return fileDescriptor_fda181cae44f7c00, []int{1}
+}
+func (m *GlobalIntegrity) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *GlobalIntegrity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_GlobalIntegrity.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *GlobalIntegrity) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_GlobalIntegrity.Merge(m, src)
+}
+func (m *GlobalIntegrity) XXX_Size() int {
+ return m.Size()
+}
+func (m *GlobalIntegrity) XXX_DiscardUnknown() {
+ xxx_messageInfo_GlobalIntegrity.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GlobalIntegrity proto.InternalMessageInfo
+
+func (m *GlobalIntegrity) GetController() string {
+ if m != nil {
+ return m.Controller
+ }
+ return ""
+}
+
+func (m *GlobalIntegrity) GetSeed() string {
+ if m != nil {
+ return m.Seed
+ }
+ return ""
+}
+
+func (m *GlobalIntegrity) GetAccumulator() []byte {
+ if m != nil {
+ return m.Accumulator
+ }
+ return nil
+}
+
+func (m *GlobalIntegrity) GetCount() uint64 {
+ if m != nil {
+ return m.Count
+ }
+ return 0
+}
+
// Params defines the set of module parameters.
type Params struct {
// Whitelisted Assets
@@ -89,7 +167,7 @@ type Params struct {
func (m *Params) Reset() { *m = Params{} }
func (*Params) ProtoMessage() {}
func (*Params) Descriptor() ([]byte, []int) {
- return fileDescriptor_fda181cae44f7c00, []int{1}
+ return fileDescriptor_fda181cae44f7c00, []int{2}
}
func (m *Params) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -694,6 +772,7 @@ func (m *Service) GetPermissions() map[string]string {
func init() {
proto.RegisterType((*GenesisState)(nil), "did.v1.GenesisState")
+ proto.RegisterType((*GlobalIntegrity)(nil), "did.v1.GlobalIntegrity")
proto.RegisterType((*Params)(nil), "did.v1.Params")
proto.RegisterMapType((map[string]*KeyInfo)(nil), "did.v1.Params.AllowedPublicKeysEntry")
proto.RegisterType((*AssetInfo)(nil), "did.v1.AssetInfo")
@@ -848,6 +927,18 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
+ if m.GlobalIntegrity != nil {
+ {
+ size, err := m.GlobalIntegrity.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenesis(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ }
{
size, err := m.Params.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
@@ -861,6 +952,55 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *GlobalIntegrity) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *GlobalIntegrity) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *GlobalIntegrity) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.Count != 0 {
+ i = encodeVarintGenesis(dAtA, i, uint64(m.Count))
+ i--
+ dAtA[i] = 0x20
+ }
+ if len(m.Accumulator) > 0 {
+ i -= len(m.Accumulator)
+ copy(dAtA[i:], m.Accumulator)
+ i = encodeVarintGenesis(dAtA, i, uint64(len(m.Accumulator)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if len(m.Seed) > 0 {
+ i -= len(m.Seed)
+ copy(dAtA[i:], m.Seed)
+ i = encodeVarintGenesis(dAtA, i, uint64(len(m.Seed)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.Controller) > 0 {
+ i -= len(m.Controller)
+ copy(dAtA[i:], m.Controller)
+ i = encodeVarintGenesis(dAtA, i, uint64(len(m.Controller)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
func (m *Params) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -1420,6 +1560,34 @@ func (m *GenesisState) Size() (n int) {
_ = l
l = m.Params.Size()
n += 1 + l + sovGenesis(uint64(l))
+ if m.GlobalIntegrity != nil {
+ l = m.GlobalIntegrity.Size()
+ n += 1 + l + sovGenesis(uint64(l))
+ }
+ return n
+}
+
+func (m *GlobalIntegrity) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Controller)
+ if l > 0 {
+ n += 1 + l + sovGenesis(uint64(l))
+ }
+ l = len(m.Seed)
+ if l > 0 {
+ n += 1 + l + sovGenesis(uint64(l))
+ }
+ l = len(m.Accumulator)
+ if l > 0 {
+ n += 1 + l + sovGenesis(uint64(l))
+ }
+ if m.Count != 0 {
+ n += 1 + sovGenesis(uint64(m.Count))
+ }
return n
}
@@ -1758,6 +1926,209 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field GlobalIntegrity", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.GlobalIntegrity == nil {
+ m.GlobalIntegrity = &GlobalIntegrity{}
+ }
+ if err := m.GlobalIntegrity.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipGenesis(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *GlobalIntegrity) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: GlobalIntegrity: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: GlobalIntegrity: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Controller", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Controller = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Seed", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Seed = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Accumulator", wireType)
+ }
+ var byteLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ byteLen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if byteLen < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ postIndex := iNdEx + byteLen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenesis
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Accumulator = append(m.Accumulator[:0], dAtA[iNdEx:postIndex]...)
+ if m.Accumulator == nil {
+ m.Accumulator = []byte{}
+ }
+ iNdEx = postIndex
+ case 4:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType)
+ }
+ m.Count = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenesis
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Count |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
default:
iNdEx = preIndex
skippy, err := skipGenesis(dAtA[iNdEx:])
diff --git a/x/did/types/integrity.go b/x/did/types/integrity.go
new file mode 100644
index 000000000..e7eeb1eff
--- /dev/null
+++ b/x/did/types/integrity.go
@@ -0,0 +1,27 @@
+package types
+
+import "lukechampine.com/blake3"
+
+func (g *GlobalIntegrity) Update(address string) bool {
+ return true
+}
+
+func (g *GlobalIntegrity) getProof() (*Proof, error) {
+ if g.Accumulator == nil {
+ return NewProof(g.Controller, g.proofProperty(), g.seedKdf())
+ }
+ return &Proof{
+ Issuer: g.Controller,
+ Property: g.proofProperty(),
+ Accumulator: g.Accumulator,
+ }, nil
+}
+
+func (g *GlobalIntegrity) proofProperty() string {
+ return "did:sonr:integrity"
+}
+
+func (g *GlobalIntegrity) seedKdf() []byte {
+ res := blake3.Sum256([]byte(g.Seed))
+ return res[:]
+}
diff --git a/x/did/types/models.pb.go b/x/did/types/models.pb.go
new file mode 100644
index 000000000..ba75c43a3
--- /dev/null
+++ b/x/did/types/models.pb.go
@@ -0,0 +1,4991 @@
+// Code generated by protoc-gen-gogo. DO NOT EDIT.
+// source: did/v1/models.proto
+
+package types
+
+import (
+ fmt "fmt"
+ _ "github.com/cosmos/gogoproto/gogoproto"
+ proto "github.com/cosmos/gogoproto/proto"
+ io "io"
+ math "math"
+ math_bits "math/bits"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
+
+// Alias defines a subject/origin pair
+type Alias struct {
+ Subject string `protobuf:"bytes,1,opt,name=subject,proto3" json:"subject,omitempty"`
+ Origin string `protobuf:"bytes,2,opt,name=origin,proto3" json:"origin,omitempty"`
+ Controller string `protobuf:"bytes,3,opt,name=controller,proto3" json:"controller,omitempty"`
+}
+
+func (m *Alias) Reset() { *m = Alias{} }
+func (m *Alias) String() string { return proto.CompactTextString(m) }
+func (*Alias) ProtoMessage() {}
+func (*Alias) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{0}
+}
+func (m *Alias) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *Alias) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_Alias.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *Alias) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Alias.Merge(m, src)
+}
+func (m *Alias) XXX_Size() int {
+ return m.Size()
+}
+func (m *Alias) XXX_DiscardUnknown() {
+ xxx_messageInfo_Alias.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Alias proto.InternalMessageInfo
+
+func (m *Alias) GetSubject() string {
+ if m != nil {
+ return m.Subject
+ }
+ return ""
+}
+
+func (m *Alias) GetOrigin() string {
+ if m != nil {
+ return m.Origin
+ }
+ return ""
+}
+
+func (m *Alias) GetController() string {
+ if m != nil {
+ return m.Controller
+ }
+ return ""
+}
+
+type Credential struct {
+ Subject string `protobuf:"bytes,1,opt,name=subject,proto3" json:"subject,omitempty"`
+ AttestationType string `protobuf:"bytes,2,opt,name=attestation_type,json=attestationType,proto3" json:"attestation_type,omitempty"`
+ Origin string `protobuf:"bytes,3,opt,name=origin,proto3" json:"origin,omitempty"`
+ CredentialId []byte `protobuf:"bytes,4,opt,name=credential_id,json=credentialId,proto3" json:"credential_id,omitempty"`
+ PublicKey []byte `protobuf:"bytes,5,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
+ Transport []string `protobuf:"bytes,6,rep,name=transport,proto3" json:"transport,omitempty"`
+ SignCount uint32 `protobuf:"varint,7,opt,name=sign_count,json=signCount,proto3" json:"sign_count,omitempty"`
+ UserPresent bool `protobuf:"varint,8,opt,name=user_present,json=userPresent,proto3" json:"user_present,omitempty"`
+ UserVerified bool `protobuf:"varint,9,opt,name=user_verified,json=userVerified,proto3" json:"user_verified,omitempty"`
+ BackupEligible bool `protobuf:"varint,10,opt,name=backup_eligible,json=backupEligible,proto3" json:"backup_eligible,omitempty"`
+ BackupState bool `protobuf:"varint,11,opt,name=backup_state,json=backupState,proto3" json:"backup_state,omitempty"`
+ CloneWarning bool `protobuf:"varint,12,opt,name=clone_warning,json=cloneWarning,proto3" json:"clone_warning,omitempty"`
+}
+
+func (m *Credential) Reset() { *m = Credential{} }
+func (m *Credential) String() string { return proto.CompactTextString(m) }
+func (*Credential) ProtoMessage() {}
+func (*Credential) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{1}
+}
+func (m *Credential) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *Credential) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_Credential.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *Credential) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Credential.Merge(m, src)
+}
+func (m *Credential) XXX_Size() int {
+ return m.Size()
+}
+func (m *Credential) XXX_DiscardUnknown() {
+ xxx_messageInfo_Credential.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Credential proto.InternalMessageInfo
+
+func (m *Credential) GetSubject() string {
+ if m != nil {
+ return m.Subject
+ }
+ return ""
+}
+
+func (m *Credential) GetAttestationType() string {
+ if m != nil {
+ return m.AttestationType
+ }
+ return ""
+}
+
+func (m *Credential) GetOrigin() string {
+ if m != nil {
+ return m.Origin
+ }
+ return ""
+}
+
+func (m *Credential) GetCredentialId() []byte {
+ if m != nil {
+ return m.CredentialId
+ }
+ return nil
+}
+
+func (m *Credential) GetPublicKey() []byte {
+ if m != nil {
+ return m.PublicKey
+ }
+ return nil
+}
+
+func (m *Credential) GetTransport() []string {
+ if m != nil {
+ return m.Transport
+ }
+ return nil
+}
+
+func (m *Credential) GetSignCount() uint32 {
+ if m != nil {
+ return m.SignCount
+ }
+ return 0
+}
+
+func (m *Credential) GetUserPresent() bool {
+ if m != nil {
+ return m.UserPresent
+ }
+ return false
+}
+
+func (m *Credential) GetUserVerified() bool {
+ if m != nil {
+ return m.UserVerified
+ }
+ return false
+}
+
+func (m *Credential) GetBackupEligible() bool {
+ if m != nil {
+ return m.BackupEligible
+ }
+ return false
+}
+
+func (m *Credential) GetBackupState() bool {
+ if m != nil {
+ return m.BackupState
+ }
+ return false
+}
+
+func (m *Credential) GetCloneWarning() bool {
+ if m != nil {
+ return m.CloneWarning
+ }
+ return false
+}
+
+// Document defines a DID document
+type Document struct {
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ Controller string `protobuf:"bytes,2,opt,name=controller,proto3" json:"controller,omitempty"`
+ Authentication []string `protobuf:"bytes,3,rep,name=authentication,proto3" json:"authentication,omitempty"`
+ AssertionMethod []string `protobuf:"bytes,4,rep,name=assertion_method,json=assertionMethod,proto3" json:"assertion_method,omitempty"`
+ CapabilityDelegation []string `protobuf:"bytes,5,rep,name=capability_delegation,json=capabilityDelegation,proto3" json:"capability_delegation,omitempty"`
+ CapabilityInvocation []string `protobuf:"bytes,6,rep,name=capability_invocation,json=capabilityInvocation,proto3" json:"capability_invocation,omitempty"`
+ Service []string `protobuf:"bytes,7,rep,name=service,proto3" json:"service,omitempty"`
+}
+
+func (m *Document) Reset() { *m = Document{} }
+func (m *Document) String() string { return proto.CompactTextString(m) }
+func (*Document) ProtoMessage() {}
+func (*Document) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{2}
+}
+func (m *Document) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *Document) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_Document.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *Document) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Document.Merge(m, src)
+}
+func (m *Document) XXX_Size() int {
+ return m.Size()
+}
+func (m *Document) XXX_DiscardUnknown() {
+ xxx_messageInfo_Document.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Document proto.InternalMessageInfo
+
+func (m *Document) GetId() string {
+ if m != nil {
+ return m.Id
+ }
+ return ""
+}
+
+func (m *Document) GetController() string {
+ if m != nil {
+ return m.Controller
+ }
+ return ""
+}
+
+func (m *Document) GetAuthentication() []string {
+ if m != nil {
+ return m.Authentication
+ }
+ return nil
+}
+
+func (m *Document) GetAssertionMethod() []string {
+ if m != nil {
+ return m.AssertionMethod
+ }
+ return nil
+}
+
+func (m *Document) GetCapabilityDelegation() []string {
+ if m != nil {
+ return m.CapabilityDelegation
+ }
+ return nil
+}
+
+func (m *Document) GetCapabilityInvocation() []string {
+ if m != nil {
+ return m.CapabilityInvocation
+ }
+ return nil
+}
+
+func (m *Document) GetService() []string {
+ if m != nil {
+ return m.Service
+ }
+ return nil
+}
+
+// Keyshare defines a keyshare from the MPC protocol
+type Keyshare struct {
+ Metadata map[string]string `protobuf:"bytes,1,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ Payloads map[string][]byte `protobuf:"bytes,2,rep,name=payloads,proto3" json:"payloads,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ Protocol string `protobuf:"bytes,3,opt,name=protocol,proto3" json:"protocol,omitempty"`
+ PublicKey []byte `protobuf:"bytes,4,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
+ Version uint32 `protobuf:"varint,5,opt,name=version,proto3" json:"version,omitempty"`
+ Role int32 `protobuf:"varint,6,opt,name=role,proto3" json:"role,omitempty"`
+}
+
+func (m *Keyshare) Reset() { *m = Keyshare{} }
+func (m *Keyshare) String() string { return proto.CompactTextString(m) }
+func (*Keyshare) ProtoMessage() {}
+func (*Keyshare) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{3}
+}
+func (m *Keyshare) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *Keyshare) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_Keyshare.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *Keyshare) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Keyshare.Merge(m, src)
+}
+func (m *Keyshare) XXX_Size() int {
+ return m.Size()
+}
+func (m *Keyshare) XXX_DiscardUnknown() {
+ xxx_messageInfo_Keyshare.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Keyshare proto.InternalMessageInfo
+
+func (m *Keyshare) GetMetadata() map[string]string {
+ if m != nil {
+ return m.Metadata
+ }
+ return nil
+}
+
+func (m *Keyshare) GetPayloads() map[string][]byte {
+ if m != nil {
+ return m.Payloads
+ }
+ return nil
+}
+
+func (m *Keyshare) GetProtocol() string {
+ if m != nil {
+ return m.Protocol
+ }
+ return ""
+}
+
+func (m *Keyshare) GetPublicKey() []byte {
+ if m != nil {
+ return m.PublicKey
+ }
+ return nil
+}
+
+func (m *Keyshare) GetVersion() uint32 {
+ if m != nil {
+ return m.Version
+ }
+ return 0
+}
+
+func (m *Keyshare) GetRole() int32 {
+ if m != nil {
+ return m.Role
+ }
+ return 0
+}
+
+// Permissions contains a list of grants and access control rules for
+// a Service.
+type Permissions struct {
+ Grants []DIDNamespace `protobuf:"varint,1,rep,packed,name=grants,proto3,enum=did.v1.DIDNamespace" json:"grants,omitempty"`
+ Scopes []PermissionScope `protobuf:"varint,2,rep,packed,name=scopes,proto3,enum=did.v1.PermissionScope" json:"scopes,omitempty"`
+}
+
+func (m *Permissions) Reset() { *m = Permissions{} }
+func (m *Permissions) String() string { return proto.CompactTextString(m) }
+func (*Permissions) ProtoMessage() {}
+func (*Permissions) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{4}
+}
+func (m *Permissions) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *Permissions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_Permissions.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *Permissions) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Permissions.Merge(m, src)
+}
+func (m *Permissions) XXX_Size() int {
+ return m.Size()
+}
+func (m *Permissions) XXX_DiscardUnknown() {
+ xxx_messageInfo_Permissions.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Permissions proto.InternalMessageInfo
+
+func (m *Permissions) GetGrants() []DIDNamespace {
+ if m != nil {
+ return m.Grants
+ }
+ return nil
+}
+
+func (m *Permissions) GetScopes() []PermissionScope {
+ if m != nil {
+ return m.Scopes
+ }
+ return nil
+}
+
+// PubKey defines a public key for a did
+type PubKey struct {
+ Role KeyRole `protobuf:"varint,1,opt,name=role,proto3,enum=did.v1.KeyRole" json:"role,omitempty"`
+ Algorithm KeyAlgorithm `protobuf:"varint,2,opt,name=algorithm,proto3,enum=did.v1.KeyAlgorithm" json:"algorithm,omitempty"`
+ Encoding KeyEncoding `protobuf:"varint,3,opt,name=encoding,proto3,enum=did.v1.KeyEncoding" json:"encoding,omitempty"`
+ Curve KeyCurve `protobuf:"varint,4,opt,name=curve,proto3,enum=did.v1.KeyCurve" json:"curve,omitempty"`
+ KeyType KeyType `protobuf:"varint,5,opt,name=key_type,json=keyType,proto3,enum=did.v1.KeyType" json:"key_type,omitempty"`
+ Raw []byte `protobuf:"bytes,6,opt,name=raw,proto3" json:"raw,omitempty"`
+ Jwk *PubKey_JWK `protobuf:"bytes,7,opt,name=jwk,proto3" json:"jwk,omitempty"`
+}
+
+func (m *PubKey) Reset() { *m = PubKey{} }
+func (m *PubKey) String() string { return proto.CompactTextString(m) }
+func (*PubKey) ProtoMessage() {}
+func (*PubKey) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{5}
+}
+func (m *PubKey) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_PubKey.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *PubKey) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_PubKey.Merge(m, src)
+}
+func (m *PubKey) XXX_Size() int {
+ return m.Size()
+}
+func (m *PubKey) XXX_DiscardUnknown() {
+ xxx_messageInfo_PubKey.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PubKey proto.InternalMessageInfo
+
+func (m *PubKey) GetRole() KeyRole {
+ if m != nil {
+ return m.Role
+ }
+ return KeyRole_KEY_ROLE_UNSPECIFIED
+}
+
+func (m *PubKey) GetAlgorithm() KeyAlgorithm {
+ if m != nil {
+ return m.Algorithm
+ }
+ return KeyAlgorithm_KEY_ALGORITHM_UNSPECIFIED
+}
+
+func (m *PubKey) GetEncoding() KeyEncoding {
+ if m != nil {
+ return m.Encoding
+ }
+ return KeyEncoding_KEY_ENCODING_UNSPECIFIED
+}
+
+func (m *PubKey) GetCurve() KeyCurve {
+ if m != nil {
+ return m.Curve
+ }
+ return KeyCurve_KEY_CURVE_UNSPECIFIED
+}
+
+func (m *PubKey) GetKeyType() KeyType {
+ if m != nil {
+ return m.KeyType
+ }
+ return KeyType_KEY_TYPE_UNSPECIFIED
+}
+
+func (m *PubKey) GetRaw() []byte {
+ if m != nil {
+ return m.Raw
+ }
+ return nil
+}
+
+func (m *PubKey) GetJwk() *PubKey_JWK {
+ if m != nil {
+ return m.Jwk
+ }
+ return nil
+}
+
+// JWK represents a JSON Web Key
+type PubKey_JWK struct {
+ Kty string `protobuf:"bytes,1,opt,name=kty,proto3" json:"kty,omitempty"`
+ Crv string `protobuf:"bytes,2,opt,name=crv,proto3" json:"crv,omitempty"`
+ X string `protobuf:"bytes,3,opt,name=x,proto3" json:"x,omitempty"`
+ Y string `protobuf:"bytes,4,opt,name=y,proto3" json:"y,omitempty"`
+ N string `protobuf:"bytes,5,opt,name=n,proto3" json:"n,omitempty"`
+ E string `protobuf:"bytes,6,opt,name=e,proto3" json:"e,omitempty"`
+}
+
+func (m *PubKey_JWK) Reset() { *m = PubKey_JWK{} }
+func (m *PubKey_JWK) String() string { return proto.CompactTextString(m) }
+func (*PubKey_JWK) ProtoMessage() {}
+func (*PubKey_JWK) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{5, 0}
+}
+func (m *PubKey_JWK) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *PubKey_JWK) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_PubKey_JWK.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *PubKey_JWK) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_PubKey_JWK.Merge(m, src)
+}
+func (m *PubKey_JWK) XXX_Size() int {
+ return m.Size()
+}
+func (m *PubKey_JWK) XXX_DiscardUnknown() {
+ xxx_messageInfo_PubKey_JWK.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PubKey_JWK proto.InternalMessageInfo
+
+func (m *PubKey_JWK) GetKty() string {
+ if m != nil {
+ return m.Kty
+ }
+ return ""
+}
+
+func (m *PubKey_JWK) GetCrv() string {
+ if m != nil {
+ return m.Crv
+ }
+ return ""
+}
+
+func (m *PubKey_JWK) GetX() string {
+ if m != nil {
+ return m.X
+ }
+ return ""
+}
+
+func (m *PubKey_JWK) GetY() string {
+ if m != nil {
+ return m.Y
+ }
+ return ""
+}
+
+func (m *PubKey_JWK) GetN() string {
+ if m != nil {
+ return m.N
+ }
+ return ""
+}
+
+func (m *PubKey_JWK) GetE() string {
+ if m != nil {
+ return m.E
+ }
+ return ""
+}
+
+// Service defines a Decentralized Service on the Sonr Blockchain
+type Service struct {
+ Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+ ServiceType string `protobuf:"bytes,2,opt,name=service_type,json=serviceType,proto3" json:"service_type,omitempty"`
+ Authority string `protobuf:"bytes,3,opt,name=authority,proto3" json:"authority,omitempty"`
+ Origin string `protobuf:"bytes,4,opt,name=origin,proto3" json:"origin,omitempty"`
+ Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"`
+ ServiceEndpoints map[string]string `protobuf:"bytes,6,rep,name=service_endpoints,json=serviceEndpoints,proto3" json:"service_endpoints,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+ Permissions *Permissions `protobuf:"bytes,7,opt,name=permissions,proto3" json:"permissions,omitempty"`
+}
+
+func (m *Service) Reset() { *m = Service{} }
+func (m *Service) String() string { return proto.CompactTextString(m) }
+func (*Service) ProtoMessage() {}
+func (*Service) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{6}
+}
+func (m *Service) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_Service.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *Service) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Service.Merge(m, src)
+}
+func (m *Service) XXX_Size() int {
+ return m.Size()
+}
+func (m *Service) XXX_DiscardUnknown() {
+ xxx_messageInfo_Service.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Service proto.InternalMessageInfo
+
+func (m *Service) GetId() string {
+ if m != nil {
+ return m.Id
+ }
+ return ""
+}
+
+func (m *Service) GetServiceType() string {
+ if m != nil {
+ return m.ServiceType
+ }
+ return ""
+}
+
+func (m *Service) GetAuthority() string {
+ if m != nil {
+ return m.Authority
+ }
+ return ""
+}
+
+func (m *Service) GetOrigin() string {
+ if m != nil {
+ return m.Origin
+ }
+ return ""
+}
+
+func (m *Service) GetDescription() string {
+ if m != nil {
+ return m.Description
+ }
+ return ""
+}
+
+func (m *Service) GetServiceEndpoints() map[string]string {
+ if m != nil {
+ return m.ServiceEndpoints
+ }
+ return nil
+}
+
+func (m *Service) GetPermissions() *Permissions {
+ if m != nil {
+ return m.Permissions
+ }
+ return nil
+}
+
+// ServicceInfo defines a Decentralized Service on the Sonr Blockchain
+type ServiceInfo struct {
+ Exists bool `protobuf:"varint,1,opt,name=exists,proto3" json:"exists,omitempty"`
+ Origin string `protobuf:"bytes,2,opt,name=origin,proto3" json:"origin,omitempty"`
+ Fingerprint string `protobuf:"bytes,3,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"`
+ Service *Service `protobuf:"bytes,4,opt,name=service,proto3" json:"service,omitempty"`
+}
+
+func (m *ServiceInfo) Reset() { *m = ServiceInfo{} }
+func (m *ServiceInfo) String() string { return proto.CompactTextString(m) }
+func (*ServiceInfo) ProtoMessage() {}
+func (*ServiceInfo) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{7}
+}
+func (m *ServiceInfo) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *ServiceInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_ServiceInfo.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *ServiceInfo) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ServiceInfo.Merge(m, src)
+}
+func (m *ServiceInfo) XXX_Size() int {
+ return m.Size()
+}
+func (m *ServiceInfo) XXX_DiscardUnknown() {
+ xxx_messageInfo_ServiceInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ServiceInfo proto.InternalMessageInfo
+
+func (m *ServiceInfo) GetExists() bool {
+ if m != nil {
+ return m.Exists
+ }
+ return false
+}
+
+func (m *ServiceInfo) GetOrigin() string {
+ if m != nil {
+ return m.Origin
+ }
+ return ""
+}
+
+func (m *ServiceInfo) GetFingerprint() string {
+ if m != nil {
+ return m.Fingerprint
+ }
+ return ""
+}
+
+func (m *ServiceInfo) GetService() *Service {
+ if m != nil {
+ return m.Service
+ }
+ return nil
+}
+
+// FirstPartyCaveat defines a first party caveat
+type FirstPartyCaveat struct {
+ Scope *Permissions `protobuf:"bytes,1,opt,name=scope,proto3" json:"scope,omitempty"`
+ Exp int64 `protobuf:"varint,2,opt,name=exp,proto3" json:"exp,omitempty"`
+ Cnf string `protobuf:"bytes,3,opt,name=cnf,proto3" json:"cnf,omitempty"`
+ Aud string `protobuf:"bytes,4,opt,name=aud,proto3" json:"aud,omitempty"`
+}
+
+func (m *FirstPartyCaveat) Reset() { *m = FirstPartyCaveat{} }
+func (m *FirstPartyCaveat) String() string { return proto.CompactTextString(m) }
+func (*FirstPartyCaveat) ProtoMessage() {}
+func (*FirstPartyCaveat) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{8}
+}
+func (m *FirstPartyCaveat) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *FirstPartyCaveat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_FirstPartyCaveat.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *FirstPartyCaveat) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_FirstPartyCaveat.Merge(m, src)
+}
+func (m *FirstPartyCaveat) XXX_Size() int {
+ return m.Size()
+}
+func (m *FirstPartyCaveat) XXX_DiscardUnknown() {
+ xxx_messageInfo_FirstPartyCaveat.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FirstPartyCaveat proto.InternalMessageInfo
+
+func (m *FirstPartyCaveat) GetScope() *Permissions {
+ if m != nil {
+ return m.Scope
+ }
+ return nil
+}
+
+func (m *FirstPartyCaveat) GetExp() int64 {
+ if m != nil {
+ return m.Exp
+ }
+ return 0
+}
+
+func (m *FirstPartyCaveat) GetCnf() string {
+ if m != nil {
+ return m.Cnf
+ }
+ return ""
+}
+
+func (m *FirstPartyCaveat) GetAud() string {
+ if m != nil {
+ return m.Aud
+ }
+ return ""
+}
+
+// ThirdPartyCaveat defines a third party caveat
+type ThirdPartyCaveat struct {
+ Scope *Permissions `protobuf:"bytes,1,opt,name=scope,proto3" json:"scope,omitempty"`
+ Exp int64 `protobuf:"varint,2,opt,name=exp,proto3" json:"exp,omitempty"`
+ Cnf string `protobuf:"bytes,3,opt,name=cnf,proto3" json:"cnf,omitempty"`
+ Aud string `protobuf:"bytes,4,opt,name=aud,proto3" json:"aud,omitempty"`
+}
+
+func (m *ThirdPartyCaveat) Reset() { *m = ThirdPartyCaveat{} }
+func (m *ThirdPartyCaveat) String() string { return proto.CompactTextString(m) }
+func (*ThirdPartyCaveat) ProtoMessage() {}
+func (*ThirdPartyCaveat) Descriptor() ([]byte, []int) {
+ return fileDescriptor_739bb5ab5cb60751, []int{9}
+}
+func (m *ThirdPartyCaveat) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *ThirdPartyCaveat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_ThirdPartyCaveat.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *ThirdPartyCaveat) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ThirdPartyCaveat.Merge(m, src)
+}
+func (m *ThirdPartyCaveat) XXX_Size() int {
+ return m.Size()
+}
+func (m *ThirdPartyCaveat) XXX_DiscardUnknown() {
+ xxx_messageInfo_ThirdPartyCaveat.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ThirdPartyCaveat proto.InternalMessageInfo
+
+func (m *ThirdPartyCaveat) GetScope() *Permissions {
+ if m != nil {
+ return m.Scope
+ }
+ return nil
+}
+
+func (m *ThirdPartyCaveat) GetExp() int64 {
+ if m != nil {
+ return m.Exp
+ }
+ return 0
+}
+
+func (m *ThirdPartyCaveat) GetCnf() string {
+ if m != nil {
+ return m.Cnf
+ }
+ return ""
+}
+
+func (m *ThirdPartyCaveat) GetAud() string {
+ if m != nil {
+ return m.Aud
+ }
+ return ""
+}
+
+func init() {
+ proto.RegisterType((*Alias)(nil), "did.v1.Alias")
+ proto.RegisterType((*Credential)(nil), "did.v1.Credential")
+ proto.RegisterType((*Document)(nil), "did.v1.Document")
+ proto.RegisterType((*Keyshare)(nil), "did.v1.Keyshare")
+ proto.RegisterMapType((map[string]string)(nil), "did.v1.Keyshare.MetadataEntry")
+ proto.RegisterMapType((map[string][]byte)(nil), "did.v1.Keyshare.PayloadsEntry")
+ proto.RegisterType((*Permissions)(nil), "did.v1.Permissions")
+ proto.RegisterType((*PubKey)(nil), "did.v1.PubKey")
+ proto.RegisterType((*PubKey_JWK)(nil), "did.v1.PubKey.JWK")
+ proto.RegisterType((*Service)(nil), "did.v1.Service")
+ proto.RegisterMapType((map[string]string)(nil), "did.v1.Service.ServiceEndpointsEntry")
+ proto.RegisterType((*ServiceInfo)(nil), "did.v1.ServiceInfo")
+ proto.RegisterType((*FirstPartyCaveat)(nil), "did.v1.FirstPartyCaveat")
+ proto.RegisterType((*ThirdPartyCaveat)(nil), "did.v1.ThirdPartyCaveat")
+}
+
+func init() { proto.RegisterFile("did/v1/models.proto", fileDescriptor_739bb5ab5cb60751) }
+
+var fileDescriptor_739bb5ab5cb60751 = []byte{
+ // 1146 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcf, 0x6e, 0xdb, 0xc6,
+ 0x13, 0x0e, 0x45, 0x4b, 0x96, 0x46, 0x8a, 0xec, 0xdf, 0xc6, 0xf9, 0x95, 0x30, 0x52, 0x41, 0x51,
+ 0xda, 0x54, 0x29, 0x0a, 0x09, 0x51, 0x50, 0xa0, 0x48, 0x7b, 0x49, 0x6d, 0x17, 0x70, 0x8c, 0x14,
+ 0x06, 0x13, 0x34, 0x68, 0x2f, 0xc2, 0x8a, 0x1c, 0xcb, 0x1b, 0x53, 0x5c, 0x62, 0x77, 0xa9, 0x98,
+ 0xc7, 0x5e, 0x7b, 0x6a, 0x9f, 0xa1, 0x2f, 0xd3, 0x63, 0x8e, 0x3d, 0x16, 0x49, 0xfb, 0x1e, 0xc5,
+ 0xfe, 0xa1, 0x44, 0x2b, 0x4d, 0x8b, 0x5e, 0x7a, 0xb1, 0x77, 0xbe, 0xf9, 0x86, 0x33, 0xfc, 0x66,
+ 0x66, 0x29, 0xb8, 0x11, 0xb3, 0x78, 0xbc, 0xbc, 0x3f, 0x5e, 0xf0, 0x18, 0x13, 0x39, 0xca, 0x04,
+ 0x57, 0x9c, 0x34, 0x62, 0x16, 0x8f, 0x96, 0xf7, 0xf7, 0xf7, 0x9c, 0x73, 0x8e, 0x29, 0x4a, 0xe6,
+ 0xbc, 0xfb, 0x7b, 0x73, 0x3e, 0xe7, 0xe6, 0x38, 0xd6, 0x27, 0x8b, 0x0e, 0xbe, 0x85, 0xfa, 0xa3,
+ 0x84, 0x51, 0x49, 0x02, 0xd8, 0x96, 0xf9, 0xec, 0x05, 0x46, 0x2a, 0xf0, 0xfa, 0xde, 0xb0, 0x15,
+ 0x96, 0x26, 0xf9, 0x3f, 0x34, 0xb8, 0x60, 0x73, 0x96, 0x06, 0x35, 0xe3, 0x70, 0x16, 0xe9, 0x01,
+ 0x44, 0x3c, 0x55, 0x82, 0x27, 0x09, 0x8a, 0xc0, 0x37, 0xbe, 0x0a, 0x32, 0xf8, 0xd9, 0x07, 0x38,
+ 0x10, 0x18, 0x63, 0xaa, 0x18, 0x4d, 0xfe, 0x26, 0xc1, 0x3d, 0xd8, 0xa5, 0x4a, 0xa1, 0x54, 0x54,
+ 0x31, 0x9e, 0x4e, 0x55, 0x91, 0xa1, 0x4b, 0xb5, 0x53, 0xc1, 0x9f, 0x15, 0x19, 0x56, 0x6a, 0xf1,
+ 0xaf, 0xd4, 0x72, 0x07, 0xae, 0x47, 0xab, 0x54, 0x53, 0x16, 0x07, 0x5b, 0x7d, 0x6f, 0xd8, 0x09,
+ 0x3b, 0x6b, 0xf0, 0x38, 0x26, 0xef, 0x03, 0x64, 0xf9, 0x2c, 0x61, 0xd1, 0xf4, 0x02, 0x8b, 0xa0,
+ 0x6e, 0x18, 0x2d, 0x8b, 0x9c, 0x60, 0x41, 0x6e, 0x41, 0x4b, 0x09, 0x9a, 0xca, 0x8c, 0x0b, 0x15,
+ 0x34, 0xfa, 0xfe, 0xb0, 0x15, 0xae, 0x01, 0x1d, 0x2c, 0xd9, 0x3c, 0x9d, 0x46, 0x3c, 0x4f, 0x55,
+ 0xb0, 0xdd, 0xf7, 0x86, 0xd7, 0xc3, 0x96, 0x46, 0x0e, 0x34, 0x40, 0x6e, 0x43, 0x27, 0x97, 0x28,
+ 0xa6, 0x99, 0x40, 0x89, 0xa9, 0x0a, 0x9a, 0x7d, 0x6f, 0xd8, 0x0c, 0xdb, 0x1a, 0x3b, 0xb5, 0x90,
+ 0xae, 0xd1, 0x50, 0x96, 0x28, 0xd8, 0x19, 0xc3, 0x38, 0x68, 0x19, 0x8e, 0x89, 0xfb, 0xc6, 0x61,
+ 0xe4, 0x23, 0xd8, 0x99, 0xd1, 0xe8, 0x22, 0xcf, 0xa6, 0x98, 0xb0, 0x39, 0x9b, 0x25, 0x18, 0x80,
+ 0xa1, 0x75, 0x2d, 0x7c, 0xe4, 0x50, 0x9d, 0xd0, 0x11, 0xb5, 0x3e, 0x18, 0xb4, 0x6d, 0x42, 0x8b,
+ 0x3d, 0xd5, 0x90, 0x11, 0x25, 0xe1, 0x29, 0x4e, 0x5f, 0x52, 0x91, 0xb2, 0x74, 0x1e, 0x74, 0x6c,
+ 0x42, 0x03, 0x3e, 0xb7, 0xd8, 0xe0, 0xa7, 0x1a, 0x34, 0x0f, 0x79, 0x94, 0x2f, 0x74, 0x89, 0x5d,
+ 0xa8, 0xb1, 0xd8, 0xb5, 0xa7, 0xc6, 0xe2, 0x8d, 0x16, 0xd7, 0x36, 0x5b, 0x4c, 0xee, 0x42, 0x97,
+ 0xe6, 0xea, 0x5c, 0x2b, 0x1c, 0x99, 0x26, 0x05, 0xbe, 0xd1, 0x6d, 0x03, 0x35, 0x1d, 0x96, 0x12,
+ 0x85, 0xe9, 0xef, 0x02, 0xd5, 0x39, 0xd7, 0x1d, 0xf2, 0x4d, 0x87, 0x4b, 0xfc, 0x89, 0x81, 0xc9,
+ 0x03, 0xb8, 0x19, 0xd1, 0x8c, 0xce, 0x58, 0xc2, 0x54, 0x31, 0x8d, 0x31, 0xc1, 0xb9, 0x7d, 0x72,
+ 0xdd, 0xf0, 0xf7, 0xd6, 0xce, 0xc3, 0x95, 0x6f, 0x23, 0x88, 0xa5, 0x4b, 0xee, 0xca, 0x69, 0x6c,
+ 0x06, 0x1d, 0xaf, 0x7c, 0x66, 0x20, 0x51, 0x2c, 0x59, 0x84, 0xc1, 0xb6, 0xa1, 0x95, 0xe6, 0xe0,
+ 0x8f, 0x1a, 0x34, 0x4f, 0xb0, 0x90, 0xe7, 0x54, 0x20, 0x79, 0x08, 0xcd, 0x05, 0x2a, 0x1a, 0x53,
+ 0x45, 0x03, 0xaf, 0xef, 0x0f, 0xdb, 0x93, 0xde, 0xc8, 0x2e, 0xda, 0xa8, 0xe4, 0x8c, 0x9e, 0x38,
+ 0xc2, 0x51, 0xaa, 0x44, 0x11, 0xae, 0xf8, 0x3a, 0x36, 0xa3, 0x45, 0xc2, 0x69, 0x2c, 0x83, 0xda,
+ 0x3b, 0x62, 0x4f, 0x1d, 0xc1, 0xc5, 0x96, 0x7c, 0xb2, 0x0f, 0x4d, 0xb3, 0xa2, 0x11, 0x4f, 0xdc,
+ 0xb0, 0xaf, 0xec, 0x8d, 0x49, 0xde, 0xda, 0x9c, 0xe4, 0x00, 0xb6, 0x97, 0x28, 0xa4, 0x55, 0x4d,
+ 0x0f, 0x6a, 0x69, 0x12, 0x02, 0x5b, 0x82, 0x27, 0x18, 0x34, 0xfa, 0xde, 0xb0, 0x1e, 0x9a, 0xf3,
+ 0xfe, 0xe7, 0x70, 0xfd, 0x4a, 0xfd, 0x64, 0x17, 0x7c, 0xfd, 0x58, 0x3b, 0x06, 0xfa, 0x48, 0xf6,
+ 0xa0, 0xbe, 0xa4, 0x49, 0x5e, 0xae, 0xa5, 0x35, 0x1e, 0xd6, 0x3e, 0xf3, 0x74, 0xf0, 0x95, 0x17,
+ 0xf8, 0xa7, 0xe0, 0x4e, 0x25, 0x78, 0x90, 0x40, 0xfb, 0x14, 0xc5, 0x82, 0x49, 0x5d, 0x9b, 0x24,
+ 0x9f, 0x40, 0x63, 0x2e, 0x68, 0xaa, 0xa4, 0xd1, 0xb9, 0x3b, 0xd9, 0x2b, 0xb5, 0x3a, 0x3c, 0x3e,
+ 0xfc, 0x9a, 0x2e, 0x50, 0x66, 0x34, 0xc2, 0xd0, 0x71, 0xc8, 0x18, 0x1a, 0x32, 0xe2, 0x19, 0x5a,
+ 0x65, 0xbb, 0x93, 0xf7, 0x4a, 0xf6, 0xfa, 0x91, 0x4f, 0xb5, 0x3f, 0x74, 0xb4, 0xc1, 0xf7, 0x3e,
+ 0x34, 0x4e, 0xf3, 0x99, 0x16, 0xe8, 0x8e, 0x93, 0x41, 0x57, 0xd9, 0x9d, 0xec, 0x54, 0x7a, 0x12,
+ 0xf2, 0x04, 0xad, 0x2e, 0x64, 0x02, 0x2d, 0x9a, 0xcc, 0xb9, 0x60, 0xea, 0x7c, 0x61, 0x6a, 0xaf,
+ 0x54, 0x74, 0x82, 0xc5, 0xa3, 0xd2, 0x17, 0xae, 0x69, 0x64, 0x0c, 0x4d, 0x4c, 0x23, 0x1e, 0xeb,
+ 0x6d, 0xf3, 0x4d, 0xc8, 0x8d, 0x4a, 0xc8, 0x91, 0x73, 0x85, 0x2b, 0x12, 0xb9, 0x0b, 0xf5, 0x28,
+ 0x17, 0x4b, 0x34, 0x4d, 0xec, 0x4e, 0x76, 0x2b, 0xec, 0x03, 0x8d, 0x87, 0xd6, 0x4d, 0x3e, 0x86,
+ 0xe6, 0x05, 0x16, 0xf6, 0x6e, 0xac, 0xbf, 0x55, 0xb5, 0xbe, 0x1b, 0xc3, 0xed, 0x0b, 0x7b, 0xd0,
+ 0x2d, 0x10, 0xf4, 0xa5, 0xe9, 0x71, 0x27, 0xd4, 0x47, 0xf2, 0x01, 0xf8, 0x2f, 0x5e, 0x5e, 0x98,
+ 0x5b, 0xab, 0x3d, 0x21, 0x2b, 0xa1, 0x8c, 0x18, 0xa3, 0xc7, 0xcf, 0x4f, 0x42, 0xed, 0xde, 0xa7,
+ 0xe0, 0x3f, 0x7e, 0x7e, 0x62, 0x3a, 0xa8, 0xd6, 0x1d, 0x54, 0xa6, 0xa7, 0x91, 0x58, 0xba, 0xe6,
+ 0xeb, 0x23, 0xe9, 0x80, 0x77, 0xe9, 0xa6, 0xd2, 0xbb, 0xd4, 0x96, 0x9d, 0xc2, 0x56, 0xe8, 0x15,
+ 0xda, 0xb2, 0x73, 0xd7, 0x0a, 0xbd, 0x54, 0x5b, 0x76, 0xdc, 0x5a, 0xa1, 0x87, 0x83, 0xdf, 0x6b,
+ 0xb0, 0xfd, 0xd4, 0x6e, 0xd9, 0x5b, 0x97, 0xcd, 0x6d, 0xe8, 0xb8, 0x05, 0xac, 0x7e, 0x02, 0xda,
+ 0x0e, 0x33, 0x6f, 0x76, 0x0b, 0x5a, 0xfa, 0x66, 0xd1, 0x62, 0x17, 0x2e, 0xfd, 0x1a, 0xa8, 0x7c,
+ 0x1c, 0xb6, 0xae, 0x7c, 0x1c, 0xfa, 0xd0, 0x8e, 0x51, 0x46, 0x82, 0x65, 0xaa, 0x5c, 0x89, 0x56,
+ 0x58, 0x85, 0x48, 0x08, 0xff, 0x2b, 0x53, 0x63, 0x1a, 0x67, 0x9c, 0xe9, 0x21, 0x6c, 0x98, 0x85,
+ 0xfd, 0xb0, 0x54, 0xcb, 0x95, 0x5d, 0xfe, 0x3f, 0x2a, 0x79, 0x76, 0x6f, 0x77, 0xe5, 0x06, 0x4c,
+ 0x3e, 0x85, 0x76, 0xb6, 0x1e, 0x6e, 0xa7, 0xfd, 0x8d, 0xb7, 0x87, 0x54, 0x86, 0x55, 0xde, 0xfe,
+ 0x01, 0xdc, 0xfc, 0xcb, 0x0c, 0xff, 0x66, 0x2b, 0x07, 0x3f, 0x78, 0xd0, 0x76, 0x4f, 0x39, 0x4e,
+ 0xcf, 0xb8, 0x56, 0x06, 0x2f, 0x99, 0x34, 0x9b, 0xa5, 0x3f, 0x01, 0xce, 0x7a, 0xe7, 0xa7, 0xbd,
+ 0x0f, 0xed, 0x33, 0x96, 0xce, 0x51, 0x64, 0x82, 0xa5, 0xca, 0x29, 0x5d, 0x85, 0xc8, 0xbd, 0xf5,
+ 0xe5, 0xb9, 0x65, 0xde, 0x6c, 0x67, 0x43, 0xa7, 0xf5, 0x6d, 0x2a, 0x61, 0xf7, 0x2b, 0x26, 0xa4,
+ 0x3a, 0xa5, 0x42, 0x15, 0x07, 0x74, 0x89, 0x54, 0x87, 0xd7, 0xcd, 0x56, 0x9a, 0x7a, 0xde, 0x21,
+ 0x8b, 0x65, 0xe8, 0xf7, 0xc6, 0xcb, 0xcc, 0x14, 0xe8, 0x87, 0xfa, 0x68, 0xc6, 0x31, 0x3d, 0x73,
+ 0x55, 0xe9, 0xa3, 0x46, 0x68, 0x1e, 0xbb, 0xb6, 0xeb, 0xa3, 0x4e, 0xfa, 0xec, 0x9c, 0x89, 0xf8,
+ 0xbf, 0x4c, 0xfa, 0xe5, 0x17, 0xbf, 0xbc, 0xee, 0x79, 0xaf, 0x5e, 0xf7, 0xbc, 0xdf, 0x5e, 0xf7,
+ 0xbc, 0x1f, 0xdf, 0xf4, 0xae, 0xbd, 0x7a, 0xd3, 0xbb, 0xf6, 0xeb, 0x9b, 0xde, 0xb5, 0xef, 0x06,
+ 0x73, 0xa6, 0xce, 0xf3, 0xd9, 0x28, 0xe2, 0x8b, 0x31, 0x4f, 0x25, 0x4f, 0xc5, 0xd8, 0xfc, 0xb9,
+ 0x1c, 0xeb, 0xdf, 0x6a, 0x7a, 0xdc, 0xe5, 0xac, 0x61, 0xae, 0xf7, 0x07, 0x7f, 0x06, 0x00, 0x00,
+ 0xff, 0xff, 0x38, 0x84, 0xad, 0x32, 0xdc, 0x09, 0x00, 0x00,
+}
+
+func (m *Alias) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *Alias) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Alias) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.Controller) > 0 {
+ i -= len(m.Controller)
+ copy(dAtA[i:], m.Controller)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Controller)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if len(m.Origin) > 0 {
+ i -= len(m.Origin)
+ copy(dAtA[i:], m.Origin)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Origin)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.Subject) > 0 {
+ i -= len(m.Subject)
+ copy(dAtA[i:], m.Subject)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Subject)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *Credential) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *Credential) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Credential) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.CloneWarning {
+ i--
+ if m.CloneWarning {
+ dAtA[i] = 1
+ } else {
+ dAtA[i] = 0
+ }
+ i--
+ dAtA[i] = 0x60
+ }
+ if m.BackupState {
+ i--
+ if m.BackupState {
+ dAtA[i] = 1
+ } else {
+ dAtA[i] = 0
+ }
+ i--
+ dAtA[i] = 0x58
+ }
+ if m.BackupEligible {
+ i--
+ if m.BackupEligible {
+ dAtA[i] = 1
+ } else {
+ dAtA[i] = 0
+ }
+ i--
+ dAtA[i] = 0x50
+ }
+ if m.UserVerified {
+ i--
+ if m.UserVerified {
+ dAtA[i] = 1
+ } else {
+ dAtA[i] = 0
+ }
+ i--
+ dAtA[i] = 0x48
+ }
+ if m.UserPresent {
+ i--
+ if m.UserPresent {
+ dAtA[i] = 1
+ } else {
+ dAtA[i] = 0
+ }
+ i--
+ dAtA[i] = 0x40
+ }
+ if m.SignCount != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.SignCount))
+ i--
+ dAtA[i] = 0x38
+ }
+ if len(m.Transport) > 0 {
+ for iNdEx := len(m.Transport) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.Transport[iNdEx])
+ copy(dAtA[i:], m.Transport[iNdEx])
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Transport[iNdEx])))
+ i--
+ dAtA[i] = 0x32
+ }
+ }
+ if len(m.PublicKey) > 0 {
+ i -= len(m.PublicKey)
+ copy(dAtA[i:], m.PublicKey)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.PublicKey)))
+ i--
+ dAtA[i] = 0x2a
+ }
+ if len(m.CredentialId) > 0 {
+ i -= len(m.CredentialId)
+ copy(dAtA[i:], m.CredentialId)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.CredentialId)))
+ i--
+ dAtA[i] = 0x22
+ }
+ if len(m.Origin) > 0 {
+ i -= len(m.Origin)
+ copy(dAtA[i:], m.Origin)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Origin)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if len(m.AttestationType) > 0 {
+ i -= len(m.AttestationType)
+ copy(dAtA[i:], m.AttestationType)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.AttestationType)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.Subject) > 0 {
+ i -= len(m.Subject)
+ copy(dAtA[i:], m.Subject)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Subject)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *Document) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *Document) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Document) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.Service) > 0 {
+ for iNdEx := len(m.Service) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.Service[iNdEx])
+ copy(dAtA[i:], m.Service[iNdEx])
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Service[iNdEx])))
+ i--
+ dAtA[i] = 0x3a
+ }
+ }
+ if len(m.CapabilityInvocation) > 0 {
+ for iNdEx := len(m.CapabilityInvocation) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.CapabilityInvocation[iNdEx])
+ copy(dAtA[i:], m.CapabilityInvocation[iNdEx])
+ i = encodeVarintModels(dAtA, i, uint64(len(m.CapabilityInvocation[iNdEx])))
+ i--
+ dAtA[i] = 0x32
+ }
+ }
+ if len(m.CapabilityDelegation) > 0 {
+ for iNdEx := len(m.CapabilityDelegation) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.CapabilityDelegation[iNdEx])
+ copy(dAtA[i:], m.CapabilityDelegation[iNdEx])
+ i = encodeVarintModels(dAtA, i, uint64(len(m.CapabilityDelegation[iNdEx])))
+ i--
+ dAtA[i] = 0x2a
+ }
+ }
+ if len(m.AssertionMethod) > 0 {
+ for iNdEx := len(m.AssertionMethod) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.AssertionMethod[iNdEx])
+ copy(dAtA[i:], m.AssertionMethod[iNdEx])
+ i = encodeVarintModels(dAtA, i, uint64(len(m.AssertionMethod[iNdEx])))
+ i--
+ dAtA[i] = 0x22
+ }
+ }
+ if len(m.Authentication) > 0 {
+ for iNdEx := len(m.Authentication) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.Authentication[iNdEx])
+ copy(dAtA[i:], m.Authentication[iNdEx])
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Authentication[iNdEx])))
+ i--
+ dAtA[i] = 0x1a
+ }
+ }
+ if len(m.Controller) > 0 {
+ i -= len(m.Controller)
+ copy(dAtA[i:], m.Controller)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Controller)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.Id) > 0 {
+ i -= len(m.Id)
+ copy(dAtA[i:], m.Id)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Id)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *Keyshare) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *Keyshare) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Keyshare) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.Role != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.Role))
+ i--
+ dAtA[i] = 0x30
+ }
+ if m.Version != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.Version))
+ i--
+ dAtA[i] = 0x28
+ }
+ if len(m.PublicKey) > 0 {
+ i -= len(m.PublicKey)
+ copy(dAtA[i:], m.PublicKey)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.PublicKey)))
+ i--
+ dAtA[i] = 0x22
+ }
+ if len(m.Protocol) > 0 {
+ i -= len(m.Protocol)
+ copy(dAtA[i:], m.Protocol)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Protocol)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if len(m.Payloads) > 0 {
+ for k := range m.Payloads {
+ v := m.Payloads[k]
+ baseI := i
+ if len(v) > 0 {
+ i -= len(v)
+ copy(dAtA[i:], v)
+ i = encodeVarintModels(dAtA, i, uint64(len(v)))
+ i--
+ dAtA[i] = 0x12
+ }
+ i -= len(k)
+ copy(dAtA[i:], k)
+ i = encodeVarintModels(dAtA, i, uint64(len(k)))
+ i--
+ dAtA[i] = 0xa
+ i = encodeVarintModels(dAtA, i, uint64(baseI-i))
+ i--
+ dAtA[i] = 0x12
+ }
+ }
+ if len(m.Metadata) > 0 {
+ for k := range m.Metadata {
+ v := m.Metadata[k]
+ baseI := i
+ i -= len(v)
+ copy(dAtA[i:], v)
+ i = encodeVarintModels(dAtA, i, uint64(len(v)))
+ i--
+ dAtA[i] = 0x12
+ i -= len(k)
+ copy(dAtA[i:], k)
+ i = encodeVarintModels(dAtA, i, uint64(len(k)))
+ i--
+ dAtA[i] = 0xa
+ i = encodeVarintModels(dAtA, i, uint64(baseI-i))
+ i--
+ dAtA[i] = 0xa
+ }
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *Permissions) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *Permissions) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Permissions) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.Scopes) > 0 {
+ dAtA2 := make([]byte, len(m.Scopes)*10)
+ var j1 int
+ for _, num := range m.Scopes {
+ for num >= 1<<7 {
+ dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80)
+ num >>= 7
+ j1++
+ }
+ dAtA2[j1] = uint8(num)
+ j1++
+ }
+ i -= j1
+ copy(dAtA[i:], dAtA2[:j1])
+ i = encodeVarintModels(dAtA, i, uint64(j1))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.Grants) > 0 {
+ dAtA4 := make([]byte, len(m.Grants)*10)
+ var j3 int
+ for _, num := range m.Grants {
+ for num >= 1<<7 {
+ dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80)
+ num >>= 7
+ j3++
+ }
+ dAtA4[j3] = uint8(num)
+ j3++
+ }
+ i -= j3
+ copy(dAtA[i:], dAtA4[:j3])
+ i = encodeVarintModels(dAtA, i, uint64(j3))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *PubKey) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *PubKey) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.Jwk != nil {
+ {
+ size, err := m.Jwk.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintModels(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x3a
+ }
+ if len(m.Raw) > 0 {
+ i -= len(m.Raw)
+ copy(dAtA[i:], m.Raw)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Raw)))
+ i--
+ dAtA[i] = 0x32
+ }
+ if m.KeyType != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.KeyType))
+ i--
+ dAtA[i] = 0x28
+ }
+ if m.Curve != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.Curve))
+ i--
+ dAtA[i] = 0x20
+ }
+ if m.Encoding != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.Encoding))
+ i--
+ dAtA[i] = 0x18
+ }
+ if m.Algorithm != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.Algorithm))
+ i--
+ dAtA[i] = 0x10
+ }
+ if m.Role != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.Role))
+ i--
+ dAtA[i] = 0x8
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *PubKey_JWK) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *PubKey_JWK) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *PubKey_JWK) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.E) > 0 {
+ i -= len(m.E)
+ copy(dAtA[i:], m.E)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.E)))
+ i--
+ dAtA[i] = 0x32
+ }
+ if len(m.N) > 0 {
+ i -= len(m.N)
+ copy(dAtA[i:], m.N)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.N)))
+ i--
+ dAtA[i] = 0x2a
+ }
+ if len(m.Y) > 0 {
+ i -= len(m.Y)
+ copy(dAtA[i:], m.Y)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Y)))
+ i--
+ dAtA[i] = 0x22
+ }
+ if len(m.X) > 0 {
+ i -= len(m.X)
+ copy(dAtA[i:], m.X)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.X)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if len(m.Crv) > 0 {
+ i -= len(m.Crv)
+ copy(dAtA[i:], m.Crv)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Crv)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.Kty) > 0 {
+ i -= len(m.Kty)
+ copy(dAtA[i:], m.Kty)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Kty)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *Service) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *Service) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Service) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.Permissions != nil {
+ {
+ size, err := m.Permissions.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintModels(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x3a
+ }
+ if len(m.ServiceEndpoints) > 0 {
+ for k := range m.ServiceEndpoints {
+ v := m.ServiceEndpoints[k]
+ baseI := i
+ i -= len(v)
+ copy(dAtA[i:], v)
+ i = encodeVarintModels(dAtA, i, uint64(len(v)))
+ i--
+ dAtA[i] = 0x12
+ i -= len(k)
+ copy(dAtA[i:], k)
+ i = encodeVarintModels(dAtA, i, uint64(len(k)))
+ i--
+ dAtA[i] = 0xa
+ i = encodeVarintModels(dAtA, i, uint64(baseI-i))
+ i--
+ dAtA[i] = 0x32
+ }
+ }
+ if len(m.Description) > 0 {
+ i -= len(m.Description)
+ copy(dAtA[i:], m.Description)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Description)))
+ i--
+ dAtA[i] = 0x2a
+ }
+ if len(m.Origin) > 0 {
+ i -= len(m.Origin)
+ copy(dAtA[i:], m.Origin)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Origin)))
+ i--
+ dAtA[i] = 0x22
+ }
+ if len(m.Authority) > 0 {
+ i -= len(m.Authority)
+ copy(dAtA[i:], m.Authority)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Authority)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if len(m.ServiceType) > 0 {
+ i -= len(m.ServiceType)
+ copy(dAtA[i:], m.ServiceType)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.ServiceType)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if len(m.Id) > 0 {
+ i -= len(m.Id)
+ copy(dAtA[i:], m.Id)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Id)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *ServiceInfo) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *ServiceInfo) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *ServiceInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.Service != nil {
+ {
+ size, err := m.Service.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintModels(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x22
+ }
+ if len(m.Fingerprint) > 0 {
+ i -= len(m.Fingerprint)
+ copy(dAtA[i:], m.Fingerprint)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Fingerprint)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if len(m.Origin) > 0 {
+ i -= len(m.Origin)
+ copy(dAtA[i:], m.Origin)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Origin)))
+ i--
+ dAtA[i] = 0x12
+ }
+ if m.Exists {
+ i--
+ if m.Exists {
+ dAtA[i] = 1
+ } else {
+ dAtA[i] = 0
+ }
+ i--
+ dAtA[i] = 0x8
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *FirstPartyCaveat) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *FirstPartyCaveat) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *FirstPartyCaveat) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.Aud) > 0 {
+ i -= len(m.Aud)
+ copy(dAtA[i:], m.Aud)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Aud)))
+ i--
+ dAtA[i] = 0x22
+ }
+ if len(m.Cnf) > 0 {
+ i -= len(m.Cnf)
+ copy(dAtA[i:], m.Cnf)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Cnf)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if m.Exp != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.Exp))
+ i--
+ dAtA[i] = 0x10
+ }
+ if m.Scope != nil {
+ {
+ size, err := m.Scope.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintModels(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *ThirdPartyCaveat) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *ThirdPartyCaveat) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *ThirdPartyCaveat) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.Aud) > 0 {
+ i -= len(m.Aud)
+ copy(dAtA[i:], m.Aud)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Aud)))
+ i--
+ dAtA[i] = 0x22
+ }
+ if len(m.Cnf) > 0 {
+ i -= len(m.Cnf)
+ copy(dAtA[i:], m.Cnf)
+ i = encodeVarintModels(dAtA, i, uint64(len(m.Cnf)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ if m.Exp != 0 {
+ i = encodeVarintModels(dAtA, i, uint64(m.Exp))
+ i--
+ dAtA[i] = 0x10
+ }
+ if m.Scope != nil {
+ {
+ size, err := m.Scope.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintModels(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func encodeVarintModels(dAtA []byte, offset int, v uint64) int {
+ offset -= sovModels(v)
+ base := offset
+ for v >= 1<<7 {
+ dAtA[offset] = uint8(v&0x7f | 0x80)
+ v >>= 7
+ offset++
+ }
+ dAtA[offset] = uint8(v)
+ return base
+}
+func (m *Alias) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Subject)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Origin)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Controller)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ return n
+}
+
+func (m *Credential) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Subject)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.AttestationType)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Origin)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.CredentialId)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.PublicKey)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ if len(m.Transport) > 0 {
+ for _, s := range m.Transport {
+ l = len(s)
+ n += 1 + l + sovModels(uint64(l))
+ }
+ }
+ if m.SignCount != 0 {
+ n += 1 + sovModels(uint64(m.SignCount))
+ }
+ if m.UserPresent {
+ n += 2
+ }
+ if m.UserVerified {
+ n += 2
+ }
+ if m.BackupEligible {
+ n += 2
+ }
+ if m.BackupState {
+ n += 2
+ }
+ if m.CloneWarning {
+ n += 2
+ }
+ return n
+}
+
+func (m *Document) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Id)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Controller)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ if len(m.Authentication) > 0 {
+ for _, s := range m.Authentication {
+ l = len(s)
+ n += 1 + l + sovModels(uint64(l))
+ }
+ }
+ if len(m.AssertionMethod) > 0 {
+ for _, s := range m.AssertionMethod {
+ l = len(s)
+ n += 1 + l + sovModels(uint64(l))
+ }
+ }
+ if len(m.CapabilityDelegation) > 0 {
+ for _, s := range m.CapabilityDelegation {
+ l = len(s)
+ n += 1 + l + sovModels(uint64(l))
+ }
+ }
+ if len(m.CapabilityInvocation) > 0 {
+ for _, s := range m.CapabilityInvocation {
+ l = len(s)
+ n += 1 + l + sovModels(uint64(l))
+ }
+ }
+ if len(m.Service) > 0 {
+ for _, s := range m.Service {
+ l = len(s)
+ n += 1 + l + sovModels(uint64(l))
+ }
+ }
+ return n
+}
+
+func (m *Keyshare) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if len(m.Metadata) > 0 {
+ for k, v := range m.Metadata {
+ _ = k
+ _ = v
+ mapEntrySize := 1 + len(k) + sovModels(uint64(len(k))) + 1 + len(v) + sovModels(uint64(len(v)))
+ n += mapEntrySize + 1 + sovModels(uint64(mapEntrySize))
+ }
+ }
+ if len(m.Payloads) > 0 {
+ for k, v := range m.Payloads {
+ _ = k
+ _ = v
+ l = 0
+ if len(v) > 0 {
+ l = 1 + len(v) + sovModels(uint64(len(v)))
+ }
+ mapEntrySize := 1 + len(k) + sovModels(uint64(len(k))) + l
+ n += mapEntrySize + 1 + sovModels(uint64(mapEntrySize))
+ }
+ }
+ l = len(m.Protocol)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.PublicKey)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ if m.Version != 0 {
+ n += 1 + sovModels(uint64(m.Version))
+ }
+ if m.Role != 0 {
+ n += 1 + sovModels(uint64(m.Role))
+ }
+ return n
+}
+
+func (m *Permissions) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if len(m.Grants) > 0 {
+ l = 0
+ for _, e := range m.Grants {
+ l += sovModels(uint64(e))
+ }
+ n += 1 + sovModels(uint64(l)) + l
+ }
+ if len(m.Scopes) > 0 {
+ l = 0
+ for _, e := range m.Scopes {
+ l += sovModels(uint64(e))
+ }
+ n += 1 + sovModels(uint64(l)) + l
+ }
+ return n
+}
+
+func (m *PubKey) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.Role != 0 {
+ n += 1 + sovModels(uint64(m.Role))
+ }
+ if m.Algorithm != 0 {
+ n += 1 + sovModels(uint64(m.Algorithm))
+ }
+ if m.Encoding != 0 {
+ n += 1 + sovModels(uint64(m.Encoding))
+ }
+ if m.Curve != 0 {
+ n += 1 + sovModels(uint64(m.Curve))
+ }
+ if m.KeyType != 0 {
+ n += 1 + sovModels(uint64(m.KeyType))
+ }
+ l = len(m.Raw)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ if m.Jwk != nil {
+ l = m.Jwk.Size()
+ n += 1 + l + sovModels(uint64(l))
+ }
+ return n
+}
+
+func (m *PubKey_JWK) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Kty)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Crv)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.X)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Y)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.N)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.E)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ return n
+}
+
+func (m *Service) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = len(m.Id)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.ServiceType)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Authority)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Origin)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Description)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ if len(m.ServiceEndpoints) > 0 {
+ for k, v := range m.ServiceEndpoints {
+ _ = k
+ _ = v
+ mapEntrySize := 1 + len(k) + sovModels(uint64(len(k))) + 1 + len(v) + sovModels(uint64(len(v)))
+ n += mapEntrySize + 1 + sovModels(uint64(mapEntrySize))
+ }
+ }
+ if m.Permissions != nil {
+ l = m.Permissions.Size()
+ n += 1 + l + sovModels(uint64(l))
+ }
+ return n
+}
+
+func (m *ServiceInfo) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.Exists {
+ n += 2
+ }
+ l = len(m.Origin)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Fingerprint)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ if m.Service != nil {
+ l = m.Service.Size()
+ n += 1 + l + sovModels(uint64(l))
+ }
+ return n
+}
+
+func (m *FirstPartyCaveat) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.Scope != nil {
+ l = m.Scope.Size()
+ n += 1 + l + sovModels(uint64(l))
+ }
+ if m.Exp != 0 {
+ n += 1 + sovModels(uint64(m.Exp))
+ }
+ l = len(m.Cnf)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Aud)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ return n
+}
+
+func (m *ThirdPartyCaveat) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.Scope != nil {
+ l = m.Scope.Size()
+ n += 1 + l + sovModels(uint64(l))
+ }
+ if m.Exp != 0 {
+ n += 1 + sovModels(uint64(m.Exp))
+ }
+ l = len(m.Cnf)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ l = len(m.Aud)
+ if l > 0 {
+ n += 1 + l + sovModels(uint64(l))
+ }
+ return n
+}
+
+func sovModels(x uint64) (n int) {
+ return (math_bits.Len64(x|1) + 6) / 7
+}
+func sozModels(x uint64) (n int) {
+ return sovModels(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (m *Alias) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Alias: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Alias: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Subject", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Subject = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Origin", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Origin = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Controller", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Controller = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *Credential) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Credential: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Credential: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Subject", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Subject = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field AttestationType", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.AttestationType = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Origin", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Origin = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field CredentialId", wireType)
+ }
+ var byteLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ byteLen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if byteLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + byteLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.CredentialId = append(m.CredentialId[:0], dAtA[iNdEx:postIndex]...)
+ if m.CredentialId == nil {
+ m.CredentialId = []byte{}
+ }
+ iNdEx = postIndex
+ case 5:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType)
+ }
+ var byteLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ byteLen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if byteLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + byteLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...)
+ if m.PublicKey == nil {
+ m.PublicKey = []byte{}
+ }
+ iNdEx = postIndex
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Transport", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Transport = append(m.Transport, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ case 7:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field SignCount", wireType)
+ }
+ m.SignCount = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.SignCount |= uint32(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 8:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field UserPresent", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.UserPresent = bool(v != 0)
+ case 9:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field UserVerified", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.UserVerified = bool(v != 0)
+ case 10:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field BackupEligible", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.BackupEligible = bool(v != 0)
+ case 11:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field BackupState", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.BackupState = bool(v != 0)
+ case 12:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field CloneWarning", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.CloneWarning = bool(v != 0)
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *Document) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Document: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Document: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Id = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Controller", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Controller = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Authentication", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Authentication = append(m.Authentication, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field AssertionMethod", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.AssertionMethod = append(m.AssertionMethod, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ case 5:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field CapabilityDelegation", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.CapabilityDelegation = append(m.CapabilityDelegation, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field CapabilityInvocation", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.CapabilityInvocation = append(m.CapabilityInvocation, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ case 7:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Service", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Service = append(m.Service, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *Keyshare) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Keyshare: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Keyshare: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Metadata == nil {
+ m.Metadata = make(map[string]string)
+ }
+ var mapkey string
+ var mapvalue string
+ for iNdEx < postIndex {
+ entryPreIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ if fieldNum == 1 {
+ var stringLenmapkey uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLenmapkey |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLenmapkey := int(stringLenmapkey)
+ if intStringLenmapkey < 0 {
+ return ErrInvalidLengthModels
+ }
+ postStringIndexmapkey := iNdEx + intStringLenmapkey
+ if postStringIndexmapkey < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postStringIndexmapkey > l {
+ return io.ErrUnexpectedEOF
+ }
+ mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+ iNdEx = postStringIndexmapkey
+ } else if fieldNum == 2 {
+ var stringLenmapvalue uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLenmapvalue |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLenmapvalue := int(stringLenmapvalue)
+ if intStringLenmapvalue < 0 {
+ return ErrInvalidLengthModels
+ }
+ postStringIndexmapvalue := iNdEx + intStringLenmapvalue
+ if postStringIndexmapvalue < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postStringIndexmapvalue > l {
+ return io.ErrUnexpectedEOF
+ }
+ mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue])
+ iNdEx = postStringIndexmapvalue
+ } else {
+ iNdEx = entryPreIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > postIndex {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+ m.Metadata[mapkey] = mapvalue
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Payloads", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Payloads == nil {
+ m.Payloads = make(map[string][]byte)
+ }
+ var mapkey string
+ mapvalue := []byte{}
+ for iNdEx < postIndex {
+ entryPreIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ if fieldNum == 1 {
+ var stringLenmapkey uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLenmapkey |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLenmapkey := int(stringLenmapkey)
+ if intStringLenmapkey < 0 {
+ return ErrInvalidLengthModels
+ }
+ postStringIndexmapkey := iNdEx + intStringLenmapkey
+ if postStringIndexmapkey < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postStringIndexmapkey > l {
+ return io.ErrUnexpectedEOF
+ }
+ mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+ iNdEx = postStringIndexmapkey
+ } else if fieldNum == 2 {
+ var mapbyteLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ mapbyteLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intMapbyteLen := int(mapbyteLen)
+ if intMapbyteLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postbytesIndex := iNdEx + intMapbyteLen
+ if postbytesIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postbytesIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ mapvalue = make([]byte, mapbyteLen)
+ copy(mapvalue, dAtA[iNdEx:postbytesIndex])
+ iNdEx = postbytesIndex
+ } else {
+ iNdEx = entryPreIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > postIndex {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+ m.Payloads[mapkey] = mapvalue
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Protocol = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType)
+ }
+ var byteLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ byteLen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if byteLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + byteLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.PublicKey = append(m.PublicKey[:0], dAtA[iNdEx:postIndex]...)
+ if m.PublicKey == nil {
+ m.PublicKey = []byte{}
+ }
+ iNdEx = postIndex
+ case 5:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType)
+ }
+ m.Version = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Version |= uint32(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 6:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType)
+ }
+ m.Role = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Role |= int32(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *Permissions) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Permissions: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Permissions: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType == 0 {
+ var v DIDNamespace
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= DIDNamespace(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.Grants = append(m.Grants, v)
+ } else if wireType == 2 {
+ var packedLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ packedLen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if packedLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + packedLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ var elementCount int
+ if elementCount != 0 && len(m.Grants) == 0 {
+ m.Grants = make([]DIDNamespace, 0, elementCount)
+ }
+ for iNdEx < postIndex {
+ var v DIDNamespace
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= DIDNamespace(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.Grants = append(m.Grants, v)
+ }
+ } else {
+ return fmt.Errorf("proto: wrong wireType = %d for field Grants", wireType)
+ }
+ case 2:
+ if wireType == 0 {
+ var v PermissionScope
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= PermissionScope(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.Scopes = append(m.Scopes, v)
+ } else if wireType == 2 {
+ var packedLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ packedLen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if packedLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + packedLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ var elementCount int
+ if elementCount != 0 && len(m.Scopes) == 0 {
+ m.Scopes = make([]PermissionScope, 0, elementCount)
+ }
+ for iNdEx < postIndex {
+ var v PermissionScope
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= PermissionScope(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.Scopes = append(m.Scopes, v)
+ }
+ } else {
+ return fmt.Errorf("proto: wrong wireType = %d for field Scopes", wireType)
+ }
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *PubKey) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: PubKey: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: PubKey: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType)
+ }
+ m.Role = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Role |= KeyRole(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 2:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Algorithm", wireType)
+ }
+ m.Algorithm = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Algorithm |= KeyAlgorithm(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 3:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Encoding", wireType)
+ }
+ m.Encoding = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Encoding |= KeyEncoding(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 4:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Curve", wireType)
+ }
+ m.Curve = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Curve |= KeyCurve(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 5:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field KeyType", wireType)
+ }
+ m.KeyType = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.KeyType |= KeyType(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Raw", wireType)
+ }
+ var byteLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ byteLen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if byteLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + byteLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Raw = append(m.Raw[:0], dAtA[iNdEx:postIndex]...)
+ if m.Raw == nil {
+ m.Raw = []byte{}
+ }
+ iNdEx = postIndex
+ case 7:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Jwk", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Jwk == nil {
+ m.Jwk = &PubKey_JWK{}
+ }
+ if err := m.Jwk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *PubKey_JWK) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: JWK: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: JWK: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Kty", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Kty = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Crv", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Crv = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field X", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.X = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Y", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Y = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 5:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field N", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.N = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field E", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.E = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *Service) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Service: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Service: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Id = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ServiceType", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.ServiceType = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Authority = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Origin", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Origin = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 5:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Description = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ServiceEndpoints", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.ServiceEndpoints == nil {
+ m.ServiceEndpoints = make(map[string]string)
+ }
+ var mapkey string
+ var mapvalue string
+ for iNdEx < postIndex {
+ entryPreIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ if fieldNum == 1 {
+ var stringLenmapkey uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLenmapkey |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLenmapkey := int(stringLenmapkey)
+ if intStringLenmapkey < 0 {
+ return ErrInvalidLengthModels
+ }
+ postStringIndexmapkey := iNdEx + intStringLenmapkey
+ if postStringIndexmapkey < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postStringIndexmapkey > l {
+ return io.ErrUnexpectedEOF
+ }
+ mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+ iNdEx = postStringIndexmapkey
+ } else if fieldNum == 2 {
+ var stringLenmapvalue uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLenmapvalue |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLenmapvalue := int(stringLenmapvalue)
+ if intStringLenmapvalue < 0 {
+ return ErrInvalidLengthModels
+ }
+ postStringIndexmapvalue := iNdEx + intStringLenmapvalue
+ if postStringIndexmapvalue < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postStringIndexmapvalue > l {
+ return io.ErrUnexpectedEOF
+ }
+ mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue])
+ iNdEx = postStringIndexmapvalue
+ } else {
+ iNdEx = entryPreIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > postIndex {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+ m.ServiceEndpoints[mapkey] = mapvalue
+ iNdEx = postIndex
+ case 7:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Permissions == nil {
+ m.Permissions = &Permissions{}
+ }
+ if err := m.Permissions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *ServiceInfo) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: ServiceInfo: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: ServiceInfo: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Exists", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.Exists = bool(v != 0)
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Origin", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Origin = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Fingerprint", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Fingerprint = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Service", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Service == nil {
+ m.Service = &Service{}
+ }
+ if err := m.Service.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *FirstPartyCaveat) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: FirstPartyCaveat: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: FirstPartyCaveat: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Scope", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Scope == nil {
+ m.Scope = &Permissions{}
+ }
+ if err := m.Scope.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 2:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Exp", wireType)
+ }
+ m.Exp = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Exp |= int64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Cnf", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Cnf = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Aud", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Aud = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *ThirdPartyCaveat) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: ThirdPartyCaveat: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: ThirdPartyCaveat: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Scope", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Scope == nil {
+ m.Scope = &Permissions{}
+ }
+ if err := m.Scope.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 2:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Exp", wireType)
+ }
+ m.Exp = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Exp |= int64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Cnf", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Cnf = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Aud", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ stringLen |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthModels
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex < 0 {
+ return ErrInvalidLengthModels
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Aud = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipModels(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthModels
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func skipModels(dAtA []byte) (n int, err error) {
+ l := len(dAtA)
+ iNdEx := 0
+ depth := 0
+ for iNdEx < l {
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ wireType := int(wire & 0x7)
+ switch wireType {
+ case 0:
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ iNdEx++
+ if dAtA[iNdEx-1] < 0x80 {
+ break
+ }
+ }
+ case 1:
+ iNdEx += 8
+ case 2:
+ var length int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowModels
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ length |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if length < 0 {
+ return 0, ErrInvalidLengthModels
+ }
+ iNdEx += length
+ case 3:
+ depth++
+ case 4:
+ if depth == 0 {
+ return 0, ErrUnexpectedEndOfGroupModels
+ }
+ depth--
+ case 5:
+ iNdEx += 4
+ default:
+ return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+ }
+ if iNdEx < 0 {
+ return 0, ErrInvalidLengthModels
+ }
+ if depth == 0 {
+ return iNdEx, nil
+ }
+ }
+ return 0, io.ErrUnexpectedEOF
+}
+
+var (
+ ErrInvalidLengthModels = fmt.Errorf("proto: negative length found during unmarshaling")
+ ErrIntOverflowModels = fmt.Errorf("proto: integer overflow")
+ ErrUnexpectedEndOfGroupModels = fmt.Errorf("proto: unexpected end of group")
+)
diff --git a/x/did/types/namespace.go b/x/did/types/namespace.go
new file mode 100644
index 000000000..1e6da75c9
--- /dev/null
+++ b/x/did/types/namespace.go
@@ -0,0 +1,102 @@
+package types
+
+import (
+ "cosmossdk.io/x/nft"
+)
+
+func (n DIDNamespace) ID() string {
+ switch n {
+ case DIDNamespace_DID_NAMESPACE_DWN:
+ return "did:dwn:0"
+ case DIDNamespace_DID_NAMESPACE_SONR:
+ return "did:sonr:0"
+ case DIDNamespace_DID_NAMESPACE_BITCOIN:
+ return "did:btc:0"
+ case DIDNamespace_DID_NAMESPACE_ETHEREUM:
+ return "did:eth:0"
+ case DIDNamespace_DID_NAMESPACE_IBC:
+ return "did:ibc:0"
+ case DIDNamespace_DID_NAMESPACE_WEBAUTHN:
+ return "did:authn:0"
+ case DIDNamespace_DID_NAMESPACE_SERVICE:
+ return "did:web:0"
+ case DIDNamespace_DID_NAMESPACE_IPFS:
+ return "did:ipfs:0"
+ }
+ return ""
+}
+
+func (n DIDNamespace) Name() string {
+ switch n {
+ case DIDNamespace_DID_NAMESPACE_DWN:
+ return "DecentralizedWebNode"
+ case DIDNamespace_DID_NAMESPACE_SONR:
+ return "SonrNetwork"
+ case DIDNamespace_DID_NAMESPACE_BITCOIN:
+ return "BitcoinNetwork"
+ case DIDNamespace_DID_NAMESPACE_ETHEREUM:
+ return "EthereumNetwork"
+ case DIDNamespace_DID_NAMESPACE_IBC:
+ return "IBCNetwork"
+ case DIDNamespace_DID_NAMESPACE_WEBAUTHN:
+ return "WebAuthentication"
+ case DIDNamespace_DID_NAMESPACE_SERVICE:
+ return "DecentrlizedService"
+ case DIDNamespace_DID_NAMESPACE_IPFS:
+ return "IPFSStorage"
+ }
+ return ""
+}
+
+func (n DIDNamespace) Symbol() string {
+ switch n {
+ case DIDNamespace_DID_NAMESPACE_DWN:
+ return "DWN"
+ case DIDNamespace_DID_NAMESPACE_SONR:
+ return "SONR"
+ case DIDNamespace_DID_NAMESPACE_BITCOIN:
+ return "BTC"
+ case DIDNamespace_DID_NAMESPACE_ETHEREUM:
+ return "ETH"
+ case DIDNamespace_DID_NAMESPACE_IBC:
+ return "IBC"
+ case DIDNamespace_DID_NAMESPACE_WEBAUTHN:
+ return "WEBAUTHN"
+ case DIDNamespace_DID_NAMESPACE_SERVICE:
+ return "SERVICE"
+ case DIDNamespace_DID_NAMESPACE_IPFS:
+ return "IPFS"
+ }
+ return ""
+}
+
+func (n DIDNamespace) Description() string {
+ switch n {
+ case DIDNamespace_DID_NAMESPACE_DWN:
+ return "DWN Service Provider"
+ case DIDNamespace_DID_NAMESPACE_SONR:
+ return "Sonr Network Gateway"
+ case DIDNamespace_DID_NAMESPACE_BITCOIN:
+ return "Bitcoin Network Gateway"
+ case DIDNamespace_DID_NAMESPACE_ETHEREUM:
+ return "Ethereum Network Gateway"
+ case DIDNamespace_DID_NAMESPACE_IBC:
+ return "IBC Network Gateway"
+ case DIDNamespace_DID_NAMESPACE_WEBAUTHN:
+ return "Web Authentication Key"
+ case DIDNamespace_DID_NAMESPACE_SERVICE:
+ return "Decentrlized Service"
+ case DIDNamespace_DID_NAMESPACE_IPFS:
+ return "Data Storage on IPFS"
+ }
+ return ""
+}
+
+func (n DIDNamespace) GetNFTClass() *nft.Class {
+ return &nft.Class{
+ Id: n.ID(),
+ Name: n.Name(),
+ Symbol: n.Symbol(),
+ Description: n.Description(),
+ }
+}
diff --git a/x/did/types/oidc/DiscoveryDocument.pkl.go b/x/did/types/oidc/DiscoveryDocument.pkl.go
new file mode 100644
index 000000000..d25cce456
--- /dev/null
+++ b/x/did/types/oidc/DiscoveryDocument.pkl.go
@@ -0,0 +1,34 @@
+// Code generated from Pkl module `oidc`. DO NOT EDIT.
+package oidc
+
+type DiscoveryDocument struct {
+ Issuer string `pkl:"issuer" json:"issuer,omitempty" param:"issuer"`
+
+ AuthorizationEndpoint string `pkl:"authorization_endpoint" json:"authorization_endpoint,omitempty" param:"authorization_endpoint"`
+
+ TokenEndpoint string `pkl:"token_endpoint" json:"token_endpoint,omitempty" param:"token_endpoint"`
+
+ UserinfoEndpoint string `pkl:"userinfo_endpoint" json:"userinfo_endpoint,omitempty" param:"userinfo_endpoint"`
+
+ JwksUri string `pkl:"jwks_uri" json:"jwks_uri,omitempty" param:"jwks_uri"`
+
+ RegistrationEndpoint string `pkl:"registration_endpoint" json:"registration_endpoint,omitempty" param:"registration_endpoint"`
+
+ ScopesSupported []string `pkl:"scopes_supported" json:"scopes_supported,omitempty" param:"scopes_supported"`
+
+ ResponseTypesSupported []string `pkl:"response_types_supported" json:"response_types_supported,omitempty" param:"response_types_supported"`
+
+ ResponseModesSupported []string `pkl:"response_modes_supported" json:"response_modes_supported,omitempty" param:"response_modes_supported"`
+
+ SubjectTypesSupported []string `pkl:"subject_types_supported" json:"subject_types_supported,omitempty" param:"subject_types_supported"`
+
+ IdTokenSigningAlgValuesSupported []string `pkl:"id_token_signing_alg_values_supported" json:"id_token_signing_alg_values_supported,omitempty" param:"id_token_signing_alg_values_supported"`
+
+ ClaimsSupported []string `pkl:"claims_supported" json:"claims_supported,omitempty" param:"claims_supported"`
+
+ GrantTypesSupported []string `pkl:"grant_types_supported" json:"grant_types_supported,omitempty" param:"grant_types_supported"`
+
+ AcrValuesSupported []string `pkl:"acr_values_supported" json:"acr_values_supported,omitempty" param:"acr_values_supported"`
+
+ TokenEndpointAuthMethodsSupported []string `pkl:"token_endpoint_auth_methods_supported" json:"token_endpoint_auth_methods_supported,omitempty" param:"token_endpoint_auth_methods_supported"`
+}
diff --git a/x/did/types/oidc/Oidc.pkl.go b/x/did/types/oidc/Oidc.pkl.go
new file mode 100644
index 000000000..3a4e4a67a
--- /dev/null
+++ b/x/did/types/oidc/Oidc.pkl.go
@@ -0,0 +1,36 @@
+// Code generated from Pkl module `oidc`. DO NOT EDIT.
+package oidc
+
+import (
+ "context"
+
+ "github.com/apple/pkl-go/pkl"
+)
+
+type Oidc struct {
+}
+
+// LoadFromPath loads the pkl module at the given path and evaluates it into a Oidc
+func LoadFromPath(ctx context.Context, path string) (ret *Oidc, err error) {
+ evaluator, err := pkl.NewEvaluator(ctx, pkl.PreconfiguredOptions)
+ if err != nil {
+ return nil, err
+ }
+ defer func() {
+ cerr := evaluator.Close()
+ if err == nil {
+ err = cerr
+ }
+ }()
+ ret, err = Load(ctx, evaluator, pkl.FileSource(path))
+ return ret, err
+}
+
+// Load loads the pkl module at the given source and evaluates it with the given evaluator into a Oidc
+func Load(ctx context.Context, evaluator pkl.Evaluator, source *pkl.ModuleSource) (*Oidc, error) {
+ var ret Oidc
+ if err := evaluator.EvaluateModule(ctx, source, &ret); err != nil {
+ return nil, err
+ }
+ return &ret, nil
+}
diff --git a/x/did/types/oidc/init.pkl.go b/x/did/types/oidc/init.pkl.go
new file mode 100644
index 000000000..0f351c673
--- /dev/null
+++ b/x/did/types/oidc/init.pkl.go
@@ -0,0 +1,9 @@
+// Code generated from Pkl module `oidc`. DO NOT EDIT.
+package oidc
+
+import "github.com/apple/pkl-go/pkl"
+
+func init() {
+ pkl.RegisterMapping("oidc", Oidc{})
+ pkl.RegisterMapping("oidc#DiscoveryDocument", DiscoveryDocument{})
+}
diff --git a/x/did/types/pubkey.go b/x/did/types/pubkey.go
new file mode 100644
index 000000000..8d75ac1fb
--- /dev/null
+++ b/x/did/types/pubkey.go
@@ -0,0 +1,153 @@
+package types
+
+import (
+ "crypto/ecdsa"
+ "encoding/hex"
+
+ cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
+ "github.com/mr-tron/base58/base58"
+ "github.com/onsonr/crypto"
+ "github.com/onsonr/crypto/macaroon"
+)
+
+var WalletKeyInfo = &KeyInfo{
+ Role: KeyRole_KEY_ROLE_DELEGATION,
+ Curve: KeyCurve_KEY_CURVE_SECP256K1,
+ Algorithm: KeyAlgorithm_KEY_ALGORITHM_ECDSA,
+ Encoding: KeyEncoding_KEY_ENCODING_HEX,
+ Type: KeyType_KEY_TYPE_BIP32,
+}
+
+var EthKeyInfo = &KeyInfo{
+ Role: KeyRole_KEY_ROLE_DELEGATION,
+ Curve: KeyCurve_KEY_CURVE_KECCAK256,
+ Algorithm: KeyAlgorithm_KEY_ALGORITHM_ECDSA,
+ Encoding: KeyEncoding_KEY_ENCODING_HEX,
+ Type: KeyType_KEY_TYPE_BIP32,
+}
+
+var SonrKeyInfo = &KeyInfo{
+ Role: KeyRole_KEY_ROLE_INVOCATION,
+ Curve: KeyCurve_KEY_CURVE_P256,
+ Algorithm: KeyAlgorithm_KEY_ALGORITHM_ECDSA,
+ Encoding: KeyEncoding_KEY_ENCODING_HEX,
+ Type: KeyType_KEY_TYPE_MPC,
+}
+
+var ChainCodeKeyInfos = map[ChainCode]*KeyInfo{
+ ChainCodeBTC: WalletKeyInfo,
+ ChainCodeETH: EthKeyInfo,
+ ChainCodeSNR: SonrKeyInfo,
+ ChainCodeIBC: WalletKeyInfo,
+}
+
+// NewEthPublicKey returns a new ethereum public key
+func NewPublicKey(data []byte, keyInfo *KeyInfo) (*PubKey, error) {
+ encKey, err := keyInfo.Encoding.EncodeRaw(data)
+ if err != nil {
+ return nil, err
+ }
+
+ return &PubKey{
+ Raw: encKey,
+ Role: keyInfo.Role,
+ Encoding: keyInfo.Encoding,
+ Algorithm: keyInfo.Algorithm,
+ Curve: keyInfo.Curve,
+ KeyType: keyInfo.Type,
+ }, nil
+}
+
+// Address returns the address of the public key
+func (k *PubKey) Address() cryptotypes.Address {
+ return nil
+}
+
+// Bytes returns the raw bytes of the public key
+func (k *PubKey) Bytes() []byte {
+ bz, _ := k.GetEncoding().DecodeRaw(k.GetRaw())
+ return bz
+}
+
+// Clone returns a copy of the public key
+func (k *PubKey) Clone() cryptotypes.PubKey {
+ return &PubKey{
+ Raw: k.GetRaw(),
+ Role: k.GetRole(),
+ Encoding: k.GetEncoding(),
+ Algorithm: k.GetAlgorithm(),
+ Curve: k.GetCurve(),
+ KeyType: k.GetKeyType(),
+ }
+}
+
+// IssueMacaroon returns a macaroon for the public key with the given id and location
+func (pk *PubKey) IssueMacaroon(subject string, origin string) (*macaroon.Macaroon, error) {
+ return macaroon.New(pk.Bytes(), []byte(subject), origin, macaroon.LatestVersion)
+}
+
+// ECDSA returns the ECDSA public key
+func (k *PubKey) ECDSA() (*ecdsa.PublicKey, error) {
+ return crypto.ComputeEcdsaPublicKey(k.Bytes())
+}
+
+// VerifySignature verifies a signature over the given message
+func (k *PubKey) VerifySignature(msg []byte, sig []byte) bool {
+ pk, err := crypto.ComputeEcdsaPublicKey(k.Bytes())
+ sigMpc, err := crypto.DeserializeMPCSignature(sig)
+ if err != nil {
+ return false
+ }
+ return crypto.VerifyMPCSignature(sigMpc, msg, pk)
+}
+
+// Equals returns true if two public keys are equal
+func (k *PubKey) Equals(k2 cryptotypes.PubKey) bool {
+ if k == nil && k2 == nil {
+ return true
+ }
+ return false
+}
+
+// Type returns the type of the public key
+func (k *PubKey) Type() string {
+ return k.KeyType.String()
+}
+
+// DecodePublicKey extracts the public key from the given data
+func (k *KeyInfo) DecodePublicKey(data interface{}) ([]byte, error) {
+ var bz []byte
+ switch v := data.(type) {
+ case string:
+ bz = []byte(v)
+ case []byte:
+ bz = v
+ default:
+ return nil, ErrUnsupportedKeyEncoding
+ }
+
+ if k.Encoding == KeyEncoding_KEY_ENCODING_RAW {
+ return bz, nil
+ }
+ if k.Encoding == KeyEncoding_KEY_ENCODING_HEX {
+ return hex.DecodeString(string(bz))
+ }
+ if k.Encoding == KeyEncoding_KEY_ENCODING_MULTIBASE {
+ return base58.Decode(string(bz))
+ }
+ return nil, ErrUnsupportedKeyEncoding
+}
+
+// EncodePublicKey encodes the public key according to the KeyInfo's encoding
+func (k *KeyInfo) EncodePublicKey(data []byte) (string, error) {
+ if k.Encoding == KeyEncoding_KEY_ENCODING_RAW {
+ return string(data), nil
+ }
+ if k.Encoding == KeyEncoding_KEY_ENCODING_HEX {
+ return hex.EncodeToString(data), nil
+ }
+ if k.Encoding == KeyEncoding_KEY_ENCODING_MULTIBASE {
+ return base58.Encode(data), nil
+ }
+ return "", ErrUnsupportedKeyEncoding
+}
diff --git a/x/did/types/scopes.go b/x/did/types/scopes.go
new file mode 100644
index 000000000..c64c97922
--- /dev/null
+++ b/x/did/types/scopes.go
@@ -0,0 +1,53 @@
+package types
+
+import "gopkg.in/macaroon-bakery.v2/bakery/checkers"
+
+var (
+ PermissionScopeStrings = [...]string{
+ "profile.name",
+ "identifiers.email",
+ "identifiers.phone",
+ "transactions.read",
+ "transactions.write",
+ "wallets.read",
+ "wallets.create",
+ "wallets.subscribe",
+ "wallets.update",
+ "transactions.verify",
+ "transactions.broadcast",
+ "admin.user",
+ "admin.validator",
+ }
+
+ StringToPermissionScope = map[string]PermissionScope{
+ "PERMISSION_SCOPE_UNSPECIFIED": PermissionScope_PERMISSION_SCOPE_UNSPECIFIED,
+ "PERMISSION_SCOPE_BASIC_INFO": PermissionScope_PERMISSION_SCOPE_BASIC_INFO,
+ "PERMISSION_SCOPE_IDENTIFIERS_EMAIL": PermissionScope_PERMISSION_SCOPE_PERMISSIONS_READ,
+ "PERMISSION_SCOPE_IDENTIFIERS_PHONE": PermissionScope_PERMISSION_SCOPE_PERMISSIONS_WRITE,
+ "PERMISSION_SCOPE_TRANSACTIONS_READ": PermissionScope_PERMISSION_SCOPE_TRANSACTIONS_READ,
+ "PERMISSION_SCOPE_TRANSACTIONS_WRITE": PermissionScope_PERMISSION_SCOPE_TRANSACTIONS_WRITE,
+ "PERMISSION_SCOPE_WALLETS_READ": PermissionScope_PERMISSION_SCOPE_WALLETS_READ,
+ "PERMISSION_SCOPE_WALLETS_CREATE": PermissionScope_PERMISSION_SCOPE_WALLETS_CREATE,
+ "PERMISSION_SCOPE_WALLETS_SUBSCRIBE": PermissionScope_PERMISSION_SCOPE_WALLETS_SUBSCRIBE,
+ "PERMISSION_SCOPE_WALLETS_UPDATE": PermissionScope_PERMISSION_SCOPE_WALLETS_UPDATE,
+ "PERMISSION_SCOPE_TRANSACTIONS_VERIFY": PermissionScope_PERMISSION_SCOPE_TRANSACTIONS_VERIFY,
+ "PERMISSION_SCOPE_TRANSACTIONS_BROADCAST": PermissionScope_PERMISSION_SCOPE_TRANSACTIONS_BROADCAST,
+ "PERMISSION_SCOPE_ADMIN_USER": PermissionScope_PERMISSION_SCOPE_ADMIN_USER,
+ "PERMISSION_SCOPE_ADMIN_VALIDATOR": PermissionScope_PERMISSION_SCOPE_ADMIN_VALIDATOR,
+ }
+)
+
+func ResolvePermissionScope(scope string) (PermissionScope, bool) {
+ uriToPrefix := make(map[string]string)
+ for _, scope := range PermissionScopeStrings {
+ uriToPrefix["https://example.com/auth/"+scope] = scope
+ }
+ PermissionNamespace := checkers.NewNamespace(uriToPrefix)
+
+ prefix, ok := PermissionNamespace.Resolve("https://example.com/auth/" + scope)
+ if !ok {
+ return 0, false
+ }
+ permScope, ok := StringToPermissionScope[prefix]
+ return permScope, ok
+}
diff --git a/x/did/types/tx.pb.go b/x/did/types/tx.pb.go
index 8e17af2ae..07dea1660 100644
--- a/x/did/types/tx.pb.go
+++ b/x/did/types/tx.pb.go
@@ -30,11 +30,9 @@ var _ = math.Inf
// proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
-// MsgUpdateParams is the Msg/UpdateParams request type.
-//
-// Since: cosmos-sdk 0.47
-type MsgUpdateParams struct {
- // authority is the address of the governance account.
+// MsgAllocateVault is the message type for the AllocateVault RPC.
+type MsgAllocateVault struct {
+ // authority is the address of the service account.
Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"`
// params defines the parameters to update.
Params Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params"`
@@ -42,18 +40,18 @@ type MsgUpdateParams struct {
Token string `protobuf:"bytes,3,opt,name=token,proto3" json:"token,omitempty"`
}
-func (m *MsgUpdateParams) Reset() { *m = MsgUpdateParams{} }
-func (m *MsgUpdateParams) String() string { return proto.CompactTextString(m) }
-func (*MsgUpdateParams) ProtoMessage() {}
-func (*MsgUpdateParams) Descriptor() ([]byte, []int) {
+func (m *MsgAllocateVault) Reset() { *m = MsgAllocateVault{} }
+func (m *MsgAllocateVault) String() string { return proto.CompactTextString(m) }
+func (*MsgAllocateVault) ProtoMessage() {}
+func (*MsgAllocateVault) Descriptor() ([]byte, []int) {
return fileDescriptor_d73284df019ff211, []int{0}
}
-func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error {
+func (m *MsgAllocateVault) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
-func (m *MsgUpdateParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+func (m *MsgAllocateVault) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
- return xxx_messageInfo_MsgUpdateParams.Marshal(b, m, deterministic)
+ return xxx_messageInfo_MsgAllocateVault.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
@@ -63,26 +61,26 @@ func (m *MsgUpdateParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, err
return b[:n], nil
}
}
-func (m *MsgUpdateParams) XXX_Merge(src proto.Message) {
- xxx_messageInfo_MsgUpdateParams.Merge(m, src)
+func (m *MsgAllocateVault) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_MsgAllocateVault.Merge(m, src)
}
-func (m *MsgUpdateParams) XXX_Size() int {
+func (m *MsgAllocateVault) XXX_Size() int {
return m.Size()
}
-func (m *MsgUpdateParams) XXX_DiscardUnknown() {
- xxx_messageInfo_MsgUpdateParams.DiscardUnknown(m)
+func (m *MsgAllocateVault) XXX_DiscardUnknown() {
+ xxx_messageInfo_MsgAllocateVault.DiscardUnknown(m)
}
-var xxx_messageInfo_MsgUpdateParams proto.InternalMessageInfo
+var xxx_messageInfo_MsgAllocateVault proto.InternalMessageInfo
-func (m *MsgUpdateParams) GetAuthority() string {
+func (m *MsgAllocateVault) GetAuthority() string {
if m != nil {
return m.Authority
}
return ""
}
-func (m *MsgUpdateParams) GetParams() Params {
+func (m *MsgAllocateVault) GetSubject() string {
if m != nil {
return m.Params
}
@@ -657,6 +655,8 @@ func init() {
proto.RegisterType((*MsgAuthorizeServiceResponse)(nil), "did.v1.MsgAuthorizeServiceResponse")
proto.RegisterType((*MsgRegisterService)(nil), "did.v1.MsgRegisterService")
proto.RegisterType((*MsgRegisterServiceResponse)(nil), "did.v1.MsgRegisterServiceResponse")
+ proto.RegisterType((*MsgUpdateParams)(nil), "did.v1.MsgUpdateParams")
+ proto.RegisterType((*MsgUpdateParamsResponse)(nil), "did.v1.MsgUpdateParamsResponse")
}
func init() { proto.RegisterFile("did/v1/tx.proto", fileDescriptor_d73284df019ff211) }
@@ -956,7 +956,7 @@ var _Msg_serviceDesc = grpc.ServiceDesc{
Metadata: "did/v1/tx.proto",
}
-func (m *MsgUpdateParams) Marshal() (dAtA []byte, err error) {
+func (m *MsgAllocateVault) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
@@ -966,7 +966,7 @@ func (m *MsgUpdateParams) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil
}
-func (m *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) {
+func (m *MsgAllocateVault) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
@@ -1423,6 +1423,76 @@ func (m *MsgRegisterServiceResponse) MarshalToSizedBuffer(dAtA []byte) (int, err
return len(dAtA) - i, nil
}
+func (m *MsgUpdateParams) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgUpdateParams) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if len(m.Token) > 0 {
+ i -= len(m.Token)
+ copy(dAtA[i:], m.Token)
+ i = encodeVarintTx(dAtA, i, uint64(len(m.Token)))
+ i--
+ dAtA[i] = 0x1a
+ }
+ {
+ size, err := m.Params.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTx(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ if len(m.Authority) > 0 {
+ i -= len(m.Authority)
+ copy(dAtA[i:], m.Authority)
+ i = encodeVarintTx(dAtA, i, uint64(len(m.Authority)))
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
+func (m *MsgUpdateParamsResponse) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *MsgUpdateParamsResponse) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ return len(dAtA) - i, nil
+}
+
func encodeVarintTx(dAtA []byte, offset int, v uint64) int {
offset -= sovTx(v)
base := offset
@@ -1434,7 +1504,7 @@ func encodeVarintTx(dAtA []byte, offset int, v uint64) int {
dAtA[offset] = uint8(v)
return base
}
-func (m *MsgUpdateParams) Size() (n int) {
+func (m *MsgAllocateVault) Size() (n int) {
if m == nil {
return 0
}
@@ -1645,7 +1715,7 @@ func sovTx(x uint64) (n int) {
func sozTx(x uint64) (n int) {
return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63))))
}
-func (m *MsgUpdateParams) Unmarshal(dAtA []byte) error {
+func (m *MsgAllocateVault) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -1668,10 +1738,10 @@ func (m *MsgUpdateParams) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: MsgUpdateParams: wiretype end group for non-group")
+ return fmt.Errorf("proto: MsgAllocateVault: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: MsgUpdateParams: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: MsgAllocateVault: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
diff --git a/x/did/types/txns/Msg.pkl.go b/x/did/types/txns/Msg.pkl.go
new file mode 100644
index 000000000..316adf06d
--- /dev/null
+++ b/x/did/types/txns/Msg.pkl.go
@@ -0,0 +1,6 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+type Msg interface {
+ GetTypeUrl() string
+}
diff --git a/x/did/types/txns/MsgDidAllocateVault.pkl.go b/x/did/types/txns/MsgDidAllocateVault.pkl.go
new file mode 100644
index 000000000..dcb4a04e4
--- /dev/null
+++ b/x/did/types/txns/MsgDidAllocateVault.pkl.go
@@ -0,0 +1,44 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgDidAllocateVault interface {
+ Msg
+
+ GetAuthority() string
+
+ GetSubject() string
+
+ GetToken() *pkl.Object
+}
+
+var _ MsgDidAllocateVault = (*MsgDidAllocateVaultImpl)(nil)
+
+type MsgDidAllocateVaultImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Authority string `pkl:"authority"`
+
+ Subject string `pkl:"subject"`
+
+ Token *pkl.Object `pkl:"token"`
+}
+
+// The type URL for the message
+func (rcv *MsgDidAllocateVaultImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgDidAllocateVaultImpl) GetAuthority() string {
+ return rcv.Authority
+}
+
+func (rcv *MsgDidAllocateVaultImpl) GetSubject() string {
+ return rcv.Subject
+}
+
+func (rcv *MsgDidAllocateVaultImpl) GetToken() *pkl.Object {
+ return rcv.Token
+}
diff --git a/x/did/types/txns/MsgDidAuthorize.pkl.go b/x/did/types/txns/MsgDidAuthorize.pkl.go
new file mode 100644
index 000000000..344bbe81a
--- /dev/null
+++ b/x/did/types/txns/MsgDidAuthorize.pkl.go
@@ -0,0 +1,60 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgDidAuthorize interface {
+ Msg
+
+ GetAuthority() string
+
+ GetController() string
+
+ GetAddress() string
+
+ GetOrigin() string
+
+ GetToken() *pkl.Object
+}
+
+var _ MsgDidAuthorize = (*MsgDidAuthorizeImpl)(nil)
+
+type MsgDidAuthorizeImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Authority string `pkl:"authority"`
+
+ Controller string `pkl:"controller"`
+
+ Address string `pkl:"address"`
+
+ Origin string `pkl:"origin"`
+
+ Token *pkl.Object `pkl:"token"`
+}
+
+// The type URL for the message
+func (rcv *MsgDidAuthorizeImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgDidAuthorizeImpl) GetAuthority() string {
+ return rcv.Authority
+}
+
+func (rcv *MsgDidAuthorizeImpl) GetController() string {
+ return rcv.Controller
+}
+
+func (rcv *MsgDidAuthorizeImpl) GetAddress() string {
+ return rcv.Address
+}
+
+func (rcv *MsgDidAuthorizeImpl) GetOrigin() string {
+ return rcv.Origin
+}
+
+func (rcv *MsgDidAuthorizeImpl) GetToken() *pkl.Object {
+ return rcv.Token
+}
diff --git a/x/did/types/txns/MsgDidProveWitness.pkl.go b/x/did/types/txns/MsgDidProveWitness.pkl.go
new file mode 100644
index 000000000..6ea127769
--- /dev/null
+++ b/x/did/types/txns/MsgDidProveWitness.pkl.go
@@ -0,0 +1,52 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgDidProveWitness interface {
+ Msg
+
+ GetAuthority() string
+
+ GetProperty() string
+
+ GetWitness() []int
+
+ GetToken() *pkl.Object
+}
+
+var _ MsgDidProveWitness = (*MsgDidProveWitnessImpl)(nil)
+
+type MsgDidProveWitnessImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Authority string `pkl:"authority"`
+
+ Property string `pkl:"property"`
+
+ Witness []int `pkl:"witness"`
+
+ Token *pkl.Object `pkl:"token"`
+}
+
+// The type URL for the message
+func (rcv *MsgDidProveWitnessImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgDidProveWitnessImpl) GetAuthority() string {
+ return rcv.Authority
+}
+
+func (rcv *MsgDidProveWitnessImpl) GetProperty() string {
+ return rcv.Property
+}
+
+func (rcv *MsgDidProveWitnessImpl) GetWitness() []int {
+ return rcv.Witness
+}
+
+func (rcv *MsgDidProveWitnessImpl) GetToken() *pkl.Object {
+ return rcv.Token
+}
diff --git a/x/did/types/txns/MsgDidRegisterController.pkl.go b/x/did/types/txns/MsgDidRegisterController.pkl.go
new file mode 100644
index 000000000..dc6d3651b
--- /dev/null
+++ b/x/did/types/txns/MsgDidRegisterController.pkl.go
@@ -0,0 +1,60 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgDidRegisterController interface {
+ Msg
+
+ GetAuthority() string
+
+ GetCid() string
+
+ GetOrigin() string
+
+ GetAuthentication() []*pkl.Object
+
+ GetToken() *pkl.Object
+}
+
+var _ MsgDidRegisterController = (*MsgDidRegisterControllerImpl)(nil)
+
+type MsgDidRegisterControllerImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Authority string `pkl:"authority"`
+
+ Cid string `pkl:"cid"`
+
+ Origin string `pkl:"origin"`
+
+ Authentication []*pkl.Object `pkl:"authentication"`
+
+ Token *pkl.Object `pkl:"token"`
+}
+
+// The type URL for the message
+func (rcv *MsgDidRegisterControllerImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgDidRegisterControllerImpl) GetAuthority() string {
+ return rcv.Authority
+}
+
+func (rcv *MsgDidRegisterControllerImpl) GetCid() string {
+ return rcv.Cid
+}
+
+func (rcv *MsgDidRegisterControllerImpl) GetOrigin() string {
+ return rcv.Origin
+}
+
+func (rcv *MsgDidRegisterControllerImpl) GetAuthentication() []*pkl.Object {
+ return rcv.Authentication
+}
+
+func (rcv *MsgDidRegisterControllerImpl) GetToken() *pkl.Object {
+ return rcv.Token
+}
diff --git a/x/did/types/txns/MsgDidRegisterService.pkl.go b/x/did/types/txns/MsgDidRegisterService.pkl.go
new file mode 100644
index 000000000..3d2f849a5
--- /dev/null
+++ b/x/did/types/txns/MsgDidRegisterService.pkl.go
@@ -0,0 +1,76 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgDidRegisterService interface {
+ Msg
+
+ GetController() string
+
+ GetOriginUri() string
+
+ GetScopes() *pkl.Object
+
+ GetDescription() string
+
+ GetServiceEndpoints() map[string]string
+
+ GetMetadata() *pkl.Object
+
+ GetToken() *pkl.Object
+}
+
+var _ MsgDidRegisterService = (*MsgDidRegisterServiceImpl)(nil)
+
+type MsgDidRegisterServiceImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Controller string `pkl:"controller"`
+
+ OriginUri string `pkl:"originUri"`
+
+ Scopes *pkl.Object `pkl:"scopes"`
+
+ Description string `pkl:"description"`
+
+ ServiceEndpoints map[string]string `pkl:"serviceEndpoints"`
+
+ Metadata *pkl.Object `pkl:"metadata"`
+
+ Token *pkl.Object `pkl:"token"`
+}
+
+// The type URL for the message
+func (rcv *MsgDidRegisterServiceImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgDidRegisterServiceImpl) GetController() string {
+ return rcv.Controller
+}
+
+func (rcv *MsgDidRegisterServiceImpl) GetOriginUri() string {
+ return rcv.OriginUri
+}
+
+func (rcv *MsgDidRegisterServiceImpl) GetScopes() *pkl.Object {
+ return rcv.Scopes
+}
+
+func (rcv *MsgDidRegisterServiceImpl) GetDescription() string {
+ return rcv.Description
+}
+
+func (rcv *MsgDidRegisterServiceImpl) GetServiceEndpoints() map[string]string {
+ return rcv.ServiceEndpoints
+}
+
+func (rcv *MsgDidRegisterServiceImpl) GetMetadata() *pkl.Object {
+ return rcv.Metadata
+}
+
+func (rcv *MsgDidRegisterServiceImpl) GetToken() *pkl.Object {
+ return rcv.Token
+}
diff --git a/x/did/types/txns/MsgDidSyncVault.pkl.go b/x/did/types/txns/MsgDidSyncVault.pkl.go
new file mode 100644
index 000000000..c7f38de0a
--- /dev/null
+++ b/x/did/types/txns/MsgDidSyncVault.pkl.go
@@ -0,0 +1,36 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgDidSyncVault interface {
+ Msg
+
+ GetController() string
+
+ GetToken() *pkl.Object
+}
+
+var _ MsgDidSyncVault = (*MsgDidSyncVaultImpl)(nil)
+
+type MsgDidSyncVaultImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Controller string `pkl:"controller"`
+
+ Token *pkl.Object `pkl:"token"`
+}
+
+// The type URL for the message
+func (rcv *MsgDidSyncVaultImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgDidSyncVaultImpl) GetController() string {
+ return rcv.Controller
+}
+
+func (rcv *MsgDidSyncVaultImpl) GetToken() *pkl.Object {
+ return rcv.Token
+}
diff --git a/x/did/types/txns/MsgDidUpdateParams.pkl.go b/x/did/types/txns/MsgDidUpdateParams.pkl.go
new file mode 100644
index 000000000..566383b4f
--- /dev/null
+++ b/x/did/types/txns/MsgDidUpdateParams.pkl.go
@@ -0,0 +1,44 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgDidUpdateParams interface {
+ Msg
+
+ GetAuthority() string
+
+ GetParams() *pkl.Object
+
+ GetToken() *pkl.Object
+}
+
+var _ MsgDidUpdateParams = (*MsgDidUpdateParamsImpl)(nil)
+
+type MsgDidUpdateParamsImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Authority string `pkl:"authority"`
+
+ Params *pkl.Object `pkl:"params"`
+
+ Token *pkl.Object `pkl:"token"`
+}
+
+// The type URL for the message
+func (rcv *MsgDidUpdateParamsImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgDidUpdateParamsImpl) GetAuthority() string {
+ return rcv.Authority
+}
+
+func (rcv *MsgDidUpdateParamsImpl) GetParams() *pkl.Object {
+ return rcv.Params
+}
+
+func (rcv *MsgDidUpdateParamsImpl) GetToken() *pkl.Object {
+ return rcv.Token
+}
diff --git a/x/did/types/txns/MsgGovDeposit.pkl.go b/x/did/types/txns/MsgGovDeposit.pkl.go
new file mode 100644
index 000000000..237e1ff46
--- /dev/null
+++ b/x/did/types/txns/MsgGovDeposit.pkl.go
@@ -0,0 +1,44 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgGovDeposit interface {
+ Msg
+
+ GetProposalId() int
+
+ GetDepositor() string
+
+ GetAmount() []*pkl.Object
+}
+
+var _ MsgGovDeposit = (*MsgGovDepositImpl)(nil)
+
+type MsgGovDepositImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ ProposalId int `pkl:"proposalId"`
+
+ Depositor string `pkl:"depositor"`
+
+ Amount []*pkl.Object `pkl:"amount"`
+}
+
+// The type URL for the message
+func (rcv *MsgGovDepositImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgGovDepositImpl) GetProposalId() int {
+ return rcv.ProposalId
+}
+
+func (rcv *MsgGovDepositImpl) GetDepositor() string {
+ return rcv.Depositor
+}
+
+func (rcv *MsgGovDepositImpl) GetAmount() []*pkl.Object {
+ return rcv.Amount
+}
diff --git a/x/did/types/txns/MsgGovSubmitProposal.pkl.go b/x/did/types/txns/MsgGovSubmitProposal.pkl.go
new file mode 100644
index 000000000..8c7f744fb
--- /dev/null
+++ b/x/did/types/txns/MsgGovSubmitProposal.pkl.go
@@ -0,0 +1,45 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgGovSubmitProposal interface {
+ Msg
+
+ GetContent() *Proposal
+
+ GetInitialDeposit() []*pkl.Object
+
+ GetProposer() string
+}
+
+var _ MsgGovSubmitProposal = (*MsgGovSubmitProposalImpl)(nil)
+
+// Gov module messages
+type MsgGovSubmitProposalImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Content *Proposal `pkl:"content"`
+
+ InitialDeposit []*pkl.Object `pkl:"initialDeposit"`
+
+ Proposer string `pkl:"proposer"`
+}
+
+// The type URL for the message
+func (rcv *MsgGovSubmitProposalImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgGovSubmitProposalImpl) GetContent() *Proposal {
+ return rcv.Content
+}
+
+func (rcv *MsgGovSubmitProposalImpl) GetInitialDeposit() []*pkl.Object {
+ return rcv.InitialDeposit
+}
+
+func (rcv *MsgGovSubmitProposalImpl) GetProposer() string {
+ return rcv.Proposer
+}
diff --git a/x/did/types/txns/MsgGovVote.pkl.go b/x/did/types/txns/MsgGovVote.pkl.go
new file mode 100644
index 000000000..73ff547b2
--- /dev/null
+++ b/x/did/types/txns/MsgGovVote.pkl.go
@@ -0,0 +1,42 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+type MsgGovVote interface {
+ Msg
+
+ GetProposalId() int
+
+ GetVoter() string
+
+ GetOption() int
+}
+
+var _ MsgGovVote = (*MsgGovVoteImpl)(nil)
+
+type MsgGovVoteImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ ProposalId int `pkl:"proposalId"`
+
+ Voter string `pkl:"voter"`
+
+ Option int `pkl:"option"`
+}
+
+// The type URL for the message
+func (rcv *MsgGovVoteImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgGovVoteImpl) GetProposalId() int {
+ return rcv.ProposalId
+}
+
+func (rcv *MsgGovVoteImpl) GetVoter() string {
+ return rcv.Voter
+}
+
+func (rcv *MsgGovVoteImpl) GetOption() int {
+ return rcv.Option
+}
diff --git a/x/did/types/txns/MsgGroupCreateGroup.pkl.go b/x/did/types/txns/MsgGroupCreateGroup.pkl.go
new file mode 100644
index 000000000..19fd7173e
--- /dev/null
+++ b/x/did/types/txns/MsgGroupCreateGroup.pkl.go
@@ -0,0 +1,45 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgGroupCreateGroup interface {
+ Msg
+
+ GetAdmin() string
+
+ GetMembers() []*pkl.Object
+
+ GetMetadata() string
+}
+
+var _ MsgGroupCreateGroup = (*MsgGroupCreateGroupImpl)(nil)
+
+// Group module messages
+type MsgGroupCreateGroupImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Admin string `pkl:"admin"`
+
+ Members []*pkl.Object `pkl:"members"`
+
+ Metadata string `pkl:"metadata"`
+}
+
+// The type URL for the message
+func (rcv *MsgGroupCreateGroupImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgGroupCreateGroupImpl) GetAdmin() string {
+ return rcv.Admin
+}
+
+func (rcv *MsgGroupCreateGroupImpl) GetMembers() []*pkl.Object {
+ return rcv.Members
+}
+
+func (rcv *MsgGroupCreateGroupImpl) GetMetadata() string {
+ return rcv.Metadata
+}
diff --git a/x/did/types/txns/MsgGroupSubmitProposal.pkl.go b/x/did/types/txns/MsgGroupSubmitProposal.pkl.go
new file mode 100644
index 000000000..2cb9f0729
--- /dev/null
+++ b/x/did/types/txns/MsgGroupSubmitProposal.pkl.go
@@ -0,0 +1,60 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgGroupSubmitProposal interface {
+ Msg
+
+ GetGroupPolicyAddress() string
+
+ GetProposers() []string
+
+ GetMetadata() string
+
+ GetMessages() []*pkl.Object
+
+ GetExec() int
+}
+
+var _ MsgGroupSubmitProposal = (*MsgGroupSubmitProposalImpl)(nil)
+
+type MsgGroupSubmitProposalImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ GroupPolicyAddress string `pkl:"groupPolicyAddress"`
+
+ Proposers []string `pkl:"proposers"`
+
+ Metadata string `pkl:"metadata"`
+
+ Messages []*pkl.Object `pkl:"messages"`
+
+ Exec int `pkl:"exec"`
+}
+
+// The type URL for the message
+func (rcv *MsgGroupSubmitProposalImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgGroupSubmitProposalImpl) GetGroupPolicyAddress() string {
+ return rcv.GroupPolicyAddress
+}
+
+func (rcv *MsgGroupSubmitProposalImpl) GetProposers() []string {
+ return rcv.Proposers
+}
+
+func (rcv *MsgGroupSubmitProposalImpl) GetMetadata() string {
+ return rcv.Metadata
+}
+
+func (rcv *MsgGroupSubmitProposalImpl) GetMessages() []*pkl.Object {
+ return rcv.Messages
+}
+
+func (rcv *MsgGroupSubmitProposalImpl) GetExec() int {
+ return rcv.Exec
+}
diff --git a/x/did/types/txns/MsgGroupVote.pkl.go b/x/did/types/txns/MsgGroupVote.pkl.go
new file mode 100644
index 000000000..79ae04244
--- /dev/null
+++ b/x/did/types/txns/MsgGroupVote.pkl.go
@@ -0,0 +1,58 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+type MsgGroupVote interface {
+ Msg
+
+ GetProposalId() int
+
+ GetVoter() string
+
+ GetOption() int
+
+ GetMetadata() string
+
+ GetExec() int
+}
+
+var _ MsgGroupVote = (*MsgGroupVoteImpl)(nil)
+
+type MsgGroupVoteImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ ProposalId int `pkl:"proposalId"`
+
+ Voter string `pkl:"voter"`
+
+ Option int `pkl:"option"`
+
+ Metadata string `pkl:"metadata"`
+
+ Exec int `pkl:"exec"`
+}
+
+// The type URL for the message
+func (rcv *MsgGroupVoteImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgGroupVoteImpl) GetProposalId() int {
+ return rcv.ProposalId
+}
+
+func (rcv *MsgGroupVoteImpl) GetVoter() string {
+ return rcv.Voter
+}
+
+func (rcv *MsgGroupVoteImpl) GetOption() int {
+ return rcv.Option
+}
+
+func (rcv *MsgGroupVoteImpl) GetMetadata() string {
+ return rcv.Metadata
+}
+
+func (rcv *MsgGroupVoteImpl) GetExec() int {
+ return rcv.Exec
+}
diff --git a/x/did/types/txns/MsgStakingBeginRedelegate.pkl.go b/x/did/types/txns/MsgStakingBeginRedelegate.pkl.go
new file mode 100644
index 000000000..fe803db38
--- /dev/null
+++ b/x/did/types/txns/MsgStakingBeginRedelegate.pkl.go
@@ -0,0 +1,52 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgStakingBeginRedelegate interface {
+ Msg
+
+ GetDelegatorAddress() string
+
+ GetValidatorSrcAddress() string
+
+ GetValidatorDstAddress() string
+
+ GetAmount() *pkl.Object
+}
+
+var _ MsgStakingBeginRedelegate = (*MsgStakingBeginRedelegateImpl)(nil)
+
+type MsgStakingBeginRedelegateImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ DelegatorAddress string `pkl:"delegatorAddress"`
+
+ ValidatorSrcAddress string `pkl:"validatorSrcAddress"`
+
+ ValidatorDstAddress string `pkl:"validatorDstAddress"`
+
+ Amount *pkl.Object `pkl:"amount"`
+}
+
+// The type URL for the message
+func (rcv *MsgStakingBeginRedelegateImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgStakingBeginRedelegateImpl) GetDelegatorAddress() string {
+ return rcv.DelegatorAddress
+}
+
+func (rcv *MsgStakingBeginRedelegateImpl) GetValidatorSrcAddress() string {
+ return rcv.ValidatorSrcAddress
+}
+
+func (rcv *MsgStakingBeginRedelegateImpl) GetValidatorDstAddress() string {
+ return rcv.ValidatorDstAddress
+}
+
+func (rcv *MsgStakingBeginRedelegateImpl) GetAmount() *pkl.Object {
+ return rcv.Amount
+}
diff --git a/x/did/types/txns/MsgStakingCreateValidator.pkl.go b/x/did/types/txns/MsgStakingCreateValidator.pkl.go
new file mode 100644
index 000000000..d3c11015c
--- /dev/null
+++ b/x/did/types/txns/MsgStakingCreateValidator.pkl.go
@@ -0,0 +1,77 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgStakingCreateValidator interface {
+ Msg
+
+ GetDescription() *pkl.Object
+
+ GetCommission() *pkl.Object
+
+ GetMinSelfDelegation() string
+
+ GetDelegatorAddress() string
+
+ GetValidatorAddress() string
+
+ GetPubkey() *pkl.Object
+
+ GetValue() *pkl.Object
+}
+
+var _ MsgStakingCreateValidator = (*MsgStakingCreateValidatorImpl)(nil)
+
+// Staking module messages
+type MsgStakingCreateValidatorImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ Description *pkl.Object `pkl:"description"`
+
+ Commission *pkl.Object `pkl:"commission"`
+
+ MinSelfDelegation string `pkl:"minSelfDelegation"`
+
+ DelegatorAddress string `pkl:"delegatorAddress"`
+
+ ValidatorAddress string `pkl:"validatorAddress"`
+
+ Pubkey *pkl.Object `pkl:"pubkey"`
+
+ Value *pkl.Object `pkl:"value"`
+}
+
+// The type URL for the message
+func (rcv *MsgStakingCreateValidatorImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgStakingCreateValidatorImpl) GetDescription() *pkl.Object {
+ return rcv.Description
+}
+
+func (rcv *MsgStakingCreateValidatorImpl) GetCommission() *pkl.Object {
+ return rcv.Commission
+}
+
+func (rcv *MsgStakingCreateValidatorImpl) GetMinSelfDelegation() string {
+ return rcv.MinSelfDelegation
+}
+
+func (rcv *MsgStakingCreateValidatorImpl) GetDelegatorAddress() string {
+ return rcv.DelegatorAddress
+}
+
+func (rcv *MsgStakingCreateValidatorImpl) GetValidatorAddress() string {
+ return rcv.ValidatorAddress
+}
+
+func (rcv *MsgStakingCreateValidatorImpl) GetPubkey() *pkl.Object {
+ return rcv.Pubkey
+}
+
+func (rcv *MsgStakingCreateValidatorImpl) GetValue() *pkl.Object {
+ return rcv.Value
+}
diff --git a/x/did/types/txns/MsgStakingDelegate.pkl.go b/x/did/types/txns/MsgStakingDelegate.pkl.go
new file mode 100644
index 000000000..b6fb170ec
--- /dev/null
+++ b/x/did/types/txns/MsgStakingDelegate.pkl.go
@@ -0,0 +1,44 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgStakingDelegate interface {
+ Msg
+
+ GetDelegatorAddress() string
+
+ GetValidatorAddress() string
+
+ GetAmount() *pkl.Object
+}
+
+var _ MsgStakingDelegate = (*MsgStakingDelegateImpl)(nil)
+
+type MsgStakingDelegateImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ DelegatorAddress string `pkl:"delegatorAddress"`
+
+ ValidatorAddress string `pkl:"validatorAddress"`
+
+ Amount *pkl.Object `pkl:"amount"`
+}
+
+// The type URL for the message
+func (rcv *MsgStakingDelegateImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgStakingDelegateImpl) GetDelegatorAddress() string {
+ return rcv.DelegatorAddress
+}
+
+func (rcv *MsgStakingDelegateImpl) GetValidatorAddress() string {
+ return rcv.ValidatorAddress
+}
+
+func (rcv *MsgStakingDelegateImpl) GetAmount() *pkl.Object {
+ return rcv.Amount
+}
diff --git a/x/did/types/txns/MsgStakingUndelegate.pkl.go b/x/did/types/txns/MsgStakingUndelegate.pkl.go
new file mode 100644
index 000000000..c1732c2c2
--- /dev/null
+++ b/x/did/types/txns/MsgStakingUndelegate.pkl.go
@@ -0,0 +1,44 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+type MsgStakingUndelegate interface {
+ Msg
+
+ GetDelegatorAddress() string
+
+ GetValidatorAddress() string
+
+ GetAmount() *pkl.Object
+}
+
+var _ MsgStakingUndelegate = (*MsgStakingUndelegateImpl)(nil)
+
+type MsgStakingUndelegateImpl struct {
+ // The type URL for the message
+ TypeUrl string `pkl:"typeUrl"`
+
+ DelegatorAddress string `pkl:"delegatorAddress"`
+
+ ValidatorAddress string `pkl:"validatorAddress"`
+
+ Amount *pkl.Object `pkl:"amount"`
+}
+
+// The type URL for the message
+func (rcv *MsgStakingUndelegateImpl) GetTypeUrl() string {
+ return rcv.TypeUrl
+}
+
+func (rcv *MsgStakingUndelegateImpl) GetDelegatorAddress() string {
+ return rcv.DelegatorAddress
+}
+
+func (rcv *MsgStakingUndelegateImpl) GetValidatorAddress() string {
+ return rcv.ValidatorAddress
+}
+
+func (rcv *MsgStakingUndelegateImpl) GetAmount() *pkl.Object {
+ return rcv.Amount
+}
diff --git a/x/did/types/txns/Proposal.pkl.go b/x/did/types/txns/Proposal.pkl.go
new file mode 100644
index 000000000..70463d42f
--- /dev/null
+++ b/x/did/types/txns/Proposal.pkl.go
@@ -0,0 +1,11 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+// Base class for all proposals
+type Proposal struct {
+ // The title of the proposal
+ Title string `pkl:"title"`
+
+ // The description of the proposal
+ Description string `pkl:"description"`
+}
diff --git a/x/did/types/txns/TxBody.pkl.go b/x/did/types/txns/TxBody.pkl.go
new file mode 100644
index 000000000..407ba4179
--- /dev/null
+++ b/x/did/types/txns/TxBody.pkl.go
@@ -0,0 +1,17 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+// Represents a transaction body
+type TxBody struct {
+ Messages []Msg `pkl:"messages"`
+
+ Memo *string `pkl:"memo"`
+
+ TimeoutHeight *int `pkl:"timeoutHeight"`
+
+ ExtensionOptions *[]*pkl.Object `pkl:"extensionOptions"`
+
+ NonCriticalExtensionOptions *[]*pkl.Object `pkl:"nonCriticalExtensionOptions"`
+}
diff --git a/x/did/types/txns/Txns.pkl.go b/x/did/types/txns/Txns.pkl.go
new file mode 100644
index 000000000..288c5c5bc
--- /dev/null
+++ b/x/did/types/txns/Txns.pkl.go
@@ -0,0 +1,36 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import (
+ "context"
+
+ "github.com/apple/pkl-go/pkl"
+)
+
+type Txns struct {
+}
+
+// LoadFromPath loads the pkl module at the given path and evaluates it into a Txns
+func LoadFromPath(ctx context.Context, path string) (ret *Txns, err error) {
+ evaluator, err := pkl.NewEvaluator(ctx, pkl.PreconfiguredOptions)
+ if err != nil {
+ return nil, err
+ }
+ defer func() {
+ cerr := evaluator.Close()
+ if err == nil {
+ err = cerr
+ }
+ }()
+ ret, err = Load(ctx, evaluator, pkl.FileSource(path))
+ return ret, err
+}
+
+// Load loads the pkl module at the given source and evaluates it with the given evaluator into a Txns
+func Load(ctx context.Context, evaluator pkl.Evaluator, source *pkl.ModuleSource) (*Txns, error) {
+ var ret Txns
+ if err := evaluator.EvaluateModule(ctx, source, &ret); err != nil {
+ return nil, err
+ }
+ return &ret, nil
+}
diff --git a/x/did/types/txns/init.pkl.go b/x/did/types/txns/init.pkl.go
new file mode 100644
index 000000000..d92d7649e
--- /dev/null
+++ b/x/did/types/txns/init.pkl.go
@@ -0,0 +1,27 @@
+// Code generated from Pkl module `txns`. DO NOT EDIT.
+package txns
+
+import "github.com/apple/pkl-go/pkl"
+
+func init() {
+ pkl.RegisterMapping("txns", Txns{})
+ pkl.RegisterMapping("txns#Proposal", Proposal{})
+ pkl.RegisterMapping("txns#MsgGovSubmitProposal", MsgGovSubmitProposalImpl{})
+ pkl.RegisterMapping("txns#MsgGovVote", MsgGovVoteImpl{})
+ pkl.RegisterMapping("txns#MsgGovDeposit", MsgGovDepositImpl{})
+ pkl.RegisterMapping("txns#MsgGroupCreateGroup", MsgGroupCreateGroupImpl{})
+ pkl.RegisterMapping("txns#MsgGroupSubmitProposal", MsgGroupSubmitProposalImpl{})
+ pkl.RegisterMapping("txns#MsgGroupVote", MsgGroupVoteImpl{})
+ pkl.RegisterMapping("txns#MsgStakingCreateValidator", MsgStakingCreateValidatorImpl{})
+ pkl.RegisterMapping("txns#MsgStakingDelegate", MsgStakingDelegateImpl{})
+ pkl.RegisterMapping("txns#MsgStakingUndelegate", MsgStakingUndelegateImpl{})
+ pkl.RegisterMapping("txns#MsgStakingBeginRedelegate", MsgStakingBeginRedelegateImpl{})
+ pkl.RegisterMapping("txns#MsgDidUpdateParams", MsgDidUpdateParamsImpl{})
+ pkl.RegisterMapping("txns#MsgDidAllocateVault", MsgDidAllocateVaultImpl{})
+ pkl.RegisterMapping("txns#MsgDidProveWitness", MsgDidProveWitnessImpl{})
+ pkl.RegisterMapping("txns#MsgDidSyncVault", MsgDidSyncVaultImpl{})
+ pkl.RegisterMapping("txns#MsgDidRegisterController", MsgDidRegisterControllerImpl{})
+ pkl.RegisterMapping("txns#MsgDidAuthorize", MsgDidAuthorizeImpl{})
+ pkl.RegisterMapping("txns#MsgDidRegisterService", MsgDidRegisterServiceImpl{})
+ pkl.RegisterMapping("txns#TxBody", TxBody{})
+}
diff --git a/x/did/types/zkprop.go b/x/did/types/zkprop.go
new file mode 100644
index 000000000..2674cd60b
--- /dev/null
+++ b/x/did/types/zkprop.go
@@ -0,0 +1,155 @@
+package types
+
+import (
+ "fmt"
+
+ "github.com/onsonr/crypto/accumulator"
+ "github.com/onsonr/crypto/core/curves"
+)
+
+// Accumulator is the accumulator for the ZKP
+type Accumulator []byte
+
+// Element is the element for the BLS scheme
+type Element = accumulator.Element
+
+// Witness is the witness for the ZKP
+type Witness []byte
+
+// NewProof creates a new Proof which is used for ZKP
+func NewProof(issuer, property string, pubKey []byte) (*Proof, error) {
+ input := append(pubKey, []byte(property)...)
+ hash := []byte(input)
+
+ curve := curves.BLS12381(&curves.PointBls12381G1{})
+ key, err := new(accumulator.SecretKey).New(curve, hash[:])
+ if err != nil {
+ return nil, fmt.Errorf("failed to create secret key: %w", err)
+ }
+
+ keyBytes, err := key.MarshalBinary()
+ if err != nil {
+ return nil, fmt.Errorf("failed to marshal secret key: %w", err)
+ }
+
+ return &Proof{
+ Issuer: issuer,
+ Property: property,
+ Accumulator: keyBytes,
+ }, nil
+}
+
+// CreateAccumulator creates a new accumulator for a Proof
+func CreateAccumulator(proof *Proof, values ...string) error {
+ curve := curves.BLS12381(&curves.PointBls12381G1{})
+ acc, err := new(accumulator.Accumulator).New(curve)
+ if err != nil {
+ return err
+ }
+
+ secretKey := new(accumulator.SecretKey)
+ if err := secretKey.UnmarshalBinary(proof.Accumulator); err != nil {
+ return err
+ }
+
+ fin, _, err := acc.Update(secretKey, ConvertValuesToZeroKnowledgeElements(values), nil)
+ if err != nil {
+ return err
+ }
+
+ accBytes, err := fin.MarshalBinary()
+ if err != nil {
+ return fmt.Errorf("failed to marshal accumulator: %w", err)
+ }
+
+ proof.Accumulator = accBytes
+ return nil
+}
+
+// CreateWitness creates a witness for the accumulator in a Proof for a given value
+func CreateWitness(proof *Proof, value string) ([]byte, error) {
+ curve := curves.BLS12381(&curves.PointBls12381G1{})
+ element := curve.Scalar.Hash([]byte(value))
+
+ secretKey := new(accumulator.SecretKey)
+ if err := secretKey.UnmarshalBinary(proof.Accumulator); err != nil {
+ return nil, err
+ }
+
+ accObj := new(accumulator.Accumulator)
+ if err := accObj.UnmarshalBinary(proof.Accumulator); err != nil {
+ return nil, fmt.Errorf("failed to unmarshal accumulator: %w", err)
+ }
+
+ mw, err := new(accumulator.MembershipWitness).New(element, accObj, secretKey)
+ if err != nil {
+ return nil, err
+ }
+
+ witnessBytes, err := mw.MarshalBinary()
+ if err != nil {
+ return nil, fmt.Errorf("failed to marshal witness: %w", err)
+ }
+ return witnessBytes, nil
+}
+
+// VerifyWitness proves that a value is a member of the accumulator
+func VerifyWitness(proof *Proof, acc Accumulator, witness Witness) error {
+ secretKey := new(accumulator.SecretKey)
+ if err := secretKey.UnmarshalBinary([]byte(proof.Id)); err != nil {
+ return err
+ }
+
+ curve := curves.BLS12381(&curves.PointBls12381G1{})
+ publicKey, err := secretKey.GetPublicKey(curve)
+ if err != nil {
+ return err
+ }
+
+ accObj := new(accumulator.Accumulator)
+ if err := accObj.UnmarshalBinary(proof.Accumulator); err != nil {
+ return fmt.Errorf("failed to unmarshal accumulator: %w", err)
+ }
+
+ witnessObj := new(accumulator.MembershipWitness)
+ if err := witnessObj.UnmarshalBinary(witness); err != nil {
+ return fmt.Errorf("failed to unmarshal witness: %w", err)
+ }
+ return witnessObj.Verify(publicKey, accObj)
+}
+
+// UpdateAccumulator updates the accumulator in a Proof with new values
+func UpdateAccumulator(proof *Proof, addValues []string, removeValues []string) error {
+ secretKey := new(accumulator.SecretKey)
+ if err := secretKey.UnmarshalBinary(proof.Accumulator); err != nil {
+ return err
+ }
+
+ accObj := new(accumulator.Accumulator)
+ if err := accObj.UnmarshalBinary(proof.Accumulator); err != nil {
+ return fmt.Errorf("failed to unmarshal accumulator: %w", err)
+ }
+
+ updatedAcc, _, err := accObj.Update(secretKey, ConvertValuesToZeroKnowledgeElements(addValues), ConvertValuesToZeroKnowledgeElements(removeValues))
+ if err != nil {
+ return err
+ }
+
+ updatedAccBytes, err := updatedAcc.MarshalBinary()
+ if err != nil {
+ return fmt.Errorf("failed to marshal updated accumulator: %w", err)
+ }
+
+ proof.Accumulator = updatedAccBytes
+ return nil
+}
+
+// ConvertValuesToZeroKnowledgeElements converts a slice of strings to a slice of accumulator elements
+func ConvertValuesToZeroKnowledgeElements(values []string) []Element {
+ curve := curves.BLS12381(&curves.PointBls12381G1{})
+ elements := make([]accumulator.Element, len(values))
+ for i, value := range values {
+ elements[i] = curve.Scalar.Hash([]byte(value))
+ }
+ return elements
+}