}
// CreateAddress generate an address for the select account
-func (m *Manager) CreateAddress(ctx context.Context, accountID string) (cp *CtrlProgram, err error) {
+func (m *Manager) CreateAddress(ctx context.Context, accountID string, change bool) (cp *CtrlProgram, err error) {
account, err := m.findByID(ctx, accountID)
if err != nil {
return nil, err
}
- return m.createAddress(ctx, account)
+ return m.createAddress(ctx, account, change)
}
// CreateAddress generate an address for the select account
-func (m *Manager) createAddress(ctx context.Context, account *Account) (cp *CtrlProgram, err error) {
+func (m *Manager) createAddress(ctx context.Context, account *Account, change bool) (cp *CtrlProgram, err error) {
if len(account.XPubs) == 1 {
- cp, err = m.createP2PKH(ctx, account)
+ cp, err = m.createP2PKH(ctx, account, change)
} else {
- cp, err = m.createP2SH(ctx, account)
+ cp, err = m.createP2SH(ctx, account, change)
}
if err != nil {
return nil, err
return cp, nil
}
-func (m *Manager) createP2PKH(ctx context.Context, account *Account) (*CtrlProgram, error) {
+func (m *Manager) createP2PKH(ctx context.Context, account *Account, change bool) (*CtrlProgram, error) {
idx := m.getNextXpubsIndex(account.Signer.XPubs)
path := signers.Path(account.Signer, signers.AccountKeySpace, idx)
derivedXPubs := chainkd.DeriveXPubs(account.XPubs, path)
Address: address.EncodeAddress(),
KeyIndex: idx,
ControlProgram: control,
+ Change: change,
}, nil
}
-func (m *Manager) createP2SH(ctx context.Context, account *Account) (*CtrlProgram, error) {
+func (m *Manager) createP2SH(ctx context.Context, account *Account, change bool) (*CtrlProgram, error) {
idx := m.getNextXpubsIndex(account.Signer.XPubs)
path := signers.Path(account.Signer, signers.AccountKeySpace, idx)
derivedXPubs := chainkd.DeriveXPubs(account.XPubs, path)
Address: address.EncodeAddress(),
KeyIndex: idx,
ControlProgram: control,
+ Change: change,
}, nil
}
Address string
KeyIndex uint64
ControlProgram []byte
+ Change bool
}
func (m *Manager) insertAccountControlProgram(ctx context.Context, progs ...*CtrlProgram) error {
return nil, err
}
- program, err := m.createAddress(nil, account)
+ program, err := m.createAddress(nil, account, false)
if err != nil {
return nil, err
}
}
if res.Change > 0 {
- acp, err := a.accounts.CreateAddress(ctx, a.AccountID)
+ acp, err := a.accounts.CreateAddress(ctx, a.AccountID, true)
if err != nil {
return errors.Wrap(err, "creating control program")
}
t.Fatal(err)
}
- controlProg, err := accountManager.CreateAddress(nil, testAccount.ID)
+ controlProg, err := accountManager.CreateAddress(nil, testAccount.ID, false)
if err != nil {
t.Fatal(err)
}
accountID = account.ID
}
- program, err := a.wallet.AccountMgr.CreateAddress(ctx, accountID)
+ program, err := a.wallet.AccountMgr.CreateAddress(ctx, accountID, false)
if err != nil {
return NewErrorResponse(err)
}
t.Fatal(err)
}
- controlProg, err := accountManager.CreateAddress(nil, testAccount.ID)
+ controlProg, err := accountManager.CreateAddress(nil, testAccount.ID, false)
if err != nil {
t.Fatal(err)
}
t.Fatal(err)
}
- controlProg, err := accountManager.CreateAddress(nil, testAccount.ID)
+ controlProg, err := accountManager.CreateAddress(nil, testAccount.ID, false)
if err != nil {
t.Fatal(err)
}
t.Fatal(err)
}
- controlProg, err := accountManager.CreateAddress(nil, testAccount.ID)
+ controlProg, err := accountManager.CreateAddress(nil, testAccount.ID, false)
if err != nil {
t.Fatal(err)
}
}
func (g *TxGenerator) mockUtxo(accountAlias, assetAlias string, amount uint64) (*account.UTXO, error) {
- ctrlProg, err := g.createControlProgram(accountAlias)
+ ctrlProg, err := g.createControlProgram(accountAlias, false)
if err != nil {
return nil, err
}
}, nil
}
-func (g *TxGenerator) createControlProgram(accountAlias string) (*account.CtrlProgram, error) {
+func (g *TxGenerator) createControlProgram(accountAlias string, change bool) (*account.CtrlProgram, error) {
acc, err := g.AccountManager.FindByAlias(nil, accountAlias)
if err != nil {
return nil, err
}
- return g.AccountManager.CreateAddress(nil, acc.ID)
+ return g.AccountManager.CreateAddress(nil, acc.ID, change)
}
// AddSpendInput add a spend input
if err != nil {
return err
}
- controlProgram, err := g.createControlProgram(accountAlias)
+ controlProgram, err := g.createControlProgram(accountAlias, false)
if err != nil {
return err
}
Chain *protocol.Chain
}
-func (ctx *walletTestContext) createControlProgram(accountName string) (*account.CtrlProgram, error) {
+func (ctx *walletTestContext) createControlProgram(accountName string, change bool) (*account.CtrlProgram, error) {
acc, err := ctx.Wallet.AccountMgr.FindByAlias(nil, accountName)
if err != nil {
return nil, err
}
- return ctx.Wallet.AccountMgr.CreateAddress(nil, acc.ID)
+ return ctx.Wallet.AccountMgr.CreateAddress(nil, acc.ID, change)
}
func (ctx *walletTestContext) getPubkey(keyAlias string) *chainkd.XPub {
}
func (ctx *walletTestContext) newBlock(txs []*types.Tx, coinbaseAccount string) (*types.Block, error) {
- controlProgram, err := ctx.createControlProgram(coinbaseAccount)
+ controlProgram, err := ctx.createControlProgram(coinbaseAccount, true)
if err != nil {
return nil, err
}
AccountID string
Address string
keyIndex uint64
+ change bool
}
const (
for _, out := range outsByScript[s] {
newOut := &accountOutput{
rawOutput: *out,
+ change: false,
}
result = append(result, newOut)
}
AccountID: cp.AccountID,
Address: cp.Address,
keyIndex: cp.KeyIndex,
+ change: cp.Change,
}
result = append(result, newOut)
}
func (w *Wallet) createProgram(account *account.Account, XPub *pseudohsm.XPub, index uint64) error {
for i := uint64(0); i < index; i++ {
- if _, err := w.AccountMgr.CreateAddress(nil, account.ID); err != nil {
+ if _, err := w.AccountMgr.CreateAddress(nil, account.ID, false); err != nil {
return err
}
}
t.Fatal(err)
}
- controlProg, err := accountManager.CreateAddress(nil, testAccount.ID)
+ controlProg, err := accountManager.CreateAddress(nil, testAccount.ID, false)
if err != nil {
t.Fatal(err)
}