Skip to content
Snippets Groups Projects
seed.go 1.22 KiB
package client

import (
	"github.com/iotaledger/iota.go/address"
	"github.com/iotaledger/iota.go/consts"
	"github.com/iotaledger/iota.go/signing"
	"github.com/iotaledger/iota.go/trinary"
)

type Seed struct {
	trytes        trinary.Trytes
	securityLevel consts.SecurityLevel
	subSeeds      map[uint64]trinary.Trits
}

func NewSeed(trytes trinary.Trytes, securityLevel consts.SecurityLevel) *Seed {
	return &Seed{
		trytes:        trytes,
		securityLevel: securityLevel,
		subSeeds:      make(map[uint64]trinary.Trits),
	}
}

func (seed *Seed) GetAddress(index uint64) *Address {
	addressTrytes, err := address.GenerateAddress(seed.trytes, index, seed.securityLevel)
	if err != nil {
		panic(err)
	}

	privateKey, err := signing.Key(seed.GetSubSeed(index), seed.securityLevel)
	if err != nil {
		panic(err)
	}

	return &Address{
		trytes:        addressTrytes,
		securityLevel: seed.securityLevel,
		privateKey:    privateKey,
	}
}

func (seed *Seed) GetSubSeed(index uint64) trinary.Trits {
	subSeed, subSeedExists := seed.subSeeds[index]
	if !subSeedExists {
		generatedSubSeed, err := signing.Subseed(seed.trytes, index)
		if err != nil {
			panic(err)
		}
		subSeed = generatedSubSeed

		seed.subSeeds[index] = subSeed
	}

	return subSeed
}