Commit 9b794a19 authored by madengji's avatar madengji Committed by vipwzw

add unfrozen status

parent b4a6fb77
...@@ -32,11 +32,8 @@ func MixCmd() *cobra.Command { ...@@ -32,11 +32,8 @@ func MixCmd() *cobra.Command {
CreateTransferRawTxCmd(), CreateTransferRawTxCmd(),
CreateWithdrawRawTxCmd(), CreateWithdrawRawTxCmd(),
CreateAuthRawTxCmd(), CreateAuthRawTxCmd(),
//CreateDepositCmd(),
//CreateTransferCmd(),
//CreateWithdrawCmd(),
CreateConfigCmd(), CreateConfigCmd(),
//CreateAuthorizeCmd(),
QueryCmd(), QueryCmd(),
WalletCmd(), WalletCmd(),
) )
...@@ -51,269 +48,6 @@ func getRealExecName(paraName string, name string) string { ...@@ -51,269 +48,6 @@ func getRealExecName(paraName string, name string) string {
} }
// CreateDepositCmd create raw asset transfer tx // CreateDepositCmd create raw asset transfer tx
//func CreateDepositCmd() *cobra.Command {
// cmd := &cobra.Command{
// Use: "deposit",
// Short: "Create a asset deposit to mix coin contract",
// Run: createDeposit,
// }
// addCreateDepositFlags(cmd)
// return cmd
//}
//
//func addCreateDepositFlags(cmd *cobra.Command) {
// cmd.Flags().StringP("proofs", "f", "", "'proof-pubinput' format pair")
// cmd.MarkFlagRequired("proofs")
//
// cmd.Flags().Uint64P("amount", "m", 0, "deposit amount")
// cmd.MarkFlagRequired("amount")
//
// cmd.Flags().StringP("secretReceiver", "p", "", "secret for receiver addr")
// cmd.MarkFlagRequired("secretReceiver")
//
// cmd.Flags().StringP("secretAuth", "a", "", "secret for authorize addr")
//
// cmd.Flags().StringP("secretReturn", "r", "", "secret for return addr")
//
//}
//func parseProofPara(input string) ([]*mixTy.ZkProofInfo, error) {
// var proofInputs []*mixTy.ZkProofInfo
// inputParas := strings.Split(input, ",")
// for _, i := range inputParas {
// inputs := strings.Split(i, "-")
// if len(inputs) != 2 {
// fmt.Println("proofs parameters not correct:", i)
// return nil, types.ErrInvalidParam
// }
// var proofInfo mixTy.ZkProofInfo
// proofInfo.Proof = inputs[0]
// proofInfo.PublicInput = inputs[1]
// proofInputs = append(proofInputs, &proofInfo)
// }
// return proofInputs, nil
//}
//
//func parseProofPara(input string) (*mixTy.ZkProofInfo, error) {
// inputs := strings.Split(input, "-")
// if len(inputs) != 2 {
// fmt.Println("proofs parameters not correct:", input)
// return nil, types.ErrInvalidParam
// }
// var proofInfo mixTy.ZkProofInfo
// proofInfo.Proof = inputs[0]
// proofInfo.PublicInput = inputs[1]
// return &proofInfo, nil
//}
//
//func createDeposit(cmd *cobra.Command, args []string) {
// paraName, _ := cmd.Flags().GetString("paraName")
// //amount, _ := cmd.Flags().GetUint64("amount")
// proofsPara, _ := cmd.Flags().GetString("proofs")
// secretReceiver, _ := cmd.Flags().GetString("secretReceiver")
// secretAuth, _ := cmd.Flags().GetString("secretAuth")
// secretReturn, _ := cmd.Flags().GetString("secretReturn")
//
// proofInputs, err := parseProofPara(proofsPara)
// if err != nil {
// return
// }
//
// proofInputs.Secrets = &mixTy.DHSecretGroup{
// Receiver: secretReceiver,
// Authorize: secretAuth,
// Returner: secretReturn,
// }
//
// payload := &mixTy.MixDepositAction{}
// payload.Proof = proofInputs
//
// params := &rpctypes.CreateTxIn{
// Execer: getRealExecName(paraName, mixTy.MixX),
// ActionName: "Deposit",
// Payload: types.MustPBToJSON(payload),
// }
// rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
// ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", params, nil)
// ctx.RunWithoutMarshal()
//
//}
//
//// CreateWithdrawCmd create raw asset transfer tx
//func CreateWithdrawCmd() *cobra.Command {
// cmd := &cobra.Command{
// Use: "withdraw",
// Short: "Create a asset withdraw from mix coin contract",
// Run: createWithdraw,
// }
// addCreateWithdrawFlags(cmd)
// return cmd
//}
//
//func addCreateWithdrawFlags(cmd *cobra.Command) {
// cmd.Flags().StringP("proofs", "p", "", "spend 'proof-pubinput' pair, multi pairs allowed with ','")
// cmd.MarkFlagRequired("proofs")
//
// cmd.Flags().Uint64P("amount", "a", 0, "withdraw amount")
// cmd.MarkFlagRequired("amount")
//
//}
//
//func createWithdraw(cmd *cobra.Command, args []string) {
// paraName, _ := cmd.Flags().GetString("paraName")
// amount, _ := cmd.Flags().GetUint64("amount")
// proofsPara, _ := cmd.Flags().GetString("proofs")
//
// proofInputs, err := parseProofPara(proofsPara)
// if err != nil {
// return
// }
//
// payload := &mixTy.MixWithdrawAction{}
// payload.Amount = amount
// payload.SpendCommits = append(payload.SpendCommits, proofInputs)
// params := &rpctypes.CreateTxIn{
// Execer: getRealExecName(paraName, mixTy.MixX),
// ActionName: "Withdraw",
// Payload: types.MustPBToJSON(payload),
// }
// rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
// ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", params, nil)
// ctx.RunWithoutMarshal()
//
//}
//
//// CreateTransferCmd create raw asset transfer tx
//func CreateTransferCmd() *cobra.Command {
// cmd := &cobra.Command{
// Use: "transfer",
// Short: "Create a asset transfer in mix coin contract",
// Run: createTransfer,
// }
// addCreateTransferFlags(cmd)
// return cmd
//}
//
//func addCreateTransferFlags(cmd *cobra.Command) {
// cmd.Flags().StringP("input", "i", "", "input 'proof-pubinput' pair, multi pairs allowed with ','")
// cmd.MarkFlagRequired("input")
//
// cmd.Flags().StringP("output", "o", "", "output 'proof-pubinput' pair")
// cmd.MarkFlagRequired("output")
//
// cmd.Flags().StringP("secretReceiver", "p", "", "secret for receiver addr")
// cmd.MarkFlagRequired("secretReceiver")
//
// cmd.Flags().StringP("secretAuth", "a", "", "secret for authorize addr")
//
// cmd.Flags().StringP("secretReturn", "r", "", "secret for return addr")
//
// cmd.Flags().StringP("change", "c", "", "output change 'proof-pubinput' pair")
// cmd.MarkFlagRequired("change")
//
// cmd.Flags().StringP("changeReceiver", "t", "", "secret for change receiver addr")
// cmd.MarkFlagRequired("changeReceiver")
//
// cmd.Flags().StringP("changeAuth", "u", "", "secret for change authorize addr")
//
// cmd.Flags().StringP("changeReturn", "e", "", "secret for change return addr")
//
//}
//
//func createTransfer(cmd *cobra.Command, args []string) {
// paraName, _ := cmd.Flags().GetString("paraName")
// proofsInput, _ := cmd.Flags().GetString("input")
// proofsOutput, _ := cmd.Flags().GetString("output")
// proofsChange, _ := cmd.Flags().GetString("change")
// secretReceiver, _ := cmd.Flags().GetString("secretReceiver")
// secretAuth, _ := cmd.Flags().GetString("secretAuth")
// secretReturn, _ := cmd.Flags().GetString("secretReturn")
// changeReceiver, _ := cmd.Flags().GetString("changeReceiver")
// changeAuth, _ := cmd.Flags().GetString("changeAuth")
// changeReturn, _ := cmd.Flags().GetString("changeReturn")
//
// proofInputs, err := parseProofPara(proofsInput)
// if err != nil {
// fmt.Println("proofsInput error")
// return
// }
// proofOutputs, err := parseProofPara(proofsOutput)
// if err != nil {
// fmt.Println("proofsOutput error")
// return
// }
// proofOutputs.Secrets = &mixTy.DHSecretGroup{
// Receiver: secretReceiver,
// Returner: secretAuth,
// Authorize: secretReturn,
// }
//
// proofChanges, err := parseProofPara(proofsChange)
// if err != nil {
// fmt.Println("proofsOutput error")
// return
// }
// proofChanges.Secrets = &mixTy.DHSecretGroup{
// Receiver: changeReceiver,
// Returner: changeAuth,
// Authorize: changeReturn,
// }
//
// payload := &mixTy.MixTransferAction{}
// payload.Input = proofInputs
// payload.Output = proofOutputs
// payload.Change = proofChanges
// params := &rpctypes.CreateTxIn{
// Execer: getRealExecName(paraName, mixTy.MixX),
// ActionName: "Transfer",
// Payload: types.MustPBToJSON(payload),
// }
// rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
// ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", params, nil)
// ctx.RunWithoutMarshal()
//
//}
//
//// CreateAuthorizeCmd create raw asset transfer tx
//func CreateAuthorizeCmd() *cobra.Command {
// cmd := &cobra.Command{
// Use: "authorize",
// Short: "Create a asset authorize in mix coin contract",
// Run: createAuthorize,
// }
// addCreateAuthorizeFlags(cmd)
// return cmd
//}
//
//func addCreateAuthorizeFlags(cmd *cobra.Command) {
// cmd.Flags().StringP("proofs", "p", "", "authorize 'proof-pubinput' pair, multi pairs allowed with ','")
// cmd.MarkFlagRequired("proofs")
//
//}
//
//func createAuthorize(cmd *cobra.Command, args []string) {
// paraName, _ := cmd.Flags().GetString("paraName")
// proofsPara, _ := cmd.Flags().GetString("proofs")
//
// proofInput, err := parseProofPara(proofsPara)
// if err != nil {
// return
// }
//
// payload := &mixTy.MixAuthorizeAction{}
// payload.AuthCommits = append(payload.AuthCommits, proofInput)
// params := &rpctypes.CreateTxIn{
// Execer: getRealExecName(paraName, mixTy.MixX),
// ActionName: "Authorize",
// Payload: types.MustPBToJSON(payload),
// }
// rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
// ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", params, nil)
// ctx.RunWithoutMarshal()
//
//}
// CreateDepositCmd create raw asset transfer tx
func CreateConfigCmd() *cobra.Command { func CreateConfigCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "config", Use: "config",
...@@ -628,8 +362,8 @@ func showMixTxs(cmd *cobra.Command, args []string) { ...@@ -628,8 +362,8 @@ func showMixTxs(cmd *cobra.Command, args []string) {
// ShowProposalBoardCmd 显示提案查询信息 // ShowProposalBoardCmd 显示提案查询信息
func ShowPaymentPubKeyCmd() *cobra.Command { func ShowPaymentPubKeyCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "paykey", Use: "rcvkey",
Short: "show peer addr payment key info", Short: "show peer addr receive key info",
Run: showPayment, Run: showPayment,
} }
addShowPaymentflags(cmd) addShowPaymentflags(cmd)
...@@ -721,22 +455,30 @@ func ShowAccountNoteInfo() *cobra.Command { ...@@ -721,22 +455,30 @@ func ShowAccountNoteInfo() *cobra.Command {
} }
func accountNoteCmdFlags(cmd *cobra.Command) { func accountNoteCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("accounts", "a", "", "accounts,note status:1:valid,2:frozen,3:used") cmd.Flags().StringP("account", "a", "", "account")
cmd.MarkFlagRequired("accounts") cmd.Flags().StringP("hash", "n", "", "notehash")
cmd.Flags().Int32P("status", "s", 0, "note status:1:valid,2:used,3:frozen,4:unfrozen")
} }
func accountNote(cmd *cobra.Command, args []string) { func accountNote(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr") rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
accounts, _ := cmd.Flags().GetString("accounts") account, _ := cmd.Flags().GetString("account")
hash, _ := cmd.Flags().GetString("hash")
status, _ := cmd.Flags().GetInt32("status")
l := strings.Split(accounts, ",") if len(account) == 0 && len(hash) == 0 && status == 0 {
fmt.Println("neet set parameters, check by --help")
return
}
var params types.ReqAddrs var params mixTy.WalletMixIndexReq
params.Addrs = append(params.Addrs, l...) params.Account = account
params.NoteHash = hash
params.Status = status
var res mixTy.WalletIndexResp var res mixTy.WalletNoteResp
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.ShowAccountNoteInfo", params, &res) ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.ShowAccountNoteInfo", &params, &res)
ctx.Run() ctx.Run()
} }
...@@ -1047,7 +789,6 @@ func depositSecretCmdFlags(cmd *cobra.Command) { ...@@ -1047,7 +789,6 @@ func depositSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins") cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins")
cmd.Flags().StringP("path", "p", "", "deposit circuit path ") cmd.Flags().StringP("path", "p", "", "deposit circuit path ")
cmd.MarkFlagRequired("path")
} }
......
# mix 执行器 零知识证明隐私
## 场景
1. 存款,公转私,支持一次存入多个目标账户,目标账户隐藏,转账金额公开(需要验证金额足够)
1. 转账,私对私,花费某个支票,转账给目标账户,多出部分找零给自己,目标账户和金额全隐藏
1. 提款,私对公,花费某些支票,统一转出给签名地址,转账金额公开(验证),签名地址和支票账户不一定对应,也就是任何知道支票密码的人都可以提款
...@@ -397,22 +397,19 @@ message PaymentKeysReq{ ...@@ -397,22 +397,19 @@ message PaymentKeysReq{
enum NoteStatus{ enum NoteStatus{
UNDEF = 0; UNDEF = 0;
VALID = 1; //已授权可使用 VALID = 1; //已授权可使用 相对消费者
FROZEN = 2; //未授权 USED = 2; //已使用
USED = 3; //已使用 FROZEN = 3; //未授权
UNFROZEN = 4; //已授权 相对授权者
} }
enum Role{
SPENDER = 0;
RETURNER = 1;
AUTHORIZER = 2;
}
message WalletIndexInfo {
message WalletNoteInfo {
string noteHash = 1; string noteHash = 1;
string nullifier = 2; string nullifier = 2;
string authorizeSpendHash = 3; string authorizeSpendHash = 3;
Role role = 4; string authorizeHash = 4;
string account = 5; //账户地址 string account = 5; //账户地址
NoteStatus status = 6; NoteStatus status = 6;
SecretData secret = 7; SecretData secret = 7;
...@@ -420,7 +417,7 @@ message WalletIndexInfo { ...@@ -420,7 +417,7 @@ message WalletIndexInfo {
} }
message WalletDbMixInfo { message WalletDbMixInfo {
WalletIndexInfo info = 1; WalletNoteInfo info = 1;
string txIndex = 2; string txIndex = 2;
} }
...@@ -429,19 +426,17 @@ message WalletMixIndexReq { ...@@ -429,19 +426,17 @@ message WalletMixIndexReq {
string noteHash = 1; string noteHash = 1;
string nullifier = 2; string nullifier = 2;
string authorizeSpendHash = 3; string authorizeSpendHash = 3;
string authorizeHash = 4;
string account = 5; string account = 5;
int32 status = 6; int32 status = 6;
int32 count = 7; int32 count = 7;
int32 direction = 8; int32 direction = 8;
} }
message WalletIndexResp { message WalletNoteResp {
repeated WalletIndexInfo notes = 1; repeated WalletNoteInfo notes = 1;
} }
message WalletReqAddrs{
repeated string addrs = 1;
}
message WalletEnablePrivacyRst{ message WalletEnablePrivacyRst{
string addr = 1; string addr = 1;
......
...@@ -65,13 +65,13 @@ func (c *Jrpc) ShowAccountPrivacyInfo(in *types.ReqString, result *json.RawMessa ...@@ -65,13 +65,13 @@ func (c *Jrpc) ShowAccountPrivacyInfo(in *types.ReqString, result *json.RawMessa
/////////////////privacy/////////////// /////////////////privacy///////////////
// ShowPrivacyAccountSpend display spend privacy account for json rpc // ShowPrivacyAccountSpend display spend privacy account for json rpc
func (c *Jrpc) ShowAccountNoteInfo(in *types.ReqAddrs, result *json.RawMessage) error { func (c *Jrpc) ShowAccountNoteInfo(in *mixTy.WalletMixIndexReq, result *json.RawMessage) error {
if 0 == len(in.Addrs) { if in == nil {
return types.ErrInvalidParam return types.ErrInvalidParam
} }
reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "ShowAccountNoteInfo", in) reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "ShowAccountNoteInfo", in)
if err != nil { if err != nil {
log.Info("ShowPrivacyAccountSpend", "return err info", err) log.Error("ShowAccountNoteInfo", "return err info", err)
return err return err
} }
*result, err = types.PBToJSON(reply) *result, err = types.PBToJSON(reply)
...@@ -134,43 +134,6 @@ func (c *Jrpc) DecryptSecretData(in *mixTy.DecryptSecretData, result *json.RawMe ...@@ -134,43 +134,6 @@ func (c *Jrpc) DecryptSecretData(in *mixTy.DecryptSecretData, result *json.RawMe
return err return err
} }
//
//func (c *Jrpc) DepositProof(in *mixTy.DepositTxReq, result *json.RawMessage) error {
// reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "DepositProof", in)
// if err != nil {
// return err
// }
// *result, err = types.PBToJSON(reply)
// return err
//}
//
//func (c *Jrpc) AuthProof(in *mixTy.AuthTxReq, result *json.RawMessage) error {
// reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "AuthProof", in)
// if err != nil {
// return err
// }
// *result, err = types.PBToJSON(reply)
// return err
//}
//
//func (c *Jrpc) TransferProof(in *mixTy.TransferTxReq, result *json.RawMessage) error {
// reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "TransferProof", in)
// if err != nil {
// return err
// }
// *result, err = types.PBToJSON(reply)
// return err
//}
//
//func (c *Jrpc) WithdrawProof(in *mixTy.WithdrawTxReq, result *json.RawMessage) error {
// reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "WithdrawProof", in)
// if err != nil {
// return err
// }
// *result, err = types.PBToJSON(reply)
// return err
//}
func (c *Jrpc) CreateRawTransaction(in *mixTy.CreateRawTxReq, result *interface{}) error { func (c *Jrpc) CreateRawTransaction(in *mixTy.CreateRawTxReq, result *interface{}) error {
reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "CreateRawTransaction", in) reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "CreateRawTransaction", in)
if err != nil { if err != nil {
......
...@@ -120,24 +120,27 @@ func (MixConfigAct) EnumDescriptor() ([]byte, []int) { ...@@ -120,24 +120,27 @@ func (MixConfigAct) EnumDescriptor() ([]byte, []int) {
type NoteStatus int32 type NoteStatus int32
const ( const (
NoteStatus_UNDEF NoteStatus = 0 NoteStatus_UNDEF NoteStatus = 0
NoteStatus_VALID NoteStatus = 1 NoteStatus_VALID NoteStatus = 1
NoteStatus_FROZEN NoteStatus = 2 NoteStatus_USED NoteStatus = 2
NoteStatus_USED NoteStatus = 3 NoteStatus_FROZEN NoteStatus = 3
NoteStatus_UNFROZEN NoteStatus = 4
) )
var NoteStatus_name = map[int32]string{ var NoteStatus_name = map[int32]string{
0: "UNDEF", 0: "UNDEF",
1: "VALID", 1: "VALID",
2: "FROZEN", 2: "USED",
3: "USED", 3: "FROZEN",
4: "UNFROZEN",
} }
var NoteStatus_value = map[string]int32{ var NoteStatus_value = map[string]int32{
"UNDEF": 0, "UNDEF": 0,
"VALID": 1, "VALID": 1,
"FROZEN": 2, "USED": 2,
"USED": 3, "FROZEN": 3,
"UNFROZEN": 4,
} }
func (x NoteStatus) String() string { func (x NoteStatus) String() string {
...@@ -148,34 +151,6 @@ func (NoteStatus) EnumDescriptor() ([]byte, []int) { ...@@ -148,34 +151,6 @@ func (NoteStatus) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{3} return fileDescriptor_5c21d519a9be369a, []int{3}
} }
type Role int32
const (
Role_SPENDER Role = 0
Role_RETURNER Role = 1
Role_AUTHORIZER Role = 2
)
var Role_name = map[int32]string{
0: "SPENDER",
1: "RETURNER",
2: "AUTHORIZER",
}
var Role_value = map[string]int32{
"SPENDER": 0,
"RETURNER": 1,
"AUTHORIZER": 2,
}
func (x Role) String() string {
return proto.EnumName(Role_name, int32(x))
}
func (Role) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{4}
}
type MixWalletRescanStatus int32 type MixWalletRescanStatus int32
const ( const (
...@@ -201,7 +176,7 @@ func (x MixWalletRescanStatus) String() string { ...@@ -201,7 +176,7 @@ func (x MixWalletRescanStatus) String() string {
} }
func (MixWalletRescanStatus) EnumDescriptor() ([]byte, []int) { func (MixWalletRescanStatus) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{5} return fileDescriptor_5c21d519a9be369a, []int{4}
} }
type ZkVerifyKey struct { type ZkVerifyKey struct {
...@@ -3121,11 +3096,11 @@ func (m *PaymentKeysReq) GetDetail() int32 { ...@@ -3121,11 +3096,11 @@ func (m *PaymentKeysReq) GetDetail() int32 {
return 0 return 0
} }
type WalletIndexInfo struct { type WalletNoteInfo struct {
NoteHash string `protobuf:"bytes,1,opt,name=noteHash,proto3" json:"noteHash,omitempty"` NoteHash string `protobuf:"bytes,1,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
Nullifier string `protobuf:"bytes,2,opt,name=nullifier,proto3" json:"nullifier,omitempty"` Nullifier string `protobuf:"bytes,2,opt,name=nullifier,proto3" json:"nullifier,omitempty"`
AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"` AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"`
Role Role `protobuf:"varint,4,opt,name=role,proto3,enum=types.Role" json:"role,omitempty"` AuthorizeHash string `protobuf:"bytes,4,opt,name=authorizeHash,proto3" json:"authorizeHash,omitempty"`
Account string `protobuf:"bytes,5,opt,name=account,proto3" json:"account,omitempty"` Account string `protobuf:"bytes,5,opt,name=account,proto3" json:"account,omitempty"`
Status NoteStatus `protobuf:"varint,6,opt,name=status,proto3,enum=types.NoteStatus" json:"status,omitempty"` Status NoteStatus `protobuf:"varint,6,opt,name=status,proto3,enum=types.NoteStatus" json:"status,omitempty"`
Secret *SecretData `protobuf:"bytes,7,opt,name=secret,proto3" json:"secret,omitempty"` Secret *SecretData `protobuf:"bytes,7,opt,name=secret,proto3" json:"secret,omitempty"`
...@@ -3134,74 +3109,74 @@ type WalletIndexInfo struct { ...@@ -3134,74 +3109,74 @@ type WalletIndexInfo struct {
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *WalletIndexInfo) Reset() { *m = WalletIndexInfo{} } func (m *WalletNoteInfo) Reset() { *m = WalletNoteInfo{} }
func (m *WalletIndexInfo) String() string { return proto.CompactTextString(m) } func (m *WalletNoteInfo) String() string { return proto.CompactTextString(m) }
func (*WalletIndexInfo) ProtoMessage() {} func (*WalletNoteInfo) ProtoMessage() {}
func (*WalletIndexInfo) Descriptor() ([]byte, []int) { func (*WalletNoteInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{50} return fileDescriptor_5c21d519a9be369a, []int{50}
} }
func (m *WalletIndexInfo) XXX_Unmarshal(b []byte) error { func (m *WalletNoteInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WalletIndexInfo.Unmarshal(m, b) return xxx_messageInfo_WalletNoteInfo.Unmarshal(m, b)
} }
func (m *WalletIndexInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { func (m *WalletNoteInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_WalletIndexInfo.Marshal(b, m, deterministic) return xxx_messageInfo_WalletNoteInfo.Marshal(b, m, deterministic)
} }
func (m *WalletIndexInfo) XXX_Merge(src proto.Message) { func (m *WalletNoteInfo) XXX_Merge(src proto.Message) {
xxx_messageInfo_WalletIndexInfo.Merge(m, src) xxx_messageInfo_WalletNoteInfo.Merge(m, src)
} }
func (m *WalletIndexInfo) XXX_Size() int { func (m *WalletNoteInfo) XXX_Size() int {
return xxx_messageInfo_WalletIndexInfo.Size(m) return xxx_messageInfo_WalletNoteInfo.Size(m)
} }
func (m *WalletIndexInfo) XXX_DiscardUnknown() { func (m *WalletNoteInfo) XXX_DiscardUnknown() {
xxx_messageInfo_WalletIndexInfo.DiscardUnknown(m) xxx_messageInfo_WalletNoteInfo.DiscardUnknown(m)
} }
var xxx_messageInfo_WalletIndexInfo proto.InternalMessageInfo var xxx_messageInfo_WalletNoteInfo proto.InternalMessageInfo
func (m *WalletIndexInfo) GetNoteHash() string { func (m *WalletNoteInfo) GetNoteHash() string {
if m != nil { if m != nil {
return m.NoteHash return m.NoteHash
} }
return "" return ""
} }
func (m *WalletIndexInfo) GetNullifier() string { func (m *WalletNoteInfo) GetNullifier() string {
if m != nil { if m != nil {
return m.Nullifier return m.Nullifier
} }
return "" return ""
} }
func (m *WalletIndexInfo) GetAuthorizeSpendHash() string { func (m *WalletNoteInfo) GetAuthorizeSpendHash() string {
if m != nil { if m != nil {
return m.AuthorizeSpendHash return m.AuthorizeSpendHash
} }
return "" return ""
} }
func (m *WalletIndexInfo) GetRole() Role { func (m *WalletNoteInfo) GetAuthorizeHash() string {
if m != nil { if m != nil {
return m.Role return m.AuthorizeHash
} }
return Role_SPENDER return ""
} }
func (m *WalletIndexInfo) GetAccount() string { func (m *WalletNoteInfo) GetAccount() string {
if m != nil { if m != nil {
return m.Account return m.Account
} }
return "" return ""
} }
func (m *WalletIndexInfo) GetStatus() NoteStatus { func (m *WalletNoteInfo) GetStatus() NoteStatus {
if m != nil { if m != nil {
return m.Status return m.Status
} }
return NoteStatus_UNDEF return NoteStatus_UNDEF
} }
func (m *WalletIndexInfo) GetSecret() *SecretData { func (m *WalletNoteInfo) GetSecret() *SecretData {
if m != nil { if m != nil {
return m.Secret return m.Secret
} }
...@@ -3209,11 +3184,11 @@ func (m *WalletIndexInfo) GetSecret() *SecretData { ...@@ -3209,11 +3184,11 @@ func (m *WalletIndexInfo) GetSecret() *SecretData {
} }
type WalletDbMixInfo struct { type WalletDbMixInfo struct {
Info *WalletIndexInfo `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` Info *WalletNoteInfo `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"`
TxIndex string `protobuf:"bytes,2,opt,name=txIndex,proto3" json:"txIndex,omitempty"` TxIndex string `protobuf:"bytes,2,opt,name=txIndex,proto3" json:"txIndex,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *WalletDbMixInfo) Reset() { *m = WalletDbMixInfo{} } func (m *WalletDbMixInfo) Reset() { *m = WalletDbMixInfo{} }
...@@ -3241,7 +3216,7 @@ func (m *WalletDbMixInfo) XXX_DiscardUnknown() { ...@@ -3241,7 +3216,7 @@ func (m *WalletDbMixInfo) XXX_DiscardUnknown() {
var xxx_messageInfo_WalletDbMixInfo proto.InternalMessageInfo var xxx_messageInfo_WalletDbMixInfo proto.InternalMessageInfo
func (m *WalletDbMixInfo) GetInfo() *WalletIndexInfo { func (m *WalletDbMixInfo) GetInfo() *WalletNoteInfo {
if m != nil { if m != nil {
return m.Info return m.Info
} }
...@@ -3259,6 +3234,7 @@ type WalletMixIndexReq struct { ...@@ -3259,6 +3234,7 @@ type WalletMixIndexReq struct {
NoteHash string `protobuf:"bytes,1,opt,name=noteHash,proto3" json:"noteHash,omitempty"` NoteHash string `protobuf:"bytes,1,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
Nullifier string `protobuf:"bytes,2,opt,name=nullifier,proto3" json:"nullifier,omitempty"` Nullifier string `protobuf:"bytes,2,opt,name=nullifier,proto3" json:"nullifier,omitempty"`
AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"` AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"`
AuthorizeHash string `protobuf:"bytes,4,opt,name=authorizeHash,proto3" json:"authorizeHash,omitempty"`
Account string `protobuf:"bytes,5,opt,name=account,proto3" json:"account,omitempty"` Account string `protobuf:"bytes,5,opt,name=account,proto3" json:"account,omitempty"`
Status int32 `protobuf:"varint,6,opt,name=status,proto3" json:"status,omitempty"` Status int32 `protobuf:"varint,6,opt,name=status,proto3" json:"status,omitempty"`
Count int32 `protobuf:"varint,7,opt,name=count,proto3" json:"count,omitempty"` Count int32 `protobuf:"varint,7,opt,name=count,proto3" json:"count,omitempty"`
...@@ -3314,6 +3290,13 @@ func (m *WalletMixIndexReq) GetAuthorizeSpendHash() string { ...@@ -3314,6 +3290,13 @@ func (m *WalletMixIndexReq) GetAuthorizeSpendHash() string {
return "" return ""
} }
func (m *WalletMixIndexReq) GetAuthorizeHash() string {
if m != nil {
return m.AuthorizeHash
}
return ""
}
func (m *WalletMixIndexReq) GetAccount() string { func (m *WalletMixIndexReq) GetAccount() string {
if m != nil { if m != nil {
return m.Account return m.Account
...@@ -3342,84 +3325,45 @@ func (m *WalletMixIndexReq) GetDirection() int32 { ...@@ -3342,84 +3325,45 @@ func (m *WalletMixIndexReq) GetDirection() int32 {
return 0 return 0
} }
type WalletIndexResp struct { type WalletNoteResp struct {
Notes []*WalletIndexInfo `protobuf:"bytes,1,rep,name=notes,proto3" json:"notes,omitempty"` Notes []*WalletNoteInfo `protobuf:"bytes,1,rep,name=notes,proto3" json:"notes,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *WalletIndexResp) Reset() { *m = WalletIndexResp{} } func (m *WalletNoteResp) Reset() { *m = WalletNoteResp{} }
func (m *WalletIndexResp) String() string { return proto.CompactTextString(m) } func (m *WalletNoteResp) String() string { return proto.CompactTextString(m) }
func (*WalletIndexResp) ProtoMessage() {} func (*WalletNoteResp) ProtoMessage() {}
func (*WalletIndexResp) Descriptor() ([]byte, []int) { func (*WalletNoteResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{53} return fileDescriptor_5c21d519a9be369a, []int{53}
} }
func (m *WalletIndexResp) XXX_Unmarshal(b []byte) error { func (m *WalletNoteResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WalletIndexResp.Unmarshal(m, b) return xxx_messageInfo_WalletNoteResp.Unmarshal(m, b)
} }
func (m *WalletIndexResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { func (m *WalletNoteResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_WalletIndexResp.Marshal(b, m, deterministic) return xxx_messageInfo_WalletNoteResp.Marshal(b, m, deterministic)
} }
func (m *WalletIndexResp) XXX_Merge(src proto.Message) { func (m *WalletNoteResp) XXX_Merge(src proto.Message) {
xxx_messageInfo_WalletIndexResp.Merge(m, src) xxx_messageInfo_WalletNoteResp.Merge(m, src)
} }
func (m *WalletIndexResp) XXX_Size() int { func (m *WalletNoteResp) XXX_Size() int {
return xxx_messageInfo_WalletIndexResp.Size(m) return xxx_messageInfo_WalletNoteResp.Size(m)
} }
func (m *WalletIndexResp) XXX_DiscardUnknown() { func (m *WalletNoteResp) XXX_DiscardUnknown() {
xxx_messageInfo_WalletIndexResp.DiscardUnknown(m) xxx_messageInfo_WalletNoteResp.DiscardUnknown(m)
} }
var xxx_messageInfo_WalletIndexResp proto.InternalMessageInfo var xxx_messageInfo_WalletNoteResp proto.InternalMessageInfo
func (m *WalletIndexResp) GetNotes() []*WalletIndexInfo { func (m *WalletNoteResp) GetNotes() []*WalletNoteInfo {
if m != nil { if m != nil {
return m.Notes return m.Notes
} }
return nil return nil
} }
type WalletReqAddrs struct {
Addrs []string `protobuf:"bytes,1,rep,name=addrs,proto3" json:"addrs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *WalletReqAddrs) Reset() { *m = WalletReqAddrs{} }
func (m *WalletReqAddrs) String() string { return proto.CompactTextString(m) }
func (*WalletReqAddrs) ProtoMessage() {}
func (*WalletReqAddrs) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{54}
}
func (m *WalletReqAddrs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WalletReqAddrs.Unmarshal(m, b)
}
func (m *WalletReqAddrs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_WalletReqAddrs.Marshal(b, m, deterministic)
}
func (m *WalletReqAddrs) XXX_Merge(src proto.Message) {
xxx_messageInfo_WalletReqAddrs.Merge(m, src)
}
func (m *WalletReqAddrs) XXX_Size() int {
return xxx_messageInfo_WalletReqAddrs.Size(m)
}
func (m *WalletReqAddrs) XXX_DiscardUnknown() {
xxx_messageInfo_WalletReqAddrs.DiscardUnknown(m)
}
var xxx_messageInfo_WalletReqAddrs proto.InternalMessageInfo
func (m *WalletReqAddrs) GetAddrs() []string {
if m != nil {
return m.Addrs
}
return nil
}
type WalletEnablePrivacyRst struct { type WalletEnablePrivacyRst struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"` Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
IsOK bool `protobuf:"varint,2,opt,name=isOK,proto3" json:"isOK,omitempty"` IsOK bool `protobuf:"varint,2,opt,name=isOK,proto3" json:"isOK,omitempty"`
...@@ -3433,7 +3377,7 @@ func (m *WalletEnablePrivacyRst) Reset() { *m = WalletEnablePrivacyRst{} ...@@ -3433,7 +3377,7 @@ func (m *WalletEnablePrivacyRst) Reset() { *m = WalletEnablePrivacyRst{}
func (m *WalletEnablePrivacyRst) String() string { return proto.CompactTextString(m) } func (m *WalletEnablePrivacyRst) String() string { return proto.CompactTextString(m) }
func (*WalletEnablePrivacyRst) ProtoMessage() {} func (*WalletEnablePrivacyRst) ProtoMessage() {}
func (*WalletEnablePrivacyRst) Descriptor() ([]byte, []int) { func (*WalletEnablePrivacyRst) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{55} return fileDescriptor_5c21d519a9be369a, []int{54}
} }
func (m *WalletEnablePrivacyRst) XXX_Unmarshal(b []byte) error { func (m *WalletEnablePrivacyRst) XXX_Unmarshal(b []byte) error {
...@@ -3486,7 +3430,7 @@ func (m *WalletEnablePrivacyResp) Reset() { *m = WalletEnablePrivacyResp ...@@ -3486,7 +3430,7 @@ func (m *WalletEnablePrivacyResp) Reset() { *m = WalletEnablePrivacyResp
func (m *WalletEnablePrivacyResp) String() string { return proto.CompactTextString(m) } func (m *WalletEnablePrivacyResp) String() string { return proto.CompactTextString(m) }
func (*WalletEnablePrivacyResp) ProtoMessage() {} func (*WalletEnablePrivacyResp) ProtoMessage() {}
func (*WalletEnablePrivacyResp) Descriptor() ([]byte, []int) { func (*WalletEnablePrivacyResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{56} return fileDescriptor_5c21d519a9be369a, []int{55}
} }
func (m *WalletEnablePrivacyResp) XXX_Unmarshal(b []byte) error { func (m *WalletEnablePrivacyResp) XXX_Unmarshal(b []byte) error {
...@@ -3527,7 +3471,7 @@ func (m *LocalMixTx) Reset() { *m = LocalMixTx{} } ...@@ -3527,7 +3471,7 @@ func (m *LocalMixTx) Reset() { *m = LocalMixTx{} }
func (m *LocalMixTx) String() string { return proto.CompactTextString(m) } func (m *LocalMixTx) String() string { return proto.CompactTextString(m) }
func (*LocalMixTx) ProtoMessage() {} func (*LocalMixTx) ProtoMessage() {}
func (*LocalMixTx) Descriptor() ([]byte, []int) { func (*LocalMixTx) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{57} return fileDescriptor_5c21d519a9be369a, []int{56}
} }
func (m *LocalMixTx) XXX_Unmarshal(b []byte) error { func (m *LocalMixTx) XXX_Unmarshal(b []byte) error {
...@@ -3585,7 +3529,7 @@ func (m *MixTxListReq) Reset() { *m = MixTxListReq{} } ...@@ -3585,7 +3529,7 @@ func (m *MixTxListReq) Reset() { *m = MixTxListReq{} }
func (m *MixTxListReq) String() string { return proto.CompactTextString(m) } func (m *MixTxListReq) String() string { return proto.CompactTextString(m) }
func (*MixTxListReq) ProtoMessage() {} func (*MixTxListReq) ProtoMessage() {}
func (*MixTxListReq) Descriptor() ([]byte, []int) { func (*MixTxListReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{58} return fileDescriptor_5c21d519a9be369a, []int{57}
} }
func (m *MixTxListReq) XXX_Unmarshal(b []byte) error { func (m *MixTxListReq) XXX_Unmarshal(b []byte) error {
...@@ -3659,7 +3603,7 @@ func (m *MixTxListResp) Reset() { *m = MixTxListResp{} } ...@@ -3659,7 +3603,7 @@ func (m *MixTxListResp) Reset() { *m = MixTxListResp{} }
func (m *MixTxListResp) String() string { return proto.CompactTextString(m) } func (m *MixTxListResp) String() string { return proto.CompactTextString(m) }
func (*MixTxListResp) ProtoMessage() {} func (*MixTxListResp) ProtoMessage() {}
func (*MixTxListResp) Descriptor() ([]byte, []int) { func (*MixTxListResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{59} return fileDescriptor_5c21d519a9be369a, []int{58}
} }
func (m *MixTxListResp) XXX_Unmarshal(b []byte) error { func (m *MixTxListResp) XXX_Unmarshal(b []byte) error {
...@@ -3700,7 +3644,7 @@ func (m *PrivacyAddrResult) Reset() { *m = PrivacyAddrResult{} } ...@@ -3700,7 +3644,7 @@ func (m *PrivacyAddrResult) Reset() { *m = PrivacyAddrResult{} }
func (m *PrivacyAddrResult) String() string { return proto.CompactTextString(m) } func (m *PrivacyAddrResult) String() string { return proto.CompactTextString(m) }
func (*PrivacyAddrResult) ProtoMessage() {} func (*PrivacyAddrResult) ProtoMessage() {}
func (*PrivacyAddrResult) Descriptor() ([]byte, []int) { func (*PrivacyAddrResult) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{60} return fileDescriptor_5c21d519a9be369a, []int{59}
} }
func (m *PrivacyAddrResult) XXX_Unmarshal(b []byte) error { func (m *PrivacyAddrResult) XXX_Unmarshal(b []byte) error {
...@@ -3753,7 +3697,7 @@ func (m *ReqEnablePrivacyRst) Reset() { *m = ReqEnablePrivacyRst{} } ...@@ -3753,7 +3697,7 @@ func (m *ReqEnablePrivacyRst) Reset() { *m = ReqEnablePrivacyRst{} }
func (m *ReqEnablePrivacyRst) String() string { return proto.CompactTextString(m) } func (m *ReqEnablePrivacyRst) String() string { return proto.CompactTextString(m) }
func (*ReqEnablePrivacyRst) ProtoMessage() {} func (*ReqEnablePrivacyRst) ProtoMessage() {}
func (*ReqEnablePrivacyRst) Descriptor() ([]byte, []int) { func (*ReqEnablePrivacyRst) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{61} return fileDescriptor_5c21d519a9be369a, []int{60}
} }
func (m *ReqEnablePrivacyRst) XXX_Unmarshal(b []byte) error { func (m *ReqEnablePrivacyRst) XXX_Unmarshal(b []byte) error {
...@@ -3786,7 +3730,6 @@ func init() { ...@@ -3786,7 +3730,6 @@ func init() {
proto.RegisterEnum("types.MixConfigType", MixConfigType_name, MixConfigType_value) proto.RegisterEnum("types.MixConfigType", MixConfigType_name, MixConfigType_value)
proto.RegisterEnum("types.MixConfigAct", MixConfigAct_name, MixConfigAct_value) proto.RegisterEnum("types.MixConfigAct", MixConfigAct_name, MixConfigAct_value)
proto.RegisterEnum("types.NoteStatus", NoteStatus_name, NoteStatus_value) proto.RegisterEnum("types.NoteStatus", NoteStatus_name, NoteStatus_value)
proto.RegisterEnum("types.Role", Role_name, Role_value)
proto.RegisterEnum("types.MixWalletRescanStatus", MixWalletRescanStatus_name, MixWalletRescanStatus_value) proto.RegisterEnum("types.MixWalletRescanStatus", MixWalletRescanStatus_name, MixWalletRescanStatus_value)
proto.RegisterType((*ZkVerifyKey)(nil), "types.ZkVerifyKey") proto.RegisterType((*ZkVerifyKey)(nil), "types.ZkVerifyKey")
proto.RegisterType((*ZkVerifyKeys)(nil), "types.ZkVerifyKeys") proto.RegisterType((*ZkVerifyKeys)(nil), "types.ZkVerifyKeys")
...@@ -3838,11 +3781,10 @@ func init() { ...@@ -3838,11 +3781,10 @@ func init() {
proto.RegisterType((*ShieldAmountRst)(nil), "types.ShieldAmountRst") proto.RegisterType((*ShieldAmountRst)(nil), "types.ShieldAmountRst")
proto.RegisterType((*CreateRawTxReq)(nil), "types.CreateRawTxReq") proto.RegisterType((*CreateRawTxReq)(nil), "types.CreateRawTxReq")
proto.RegisterType((*PaymentKeysReq)(nil), "types.PaymentKeysReq") proto.RegisterType((*PaymentKeysReq)(nil), "types.PaymentKeysReq")
proto.RegisterType((*WalletIndexInfo)(nil), "types.WalletIndexInfo") proto.RegisterType((*WalletNoteInfo)(nil), "types.WalletNoteInfo")
proto.RegisterType((*WalletDbMixInfo)(nil), "types.WalletDbMixInfo") proto.RegisterType((*WalletDbMixInfo)(nil), "types.WalletDbMixInfo")
proto.RegisterType((*WalletMixIndexReq)(nil), "types.WalletMixIndexReq") proto.RegisterType((*WalletMixIndexReq)(nil), "types.WalletMixIndexReq")
proto.RegisterType((*WalletIndexResp)(nil), "types.WalletIndexResp") proto.RegisterType((*WalletNoteResp)(nil), "types.WalletNoteResp")
proto.RegisterType((*WalletReqAddrs)(nil), "types.WalletReqAddrs")
proto.RegisterType((*WalletEnablePrivacyRst)(nil), "types.WalletEnablePrivacyRst") proto.RegisterType((*WalletEnablePrivacyRst)(nil), "types.WalletEnablePrivacyRst")
proto.RegisterType((*WalletEnablePrivacyResp)(nil), "types.WalletEnablePrivacyResp") proto.RegisterType((*WalletEnablePrivacyResp)(nil), "types.WalletEnablePrivacyResp")
proto.RegisterType((*LocalMixTx)(nil), "types.LocalMixTx") proto.RegisterType((*LocalMixTx)(nil), "types.LocalMixTx")
...@@ -3857,172 +3799,168 @@ func init() { ...@@ -3857,172 +3799,168 @@ func init() {
} }
var fileDescriptor_5c21d519a9be369a = []byte{ var fileDescriptor_5c21d519a9be369a = []byte{
// 2625 bytes of a gzipped FileDescriptorProto // 2567 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x73, 0x23, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x4b, 0x6f, 0x1b, 0xc9,
0x15, 0xf7, 0xe8, 0xd3, 0x7a, 0x96, 0x6c, 0xb9, 0x77, 0xe3, 0x28, 0xae, 0x10, 0x4c, 0x27, 0x24, 0x11, 0xd6, 0x0c, 0x5f, 0x62, 0x89, 0x94, 0xa8, 0xb6, 0x57, 0x4b, 0x0b, 0x1b, 0x43, 0xe9, 0x75,
0xc6, 0x9b, 0x5a, 0x82, 0x36, 0x04, 0xa8, 0x82, 0x0d, 0xca, 0x4a, 0x1b, 0x2b, 0x59, 0xcb, 0xae, 0xd6, 0x5a, 0x39, 0x70, 0x16, 0xf2, 0x66, 0x83, 0x00, 0x59, 0x27, 0x5c, 0x93, 0xb2, 0xb8, 0xb6,
0x96, 0xbc, 0xde, 0xdd, 0x54, 0xa8, 0x9a, 0x95, 0xda, 0xf6, 0xd4, 0xca, 0x1a, 0xed, 0xcc, 0xc8, 0x28, 0xa1, 0x45, 0xf9, 0xb5, 0xd8, 0x00, 0x63, 0xb2, 0x25, 0x0d, 0x4c, 0x71, 0xe8, 0x99, 0xa1,
0x2b, 0xe7, 0x46, 0x41, 0x15, 0x17, 0x6e, 0x50, 0xc5, 0x8d, 0x2a, 0x4e, 0xe4, 0x4c, 0x51, 0x1c, 0x4c, 0xed, 0x2d, 0x48, 0x80, 0x20, 0xb7, 0x00, 0x09, 0x90, 0x5b, 0x80, 0x9c, 0xb2, 0xe7, 0x20,
0xf8, 0x13, 0x38, 0xf3, 0x07, 0x50, 0xc5, 0x81, 0x3b, 0x7f, 0x01, 0xf5, 0xfa, 0x63, 0xa6, 0x7b, 0xc8, 0x21, 0x3f, 0x21, 0xe7, 0xfc, 0x80, 0xdc, 0x72, 0xcf, 0x2f, 0x08, 0xaa, 0x1f, 0x33, 0xdd,
0x2c, 0xf9, 0x63, 0x59, 0x6e, 0xdc, 0xfc, 0xde, 0xbc, 0x7e, 0xfd, 0xde, 0xef, 0x7d, 0xf4, 0xeb, 0x23, 0xea, 0xe5, 0x6c, 0x80, 0x1c, 0x72, 0x53, 0xd5, 0x54, 0x57, 0x57, 0x7d, 0xf5, 0xe8, 0xea,
0x96, 0xa1, 0x74, 0xe2, 0x4d, 0x6f, 0x8f, 0x03, 0x3f, 0xf2, 0x49, 0x3e, 0x3a, 0x1b, 0xf3, 0x70, 0xa6, 0xa0, 0x7c, 0xe4, 0x4f, 0xee, 0x8e, 0xc2, 0x20, 0x0e, 0x48, 0x21, 0x3e, 0x19, 0xf1, 0x68,
0xbd, 0xdc, 0xf7, 0x4f, 0x4e, 0xfc, 0x91, 0x64, 0xae, 0xaf, 0x46, 0x81, 0x3b, 0x0a, 0xdd, 0x7e, 0xb9, 0xd2, 0x0b, 0x8e, 0x8e, 0x82, 0xa1, 0x64, 0x2e, 0x2f, 0xc6, 0xa1, 0x37, 0x8c, 0xbc, 0x5e,
0xe4, 0x69, 0x16, 0xfd, 0x0c, 0x96, 0x9e, 0x3c, 0x7b, 0xc8, 0x03, 0xef, 0xf0, 0xec, 0x73, 0x7e, 0xec, 0x6b, 0x16, 0xfd, 0x1c, 0xe6, 0x5e, 0xbc, 0x7a, 0xc2, 0x43, 0x7f, 0xff, 0xe4, 0x11, 0x3f,
0x46, 0xbe, 0x0d, 0x39, 0x5c, 0x58, 0x73, 0x36, 0x9c, 0xcd, 0xe5, 0xfa, 0xea, 0x6d, 0xa1, 0xe5, 0x21, 0xdf, 0x81, 0x3c, 0x2e, 0xac, 0x3b, 0x2b, 0xce, 0xea, 0xfc, 0xfa, 0xe2, 0x5d, 0xa1, 0xe5,
0xb6, 0xfc, 0xde, 0x3b, 0x1b, 0x73, 0x26, 0x3e, 0x93, 0x9b, 0x90, 0x3f, 0x75, 0x87, 0x13, 0x5e, 0xae, 0xfc, 0xde, 0x3d, 0x19, 0x71, 0x26, 0x3e, 0x93, 0xeb, 0x50, 0x38, 0xf6, 0x06, 0x63, 0x5e,
0xcb, 0x6c, 0x38, 0x9b, 0x25, 0x26, 0x09, 0xfa, 0x11, 0x94, 0x0d, 0x5d, 0x21, 0x79, 0x17, 0x72, 0x77, 0x57, 0x9c, 0xd5, 0x32, 0x93, 0x04, 0xfd, 0x04, 0x2a, 0x86, 0xae, 0x88, 0x7c, 0x00, 0xf9,
0x03, 0x37, 0x72, 0x6b, 0xce, 0x46, 0x76, 0x73, 0xa9, 0x4e, 0x94, 0x32, 0x43, 0x84, 0x89, 0xef, 0xbe, 0x17, 0x7b, 0x75, 0x67, 0x25, 0xb7, 0x3a, 0xb7, 0x4e, 0x94, 0x32, 0x43, 0x84, 0x89, 0xef,
0xf4, 0x2d, 0x58, 0x6c, 0x4c, 0xa2, 0x63, 0xb1, 0x86, 0x40, 0xee, 0x19, 0x3f, 0x0b, 0xc5, 0x9a, 0xf4, 0x26, 0xcc, 0x36, 0xc6, 0xf1, 0xa1, 0x58, 0x43, 0x20, 0xff, 0x8a, 0x9f, 0x44, 0x62, 0x4d,
0x12, 0x13, 0x7f, 0xd3, 0xa7, 0x00, 0x7b, 0xee, 0xd9, 0x09, 0x1f, 0x45, 0x68, 0x22, 0x81, 0x9c, 0x99, 0x89, 0xbf, 0xe9, 0x4b, 0x80, 0x1d, 0xef, 0xe4, 0x88, 0x0f, 0x63, 0x34, 0x91, 0x40, 0xde,
0x3b, 0x18, 0x04, 0xc2, 0xc4, 0x12, 0x13, 0x7f, 0x93, 0x0d, 0x58, 0x0a, 0x78, 0x9f, 0x7b, 0xa7, 0xeb, 0xf7, 0x43, 0x61, 0x62, 0x99, 0x89, 0xbf, 0xc9, 0x0a, 0xcc, 0x85, 0xbc, 0xc7, 0xfd, 0x63,
0x3c, 0xf8, 0x9c, 0x9f, 0x29, 0xab, 0x4c, 0x16, 0x79, 0x0b, 0x80, 0x8f, 0xfa, 0xc1, 0xd9, 0x18, 0x1e, 0x3e, 0xe2, 0x27, 0xca, 0x2a, 0x93, 0x45, 0x6e, 0x02, 0xf0, 0x61, 0x2f, 0x3c, 0x19, 0xa1,
0x75, 0xd4, 0xb2, 0x42, 0xc0, 0xe0, 0xd0, 0x7f, 0x3b, 0xb0, 0xb2, 0xe3, 0x4d, 0xef, 0xf9, 0xa3, 0x8e, 0x7a, 0x4e, 0x08, 0x18, 0x1c, 0xfa, 0x2f, 0x07, 0x16, 0xb6, 0xfc, 0xc9, 0x83, 0x60, 0xb8,
0x43, 0xef, 0xa8, 0x21, 0x10, 0x22, 0xef, 0x40, 0xa6, 0x77, 0xa6, 0xa0, 0xb8, 0xa9, 0xac, 0x8f, 0xef, 0x1f, 0x34, 0x04, 0x42, 0xe4, 0x16, 0xb8, 0xdd, 0x13, 0x05, 0xc5, 0x75, 0x65, 0x7d, 0x22,
0x65, 0x04, 0x1a, 0x99, 0xde, 0x19, 0xb9, 0x05, 0x05, 0x29, 0x2f, 0xb6, 0x5d, 0xae, 0xdf, 0x48, 0x23, 0xd0, 0x70, 0xbb, 0x27, 0xe4, 0x0e, 0x14, 0xa5, 0xbc, 0xd8, 0x76, 0x7e, 0xfd, 0x5a, 0x56,
0x4b, 0x36, 0xfa, 0x11, 0x53, 0x22, 0xa4, 0x0e, 0xa5, 0x53, 0xed, 0xbd, 0xb0, 0x62, 0x26, 0x2e, 0xb2, 0xd1, 0x8b, 0x99, 0x12, 0x21, 0xeb, 0x50, 0x3e, 0xd6, 0xde, 0x0b, 0x2b, 0xa6, 0xe2, 0xb2,
0xdb, 0x0b, 0x2c, 0x11, 0x23, 0xeb, 0x50, 0x74, 0x25, 0x3c, 0xb5, 0x1c, 0xda, 0xbd, 0xbd, 0xc0, 0x39, 0xc3, 0x52, 0x31, 0xb2, 0x0c, 0x25, 0x4f, 0xc2, 0x53, 0xcf, 0xa3, 0xdd, 0x9b, 0x33, 0x4c,
0x34, 0x83, 0xdc, 0x01, 0x18, 0xc7, 0xd0, 0xd4, 0xf2, 0x42, 0xa1, 0x8e, 0x5a, 0x82, 0xd9, 0xf6, 0x33, 0xc8, 0x3d, 0x80, 0x51, 0x02, 0x4d, 0xbd, 0x20, 0x14, 0xea, 0xa8, 0xa5, 0x98, 0x6d, 0xce,
0x02, 0x33, 0xc4, 0x3e, 0x29, 0xaa, 0xe8, 0xd1, 0x1f, 0xc3, 0x62, 0x73, 0xbb, 0xcb, 0xfb, 0x01, 0x30, 0x43, 0xec, 0xb3, 0x92, 0x8a, 0x1e, 0xfd, 0x11, 0xcc, 0x36, 0x37, 0x77, 0x79, 0x2f, 0xe4,
0x8f, 0x48, 0x0d, 0x8a, 0x63, 0x2e, 0xe1, 0x93, 0xc8, 0x6a, 0x92, 0xac, 0x41, 0x21, 0x14, 0x32, 0x31, 0xa9, 0x43, 0x69, 0xc4, 0x25, 0x7c, 0x12, 0x59, 0x4d, 0x92, 0x25, 0x28, 0x46, 0x42, 0x46,
0x0a, 0x57, 0x45, 0x51, 0x0e, 0x15, 0xbd, 0xfa, 0xd3, 0xc0, 0x9f, 0x8c, 0xc9, 0x3a, 0x2c, 0x6a, 0xe1, 0xaa, 0x28, 0xca, 0xa1, 0xaa, 0x57, 0x3f, 0x0c, 0x83, 0xf1, 0x88, 0x2c, 0xc3, 0xac, 0x86,
0xc8, 0x95, 0x8e, 0x98, 0x96, 0xdf, 0xa2, 0x49, 0x30, 0xe2, 0x81, 0x52, 0x13, 0xd3, 0xe4, 0x4d, 0x5c, 0xe9, 0x48, 0x68, 0xf9, 0x2d, 0x1e, 0x87, 0x43, 0x1e, 0x2a, 0x35, 0x09, 0x4d, 0xde, 0x83,
0x28, 0xa1, 0x3f, 0x7e, 0xe0, 0x7d, 0xc5, 0x55, 0x68, 0x12, 0x06, 0x9d, 0x60, 0x86, 0xee, 0x05, 0x32, 0xfa, 0x13, 0x84, 0xfe, 0x57, 0x5c, 0x85, 0x26, 0x65, 0xd0, 0x31, 0x66, 0xe8, 0x4e, 0x18,
0xbe, 0x7f, 0xd8, 0x1e, 0x1d, 0xfa, 0x98, 0x7a, 0x63, 0x24, 0xd4, 0x0e, 0x92, 0xc0, 0x04, 0x18, 0x04, 0xfb, 0xed, 0xe1, 0x7e, 0x80, 0xa9, 0x37, 0x42, 0x42, 0xed, 0x20, 0x09, 0x4c, 0x80, 0xd1,
0x4f, 0x9e, 0x0e, 0xbd, 0x7e, 0x7b, 0x34, 0x9e, 0x68, 0x43, 0x4d, 0x16, 0xb9, 0x0d, 0x45, 0x69, 0xf8, 0xe5, 0xc0, 0xef, 0xb5, 0x87, 0xa3, 0xb1, 0x36, 0xd4, 0x64, 0x91, 0xbb, 0x50, 0x92, 0x76,
0x77, 0xa8, 0x70, 0xd7, 0x11, 0xb5, 0x7c, 0x60, 0x5a, 0x88, 0xde, 0x85, 0xea, 0x8e, 0x37, 0x6d, 0x47, 0x0a, 0x77, 0x1d, 0x51, 0xcb, 0x07, 0xa6, 0x85, 0xe8, 0x7d, 0xa8, 0x6d, 0xf9, 0x93, 0x26,
0xf2, 0xb1, 0x1f, 0x7a, 0x91, 0x8a, 0xde, 0x16, 0x14, 0xc4, 0x76, 0xe1, 0xb9, 0x94, 0x8e, 0xed, 0x1f, 0x05, 0x91, 0x1f, 0xab, 0xe8, 0xad, 0x41, 0x51, 0x6c, 0x17, 0x9d, 0x4a, 0xe9, 0xc4, 0x3e,
0x63, 0x4a, 0x82, 0xfe, 0xce, 0x81, 0xd5, 0x1d, 0x6f, 0xda, 0xc3, 0x8a, 0x3b, 0xe4, 0x41, 0xa2, 0xa6, 0x24, 0xe8, 0xef, 0x1c, 0x58, 0xdc, 0xf2, 0x27, 0x5d, 0xac, 0xb8, 0x7d, 0x1e, 0xa6, 0x1a,
0xc1, 0x43, 0x73, 0x2e, 0xd4, 0x20, 0x25, 0x50, 0xd6, 0x9f, 0x44, 0xda, 0x9d, 0x39, 0xb2, 0x52, 0x7c, 0x34, 0xe7, 0x5c, 0x0d, 0x52, 0x02, 0x65, 0x83, 0x71, 0xac, 0xdd, 0x39, 0x43, 0x56, 0x4a,
0x02, 0x65, 0xfb, 0xc7, 0xee, 0xe8, 0x88, 0x9f, 0x4b, 0x2a, 0x43, 0x56, 0x4a, 0xd0, 0x03, 0x61, 0xa0, 0x6c, 0xef, 0xd0, 0x1b, 0x1e, 0xf0, 0x53, 0x49, 0x65, 0xc8, 0x4a, 0x09, 0xfa, 0x54, 0x18,
0xd8, 0x81, 0x17, 0x1d, 0x0f, 0x02, 0xf7, 0x85, 0x32, 0x6c, 0x0d, 0x0a, 0xee, 0x89, 0x3f, 0x19, 0xf6, 0xd4, 0x8f, 0x0f, 0xfb, 0xa1, 0xf7, 0x46, 0x19, 0xb6, 0x04, 0x45, 0xef, 0x28, 0x18, 0x0f,
0x45, 0x02, 0xd7, 0x1c, 0x53, 0x94, 0xe1, 0x72, 0xe6, 0x52, 0x97, 0xef, 0x02, 0xd9, 0xf1, 0xa6, 0x63, 0x81, 0x6b, 0x9e, 0x29, 0xca, 0x70, 0xd9, 0xbd, 0xd0, 0xe5, 0xfb, 0x40, 0xb6, 0xfc, 0x49,
0x0d, 0x1d, 0x39, 0xa5, 0x79, 0xd3, 0x0c, 0xd8, 0x6c, 0x05, 0x52, 0x80, 0xfe, 0x25, 0x03, 0x25, 0x43, 0x47, 0x4e, 0x69, 0x5e, 0x35, 0x03, 0x36, 0x5d, 0x81, 0x14, 0xa0, 0x7f, 0x71, 0xa1, 0x8c,
0x54, 0x20, 0xd7, 0x2d, 0x43, 0x26, 0x92, 0xb9, 0x98, 0x67, 0x99, 0xe8, 0x8c, 0x7c, 0x00, 0x85, 0x0a, 0xe4, 0xba, 0x79, 0x70, 0x63, 0x99, 0x8b, 0x05, 0xe6, 0xc6, 0x27, 0xe4, 0x23, 0x28, 0xf6,
0xbe, 0xa8, 0x27, 0x05, 0xc7, 0xda, 0x8c, 0x3a, 0xf3, 0xfc, 0xd1, 0xf6, 0x02, 0x53, 0x72, 0xe4, 0x44, 0x3d, 0x29, 0x38, 0x96, 0xa6, 0xd4, 0x99, 0x1f, 0x0c, 0x37, 0x67, 0x98, 0x92, 0x23, 0xf7,
0x0e, 0x14, 0x07, 0x32, 0x7e, 0x0a, 0x95, 0xd7, 0x93, 0x25, 0x56, 0x60, 0xb1, 0xa2, 0x94, 0x24, 0xa0, 0xd4, 0x97, 0xf1, 0x53, 0xa8, 0xbc, 0x9b, 0x2e, 0xb1, 0x02, 0x8b, 0x15, 0xa5, 0x24, 0xc9,
0xf9, 0x08, 0x16, 0x5f, 0x28, 0x68, 0x44, 0xb9, 0x2d, 0xd5, 0x6b, 0xc9, 0x2a, 0x1b, 0xb4, 0xed, 0x27, 0x30, 0xfb, 0x46, 0x41, 0x23, 0xca, 0x6d, 0x6e, 0xbd, 0x9e, 0xae, 0xb2, 0x41, 0xdb, 0x9c,
0x05, 0x16, 0xcb, 0xe2, 0xba, 0x48, 0xc5, 0x5a, 0xd5, 0xa1, 0xb1, 0xce, 0xce, 0x02, 0x5c, 0xa7, 0x61, 0x89, 0x2c, 0xae, 0x8b, 0x55, 0xac, 0x55, 0x1d, 0x1a, 0xeb, 0xec, 0x2c, 0xc0, 0x75, 0x5a,
0x65, 0xc9, 0x8f, 0xcc, 0xe4, 0x2f, 0x88, 0x85, 0x6f, 0x24, 0x0b, 0x53, 0x60, 0x62, 0x63, 0x88, 0x96, 0xfc, 0xd0, 0x4c, 0xfe, 0xa2, 0x58, 0x78, 0x23, 0x5d, 0x98, 0x01, 0x13, 0x1b, 0x43, 0x22,
0xa5, 0x93, 0x3a, 0xde, 0x06, 0xa2, 0xfc, 0xd9, 0x33, 0x32, 0x7e, 0x1d, 0x16, 0x47, 0x7e, 0xc4, 0x9d, 0xd6, 0xf1, 0x26, 0x10, 0xe5, 0xcf, 0x8e, 0x91, 0xf1, 0xcb, 0x30, 0x3b, 0x0c, 0x62, 0xbe,
0xb7, 0xdd, 0xf0, 0x58, 0x97, 0xa3, 0xa6, 0x8d, 0x70, 0xab, 0x9a, 0x96, 0x14, 0xfd, 0xa3, 0x03, 0xe9, 0x45, 0x87, 0xba, 0x1c, 0x35, 0x6d, 0x84, 0x5b, 0xd5, 0xb4, 0xa4, 0xe8, 0x1f, 0x1d, 0xb8,
0x37, 0xb4, 0x93, 0xa6, 0x2e, 0x0a, 0xe5, 0x28, 0xe0, 0x9c, 0xf9, 0x7e, 0x64, 0xe8, 0xb3, 0x78, 0xa6, 0x9d, 0x34, 0x75, 0x51, 0xa8, 0xc4, 0x21, 0xe7, 0x2c, 0x08, 0x62, 0x43, 0x9f, 0xc5, 0x23,
0xe4, 0x1d, 0xa8, 0x8c, 0x26, 0xc3, 0xa1, 0x77, 0xe8, 0xf1, 0x40, 0x08, 0x49, 0xd5, 0x36, 0x93, 0xb7, 0xa0, 0x3a, 0x1c, 0x0f, 0x06, 0xfe, 0xbe, 0xcf, 0x43, 0x21, 0x24, 0x55, 0xdb, 0x4c, 0x72,
0xdc, 0x06, 0x12, 0x7b, 0xd0, 0x1d, 0xf3, 0xd1, 0x40, 0x88, 0xca, 0xaa, 0x9f, 0xf1, 0xc5, 0xb0, 0x17, 0x48, 0xe2, 0xc1, 0xee, 0x88, 0x0f, 0xfb, 0x42, 0x54, 0x56, 0xfd, 0x94, 0x2f, 0x86, 0xa5,
0x34, 0x67, 0x59, 0xfa, 0x0f, 0x07, 0x6a, 0x1a, 0x56, 0x61, 0xe3, 0x4b, 0x98, 0x1b, 0x1e, 0x7b, 0x79, 0xcb, 0xd2, 0x7f, 0x38, 0x50, 0xd7, 0xb0, 0x0a, 0x1b, 0xdf, 0xc2, 0xdc, 0xe8, 0xd0, 0xe7,
0x7c, 0x38, 0x68, 0x08, 0x85, 0x8f, 0xb4, 0xb9, 0x16, 0x33, 0x2d, 0xf5, 0x58, 0x59, 0x6a, 0x33, 0x83, 0x7e, 0x43, 0x28, 0x7c, 0xa6, 0xcd, 0xb5, 0x98, 0x59, 0xa9, 0xe7, 0xca, 0x52, 0x9b, 0x79,
0xe7, 0x38, 0x95, 0x9b, 0xeb, 0xd4, 0x39, 0xa8, 0xf2, 0x33, 0xa0, 0xa2, 0xbf, 0x70, 0xe0, 0x0d, 0x86, 0x53, 0xf9, 0x33, 0x9d, 0x3a, 0x05, 0x55, 0x61, 0x0a, 0x54, 0xf4, 0xe7, 0x0e, 0xdc, 0xd0,
0xed, 0xe2, 0xae, 0xa8, 0xf3, 0xab, 0x86, 0xf7, 0x15, 0xfa, 0x46, 0xff, 0xea, 0xc0, 0xcd, 0x38, 0x2e, 0x6e, 0x8b, 0x3a, 0xbf, 0x6c, 0x78, 0xbf, 0x41, 0xdf, 0xe8, 0x5f, 0x1d, 0xb8, 0x9e, 0xa4,
0x0d, 0xaf, 0x0b, 0xf2, 0x26, 0xac, 0xb8, 0xc6, 0xda, 0xe4, 0x70, 0x4e, 0xb3, 0xd1, 0x98, 0x98, 0xe1, 0x55, 0x41, 0x5e, 0x85, 0x05, 0xcf, 0x58, 0x9b, 0x1e, 0xce, 0x59, 0x36, 0x1a, 0x93, 0xb0,
0x65, 0xa4, 0x84, 0xcd, 0xbc, 0x2e, 0xd0, 0xf4, 0x67, 0xb0, 0x22, 0x4f, 0xd5, 0xe4, 0x00, 0xf9, 0x8c, 0x94, 0xb0, 0x99, 0x57, 0x05, 0x9a, 0xfe, 0x14, 0x16, 0xe4, 0xa9, 0x9a, 0x1e, 0x20, 0xdf,
0x56, 0xdc, 0x57, 0x66, 0x0e, 0x38, 0xd8, 0x6a, 0xe2, 0x96, 0x95, 0xb9, 0xac, 0x65, 0xfd, 0x14, 0x4e, 0xfa, 0xca, 0xd4, 0x01, 0x07, 0x5b, 0x4d, 0xd2, 0xb2, 0xdc, 0x8b, 0x5a, 0xd6, 0x4f, 0x00,
0xa0, 0x35, 0xf5, 0xc2, 0xe8, 0x21, 0xd6, 0x21, 0x1e, 0x64, 0x71, 0x04, 0x15, 0x1c, 0x09, 0x03, 0x5a, 0x13, 0x3f, 0x8a, 0x9f, 0x60, 0x1d, 0xe2, 0x41, 0x96, 0x44, 0x50, 0xc1, 0x91, 0x32, 0xf0,
0x4f, 0x2e, 0x8e, 0xb2, 0x42, 0xeb, 0x22, 0x93, 0x04, 0xdd, 0x82, 0xea, 0x3d, 0xff, 0xe4, 0xc4, 0xe4, 0xe2, 0x28, 0x2b, 0xb4, 0xce, 0x32, 0x49, 0xd0, 0x35, 0xa8, 0x3d, 0x08, 0x8e, 0x8e, 0xfc,
0x8b, 0x7a, 0x01, 0xe7, 0x0f, 0xb8, 0x7b, 0xca, 0x43, 0xcc, 0xf9, 0xa1, 0xf8, 0x4b, 0x9c, 0x12, 0xb8, 0x1b, 0x72, 0xfe, 0x98, 0x7b, 0xc7, 0x3c, 0xc2, 0x9c, 0x1f, 0x88, 0xbf, 0xc4, 0x29, 0x51,
0x65, 0xa6, 0x28, 0xfa, 0x1e, 0xac, 0x24, 0xb2, 0x88, 0x71, 0x88, 0x4a, 0x03, 0xfc, 0x43, 0x49, 0x61, 0x8a, 0xa2, 0xb7, 0x61, 0x21, 0x95, 0x45, 0x8c, 0x23, 0x54, 0x1a, 0xe2, 0x1f, 0x4a, 0x52,
0x4a, 0x82, 0xfe, 0xc1, 0x31, 0x25, 0xf7, 0x02, 0xff, 0x94, 0x8b, 0x13, 0xd8, 0x0e, 0x55, 0x4c, 0x12, 0xf4, 0x0f, 0x8e, 0x29, 0xb9, 0x13, 0x06, 0xc7, 0x5c, 0x9c, 0xc0, 0x76, 0xa8, 0x12, 0x1a,
0xe3, 0x37, 0xe1, 0x4f, 0x57, 0x1c, 0xf2, 0x38, 0x79, 0xc5, 0x34, 0x4e, 0x4e, 0x63, 0xe9, 0xf6, 0xbf, 0x09, 0x7f, 0x76, 0xc5, 0x21, 0x8f, 0x93, 0x57, 0x42, 0xe3, 0xe4, 0x34, 0x92, 0x6e, 0xf7,
0x80, 0x4f, 0x45, 0x54, 0x2a, 0xcc, 0xe0, 0x48, 0xa7, 0x4f, 0xa4, 0xe5, 0x22, 0x12, 0x15, 0x96, 0xf9, 0x44, 0x44, 0xa5, 0xca, 0x0c, 0x8e, 0x74, 0xfa, 0x48, 0x5a, 0x2e, 0x22, 0x51, 0x65, 0x29,
0x30, 0x70, 0xac, 0x38, 0xe6, 0xc3, 0x31, 0x0f, 0xc2, 0x5a, 0x7e, 0x23, 0xbb, 0x59, 0x61, 0x9a, 0x03, 0xc7, 0x8a, 0x43, 0x3e, 0x18, 0xf1, 0x30, 0xaa, 0x17, 0x56, 0x72, 0xab, 0x55, 0xa6, 0x49,
0xa4, 0x2d, 0x58, 0x42, 0xe3, 0x04, 0x9a, 0xfc, 0xf9, 0x65, 0xe6, 0x0d, 0xb9, 0x7b, 0x68, 0x34, 0xda, 0x82, 0x39, 0x34, 0x4e, 0xa0, 0xc9, 0x5f, 0x5f, 0x64, 0xde, 0x80, 0x7b, 0xfb, 0x46, 0x53,
0x95, 0x98, 0xa6, 0xef, 0x42, 0x59, 0x20, 0xe7, 0x85, 0x11, 0xe3, 0xe1, 0x38, 0x85, 0x5d, 0x29, 0x49, 0x68, 0xfa, 0x01, 0x54, 0x04, 0x72, 0x7e, 0x14, 0x33, 0x1e, 0x8d, 0x32, 0xd8, 0x95, 0x13,
0xc6, 0xee, 0x01, 0x2c, 0x27, 0x03, 0xd1, 0x9e, 0xeb, 0x05, 0xe8, 0x98, 0x1a, 0x4f, 0x92, 0xa1, 0xec, 0x1e, 0xc3, 0x7c, 0x3a, 0x10, 0xed, 0x78, 0x7e, 0x88, 0x8e, 0xa9, 0xf1, 0x24, 0x1d, 0x7a,
0xc7, 0xe0, 0xe0, 0xae, 0x21, 0x26, 0x52, 0x92, 0xb4, 0x31, 0x4d, 0x3f, 0x81, 0xe5, 0x56, 0x3c, 0x0c, 0x0e, 0xee, 0x1a, 0x61, 0x22, 0xa5, 0x49, 0x9b, 0xd0, 0xf4, 0x33, 0x98, 0x6f, 0x25, 0xc3,
0x3c, 0x0a, 0x6d, 0x38, 0x3f, 0x05, 0xde, 0xa9, 0x39, 0x3f, 0x49, 0x12, 0x2d, 0x1a, 0x9b, 0xa9, 0xa3, 0xd0, 0x86, 0xf3, 0x53, 0xe8, 0x1f, 0x9b, 0xf3, 0x93, 0x24, 0xd1, 0xa2, 0x91, 0x99, 0xfa,
0xaf, 0x28, 0xfa, 0x73, 0x07, 0x56, 0x1b, 0xfd, 0x3e, 0x56, 0xd9, 0x5e, 0xe0, 0x9d, 0xba, 0x7d, 0x8a, 0xa2, 0x3f, 0x73, 0x60, 0xb1, 0xd1, 0xeb, 0x61, 0x95, 0xed, 0x84, 0xfe, 0xb1, 0xd7, 0x13,
0x31, 0xed, 0x7d, 0xdf, 0x9a, 0xe8, 0xe4, 0x99, 0xf9, 0xda, 0xb9, 0x89, 0x0e, 0xb7, 0x34, 0x67, 0xd3, 0xde, 0xf7, 0xad, 0x89, 0x4e, 0x9e, 0x99, 0xef, 0x9c, 0x9a, 0xe8, 0x70, 0x4b, 0x73, 0xa6,
0x3a, 0x5c, 0x66, 0xcc, 0xb7, 0x19, 0x6b, 0x99, 0x6d, 0xa9, 0x35, 0xf6, 0x7e, 0x01, 0xab, 0x07, 0xc3, 0x65, 0xc6, 0x7c, 0xeb, 0x5a, 0xcb, 0x6c, 0x4b, 0xad, 0xb1, 0xf7, 0x0b, 0x58, 0x7c, 0xea,
0xee, 0x70, 0xc8, 0xa3, 0xc6, 0x60, 0x10, 0x28, 0x2b, 0x48, 0x5d, 0xba, 0xe2, 0xf6, 0xf5, 0xfe, 0x0d, 0x06, 0x3c, 0x6e, 0xf4, 0xfb, 0xa1, 0xb2, 0x82, 0xac, 0x4b, 0x57, 0xbc, 0x9e, 0xde, 0x5f,
0xfa, 0x24, 0x3b, 0x67, 0x2d, 0xd3, 0x82, 0xf1, 0x54, 0x9e, 0x49, 0xa6, 0x72, 0xfa, 0xb5, 0x03, 0x9f, 0x64, 0xa7, 0xac, 0x65, 0x5a, 0x30, 0x99, 0xca, 0xdd, 0x74, 0x2a, 0xa7, 0x5f, 0x3b, 0x00,
0x20, 0x67, 0xab, 0xa6, 0x1b, 0xb9, 0xe9, 0x21, 0xdd, 0x39, 0x3f, 0xa4, 0xbf, 0x09, 0x25, 0x39, 0x72, 0xb6, 0x6a, 0x7a, 0xb1, 0x97, 0x1d, 0xd2, 0x9d, 0xd3, 0x43, 0xfa, 0x7b, 0x50, 0x96, 0x43,
0x14, 0x26, 0x60, 0x25, 0x0c, 0xec, 0x37, 0x71, 0x85, 0x27, 0x43, 0xbc, 0xc5, 0x9b, 0x77, 0x5a, 0x61, 0x0a, 0x56, 0xca, 0xc0, 0x7e, 0x93, 0x54, 0x78, 0x3a, 0xc4, 0x5b, 0xbc, 0xb3, 0x4e, 0x0b,
0x60, 0xac, 0xb1, 0x39, 0x32, 0x77, 0x34, 0xf0, 0x4f, 0x54, 0xb7, 0x35, 0x38, 0xb4, 0x05, 0xab, 0x8c, 0x35, 0x36, 0x47, 0xe6, 0x0d, 0xfb, 0xc1, 0x91, 0xea, 0xb6, 0x06, 0x87, 0xb6, 0x60, 0x51,
0x0a, 0x25, 0xc3, 0xe0, 0x64, 0xf0, 0x75, 0xcc, 0xc1, 0xd7, 0x1c, 0x95, 0x33, 0xd6, 0xa8, 0x4c, 0xa1, 0x64, 0x18, 0x9c, 0x0e, 0xbe, 0x8e, 0x39, 0xf8, 0x9a, 0xa3, 0xb2, 0x6b, 0x8d, 0xca, 0xf4,
0xbf, 0x84, 0xd5, 0x26, 0xbf, 0xaa, 0x1a, 0xcc, 0x8b, 0xc0, 0x33, 0xf3, 0x42, 0x50, 0xa6, 0xfa, 0x4b, 0x58, 0x6c, 0xf2, 0xcb, 0xaa, 0xc1, 0xbc, 0x08, 0x7d, 0x33, 0x2f, 0x04, 0x65, 0xaa, 0xcf,
0xac, 0xad, 0xfe, 0x37, 0x0e, 0x2c, 0xa9, 0x83, 0x5e, 0xb4, 0xb2, 0x77, 0xa0, 0xa2, 0xe1, 0xc3, 0xd9, 0xea, 0x7f, 0xe3, 0xc0, 0x9c, 0x3a, 0xe8, 0x45, 0x2b, 0xbb, 0x05, 0x55, 0x0d, 0x1f, 0xc6,
0xf8, 0x85, 0x6a, 0x03, 0x9b, 0x29, 0xf3, 0x1c, 0x41, 0x6c, 0x24, 0x01, 0x32, 0x38, 0x56, 0xe7, 0x2f, 0x52, 0x1b, 0xd8, 0x4c, 0x99, 0xe7, 0x08, 0x62, 0x23, 0x0d, 0x90, 0xc1, 0xb1, 0x3a, 0xaf,
0x15, 0x22, 0xe9, 0xce, 0x2b, 0xa4, 0x6a, 0x50, 0x94, 0x58, 0x86, 0x0a, 0x5a, 0x4d, 0xd2, 0x1e, 0x10, 0xc9, 0x76, 0x5e, 0x21, 0x55, 0x87, 0x92, 0xc4, 0x32, 0x52, 0xd0, 0x6a, 0x92, 0x76, 0xa1,
0x94, 0x95, 0x51, 0xbd, 0x29, 0x56, 0xf2, 0xfb, 0xc9, 0xd8, 0x65, 0x8f, 0x7c, 0x86, 0xe9, 0xc9, 0xa2, 0x8c, 0xea, 0x4e, 0xb0, 0x92, 0xbf, 0x9b, 0x8e, 0x5d, 0xf6, 0xc8, 0x67, 0x98, 0x9e, 0xce,
0xbc, 0xb5, 0x06, 0x85, 0xaf, 0x9e, 0xed, 0xb9, 0x91, 0xae, 0x6c, 0x45, 0xd1, 0x5f, 0x39, 0x50, 0x5b, 0x4b, 0x50, 0xfc, 0xea, 0xd5, 0x8e, 0x17, 0xeb, 0xca, 0x56, 0x14, 0xfd, 0xa5, 0x03, 0x35,
0xd5, 0x43, 0x0d, 0x36, 0x1b, 0x51, 0xdc, 0x17, 0x9d, 0x79, 0xef, 0xd9, 0x4d, 0x5b, 0xb7, 0xf6, 0x3d, 0xd4, 0x60, 0xb3, 0x11, 0xc5, 0x7d, 0xde, 0x99, 0x77, 0xdb, 0x6e, 0xda, 0xba, 0xb5, 0xa7,
0x24, 0x10, 0xfa, 0xae, 0x70, 0xdd, 0x9b, 0x80, 0x07, 0x15, 0xd1, 0x45, 0xdd, 0xe8, 0x58, 0x58, 0x81, 0xd0, 0x77, 0x85, 0xab, 0xde, 0x04, 0x7c, 0xa8, 0x8a, 0x2e, 0xea, 0xc5, 0x87, 0xc2, 0x92,
0x72, 0xa5, 0x83, 0x6f, 0x1d, 0xc7, 0x41, 0xb9, 0x48, 0x77, 0x54, 0x4d, 0x9b, 0x3d, 0x31, 0x6b, 0x4b, 0x1d, 0x7c, 0xcb, 0x38, 0x0e, 0xca, 0x45, 0xba, 0xa3, 0x6a, 0xda, 0xec, 0x89, 0x39, 0xbb,
0xf7, 0xc4, 0x23, 0xa8, 0xe8, 0xe9, 0x4b, 0x62, 0xb9, 0x01, 0x4b, 0x91, 0x1f, 0xb9, 0xc3, 0x86, 0x27, 0x1e, 0x40, 0x55, 0x4f, 0x5f, 0x12, 0xcb, 0x15, 0x98, 0x8b, 0x83, 0xd8, 0x1b, 0x34, 0xcc,
0x39, 0x9b, 0x9b, 0x2c, 0xd1, 0x7e, 0x15, 0x04, 0xa1, 0xae, 0x99, 0x98, 0x61, 0xa0, 0x9b, 0xb5, 0xd9, 0xdc, 0x64, 0x89, 0xf6, 0xab, 0x20, 0x88, 0x74, 0xcd, 0x24, 0x0c, 0x03, 0xdd, 0x9c, 0x85,
0xd0, 0xfd, 0x5b, 0x06, 0x56, 0xe2, 0x39, 0x4f, 0xc2, 0x4b, 0xbe, 0x63, 0xe5, 0xe9, 0x4c, 0x04, 0xee, 0xdf, 0x5c, 0x58, 0x48, 0xe6, 0x3c, 0x09, 0x2f, 0xf9, 0xd0, 0xca, 0xd3, 0xa9, 0x08, 0xea,
0x75, 0xea, 0xfe, 0x6f, 0x46, 0x3d, 0x33, 0xba, 0xb9, 0x54, 0x74, 0x29, 0x94, 0x45, 0xf3, 0xdd, 0xd4, 0xfd, 0xef, 0x8c, 0x7a, 0x66, 0x74, 0xf3, 0x99, 0xe8, 0x52, 0xa8, 0x88, 0xe6, 0xbb, 0xa3,
0x53, 0x3d, 0x56, 0x96, 0xb0, 0xc5, 0x43, 0x28, 0x04, 0x7d, 0x7f, 0xe8, 0x1e, 0x89, 0x51, 0xba, 0x7a, 0xac, 0x2c, 0x61, 0x8b, 0x87, 0x50, 0x08, 0x7a, 0x63, 0xe0, 0x1d, 0x88, 0x51, 0xba, 0xcc,
0xc4, 0x12, 0x86, 0x95, 0xe6, 0x42, 0xa2, 0x98, 0x4a, 0x73, 0x21, 0x55, 0x87, 0x52, 0x24, 0x8f, 0x52, 0x86, 0x95, 0xe6, 0x42, 0xa2, 0x94, 0x49, 0x73, 0x21, 0xb5, 0x0e, 0xe5, 0x58, 0x1e, 0x99,
0x4c, 0xff, 0xb0, 0xb6, 0x68, 0xa5, 0x87, 0x95, 0x04, 0x2c, 0x11, 0xa3, 0x1e, 0x94, 0x70, 0x40, 0xc1, 0x7e, 0x7d, 0xd6, 0x4a, 0x0f, 0x2b, 0x09, 0x58, 0x2a, 0x46, 0x7d, 0x28, 0xe3, 0x80, 0x24,
0x92, 0x11, 0xbb, 0x28, 0x45, 0xcd, 0x69, 0xa8, 0xe7, 0x1b, 0xb5, 0x96, 0x66, 0x1b, 0x71, 0xcb, 0x23, 0x76, 0x5e, 0x8a, 0x9a, 0xd3, 0x50, 0x37, 0x30, 0x6a, 0x2d, 0xcb, 0x36, 0xe2, 0x96, 0xb7,
0x59, 0x71, 0xfb, 0x53, 0x06, 0x96, 0x70, 0x2f, 0x1d, 0xb3, 0xf7, 0xec, 0xcb, 0xd5, 0xfc, 0xa4, 0xe2, 0xf6, 0x27, 0x17, 0xe6, 0x70, 0x2f, 0x1d, 0xb3, 0xdb, 0xf6, 0xe5, 0xea, 0xec, 0xa4, 0xbf,
0x7f, 0x0b, 0x00, 0xf7, 0xb0, 0x66, 0x30, 0x83, 0x83, 0x89, 0x26, 0x28, 0x05, 0xaf, 0x34, 0xcb, 0x09, 0x80, 0x7b, 0x58, 0x33, 0x98, 0xc1, 0xc1, 0x44, 0x13, 0x94, 0x82, 0x57, 0x9a, 0x65, 0xb2,
0x64, 0xa1, 0x63, 0x48, 0x9a, 0xd1, 0xd1, 0xf4, 0x9c, 0x48, 0xe7, 0xaf, 0x14, 0xe9, 0x42, 0x0a, 0xd0, 0x31, 0x24, 0xcd, 0xe8, 0x68, 0xfa, 0x8c, 0x48, 0x17, 0x2e, 0x15, 0xe9, 0x62, 0x06, 0x24,
0x24, 0x2b, 0x8a, 0xc5, 0x74, 0x14, 0x5f, 0x26, 0x3e, 0x9f, 0x01, 0xb1, 0x6e, 0x0a, 0x32, 0x50, 0x2b, 0x8a, 0xa5, 0x6c, 0x14, 0xdf, 0x26, 0x3e, 0x9f, 0x03, 0xb1, 0x6e, 0x0a, 0x32, 0x50, 0x56,
0x56, 0xe1, 0x38, 0xf3, 0x0b, 0xc7, 0x6e, 0x4b, 0x5f, 0xc0, 0x0d, 0x7b, 0x24, 0x7f, 0x95, 0x3d, 0xe1, 0x38, 0x67, 0x17, 0x8e, 0xdd, 0x96, 0xbe, 0x80, 0x6b, 0xf6, 0x48, 0xfe, 0x4d, 0xf6, 0xbc,
0x2f, 0xc2, 0x4e, 0x23, 0x95, 0x4b, 0xb5, 0xdf, 0x85, 0xbc, 0x78, 0x0c, 0x50, 0x4a, 0xdf, 0x88, 0x18, 0x3b, 0x8d, 0x54, 0x2e, 0xd5, 0x7e, 0x0f, 0x0a, 0xe2, 0x31, 0x40, 0x29, 0xbd, 0x91, 0x78,
0x3d, 0x4d, 0x7b, 0xc3, 0xa4, 0x1c, 0xa9, 0xa7, 0xde, 0x0c, 0xd6, 0x53, 0x2b, 0x0c, 0x9b, 0xf5, 0x9a, 0xf5, 0x86, 0x49, 0x39, 0xb2, 0x9e, 0x79, 0x33, 0x58, 0xce, 0xac, 0x30, 0x6c, 0xd6, 0x6f,
0xdb, 0x01, 0xdd, 0x82, 0x72, 0xd7, 0x98, 0xf8, 0x49, 0x19, 0x9c, 0x47, 0x0a, 0x10, 0xe7, 0x11, 0x07, 0x74, 0x0d, 0x2a, 0xbb, 0xc6, 0xc4, 0x4f, 0x2a, 0xe0, 0x3c, 0x53, 0x80, 0x38, 0xcf, 0x90,
0x52, 0x8f, 0x95, 0x99, 0xce, 0x63, 0xfa, 0x75, 0x36, 0x85, 0xa5, 0xec, 0x88, 0x57, 0x4e, 0xc3, 0x7a, 0xae, 0xcc, 0x74, 0x9e, 0xd3, 0xaf, 0x73, 0x19, 0x2c, 0x65, 0x47, 0xbc, 0x74, 0x1a, 0xfe,
0xff, 0x37, 0x0e, 0x23, 0x31, 0xc9, 0x0f, 0xa0, 0x6c, 0xde, 0xb5, 0x6a, 0x25, 0xb1, 0x4c, 0x3f, 0xbf, 0x71, 0x18, 0x89, 0x49, 0x7e, 0x00, 0x15, 0xf3, 0xae, 0x55, 0x2f, 0x8b, 0x65, 0xfa, 0x01,
0x20, 0x9a, 0x41, 0x61, 0x96, 0xa0, 0x18, 0x85, 0x24, 0x5f, 0x0e, 0x34, 0xa0, 0x46, 0x21, 0x83, 0xd1, 0x0c, 0x0a, 0xb3, 0x04, 0xc5, 0x28, 0x24, 0xf9, 0x72, 0xa0, 0x01, 0x35, 0x0a, 0x19, 0x3c,
0x47, 0xff, 0xe5, 0xa4, 0x53, 0xf5, 0x9a, 0xb1, 0x32, 0x51, 0xcd, 0xa4, 0x50, 0xbd, 0xe6, 0x19, 0xfa, 0x4f, 0x27, 0x9b, 0xaa, 0x57, 0x8c, 0x95, 0x89, 0xaa, 0x9b, 0x41, 0xf5, 0x8a, 0x67, 0xe8,
0x7a, 0xce, 0xd3, 0xdc, 0xcb, 0x7a, 0x9a, 0x9f, 0xe1, 0xe9, 0xdf, 0x1d, 0x58, 0xd5, 0x9e, 0x26, 0x29, 0x4f, 0xf3, 0x6f, 0xeb, 0x69, 0x61, 0x8a, 0xa7, 0x7f, 0x77, 0x60, 0x51, 0x7b, 0x9a, 0xce,
0xb3, 0xc2, 0xc7, 0x50, 0x89, 0xcc, 0x4c, 0xbd, 0xa8, 0x86, 0xe4, 0x2a, 0x5b, 0x9e, 0xdc, 0x85, 0x0a, 0x3f, 0x86, 0x6a, 0x6c, 0x66, 0xea, 0x79, 0x35, 0x24, 0x57, 0xd9, 0xf2, 0xe4, 0x3e, 0x54,
0x72, 0xe4, 0x06, 0x47, 0x3c, 0xda, 0xbd, 0xbc, 0xa2, 0xa4, 0x02, 0x4b, 0x1e, 0xd7, 0xcb, 0x17, 0x62, 0x2f, 0x3c, 0xe0, 0xf1, 0xf6, 0xc5, 0x15, 0x25, 0x15, 0x58, 0xf2, 0xb8, 0x5e, 0xbe, 0xb8,
0x37, 0xb5, 0x3e, 0x7b, 0xf9, 0x7a, 0x53, 0x9e, 0xfe, 0x32, 0x03, 0x2b, 0x16, 0x32, 0xa1, 0x80, 0xa9, 0xf5, 0xb9, 0x8b, 0xd7, 0x9b, 0xf2, 0xf4, 0x17, 0x2e, 0x2c, 0x58, 0xc8, 0x44, 0x02, 0x0e,
0x43, 0x14, 0xba, 0xf4, 0x5c, 0xdf, 0x71, 0x2c, 0x1e, 0xca, 0xc8, 0xca, 0x56, 0x90, 0xc9, 0xd8, 0x51, 0xe8, 0xd2, 0x73, 0x7d, 0xc7, 0xb1, 0x78, 0x28, 0x23, 0x2b, 0x5b, 0x41, 0x26, 0x63, 0x67,
0x59, 0x3c, 0x94, 0x91, 0x7b, 0x29, 0x19, 0x35, 0x4b, 0x9b, 0x3c, 0x72, 0x2b, 0x7e, 0xab, 0xcc, 0xf1, 0x50, 0x46, 0xee, 0xa5, 0x64, 0xd4, 0x2c, 0x6d, 0xf2, 0xc8, 0x9d, 0xe4, 0xad, 0x32, 0x2f,
0x89, 0xa7, 0xbf, 0x99, 0xd1, 0xd2, 0x8f, 0x95, 0xb7, 0xe2, 0xc6, 0x93, 0x9f, 0x1f, 0x5a, 0xfd, 0x9e, 0xfe, 0xa6, 0x46, 0x4b, 0x3f, 0x56, 0xde, 0x49, 0x1a, 0x4f, 0xe1, 0xec, 0xd0, 0xea, 0xd7,
0x5a, 0x79, 0x2b, 0x7e, 0xad, 0x2c, 0x5c, 0x20, 0xac, 0x9e, 0x2b, 0x7f, 0xeb, 0xc0, 0xf2, 0xbd, 0xca, 0x3b, 0xc9, 0x6b, 0x65, 0xf1, 0x1c, 0x61, 0xf5, 0x5c, 0xf9, 0x5b, 0x07, 0xe6, 0x1f, 0x84,
0x80, 0xbb, 0x38, 0xab, 0xbf, 0x88, 0xcf, 0x58, 0xf9, 0x23, 0x46, 0x4f, 0x3f, 0x10, 0xc6, 0x34, 0xdc, 0xc3, 0x59, 0xfd, 0x4d, 0x72, 0xc6, 0xca, 0x1f, 0x31, 0xba, 0xfa, 0x81, 0x30, 0xa1, 0xf1,
0x5e, 0x44, 0xc4, 0x8f, 0x0e, 0x98, 0x61, 0x65, 0xf9, 0x03, 0x83, 0x78, 0x60, 0x0e, 0x43, 0x1e, 0x22, 0x22, 0x7e, 0x74, 0xc0, 0x0c, 0xab, 0xc8, 0x1f, 0x18, 0xc4, 0x03, 0x73, 0x14, 0xf1, 0xb8,
0xb5, 0xa6, 0xbc, 0xaf, 0x67, 0xa4, 0x98, 0x21, 0x8e, 0x46, 0x24, 0x7a, 0xfe, 0x33, 0x3e, 0xd2, 0x35, 0xe1, 0x3d, 0x3d, 0x23, 0x25, 0x0c, 0x71, 0x34, 0x22, 0xd1, 0x0d, 0x5e, 0xf1, 0xa1, 0xfe,
0x3f, 0x0d, 0x24, 0x1c, 0xbc, 0x62, 0x47, 0x5e, 0x34, 0xe4, 0xaa, 0x33, 0x48, 0x82, 0x3e, 0x34, 0x69, 0x20, 0xe5, 0xe0, 0x15, 0x3b, 0xf6, 0xe3, 0x01, 0x57, 0x9d, 0x41, 0x12, 0xf4, 0x89, 0x79,
0xef, 0x93, 0x21, 0x5a, 0x35, 0xff, 0x06, 0x38, 0xe3, 0x72, 0x84, 0x67, 0xc0, 0x80, 0x47, 0xae, 0x9f, 0x8c, 0xd0, 0xaa, 0xb3, 0x6f, 0x80, 0x53, 0x2e, 0x47, 0x78, 0x06, 0xf4, 0x79, 0xec, 0xf9,
0x37, 0x14, 0x3b, 0xe6, 0x99, 0xa2, 0xe8, 0xaf, 0x71, 0x32, 0x13, 0x57, 0x32, 0x71, 0xbd, 0x16, 0x03, 0xb1, 0x63, 0x81, 0x29, 0x8a, 0xfe, 0xda, 0x85, 0x79, 0x79, 0x25, 0xeb, 0x04, 0xb1, 0xb8,
0x73, 0xfe, 0x45, 0x33, 0x85, 0xf5, 0xe6, 0x90, 0x49, 0xbf, 0x39, 0x5c, 0xb7, 0x93, 0x7e, 0x13, 0x1d, 0x9f, 0x3b, 0x52, 0x58, 0x4f, 0x0e, 0x6e, 0xf6, 0xc9, 0xe1, 0xaa, 0x8d, 0xf4, 0xd4, 0x23,
0x72, 0x81, 0x3f, 0xe4, 0x02, 0xbd, 0xe5, 0xfa, 0x92, 0x8a, 0x0b, 0xf3, 0x87, 0x9c, 0x89, 0x0f, 0x4c, 0x7e, 0xda, 0x23, 0x0c, 0x5e, 0x05, 0xe4, 0x4d, 0x50, 0x95, 0xa3, 0x26, 0xc5, 0x08, 0x19,
0xe2, 0x1a, 0x20, 0x6f, 0x81, 0xaa, 0x14, 0x35, 0x29, 0xc6, 0xc7, 0xc8, 0x8d, 0x26, 0xa1, 0xc0, 0x7b, 0xf1, 0x38, 0x12, 0x58, 0xa5, 0xef, 0x2b, 0xe8, 0xca, 0xae, 0xf8, 0xc0, 0x94, 0x80, 0x31,
0x29, 0x79, 0x5b, 0xe9, 0xf8, 0x11, 0xef, 0x8a, 0x0f, 0x4c, 0x09, 0x18, 0x93, 0x66, 0xf1, 0x92, 0x6d, 0x96, 0x2e, 0x98, 0x36, 0xe9, 0x13, 0x58, 0x90, 0x88, 0x34, 0x5f, 0x6e, 0xf9, 0x13, 0x01,
0x49, 0x93, 0x1e, 0x68, 0x34, 0x9a, 0x4f, 0x77, 0x3c, 0x89, 0xc6, 0x16, 0xe4, 0xbc, 0xd1, 0xa1, 0xc9, 0x87, 0x90, 0xf7, 0x87, 0xfb, 0x41, 0xe6, 0x7e, 0x6c, 0xe3, 0xc6, 0x84, 0x08, 0x5a, 0x1b,
0xaf, 0xea, 0x59, 0x3f, 0x03, 0xa7, 0x30, 0x63, 0x42, 0x06, 0xcd, 0x8d, 0xa6, 0xf2, 0xe5, 0x42, 0x4f, 0xe4, 0xe3, 0x85, 0xba, 0xad, 0x29, 0x92, 0xfe, 0xca, 0xd5, 0xb7, 0x5f, 0xa1, 0xb6, 0xcf,
0x5d, 0xd5, 0x14, 0x49, 0xff, 0xe9, 0xe8, 0xab, 0xaf, 0xd0, 0x3b, 0xe0, 0x97, 0x4e, 0x6f, 0xaf, 0x2f, 0x1c, 0xe0, 0xfe, 0xb7, 0xd0, 0x5e, 0xb2, 0xd0, 0x2e, 0x24, 0xd0, 0x5e, 0x87, 0x82, 0x94,
0x16, 0xe9, 0xf9, 0x40, 0xae, 0x59, 0x40, 0xe6, 0x63, 0xd4, 0x6e, 0x42, 0x5e, 0xca, 0x17, 0x05, 0x2f, 0x09, 0xb6, 0x24, 0xd0, 0xf6, 0xbe, 0x1f, 0x72, 0xf9, 0x53, 0xd5, 0xac, 0xf8, 0x92, 0x32,
0x5b, 0x12, 0x68, 0xd5, 0xc0, 0x0b, 0xb8, 0xfc, 0x05, 0x6a, 0x51, 0x7c, 0x49, 0x18, 0xf4, 0x63, 0xe8, 0xa7, 0x66, 0xd6, 0x89, 0xfe, 0x79, 0x07, 0x0a, 0xe8, 0xb7, 0xfe, 0xa5, 0xe2, 0x0c, 0x8c,
0x2b, 0x99, 0x44, 0x5f, 0x7c, 0x1f, 0xf2, 0xe8, 0x92, 0xfe, 0x05, 0x62, 0x1e, 0x7e, 0x52, 0x88, 0xa5, 0x0c, 0x65, 0xb0, 0x24, 0x3f, 0xb4, 0x86, 0xde, 0xcb, 0x01, 0x57, 0x2f, 0x04, 0xd8, 0xb1,
0xbe, 0x0b, 0xcb, 0xf2, 0x0b, 0xe3, 0xcf, 0xe5, 0x75, 0xf2, 0x26, 0xe4, 0x5d, 0x75, 0xd9, 0xc4, 0xa6, 0xfd, 0x5c, 0x47, 0x20, 0xef, 0x47, 0xdb, 0x8f, 0xd4, 0x43, 0x98, 0xf8, 0x9b, 0xd4, 0x20,
0xde, 0x23, 0x09, 0xca, 0x60, 0x4d, 0xca, 0xb5, 0x46, 0xee, 0xd3, 0x21, 0x57, 0x4f, 0x04, 0xd8, 0x77, 0x14, 0x1d, 0x28, 0xb4, 0xf0, 0x4f, 0xda, 0x81, 0x77, 0xa7, 0xe9, 0x44, 0xdb, 0xee, 0x41,
0xb2, 0x66, 0xfd, 0x5e, 0x47, 0x20, 0xe7, 0x85, 0xbb, 0x9f, 0xab, 0x97, 0x30, 0xf1, 0x37, 0xa9, 0x21, 0xe4, 0xd1, 0x48, 0xdb, 0xf6, 0x2d, 0xcb, 0xb6, 0xac, 0x09, 0x4c, 0xca, 0xd2, 0x0e, 0xc0,
0x42, 0xf6, 0x24, 0x3c, 0x52, 0x88, 0xe1, 0x9f, 0xb4, 0x03, 0xaf, 0xcf, 0xd2, 0x89, 0x4e, 0xdc, 0xe3, 0xa0, 0xe7, 0x0d, 0xb6, 0xfc, 0x49, 0x77, 0x82, 0x36, 0x1c, 0xa6, 0x21, 0x16, 0x7f, 0x23,
0x81, 0x7c, 0xc0, 0xc3, 0xb1, 0x76, 0xe2, 0x1b, 0x96, 0x13, 0x69, 0x13, 0x98, 0x94, 0xa5, 0x1d, 0xa0, 0x87, 0xdc, 0x3f, 0x38, 0x94, 0xbd, 0x3e, 0xc7, 0x14, 0x85, 0x80, 0xfa, 0xc9, 0xeb, 0x57,
0x80, 0x07, 0x7e, 0xdf, 0x1d, 0xee, 0x78, 0xd3, 0xde, 0x14, 0x6d, 0x38, 0x4e, 0xc2, 0x2c, 0xfe, 0x8e, 0x49, 0x82, 0xfe, 0xde, 0x81, 0x8a, 0xd0, 0x25, 0xdf, 0x9e, 0x5e, 0x9b, 0x99, 0xe6, 0x58,
0x46, 0xe8, 0x8f, 0xb9, 0x77, 0x74, 0x2c, 0x9b, 0x7d, 0x96, 0x29, 0x0a, 0x7d, 0xf6, 0xe2, 0xe7, 0x99, 0x96, 0x6c, 0xe6, 0x4e, 0xdd, 0x2c, 0x37, 0x7d, 0xb3, 0xbc, 0xb1, 0x59, 0x1a, 0xd3, 0xc2,
0xaf, 0x2c, 0x93, 0x04, 0xfd, 0xbd, 0x03, 0x65, 0xa1, 0x4b, 0x3e, 0x3e, 0x3d, 0x37, 0xb3, 0xcd, 0x99, 0x31, 0x2d, 0x66, 0x63, 0xfa, 0x31, 0x54, 0x0d, 0xfb, 0xa2, 0x11, 0x79, 0x1f, 0x72, 0xf1,
0xb1, 0xb2, 0x2d, 0xde, 0x2c, 0x33, 0x73, 0xb3, 0xec, 0xec, 0xcd, 0x72, 0xc6, 0x66, 0x49, 0xf4, 0x44, 0x83, 0xa6, 0x0b, 0x2e, 0xc5, 0x84, 0xe1, 0x57, 0xba, 0x05, 0x8b, 0x0a, 0x3b, 0xbc, 0x89,
0xf3, 0x73, 0xa3, 0x5f, 0x48, 0x47, 0xff, 0x43, 0xa8, 0x18, 0xf6, 0x85, 0x63, 0xf2, 0x36, 0x64, 0x30, 0x1e, 0x8d, 0x07, 0xff, 0x49, 0x14, 0xdb, 0x70, 0x8d, 0xf1, 0xd7, 0xa7, 0xd2, 0x62, 0x1d,
0xa3, 0xa9, 0x06, 0x4d, 0x57, 0x5d, 0x82, 0x09, 0xc3, 0xaf, 0x74, 0x07, 0x56, 0x15, 0x76, 0x18, 0x4a, 0xa1, 0x50, 0xad, 0xcd, 0xd1, 0x6f, 0x4c, 0xa7, 0xf6, 0x66, 0x5a, 0x70, 0xed, 0x4b, 0x80,
0x70, 0xc6, 0xc3, 0xc9, 0xf0, 0xbf, 0x89, 0x62, 0x1b, 0x6e, 0x30, 0xfe, 0xfc, 0x5c, 0x5a, 0xd4, 0xf4, 0xa1, 0x96, 0xcc, 0x41, 0xa9, 0xd9, 0xda, 0xd9, 0xde, 0x6d, 0x77, 0x6b, 0x33, 0xa4, 0x02,
0xa1, 0x18, 0x08, 0xd5, 0xda, 0x1c, 0xfd, 0xc8, 0x74, 0x6e, 0x6f, 0xa6, 0x05, 0xb7, 0xbe, 0x04, 0xb3, 0x4f, 0xdb, 0xdd, 0xcd, 0x26, 0x6b, 0x3c, 0xad, 0x39, 0x64, 0x11, 0xaa, 0x5d, 0xd6, 0xe8,
0x48, 0x5e, 0x6a, 0xc9, 0x12, 0x14, 0x9b, 0xad, 0xbd, 0xdd, 0x6e, 0xbb, 0x57, 0x5d, 0x20, 0x65, 0xec, 0x6e, 0xb4, 0x58, 0xbb, 0xb3, 0xb3, 0xd7, 0xad, 0xb9, 0x84, 0xc0, 0xbc, 0x66, 0x6d, 0xef,
0x58, 0x3c, 0x68, 0xf7, 0xb6, 0x9b, 0xac, 0x71, 0x50, 0x75, 0xc8, 0x2a, 0x54, 0x7a, 0xac, 0xd1, 0x75, 0x91, 0x97, 0x23, 0x55, 0x28, 0x37, 0xf6, 0xba, 0x9b, 0xdb, 0xac, 0xfd, 0xa2, 0x55, 0xcb,
0xe9, 0xde, 0x6f, 0xb1, 0x76, 0x67, 0x6f, 0xbf, 0x57, 0xcd, 0x10, 0x02, 0xcb, 0x9a, 0xb5, 0xbb, 0xaf, 0xad, 0x0b, 0xb8, 0xd2, 0x5f, 0x77, 0x09, 0x40, 0x51, 0xee, 0x57, 0x9b, 0x21, 0xb3, 0x90,
0xdf, 0x43, 0x5e, 0x96, 0x54, 0xa0, 0xd4, 0xd8, 0xef, 0x6d, 0xef, 0xb2, 0xf6, 0x93, 0x56, 0x35, 0xc7, 0x7b, 0x57, 0xcd, 0xc1, 0x7d, 0x55, 0xe3, 0xaf, 0xb9, 0x6b, 0xef, 0x8b, 0x14, 0x48, 0x7e,
0xb7, 0x55, 0x17, 0x70, 0x25, 0x3f, 0xef, 0x12, 0x80, 0x82, 0xdc, 0xaf, 0xba, 0x40, 0x16, 0x21, 0x7f, 0x22, 0x25, 0xc8, 0x35, 0xfa, 0xfd, 0xda, 0x0c, 0xae, 0x6d, 0xf2, 0x01, 0x8f, 0x79, 0xcd,
0x87, 0x17, 0xaf, 0xaa, 0x83, 0xfb, 0xaa, 0xce, 0x5f, 0xcd, 0x6c, 0xbd, 0x2d, 0x52, 0x20, 0xfe, 0x59, 0xdb, 0x00, 0x48, 0x1b, 0x20, 0x29, 0x43, 0x61, 0xaf, 0xd3, 0x6c, 0x6d, 0xd4, 0x66, 0xf0,
0x01, 0x8a, 0x14, 0x21, 0xdb, 0x18, 0x0c, 0xaa, 0x0b, 0xb8, 0xb6, 0xc9, 0x87, 0x3c, 0xe2, 0x55, 0xcf, 0x27, 0x8d, 0xc7, 0xed, 0x66, 0xcd, 0x41, 0xfd, 0x7b, 0xbb, 0xad, 0x66, 0xcd, 0xc5, 0x95,
0x67, 0xeb, 0x87, 0x00, 0x49, 0x17, 0x24, 0x25, 0xc8, 0xef, 0x77, 0x9a, 0xad, 0xfb, 0xd5, 0x05, 0x1b, 0x6c, 0xfb, 0x45, 0xab, 0x53, 0xcb, 0xa1, 0x5b, 0x7b, 0x1d, 0x45, 0xe5, 0xd7, 0x3e, 0x85,
0xfc, 0xf3, 0x61, 0xe3, 0x41, 0xbb, 0x59, 0x75, 0x50, 0xfe, 0x3e, 0xdb, 0x7d, 0xd2, 0xea, 0x54, 0x77, 0xb6, 0xfc, 0x89, 0x4c, 0x72, 0xc6, 0xa3, 0x9e, 0x37, 0x54, 0x2a, 0x67, 0x21, 0xdf, 0x6e,
0x33, 0xb8, 0xd7, 0x7e, 0xb7, 0xd5, 0xac, 0x66, 0xb7, 0xbe, 0x07, 0x39, 0x6c, 0xbe, 0xb8, 0x67, 0x3e, 0x6e, 0x49, 0x1c, 0x76, 0x1f, 0x34, 0x3a, 0x9d, 0x76, 0xe7, 0x61, 0xcd, 0x41, 0x6a, 0xa3,
0x77, 0xaf, 0xd5, 0x69, 0xb6, 0x98, 0xf4, 0x95, 0xb5, 0x7a, 0xfb, 0xac, 0xd3, 0x62, 0x55, 0x87, 0xdd, 0x69, 0xef, 0x6e, 0xa2, 0xe2, 0xf5, 0x3f, 0x3b, 0x00, 0x47, 0xfe, 0x44, 0xbf, 0xf2, 0x7d,
0x2c, 0x03, 0xc4, 0x4e, 0xb0, 0x6a, 0x66, 0xeb, 0x27, 0xf0, 0xda, 0x8e, 0x37, 0xd5, 0x45, 0x1b, 0x0c, 0x0b, 0x0f, 0x33, 0x7a, 0xaa, 0x2a, 0x06, 0x8c, 0xbf, 0xee, 0xf8, 0x83, 0xe5, 0x5a, 0x4a,
0xf6, 0xdd, 0x91, 0xda, 0x77, 0x11, 0x72, 0xed, 0xe6, 0x83, 0x96, 0x54, 0xd0, 0xbd, 0xd7, 0xe8, 0xee, 0xc6, 0xa1, 0x3f, 0x3c, 0xa0, 0x33, 0xe4, 0x23, 0x98, 0x93, 0x4b, 0xd0, 0xa3, 0x4b, 0xad,
0x74, 0xda, 0x9d, 0x4f, 0xab, 0x0e, 0x52, 0xf7, 0xdb, 0x9d, 0x76, 0x77, 0xbb, 0xd5, 0xac, 0x66, 0xb8, 0x0f, 0x55, 0x2b, 0xfa, 0x64, 0x21, 0x15, 0x12, 0x0f, 0x54, 0xcb, 0xcb, 0x29, 0x23, 0x9b,
0xea, 0x7f, 0x76, 0x00, 0x4e, 0xbc, 0xa9, 0x7e, 0x0b, 0xfc, 0x10, 0x56, 0x3e, 0x4d, 0xe9, 0xa9, 0x27, 0x74, 0xe6, 0x65, 0x51, 0xfc, 0xa3, 0xc2, 0xbd, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x40,
0xe8, 0x53, 0x81, 0x3f, 0xef, 0x78, 0xc3, 0xf5, 0x6a, 0x42, 0x76, 0xa3, 0xc0, 0x1b, 0x1d, 0xd1, 0x0f, 0x00, 0xa1, 0xdd, 0x20, 0x00, 0x00,
0x05, 0xf2, 0x01, 0x2c, 0xc9, 0x25, 0xe8, 0xf6, 0x95, 0x56, 0xdc, 0x85, 0x8a, 0x95, 0x22, 0x64,
0x25, 0x11, 0x12, 0x7d, 0x67, 0x7d, 0x3d, 0x61, 0xa4, 0x93, 0x89, 0x2e, 0x3c, 0x2d, 0x88, 0x7f,
0x67, 0xb8, 0xf3, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x73, 0x91, 0xca, 0x02, 0x03, 0x21, 0x00,
0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
......
...@@ -11,7 +11,7 @@ import ( ...@@ -11,7 +11,7 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
) )
func (policy *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (types.Message, error) { func (p *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (types.Message, error) {
if len(req.Addr) == 0 && len(req.PrivKey) == 0 { if len(req.Addr) == 0 && len(req.PrivKey) == 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "addr or privkey need be set") return nil, errors.Wrapf(types.ErrInvalidParam, "addr or privkey need be set")
} }
...@@ -32,7 +32,7 @@ func (policy *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (t ...@@ -32,7 +32,7 @@ func (policy *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (t
} }
//通过account 从钱包获取 //通过account 从钱包获取
keys, err := policy.getAccountPrivacyKey(req.Addr) keys, err := p.getAccountPrivacyKey(req.Addr)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "get account =%s privacy key", req.Addr) return nil, errors.Wrapf(err, "get account =%s privacy key", req.Addr)
} }
...@@ -43,56 +43,40 @@ func (policy *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (t ...@@ -43,56 +43,40 @@ func (policy *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (t
return keys, nil return keys, nil
} }
func (policy *mixPolicy) On_ShowAccountNoteInfo(req *types.ReqAddrs) (types.Message, error) { func (p *mixPolicy) On_ShowAccountNoteInfo(req *mixTy.WalletMixIndexReq) (types.Message, error) {
return policy.showAccountNoteInfo(req.Addrs) return p.showAccountNoteInfo(req)
} }
func (policy *mixPolicy) On_GetRescanStatus(in *types.ReqNil) (types.Message, error) { func (p *mixPolicy) On_GetRescanStatus(in *types.ReqNil) (types.Message, error) {
return &types.ReqString{Data: policy.getRescanStatus()}, nil return &types.ReqString{Data: p.getRescanStatus()}, nil
} }
//重新扫描所有notes //重新扫描所有notes
func (policy *mixPolicy) On_RescanNotes(in *types.ReqNil) (types.Message, error) { func (p *mixPolicy) On_RescanNotes(in *types.ReqNil) (types.Message, error) {
err := policy.tryRescanNotes() err := p.tryRescanNotes()
if err != nil { if err != nil {
bizlog.Error("rescanUTXOs", "err", err.Error()) bizlog.Error("rescanUTXOs", "err", err.Error())
} }
return &types.ReqString{Data: "ok"}, err return &types.ReqString{Data: "ok"}, err
} }
func (policy *mixPolicy) On_EnablePrivacy(req *types.ReqAddrs) (types.Message, error) { func (p *mixPolicy) On_EnablePrivacy(req *types.ReqAddrs) (types.Message, error) {
return policy.enablePrivacy(req.Addrs) return p.enablePrivacy(req.Addrs)
} }
//func (policy *mixPolicy) On_EncodeSecretData(req *mixTy.SecretData) (types.Message, error) { //func (p *mixPolicy) On_EncodeSecretData(req *mixTy.SecretData) (types.Message, error) {
// return encodeSecretData(req) // return encodeSecretData(req)
//} //}
func (policy *mixPolicy) On_EncryptSecretData(req *mixTy.EncryptSecretData) (types.Message, error) { func (p *mixPolicy) On_EncryptSecretData(req *mixTy.EncryptSecretData) (types.Message, error) {
return encryptSecretData(req) return encryptSecretData(req)
} }
func (policy *mixPolicy) On_DecryptSecretData(req *mixTy.DecryptSecretData) (types.Message, error) { func (p *mixPolicy) On_DecryptSecretData(req *mixTy.DecryptSecretData) (types.Message, error) {
return decryptSecretData(req) return decryptSecretData(req)
} }
//func (policy *mixPolicy) On_DepositProof(req *mixTy.CreateRawTxReq) (types.Message, error) { func (p *mixPolicy) On_CreateRawTransaction(req *mixTy.CreateRawTxReq) (types.Message, error) {
// return policy.createDepositTx(req) return p.createRawTx(req)
//}
//
//func (policy *mixPolicy) On_WithdrawProof(req *mixTy.CreateRawTxReq) (types.Message, error) {
// return policy.createWithdrawTx(req)
//}
//
//func (policy *mixPolicy) On_AuthProof(req *mixTy.CreateRawTxReq) (types.Message, error) {
// return policy.createAuthTx(req)
//}
//
//func (policy *mixPolicy) On_TransferProof(req *mixTy.CreateRawTxReq) (types.Message, error) {
// return policy.createTransferTx(req)
//}
func (policy *mixPolicy) On_CreateRawTransaction(req *mixTy.CreateRawTxReq) (types.Message, error) {
return policy.createRawTx(req)
} }
...@@ -147,9 +147,9 @@ func mimcHashCalc(sum []byte) []byte { ...@@ -147,9 +147,9 @@ func mimcHashCalc(sum []byte) []byte {
return mimcbn256.Sum("seed", sum) return mimcbn256.Sum("seed", sum)
} }
func (policy *mixPolicy) getPrivKeyByAddr(addr string) (crypto.PrivKey, error) { func (p *mixPolicy) getPrivKeyByAddr(addr string) (crypto.PrivKey, error) {
//获取指定地址在钱包里的账户信息 //获取指定地址在钱包里的账户信息
Accountstor, err := policy.store.GetAccountByAddr(addr) Accountstor, err := p.store.GetAccountByAddr(addr)
if err != nil { if err != nil {
bizlog.Error("ProcSendToAddress", "GetAccountByAddr err:", err) bizlog.Error("ProcSendToAddress", "GetAccountByAddr err:", err)
return nil, err return nil, err
...@@ -161,7 +161,7 @@ func (policy *mixPolicy) getPrivKeyByAddr(addr string) (crypto.PrivKey, error) { ...@@ -161,7 +161,7 @@ func (policy *mixPolicy) getPrivKeyByAddr(addr string) (crypto.PrivKey, error) {
bizlog.Error("ProcSendToAddress", "FromHex err", err) bizlog.Error("ProcSendToAddress", "FromHex err", err)
return nil, err return nil, err
} }
operater := policy.getWalletOperate() operater := p.getWalletOperate()
password := []byte(operater.GetPassword()) password := []byte(operater.GetPassword())
privkey := wcom.CBCDecrypterPrivkey(password, prikeybyte) privkey := wcom.CBCDecrypterPrivkey(password, prikeybyte)
//通过privkey生成一个pubkey然后换算成对应的addr //通过privkey生成一个pubkey然后换算成对应的addr
...@@ -178,30 +178,30 @@ func (policy *mixPolicy) getPrivKeyByAddr(addr string) (crypto.PrivKey, error) { ...@@ -178,30 +178,30 @@ func (policy *mixPolicy) getPrivKeyByAddr(addr string) (crypto.PrivKey, error) {
return priv, nil return priv, nil
} }
func (policy *mixPolicy) getAccountPrivacyKey(addr string) (*mixTy.WalletAddrPrivacy, error) { func (p *mixPolicy) getAccountPrivacyKey(addr string) (*mixTy.WalletAddrPrivacy, error) {
if data, _ := policy.store.getAccountPrivacy(addr); data != nil { if data, _ := p.store.getAccountPrivacy(addr); data != nil {
privacyInfo := &mixTy.AccountPrivacyKey{} privacyInfo := &mixTy.AccountPrivacyKey{}
password := []byte(policy.getWalletOperate().GetPassword()) password := []byte(p.getWalletOperate().GetPassword())
decrypted, err := decryptDataWithPading(password, data) decrypted, err := decryptDataWithPading(password, data)
if err != nil { if err != nil {
return policy.savePrivacyPair(addr) return p.savePrivacyPair(addr)
} }
//有可能修改了秘钥,如果解密失败,需要重新设置 //有可能修改了秘钥,如果解密失败,需要重新设置
err = types.Decode(decrypted, privacyInfo) err = types.Decode(decrypted, privacyInfo)
if err != nil { if err != nil {
return policy.savePrivacyPair(addr) return p.savePrivacyPair(addr)
} }
return &mixTy.WalletAddrPrivacy{Privacy: privacyInfo, Addr: addr}, nil return &mixTy.WalletAddrPrivacy{Privacy: privacyInfo, Addr: addr}, nil
} }
return policy.savePrivacyPair(addr) return p.savePrivacyPair(addr)
} }
func (policy *mixPolicy) savePrivacyPair(addr string) (*mixTy.WalletAddrPrivacy, error) { func (p *mixPolicy) savePrivacyPair(addr string) (*mixTy.WalletAddrPrivacy, error) {
priv, err := policy.getPrivKeyByAddr(addr) priv, err := p.getPrivKeyByAddr(addr)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "savePrivacyPair addr=%s", addr) return nil, errors.Wrapf(err, "savePrivacyPair addr=%s", addr)
} }
...@@ -209,17 +209,17 @@ func (policy *mixPolicy) savePrivacyPair(addr string) (*mixTy.WalletAddrPrivacy, ...@@ -209,17 +209,17 @@ func (policy *mixPolicy) savePrivacyPair(addr string) (*mixTy.WalletAddrPrivacy,
bizlog.Info("savePrivacyPair", "pri", common.ToHex(priv.Bytes()), "addr", addr) bizlog.Info("savePrivacyPair", "pri", common.ToHex(priv.Bytes()), "addr", addr)
newPrivacy := newPrivacyKey(priv.Bytes()) newPrivacy := newPrivacyKey(priv.Bytes())
password := []byte(policy.getWalletOperate().GetPassword()) password := []byte(p.getWalletOperate().GetPassword())
encryptered := encryptDataWithPadding(password, types.Encode(newPrivacy)) encryptered := encryptDataWithPadding(password, types.Encode(newPrivacy))
//save the privacy created to wallet db //save the privacy created to wallet db
policy.store.setAccountPrivacy(addr, encryptered) p.store.setAccountPrivacy(addr, encryptered)
return &mixTy.WalletAddrPrivacy{Privacy: newPrivacy, Addr: addr}, nil return &mixTy.WalletAddrPrivacy{Privacy: newPrivacy, Addr: addr}, nil
} }
//查询钱包里面所有的地址对应的PrivacyKeys //查询钱包里面所有的地址对应的PrivacyKeys
func (policy *mixPolicy) getWalletPrivacyKeys() ([]*mixTy.WalletAddrPrivacy, error) { func (p *mixPolicy) getWalletPrivacyKeys() ([]*mixTy.WalletAddrPrivacy, error) {
//通过Account前缀查找获取钱包中的所有账户信息 //通过Account前缀查找获取钱包中的所有账户信息
WalletAccStores, err := policy.store.GetAccountByPrefix("Account") WalletAccStores, err := p.store.GetAccountByPrefix("Account")
if err != nil || len(WalletAccStores) == 0 { if err != nil || len(WalletAccStores) == 0 {
bizlog.Info("getPrivacyKeyPairs", "store getAccountByPrefix error", err) bizlog.Info("getPrivacyKeyPairs", "store getAccountByPrefix error", err)
return nil, err return nil, err
...@@ -228,7 +228,7 @@ func (policy *mixPolicy) getWalletPrivacyKeys() ([]*mixTy.WalletAddrPrivacy, err ...@@ -228,7 +228,7 @@ func (policy *mixPolicy) getWalletPrivacyKeys() ([]*mixTy.WalletAddrPrivacy, err
var infoPriRes []*mixTy.WalletAddrPrivacy var infoPriRes []*mixTy.WalletAddrPrivacy
for _, AccStore := range WalletAccStores { for _, AccStore := range WalletAccStores {
if len(AccStore.Addr) != 0 { if len(AccStore.Addr) != 0 {
if privacyInfo, err := policy.getAccountPrivacyKey(AccStore.Addr); err == nil { if privacyInfo, err := p.getAccountPrivacyKey(AccStore.Addr); err == nil {
infoPriRes = append(infoPriRes, privacyInfo) infoPriRes = append(infoPriRes, privacyInfo)
} }
} }
...@@ -243,38 +243,38 @@ func (policy *mixPolicy) getWalletPrivacyKeys() ([]*mixTy.WalletAddrPrivacy, err ...@@ -243,38 +243,38 @@ func (policy *mixPolicy) getWalletPrivacyKeys() ([]*mixTy.WalletAddrPrivacy, err
} }
func (policy *mixPolicy) getRescanStatus() string { func (p *mixPolicy) getRescanStatus() string {
status := policy.store.getRescanNoteStatus() status := p.store.getRescanNoteStatus()
return mixTy.MixWalletRescanStatus(status).String() return mixTy.MixWalletRescanStatus(status).String()
} }
func (policy *mixPolicy) tryRescanNotes() error { func (p *mixPolicy) tryRescanNotes() error {
//未使能,直接使能 //未使能,直接使能
if !policy.store.getPrivacyEnable() { if !p.store.getPrivacyEnable() {
//policy.store.enablePrivacy() //p.store.enablePrivacy()
return errors.Wrap(types.ErrNotAllow, "privacy need enable firstly") return errors.Wrap(types.ErrNotAllow, "privacy need enable firstly")
} }
operater := policy.getWalletOperate() operater := p.getWalletOperate()
if operater.IsWalletLocked() { if operater.IsWalletLocked() {
return types.ErrWalletIsLocked return types.ErrWalletIsLocked
} }
status := policy.store.getRescanNoteStatus() status := p.store.getRescanNoteStatus()
if status == int32(mixTy.MixWalletRescanStatus_SCANNING) { if status == int32(mixTy.MixWalletRescanStatus_SCANNING) {
return errors.Wrap(types.ErrNotAllow, "mix wallet is scanning") return errors.Wrap(types.ErrNotAllow, "mix wallet is scanning")
} }
policy.store.setRescanNoteStatus(int32(mixTy.MixWalletRescanStatus_SCANNING)) p.store.setRescanNoteStatus(int32(mixTy.MixWalletRescanStatus_SCANNING))
go policy.rescanNotes() go p.rescanNotes()
return nil return nil
} }
//从localdb中把Mix合约的交易按升序都获取出来依次处理 //从localdb中把Mix合约的交易按升序都获取出来依次处理
func (policy *mixPolicy) rescanNotes() { func (p *mixPolicy) rescanNotes() {
var txInfo mixTy.LocalMixTx var txInfo mixTy.LocalMixTx
i := 0 i := 0
operater := policy.getWalletOperate() operater := p.getWalletOperate()
for { for {
select { select {
case <-operater.GetWalletDone(): case <-operater.GetWalletDone():
...@@ -324,19 +324,19 @@ func (policy *mixPolicy) rescanNotes() { ...@@ -324,19 +324,19 @@ func (policy *mixPolicy) rescanNotes() {
txInfo.Index = mixTxInfos.Txs[txcount-1].GetIndex() txInfo.Index = mixTxInfos.Txs[txcount-1].GetIndex()
} }
policy.processPrivcyTxs(&ReqHashes) p.processPrivcyTxs(&ReqHashes)
if txcount < int(MaxTxHashsPerTime) { if txcount < int(MaxTxHashsPerTime) {
break break
} }
} }
policy.store.setRescanNoteStatus(int32(mixTy.MixWalletRescanStatus_FINISHED)) p.store.setRescanNoteStatus(int32(mixTy.MixWalletRescanStatus_FINISHED))
return return
} }
func (policy *mixPolicy) processPrivcyTxs(ReqHashes *types.ReqHashes) { func (p *mixPolicy) processPrivcyTxs(ReqHashes *types.ReqHashes) {
//通过txhashs获取对应的txdetail //通过txhashs获取对应的txdetail
txDetails, err := policy.getWalletOperate().GetAPI().GetTransactionByHash(ReqHashes) txDetails, err := p.getWalletOperate().GetAPI().GetTransactionByHash(ReqHashes)
if err != nil { if err != nil {
bizlog.Error("processPrivcyTx", "GetTransactionByHash error", err) bizlog.Error("processPrivcyTx", "GetTransactionByHash error", err)
return return
...@@ -347,18 +347,18 @@ func (policy *mixPolicy) processPrivcyTxs(ReqHashes *types.ReqHashes) { ...@@ -347,18 +347,18 @@ func (policy *mixPolicy) processPrivcyTxs(ReqHashes *types.ReqHashes) {
bizlog.Error("processPrivcyTx wrong tx", "receipt ty", tx.Receipt.Ty, "hash", common.ToHex(tx.Tx.Hash())) bizlog.Error("processPrivcyTx wrong tx", "receipt ty", tx.Receipt.Ty, "hash", common.ToHex(tx.Tx.Hash()))
continue continue
} }
set, err := policy.processMixTx(tx.Tx, tx.Height, tx.Index) set, err := p.processMixTx(tx.Tx, tx.Height, tx.Index)
if err != nil { if err != nil {
bizlog.Error("processPrivcyTx", "processMixTx error", err) bizlog.Error("processPrivcyTx", "processMixTx error", err)
continue continue
} }
policy.store.setKvs(set) p.store.setKvs(set)
} }
} }
func (policy *mixPolicy) enablePrivacy(addrs []string) (*mixTy.ReqEnablePrivacyRst, error) { func (p *mixPolicy) enablePrivacy(addrs []string) (*mixTy.ReqEnablePrivacyRst, error) {
if 0 == len(addrs) { if 0 == len(addrs) {
WalletAccStores, err := policy.store.GetAccountByPrefix("Account") WalletAccStores, err := p.store.GetAccountByPrefix("Account")
if err != nil || len(WalletAccStores) == 0 { if err != nil || len(WalletAccStores) == 0 {
bizlog.Info("enablePrivacy", "GetAccountByPrefix:err", err) bizlog.Info("enablePrivacy", "GetAccountByPrefix:err", err)
return nil, types.ErrNotFound return nil, types.ErrNotFound
...@@ -376,7 +376,7 @@ func (policy *mixPolicy) enablePrivacy(addrs []string) (*mixTy.ReqEnablePrivacyR ...@@ -376,7 +376,7 @@ func (policy *mixPolicy) enablePrivacy(addrs []string) (*mixTy.ReqEnablePrivacyR
for _, addr := range addrs { for _, addr := range addrs {
str := "" str := ""
isOK := true isOK := true
_, err := policy.getAccountPrivacyKey(addr) _, err := p.getAccountPrivacyKey(addr)
if err != nil { if err != nil {
isOK = false isOK = false
str = err.Error() str = err.Error()
...@@ -390,34 +390,25 @@ func (policy *mixPolicy) enablePrivacy(addrs []string) (*mixTy.ReqEnablePrivacyR ...@@ -390,34 +390,25 @@ func (policy *mixPolicy) enablePrivacy(addrs []string) (*mixTy.ReqEnablePrivacyR
rep.Results = append(rep.Results, priAddrResult) rep.Results = append(rep.Results, priAddrResult)
} }
policy.store.enablePrivacy() p.store.enablePrivacy()
return &rep, nil return &rep, nil
} }
func (policy *mixPolicy) showAccountNoteInfo(addrs []string) (*mixTy.WalletIndexResp, error) { func (p *mixPolicy) showAccountNoteInfo(req *mixTy.WalletMixIndexReq) (*mixTy.WalletNoteResp, error) {
var resps mixTy.WalletIndexResp resp, err := p.listMixInfos(req)
for _, addr := range addrs { return resp.(*mixTy.WalletNoteResp), err
var req mixTy.WalletMixIndexReq
req.Account = addr
resp, err := policy.listMixInfos(&req)
if err != nil {
return nil, err
}
resps.Notes = append(resps.Notes, resp.(*mixTy.WalletIndexResp).Notes...)
}
return &resps, nil
} }
func (policy *mixPolicy) createRawTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) { func (p *mixPolicy) createRawTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) {
switch req.ActionTy { switch req.ActionTy {
case mixTy.MixActionDeposit: case mixTy.MixActionDeposit:
return policy.createDepositTx(req) return p.createDepositTx(req)
case mixTy.MixActionWithdraw: case mixTy.MixActionWithdraw:
return policy.createWithdrawTx(req) return p.createWithdrawTx(req)
case mixTy.MixActionAuth: case mixTy.MixActionAuth:
return policy.createAuthTx(req) return p.createAuthTx(req)
case mixTy.MixActionTransfer: case mixTy.MixActionTransfer:
return policy.createTransferTx(req) return p.createTransferTx(req)
default: default:
return nil, errors.Wrapf(types.ErrInvalidParam, "action=%d", req.ActionTy) return nil, errors.Wrapf(types.ErrInvalidParam, "action=%d", req.ActionTy)
} }
......
...@@ -144,6 +144,8 @@ func (p *mixPolicy) processAuth(auth *mixTy.MixAuthorizeAction, table *table.Tab ...@@ -144,6 +144,8 @@ func (p *mixPolicy) processAuth(auth *mixTy.MixAuthorizeAction, table *table.Tab
} }
input := out.(*mixTy.AuthorizePublicInput) input := out.(*mixTy.AuthorizePublicInput)
updateAuthSpend(table, input.AuthorizeSpendHash) updateAuthSpend(table, input.AuthorizeSpendHash)
updateAuthHash(table, input.AuthorizeHash)
} }
func (p *mixPolicy) processNullifiers(nulls []string, table *table.Table) { func (p *mixPolicy) processNullifiers(nulls []string, table *table.Table) {
...@@ -189,11 +191,27 @@ func updateAuthSpend(ldb *table.Table, authSpend string) error { ...@@ -189,11 +191,27 @@ func updateAuthSpend(ldb *table.Table, authSpend string) error {
return ldb.Update([]byte(u.TxIndex), u) return ldb.Update([]byte(u.TxIndex), u)
} }
func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, error) { func updateAuthHash(ldb *table.Table, authHash string) error {
xs, err := ldb.ListIndex("authHash", []byte(authHash), nil, 1, 0)
if err != nil || len(xs) != 1 {
bizlog.Error("updateAuthHash update query List failed", "key", authHash, "err", err, "len", len(xs))
return nil
}
u, ok := xs[0].Data.(*mixTy.WalletDbMixInfo)
if !ok {
bizlog.Error("updateAuthSpend update decode failed", "data", xs[0].Data)
return nil
}
u.Info.Status = mixTy.NoteStatus_UNFROZEN
return ldb.Update([]byte(u.TxIndex), u)
}
func (p *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, error) {
if req == nil { if req == nil {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
localDb := e.getWalletOperate().GetDBStore() localDb := p.getWalletOperate().GetDBStore()
query := NewMixTable(localDb).GetQuery(commondb.NewKVDB(localDb)) query := NewMixTable(localDb).GetQuery(commondb.NewKVDB(localDb))
var primary []byte var primary []byte
...@@ -211,7 +229,7 @@ func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e ...@@ -211,7 +229,7 @@ func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e
} }
cur := &MixRow{ cur := &MixRow{
WalletDbMixInfo: &mixTy.WalletDbMixInfo{Info: &mixTy.WalletIndexInfo{ WalletDbMixInfo: &mixTy.WalletDbMixInfo{Info: &mixTy.WalletNoteInfo{
NoteHash: req.NoteHash, NoteHash: req.NoteHash,
Nullifier: req.Nullifier, Nullifier: req.Nullifier,
AuthorizeSpendHash: req.AuthorizeSpendHash, AuthorizeSpendHash: req.AuthorizeSpendHash,
...@@ -233,7 +251,7 @@ func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e ...@@ -233,7 +251,7 @@ func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e
if len(rows) == 0 { if len(rows) == 0 {
return nil, types.ErrNotFound return nil, types.ErrNotFound
} }
var resp mixTy.WalletIndexResp var resp mixTy.WalletNoteResp
for _, row := range rows { for _, row := range rows {
r, ok := row.Data.(*mixTy.WalletDbMixInfo) r, ok := row.Data.(*mixTy.WalletDbMixInfo)
if !ok { if !ok {
...@@ -245,8 +263,8 @@ func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e ...@@ -245,8 +263,8 @@ func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e
return &resp, nil return &resp, nil
} }
func (e *mixPolicy) execAutoDelLocal(tx *types.Transaction) (*types.LocalDBSet, error) { func (p *mixPolicy) execAutoDelLocal(tx *types.Transaction) (*types.LocalDBSet, error) {
kvs, err := e.store.DelRollbackKV(tx, tx.Execer) kvs, err := p.store.DelRollbackKV(tx, tx.Execer)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -255,7 +273,7 @@ func (e *mixPolicy) execAutoDelLocal(tx *types.Transaction) (*types.LocalDBSet, ...@@ -255,7 +273,7 @@ func (e *mixPolicy) execAutoDelLocal(tx *types.Transaction) (*types.LocalDBSet,
return dbSet, nil return dbSet, nil
} }
func (p *mixPolicy) addTable(info *mixTy.WalletIndexInfo, heightIndex string, table *table.Table) { func (p *mixPolicy) addTable(info *mixTy.WalletNoteInfo, heightIndex string, table *table.Table) {
r := &mixTy.WalletDbMixInfo{ r := &mixTy.WalletDbMixInfo{
Info: info, Info: info,
TxIndex: heightIndex + info.NoteHash, TxIndex: heightIndex + info.NoteHash,
...@@ -310,7 +328,7 @@ func (p *mixPolicy) processSecretGroup(noteHash string, secretGroup *mixTy.DHSec ...@@ -310,7 +328,7 @@ func (p *mixPolicy) processSecretGroup(noteHash string, secretGroup *mixTy.DHSec
} }
} }
func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys []*mixTy.WalletAddrPrivacy) (*mixTy.WalletIndexInfo, error) { func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys []*mixTy.WalletAddrPrivacy) (*mixTy.WalletNoteInfo, error) {
var dhSecret mixTy.DHSecret var dhSecret mixTy.DHSecret
data, err := hex.DecodeString(secretData) data, err := hex.DecodeString(secretData)
if err != nil { if err != nil {
...@@ -339,13 +357,14 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys ...@@ -339,13 +357,14 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys
continue continue
} }
bizlog.Info("processSecret.decode rawData OK", "notehash", noteHash, "addr", key.Addr) bizlog.Info("processSecret.decode rawData OK", "notehash", noteHash, "addr", key.Addr)
//wallet产生deposit tx时候 确保了三个key不同,除非自己构造相同key的交易
if rawData.ReceiverKey == key.Privacy.PaymentKey.ReceiveKey || if rawData.ReceiverKey == key.Privacy.PaymentKey.ReceiveKey ||
rawData.ReturnKey == key.Privacy.PaymentKey.ReceiveKey || rawData.ReturnKey == key.Privacy.PaymentKey.ReceiveKey ||
rawData.AuthorizeKey == key.Privacy.PaymentKey.ReceiveKey { rawData.AuthorizeKey == key.Privacy.PaymentKey.ReceiveKey {
//decrypted, save database //decrypted, save database
var info mixTy.WalletIndexInfo var info mixTy.WalletNoteInfo
info.NoteHash = noteHash info.NoteHash = noteHash
info.Nullifier = mixTy.Byte2Str(mimcHashString([]string{rawData.NoteRandom})) info.Nullifier = hex.EncodeToString(mimcHashString([]string{rawData.NoteRandom}))
//如果自己是spender,则记录有关spenderAuthHash,如果是returner,则记录returnerAuthHash //如果自己是spender,则记录有关spenderAuthHash,如果是returner,则记录returnerAuthHash
//如果授权为spenderAuthHash,则根据授权hash索引到本地数据库,spender更新本地为VALID,returner侧不变仍为FROZEN,花费后,两端都变为USED //如果授权为spenderAuthHash,则根据授权hash索引到本地数据库,spender更新本地为VALID,returner侧不变仍为FROZEN,花费后,两端都变为USED
//如果授权为returnerAuthHash,则returner更新本地为VALID,spender侧仍为FROZEN, //如果授权为returnerAuthHash,则returner更新本地为VALID,spender侧仍为FROZEN,
...@@ -353,13 +372,10 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys ...@@ -353,13 +372,10 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys
if len(rawData.AuthorizeKey) > LENNULLKEY { if len(rawData.AuthorizeKey) > LENNULLKEY {
switch key.Privacy.PaymentKey.ReceiveKey { switch key.Privacy.PaymentKey.ReceiveKey {
case rawData.ReceiverKey: case rawData.ReceiverKey:
info.Role = mixTy.Role_SPENDER
info.AuthorizeSpendHash = mixTy.Byte2Str(mimcHashString([]string{rawData.ReceiverKey, rawData.Amount, rawData.NoteRandom}))
case rawData.ReturnKey: case rawData.ReturnKey:
info.Role = mixTy.Role_RETURNER info.AuthorizeSpendHash = hex.EncodeToString(mimcHashString([]string{key.Privacy.PaymentKey.ReceiveKey, rawData.Amount, rawData.NoteRandom}))
info.AuthorizeSpendHash = mixTy.Byte2Str(mimcHashString([]string{rawData.ReturnKey, rawData.Amount, rawData.NoteRandom}))
case rawData.AuthorizeKey: case rawData.AuthorizeKey:
info.Role = mixTy.Role_AUTHORIZER info.AuthorizeHash = hex.EncodeToString(mimcHashString([]string{rawData.AuthorizeKey, rawData.NoteRandom}))
} }
} }
......
...@@ -22,6 +22,7 @@ var boardOpt = &table.Option{ ...@@ -22,6 +22,7 @@ var boardOpt = &table.Option{
Index: []string{ Index: []string{
"noteHash", "noteHash",
"nullifier", "nullifier",
"authHash",
"authSpendHash", "authSpendHash",
"account", "account",
"status"}, "status"},
...@@ -70,6 +71,8 @@ func (r *MixRow) Get(key string) ([]byte, error) { ...@@ -70,6 +71,8 @@ func (r *MixRow) Get(key string) ([]byte, error) {
return []byte(r.Info.NoteHash), nil return []byte(r.Info.NoteHash), nil
case "nullifier": case "nullifier":
return []byte(r.Info.Nullifier), nil return []byte(r.Info.Nullifier), nil
case "authHash":
return []byte(r.Info.AuthorizeHash), nil
case "authSpendHash": case "authSpendHash":
return []byte(r.Info.AuthorizeSpendHash), nil return []byte(r.Info.AuthorizeSpendHash), nil
case "account": case "account":
......
...@@ -22,31 +22,6 @@ type mixStore struct { ...@@ -22,31 +22,6 @@ type mixStore struct {
*wcom.Store *wcom.Store
} }
//
//func (store *mixStore) getAccountByPrefix(addr string) ([]*types.WalletAccountStore, error) {
// if len(addr) == 0 {
// bizlog.Error("getAccountByPrefix addr is nil")
// return nil, types.ErrInvalidParam
// }
// list := store.NewListHelper()
// accbytes := list.PrefixScan([]byte(addr))
// if len(accbytes) == 0 {
// bizlog.Error("getAccountByPrefix addr not exist")
// return nil, types.ErrAccountNotExist
// }
// WalletAccountStores := make([]*types.WalletAccountStore, len(accbytes))
// for index, accbyte := range accbytes {
// var walletaccount types.WalletAccountStore
// err := proto.Unmarshal(accbyte, &walletaccount)
// if err != nil {
// bizlog.Error("GetAccountByAddr", "proto.Unmarshal err:", err)
// return nil, types.ErrUnmarshal
// }
// WalletAccountStores[index] = &walletaccount
// }
// return WalletAccountStores, nil
//}
func (store *mixStore) getAccountPrivacy(addr string) ([]byte, error) { func (store *mixStore) getAccountPrivacy(addr string) ([]byte, error) {
if len(addr) == 0 { if len(addr) == 0 {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
...@@ -56,29 +31,6 @@ func (store *mixStore) getAccountPrivacy(addr string) ([]byte, error) { ...@@ -56,29 +31,6 @@ func (store *mixStore) getAccountPrivacy(addr string) ([]byte, error) {
} }
//
//func (store *mixStore) getAccountByAddr(addr string) (*types.WalletAccountStore, error) {
// var account types.WalletAccountStore
// if len(addr) == 0 {
// bizlog.Error("GetAccountByAddr addr is nil")
// return nil, types.ErrInvalidParam
// }
// data, err := store.Get(calcMixAddrKey(addr))
// if data == nil || err != nil {
// if err != db.ErrNotFoundInDb {
// bizlog.Debug("GetAccountByAddr addr", "err", err)
// }
// return nil, types.ErrAddrNotExist
// }
//
// err = types.Decode(data, &account)
// if err != nil {
// bizlog.Error("GetAccountByAddr", "proto.Unmarshal err:", err)
// return nil, types.ErrUnmarshal
// }
// return &account, nil
//}
func (store *mixStore) setAccountPrivacy(addr string, data []byte) error { func (store *mixStore) setAccountPrivacy(addr string, data []byte) error {
if len(addr) == 0 { if len(addr) == 0 {
bizlog.Error("SetWalletAccountPrivacy addr is nil") bizlog.Error("SetWalletAccountPrivacy addr is nil")
...@@ -90,9 +42,6 @@ func (store *mixStore) setAccountPrivacy(addr string, data []byte) error { ...@@ -90,9 +42,6 @@ func (store *mixStore) setAccountPrivacy(addr string, data []byte) error {
} }
store.GetDB().Set(calcMixAddrKey(addr), data) store.GetDB().Set(calcMixAddrKey(addr), data)
//newbatch := store.NewBatch(true)
//newbatch.Set(calcMixAddrKey(addr), data)
//newbatch.Write()
return nil return nil
} }
......
...@@ -67,18 +67,20 @@ type AuthorizeInput struct { ...@@ -67,18 +67,20 @@ type AuthorizeInput struct {
Valid9 string `tag:"secret"` Valid9 string `tag:"secret"`
} }
func (policy *mixPolicy) getAuthParms(req *mixTy.AuthTxReq) (*AuthorizeInput, error) { func (p *mixPolicy) getAuthParms(req *mixTy.AuthTxReq) (*AuthorizeInput, error) {
note, err := policy.getNoteInfo(req.NoteHash, mixTy.NoteStatus_FROZEN) note, err := p.getNoteInfo(req.NoteHash)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if note.Status != mixTy.NoteStatus_FROZEN {
return nil, errors.Wrapf(types.ErrNotAllow, "wrong note status=%s", note.Status.String())
}
if note.Secret.ReceiverKey != req.AuthorizeToAddr && note.Secret.ReturnKey != req.AuthorizeToAddr { if note.Secret.ReceiverKey != req.AuthorizeToAddr && note.Secret.ReturnKey != req.AuthorizeToAddr {
return nil, errors.Wrapf(types.ErrInvalidParam, "note no match addr to AuthorizeToAddr=%s", req.AuthorizeToAddr) return nil, errors.Wrapf(types.ErrInvalidParam, "note no match addr to AuthorizeToAddr=%s", req.AuthorizeToAddr)
} }
//get spend privacy key //get spend privacy key
privacyKey, err := policy.getAccountPrivacyKey(note.Account) privacyKey, err := p.getAccountPrivacyKey(note.Account)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getAccountPrivacyKey addr=%s", note.Account) return nil, errors.Wrapf(err, "getAccountPrivacyKey addr=%s", note.Account)
} }
...@@ -110,7 +112,7 @@ func (policy *mixPolicy) getAuthParms(req *mixTy.AuthTxReq) (*AuthorizeInput, er ...@@ -110,7 +112,7 @@ func (policy *mixPolicy) getAuthParms(req *mixTy.AuthTxReq) (*AuthorizeInput, er
} }
//get tree path //get tree path
treeProof, err := policy.getTreeProof(note.NoteHash) treeProof, err := p.getTreeProof(note.NoteHash)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash) return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash)
} }
...@@ -121,13 +123,13 @@ func (policy *mixPolicy) getAuthParms(req *mixTy.AuthTxReq) (*AuthorizeInput, er ...@@ -121,13 +123,13 @@ func (policy *mixPolicy) getAuthParms(req *mixTy.AuthTxReq) (*AuthorizeInput, er
} }
func (policy *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) { func (p *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) {
var auth mixTy.AuthTxReq var auth mixTy.AuthTxReq
err := types.Decode(req.Data, &auth) err := types.Decode(req.Data, &auth)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "decode req fail") return nil, errors.Wrap(err, "decode req fail")
} }
input, err := policy.getAuthParms(&auth) input, err := p.getAuthParms(&auth)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -137,18 +139,18 @@ func (policy *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transac ...@@ -137,18 +139,18 @@ func (policy *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transac
return nil, errors.Wrapf(err, "getZkProofKeys note=%s", auth.NoteHash) return nil, errors.Wrapf(err, "getZkProofKeys note=%s", auth.NoteHash)
} }
//verify //verify
if err := policy.verifyProofOnChain(mixTy.VerifyType_AUTHORIZE, proofInfo, auth.ZkPath+mixTy.AuthVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_AUTHORIZE, proofInfo, auth.ZkPath+mixTy.AuthVk); err != nil {
return nil, errors.Wrapf(err, "verifyProof fail for note=%s", auth.NoteHash) return nil, errors.Wrapf(err, "verifyProof fail for note=%s", auth.NoteHash)
} }
return policy.getAuthTx(strings.TrimSpace(req.Title+mixTy.MixX), proofInfo) return p.getAuthTx(strings.TrimSpace(req.Title+mixTy.MixX), proofInfo)
} }
func (policy *mixPolicy) getAuthTx(execName string, proof *mixTy.ZkProofInfo) (*types.Transaction, error) { func (p *mixPolicy) getAuthTx(execName string, proof *mixTy.ZkProofInfo) (*types.Transaction, error) {
payload := &mixTy.MixAuthorizeAction{} payload := &mixTy.MixAuthorizeAction{}
payload.Proof = proof payload.Proof = proof
cfg := policy.getWalletOperate().GetAPI().GetConfig() cfg := p.getWalletOperate().GetAPI().GetConfig()
action := &mixTy.MixAction{ action := &mixTy.MixAction{
Ty: mixTy.MixActionAuth, Ty: mixTy.MixActionAuth,
Value: &mixTy.MixAction_Authorize{Authorize: payload}, Value: &mixTy.MixAction_Authorize{Authorize: payload},
......
...@@ -32,7 +32,12 @@ type DepositInput struct { ...@@ -32,7 +32,12 @@ type DepositInput struct {
NoteRandom string `tag:"secret"` NoteRandom string `tag:"secret"`
} }
func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string) (*mixTy.DepositProofResp, error) { func (p *mixPolicy) depositParams(receiver, returner, auth, amount string) (*mixTy.DepositProofResp, error) {
if receiver == returner || receiver == auth || returner == auth {
return nil, errors.Wrapf(types.ErrInvalidParam, "addrs should not be same to receiver=%s,return=%s,auth=%s",
receiver, returner, auth)
}
if len(receiver) <= 0 { if len(receiver) <= 0 {
return nil, errors.Wrap(types.ErrInvalidParam, "receiver is nil") return nil, errors.Wrap(types.ErrInvalidParam, "receiver is nil")
} }
...@@ -53,7 +58,7 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string) ...@@ -53,7 +58,7 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string)
//TODO 线上检查是否随机值在nullifer里面 //TODO 线上检查是否随机值在nullifer里面
// 获取receiving addr对应的paymentKey // 获取receiving addr对应的paymentKey
payKeys, e := policy.getPaymentKey(receiver) payKeys, e := p.getPaymentKey(receiver)
if e != nil { if e != nil {
return nil, errors.Wrapf(e, "get payment key for addr = %s", receiver) return nil, errors.Wrapf(e, "get payment key for addr = %s", receiver)
} }
...@@ -65,7 +70,7 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string) ...@@ -65,7 +70,7 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string)
//如果Input不填,缺省空为“0”字符串 //如果Input不填,缺省空为“0”字符串
secret.ReturnKey = "0" secret.ReturnKey = "0"
if len(returner) > 0 { if len(returner) > 0 {
returnKey, err = policy.getPaymentKey(returner) returnKey, err = p.getPaymentKey(returner)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "get payment key for return addr = %s", returner) return nil, errors.Wrapf(err, "get payment key for return addr = %s", returner)
} }
...@@ -76,7 +81,7 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string) ...@@ -76,7 +81,7 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string)
var authKey *mixTy.PaymentKey var authKey *mixTy.PaymentKey
secret.AuthorizeKey = "0" secret.AuthorizeKey = "0"
if len(auth) > 0 { if len(auth) > 0 {
authKey, err = policy.getPaymentKey(auth) authKey, err = p.getPaymentKey(auth)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "get payment key for authorize addr = %s", auth) return nil, errors.Wrapf(err, "get payment key for authorize addr = %s", auth)
} }
...@@ -123,9 +128,9 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string) ...@@ -123,9 +128,9 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string)
} }
func (policy *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPath string) (*mixTy.ZkProofInfo, error) { func (p *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPath string) (*mixTy.ZkProofInfo, error) {
resp, err := policy.depositParams(receiver, returner, auth, amount) resp, err := p.depositParams(receiver, returner, auth, amount)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -144,14 +149,14 @@ func (policy *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPat ...@@ -144,14 +149,14 @@ func (policy *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPat
} }
//线上验证proof,失败的原因有可能circuit,Pk和线上vk不匹配,或不是一起产生的版本 //线上验证proof,失败的原因有可能circuit,Pk和线上vk不匹配,或不是一起产生的版本
if err := policy.verifyProofOnChain(mixTy.VerifyType_DEPOSIT, proofInfo, zkPath+mixTy.DepositVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_DEPOSIT, proofInfo, zkPath+mixTy.DepositVk); err != nil {
return nil, errors.Wrap(err, "verifyProof fail") return nil, errors.Wrap(err, "verifyProof fail")
} }
proofInfo.Secrets = resp.Secrets proofInfo.Secrets = resp.Secrets
return proofInfo, nil return proofInfo, nil
} }
func (policy *mixPolicy) createDepositTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) { func (p *mixPolicy) createDepositTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) {
var deposit mixTy.DepositTxReq var deposit mixTy.DepositTxReq
err := types.Decode(req.Data, &deposit) err := types.Decode(req.Data, &deposit)
if err != nil { if err != nil {
...@@ -175,22 +180,22 @@ func (policy *mixPolicy) createDepositTx(req *mixTy.CreateRawTxReq) (*types.Tran ...@@ -175,22 +180,22 @@ func (policy *mixPolicy) createDepositTx(req *mixTy.CreateRawTxReq) (*types.Tran
var proofs []*mixTy.ZkProofInfo var proofs []*mixTy.ZkProofInfo
for i, rcv := range receivers { for i, rcv := range receivers {
p, err := policy.getDepositProof(rcv, deposit.Deposit.ReturnAddr, deposit.Deposit.AuthorizeAddr, amounts[i], deposit.ZkPath) p, err := p.getDepositProof(rcv, deposit.Deposit.ReturnAddr, deposit.Deposit.AuthorizeAddr, amounts[i], deposit.ZkPath)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "get Deposit proof for=%s", rcv) return nil, errors.Wrapf(err, "get Deposit proof for=%s", rcv)
} }
proofs = append(proofs, p) proofs = append(proofs, p)
} }
return policy.getDepositTx(strings.TrimSpace(req.Title+mixTy.MixX), proofs) return p.getDepositTx(strings.TrimSpace(req.Title+mixTy.MixX), proofs)
} }
func (policy *mixPolicy) getDepositTx(execName string, proofs []*mixTy.ZkProofInfo) (*types.Transaction, error) { func (p *mixPolicy) getDepositTx(execName string, proofs []*mixTy.ZkProofInfo) (*types.Transaction, error) {
payload := &mixTy.MixDepositAction{} payload := &mixTy.MixDepositAction{}
payload.Proofs = proofs payload.Proofs = proofs
cfg := policy.getWalletOperate().GetAPI().GetConfig() cfg := p.getWalletOperate().GetAPI().GetConfig()
action := &mixTy.MixAction{ action := &mixTy.MixAction{
Ty: mixTy.MixActionDeposit, Ty: mixTy.MixActionDeposit,
Value: &mixTy.MixAction_Deposit{Deposit: payload}, Value: &mixTy.MixAction_Deposit{Deposit: payload},
......
...@@ -92,10 +92,10 @@ type TransferOutput struct { ...@@ -92,10 +92,10 @@ type TransferOutput struct {
AmountRandom string `tag:"secret"` AmountRandom string `tag:"secret"`
} }
func (policy *mixPolicy) getTransferInputPart(note *mixTy.WalletIndexInfo) (*TransferInput, error) { func (p *mixPolicy) getTransferInputPart(note *mixTy.WalletNoteInfo) (*TransferInput, error) {
//get spend privacy key //get spend privacy key
privacyKey, err := policy.getAccountPrivacyKey(note.Account) privacyKey, err := p.getAccountPrivacyKey(note.Account)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getAccountPrivacyKey addr=%s", note.Account) return nil, errors.Wrapf(err, "getAccountPrivacyKey addr=%s", note.Account)
} }
...@@ -133,7 +133,7 @@ func (policy *mixPolicy) getTransferInputPart(note *mixTy.WalletIndexInfo) (*Tra ...@@ -133,7 +133,7 @@ func (policy *mixPolicy) getTransferInputPart(note *mixTy.WalletIndexInfo) (*Tra
input.AuthorizeFlag = "1" input.AuthorizeFlag = "1"
} }
treeProof, err := policy.getTreeProof(note.NoteHash) treeProof, err := p.getTreeProof(note.NoteHash)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash) return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash)
} }
...@@ -143,13 +143,13 @@ func (policy *mixPolicy) getTransferInputPart(note *mixTy.WalletIndexInfo) (*Tra ...@@ -143,13 +143,13 @@ func (policy *mixPolicy) getTransferInputPart(note *mixTy.WalletIndexInfo) (*Tra
return &input, nil return &input, nil
} }
func (policy *mixPolicy) getTransferOutput(req *mixTy.DepositInfo) (*TransferOutput, *mixTy.DHSecretGroup, error) { func (p *mixPolicy) getTransferOutput(req *mixTy.DepositInfo) (*TransferOutput, *mixTy.DHSecretGroup, error) {
//目前只支持一个ReceiverAddr //目前只支持一个ReceiverAddr
if strings.Contains(req.ReceiverAddrs, ",") || strings.Contains(req.Amounts, ",") { if strings.Contains(req.ReceiverAddrs, ",") || strings.Contains(req.Amounts, ",") {
return nil, nil, errors.Wrapf(types.ErrInvalidParam, "only support one addr or amount,addrs=%s,amount=%s", return nil, nil, errors.Wrapf(types.ErrInvalidParam, "only support one addr or amount,addrs=%s,amount=%s",
req.ReceiverAddrs, req.Amounts) req.ReceiverAddrs, req.Amounts)
} }
resp, err := policy.depositParams(req.ReceiverAddrs, req.ReturnAddr, req.AuthorizeAddr, req.Amounts) resp, err := p.depositParams(req.ReceiverAddrs, req.ReturnAddr, req.AuthorizeAddr, req.Amounts)
if err != nil { if err != nil {
return nil, nil, errors.Wrapf(err, "deposit toAddr=%s", req.ReceiverAddrs) return nil, nil, errors.Wrapf(err, "deposit toAddr=%s", req.ReceiverAddrs)
} }
...@@ -269,7 +269,7 @@ func getShieldValue(inputAmounts []uint64, outAmount, change, minTxFee uint64) ( ...@@ -269,7 +269,7 @@ func getShieldValue(inputAmounts []uint64, outAmount, change, minTxFee uint64) (
return rst, nil return rst, nil
} }
func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) { func (p *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) {
var transfer mixTy.TransferTxReq var transfer mixTy.TransferTxReq
err := types.Decode(req.Data, &transfer) err := types.Decode(req.Data, &transfer)
if err != nil { if err != nil {
...@@ -277,19 +277,22 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra ...@@ -277,19 +277,22 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
} }
noteHashs := strings.Split(transfer.GetInput().NoteHashs, ",") noteHashs := strings.Split(transfer.GetInput().NoteHashs, ",")
var notes []*mixTy.WalletIndexInfo var notes []*mixTy.WalletNoteInfo
for _, h := range noteHashs { for _, h := range noteHashs {
note, err := policy.getNoteInfo(h, mixTy.NoteStatus_VALID) note, err := p.getNoteInfo(h)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "get note info for=%s", h) return nil, errors.Wrapf(err, "get note info for=%s", h)
} }
if note.Status != mixTy.NoteStatus_VALID && note.Status != mixTy.NoteStatus_UNFROZEN {
return nil, errors.Wrapf(types.ErrNotAllow, "wrong note status=%s", note.Status.String())
}
notes = append(notes, note) notes = append(notes, note)
} }
//1.获取Input //1.获取Input
var inputParts []*TransferInput var inputParts []*TransferInput
for _, n := range notes { for _, n := range notes {
input, err := policy.getTransferInputPart(n) input, err := p.getTransferInputPart(n)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getTransferInputPart note=%s", n.NoteHash) return nil, errors.Wrapf(err, "getTransferInputPart note=%s", n.NoteHash)
} }
...@@ -319,7 +322,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra ...@@ -319,7 +322,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
if sumInput < outAmount+uint64(mixTy.Privacy2PrivacyTxFee) { if sumInput < outAmount+uint64(mixTy.Privacy2PrivacyTxFee) {
return nil, errors.Wrapf(types.ErrInvalidParam, "out amount=%d big than input=%d - fee=%d", outAmount, sumInput, uint64(mixTy.Privacy2PrivacyTxFee)) return nil, errors.Wrapf(types.ErrInvalidParam, "out amount=%d big than input=%d - fee=%d", outAmount, sumInput, uint64(mixTy.Privacy2PrivacyTxFee))
} }
outPart, outDHSecret, err := policy.getTransferOutput(transfer.Output.Deposit) outPart, outDHSecret, err := p.getTransferOutput(transfer.Output.Deposit)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "getTransferOutput for deposit") return nil, errors.Wrap(err, "getTransferOutput for deposit")
} }
...@@ -333,7 +336,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra ...@@ -333,7 +336,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
ReceiverAddrs: notes[0].Account, ReceiverAddrs: notes[0].Account,
Amounts: strconv.FormatUint(changeAmount, 10), Amounts: strconv.FormatUint(changeAmount, 10),
} }
changePart, changeDHSecret, err := policy.getTransferOutput(change) changePart, changeDHSecret, err := p.getTransferOutput(change)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "getTransferOutput change part ") return nil, errors.Wrap(err, "getTransferOutput change part ")
} }
...@@ -368,7 +371,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra ...@@ -368,7 +371,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "verify.input getZkProofKeys,the i=%d", i) return nil, errors.Wrapf(err, "verify.input getZkProofKeys,the i=%d", i)
} }
if err := policy.verifyProofOnChain(mixTy.VerifyType_TRANSFERINPUT, inputProof, transfer.Input.ZkPath+mixTy.TransInputVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_TRANSFERINPUT, inputProof, transfer.Input.ZkPath+mixTy.TransInputVk); err != nil {
return nil, errors.Wrapf(err, "input verifyProof fail,the i=%d", i) return nil, errors.Wrapf(err, "input verifyProof fail,the i=%d", i)
} }
inputProofs = append(inputProofs, inputProof) inputProofs = append(inputProofs, inputProof)
...@@ -379,7 +382,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra ...@@ -379,7 +382,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "output getZkProofKeys") return nil, errors.Wrapf(err, "output getZkProofKeys")
} }
if err := policy.verifyProofOnChain(mixTy.VerifyType_TRANSFEROUTPUT, outputProof, transfer.Output.ZkPath+mixTy.TransOutputVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_TRANSFEROUTPUT, outputProof, transfer.Output.ZkPath+mixTy.TransOutputVk); err != nil {
return nil, errors.Wrapf(err, "output verifyProof fail") return nil, errors.Wrapf(err, "output verifyProof fail")
} }
outputProof.Secrets = outDHSecret outputProof.Secrets = outDHSecret
...@@ -389,21 +392,21 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra ...@@ -389,21 +392,21 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "change getZkProofKeys") return nil, errors.Wrapf(err, "change getZkProofKeys")
} }
if err := policy.verifyProofOnChain(mixTy.VerifyType_TRANSFEROUTPUT, changeProof, transfer.Output.ZkPath+mixTy.TransOutputVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_TRANSFEROUTPUT, changeProof, transfer.Output.ZkPath+mixTy.TransOutputVk); err != nil {
return nil, errors.Wrapf(err, "change verifyProof fail") return nil, errors.Wrapf(err, "change verifyProof fail")
} }
changeProof.Secrets = changeDHSecret changeProof.Secrets = changeDHSecret
return policy.getTransferTx(strings.TrimSpace(req.Title+mixTy.MixX), inputProofs, outputProof, changeProof) return p.getTransferTx(strings.TrimSpace(req.Title+mixTy.MixX), inputProofs, outputProof, changeProof)
} }
func (policy *mixPolicy) getTransferTx(execName string, inputProofs []*mixTy.ZkProofInfo, proofs ...*mixTy.ZkProofInfo) (*types.Transaction, error) { func (p *mixPolicy) getTransferTx(execName string, inputProofs []*mixTy.ZkProofInfo, proofs ...*mixTy.ZkProofInfo) (*types.Transaction, error) {
payload := &mixTy.MixTransferAction{} payload := &mixTy.MixTransferAction{}
payload.Inputs = inputProofs payload.Inputs = inputProofs
payload.Output = proofs[1] payload.Output = proofs[1]
payload.Change = proofs[2] payload.Change = proofs[2]
cfg := policy.getWalletOperate().GetAPI().GetConfig() cfg := p.getWalletOperate().GetAPI().GetConfig()
action := &mixTy.MixAction{ action := &mixTy.MixAction{
Ty: mixTy.MixActionTransfer, Ty: mixTy.MixActionTransfer,
Value: &mixTy.MixAction_Transfer{Transfer: payload}, Value: &mixTy.MixAction_Transfer{Transfer: payload},
......
...@@ -67,11 +67,14 @@ type WithdrawInput struct { ...@@ -67,11 +67,14 @@ type WithdrawInput struct {
Valid9 string `tag:"secret"` Valid9 string `tag:"secret"`
} }
func (policy *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, error) { func (p *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, error) {
note, err := policy.getNoteInfo(noteHash, mixTy.NoteStatus_VALID) note, err := p.getNoteInfo(noteHash)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if note.Status != mixTy.NoteStatus_VALID && note.Status != mixTy.NoteStatus_UNFROZEN {
return nil, errors.Wrapf(types.ErrNotAllow, "wrong note status=%s", note.Status.String())
}
var input WithdrawInput var input WithdrawInput
initTreePath(&input) initTreePath(&input)
...@@ -85,24 +88,24 @@ func (policy *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, err ...@@ -85,24 +88,24 @@ func (policy *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, err
input.AuthorizePubKey = note.Secret.AuthorizeKey input.AuthorizePubKey = note.Secret.AuthorizeKey
input.NoteRandom = note.Secret.NoteRandom input.NoteRandom = note.Secret.NoteRandom
input.SpendFlag = "1"
if note.Role == mixTy.Role_RETURNER {
input.SpendFlag = "0"
}
input.AuthorizeFlag = "0" input.AuthorizeFlag = "0"
if len(input.AuthorizeSpendHash) > LENNULLKEY { if len(input.AuthorizeSpendHash) > LENNULLKEY {
input.AuthorizeFlag = "1" input.AuthorizeFlag = "1"
} }
//get spend privacy key //get spend privacy key
privacyKey, err := policy.getAccountPrivacyKey(note.Account) privacyKey, err := p.getAccountPrivacyKey(note.Account)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getAccountPrivacyKey addr=%s", note.Account) return nil, errors.Wrapf(err, "getAccountPrivacyKey addr=%s", note.Account)
} }
input.SpendPriKey = privacyKey.Privacy.PaymentKey.SpendKey input.SpendPriKey = privacyKey.Privacy.PaymentKey.SpendKey
input.SpendFlag = "1"
if privacyKey.Privacy.PaymentKey.ReceiveKey == input.ReturnPubKey {
input.SpendFlag = "0"
}
//get tree path //get tree path
treeProof, err := policy.getTreeProof(note.NoteHash) treeProof, err := p.getTreeProof(note.NoteHash)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash) return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash)
} }
...@@ -113,7 +116,7 @@ func (policy *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, err ...@@ -113,7 +116,7 @@ func (policy *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, err
} }
func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) { func (p *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Transaction, error) {
var withdraw mixTy.WithdrawTxReq var withdraw mixTy.WithdrawTxReq
err := types.Decode(req.Data, &withdraw) err := types.Decode(req.Data, &withdraw)
if err != nil { if err != nil {
...@@ -131,7 +134,7 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra ...@@ -131,7 +134,7 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra
var sum uint64 var sum uint64
for _, note := range notes { for _, note := range notes {
input, err := policy.getWithdrawParams(note) input, err := p.getWithdrawParams(note)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getWithdrawParams note=%s", note) return nil, errors.Wrapf(err, "getWithdrawParams note=%s", note)
} }
...@@ -141,7 +144,7 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra ...@@ -141,7 +144,7 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra
return nil, errors.Wrapf(err, "getZkProofKeys note=%s", note) return nil, errors.Wrapf(err, "getZkProofKeys note=%s", note)
} }
//verify //verify
if err := policy.verifyProofOnChain(mixTy.VerifyType_WITHDRAW, proofInfo, withdraw.ZkPath+mixTy.WithdrawVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_WITHDRAW, proofInfo, withdraw.ZkPath+mixTy.WithdrawVk); err != nil {
return nil, errors.Wrapf(err, "verifyProof fail for note=%s", note) return nil, errors.Wrapf(err, "verifyProof fail for note=%s", note)
} }
...@@ -158,16 +161,16 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra ...@@ -158,16 +161,16 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra
return nil, errors.Wrapf(types.ErrInvalidParam, "amount not match req=%d,note.sum=%d", withdraw.TotalAmount, sum) return nil, errors.Wrapf(types.ErrInvalidParam, "amount not match req=%d,note.sum=%d", withdraw.TotalAmount, sum)
} }
return policy.getWithdrawTx(strings.TrimSpace(req.Title+mixTy.MixX), withdraw.TotalAmount, proofs) return p.getWithdrawTx(strings.TrimSpace(req.Title+mixTy.MixX), withdraw.TotalAmount, proofs)
} }
func (policy *mixPolicy) getWithdrawTx(execName string, amount uint64, proofs []*mixTy.ZkProofInfo) (*types.Transaction, error) { func (p *mixPolicy) getWithdrawTx(execName string, amount uint64, proofs []*mixTy.ZkProofInfo) (*types.Transaction, error) {
payload := &mixTy.MixWithdrawAction{} payload := &mixTy.MixWithdrawAction{}
payload.Amount = amount payload.Amount = amount
payload.Proofs = proofs payload.Proofs = proofs
cfg := policy.getWalletOperate().GetAPI().GetConfig() cfg := p.getWalletOperate().GetAPI().GetConfig()
action := &mixTy.MixAction{ action := &mixTy.MixAction{
Ty: mixTy.MixActionWithdraw, Ty: mixTy.MixActionWithdraw,
Value: &mixTy.MixAction_Withdraw{Withdraw: payload}, Value: &mixTy.MixAction_Withdraw{Withdraw: payload},
......
...@@ -87,7 +87,7 @@ func decryptSecretData(req *mixTy.DecryptSecretData) (*mixTy.SecretData, error) ...@@ -87,7 +87,7 @@ func decryptSecretData(req *mixTy.DecryptSecretData) (*mixTy.SecretData, error)
return &raw, nil return &raw, nil
} }
func (policy *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.ZkProofInfo, vkPath string) error { func (p *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.ZkProofInfo, vkPath string) error {
//vkpath verify //vkpath verify
if len(vkPath) > 0 { if len(vkPath) > 0 {
vk, err := getVerifyKey(vkPath) vk, err := getVerifyKey(vkPath)
...@@ -111,7 +111,7 @@ func (policy *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.Zk ...@@ -111,7 +111,7 @@ func (policy *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.Zk
Proof: proof, Proof: proof,
} }
//onchain verify //onchain verify
_, err := policy.walletOperate.GetAPI().QueryChain(&types.ChainExecutor{ _, err := p.walletOperate.GetAPI().QueryChain(&types.ChainExecutor{
Driver: "mix", Driver: "mix",
FuncName: "VerifyProof", FuncName: "VerifyProof",
Param: types.Encode(verify), Param: types.Encode(verify),
...@@ -119,8 +119,8 @@ func (policy *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.Zk ...@@ -119,8 +119,8 @@ func (policy *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.Zk
return err return err
} }
func (policy *mixPolicy) getPaymentKey(addr string) (*mixTy.PaymentKey, error) { func (p *mixPolicy) getPaymentKey(addr string) (*mixTy.PaymentKey, error) {
msg, err := policy.walletOperate.GetAPI().QueryChain(&types.ChainExecutor{ msg, err := p.walletOperate.GetAPI().QueryChain(&types.ChainExecutor{
Driver: "mix", Driver: "mix",
FuncName: "PaymentPubKey", FuncName: "PaymentPubKey",
Param: types.Encode(&types.ReqString{Data: addr}), Param: types.Encode(&types.ReqString{Data: addr}),
...@@ -131,8 +131,8 @@ func (policy *mixPolicy) getPaymentKey(addr string) (*mixTy.PaymentKey, error) { ...@@ -131,8 +131,8 @@ func (policy *mixPolicy) getPaymentKey(addr string) (*mixTy.PaymentKey, error) {
return msg.(*mixTy.PaymentKey), err return msg.(*mixTy.PaymentKey), err
} }
func (policy *mixPolicy) getPathProof(leaf string) (*mixTy.CommitTreeProve, error) { func (p *mixPolicy) getPathProof(leaf string) (*mixTy.CommitTreeProve, error) {
msg, err := policy.walletOperate.GetAPI().QueryChain(&types.ChainExecutor{ msg, err := p.walletOperate.GetAPI().QueryChain(&types.ChainExecutor{
Driver: "mix", Driver: "mix",
FuncName: "GetTreePath", FuncName: "GetTreePath",
Param: types.Encode(&mixTy.TreeInfoReq{LeafHash: leaf}), Param: types.Encode(&mixTy.TreeInfoReq{LeafHash: leaf}),
...@@ -143,32 +143,30 @@ func (policy *mixPolicy) getPathProof(leaf string) (*mixTy.CommitTreeProve, erro ...@@ -143,32 +143,30 @@ func (policy *mixPolicy) getPathProof(leaf string) (*mixTy.CommitTreeProve, erro
return msg.(*mixTy.CommitTreeProve), nil return msg.(*mixTy.CommitTreeProve), nil
} }
func (policy *mixPolicy) getNoteInfo(noteHash string, noteStatus mixTy.NoteStatus) (*mixTy.WalletIndexInfo, error) { func (p *mixPolicy) getNoteInfo(noteHash string) (*mixTy.WalletNoteInfo, error) {
if policy.walletOperate.IsWalletLocked() { if p.walletOperate.IsWalletLocked() {
return nil, types.ErrWalletIsLocked return nil, types.ErrWalletIsLocked
} }
var index mixTy.WalletMixIndexReq var index mixTy.WalletMixIndexReq
index.NoteHash = noteHash index.NoteHash = noteHash
msg, err := policy.listMixInfos(&index) msg, err := p.listMixInfos(&index)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "list noteHash=%s", noteHash) return nil, errors.Wrapf(err, "list noteHash=%s", noteHash)
} }
resp := msg.(*mixTy.WalletIndexResp) resp := msg.(*mixTy.WalletNoteResp)
if len(resp.Notes) < 1 { if len(resp.Notes) < 1 {
return nil, errors.Wrapf(err, "list not found noteHash=%s", noteHash) return nil, errors.Wrapf(err, "list not found noteHash=%s", noteHash)
} }
note := msg.(*mixTy.WalletIndexResp).Notes[0] note := msg.(*mixTy.WalletNoteResp).Notes[0]
if note.Status != noteStatus {
return nil, errors.Wrapf(types.ErrNotAllow, "wrong note status=%s", note.Status.String())
}
return note, nil return note, nil
} }
func (policy *mixPolicy) getTreeProof(leaf string) (*mixTy.TreePathProof, error) { func (p *mixPolicy) getTreeProof(leaf string) (*mixTy.TreePathProof, error) {
//get tree path //get tree path
path, err := policy.getPathProof(leaf) path, err := p.getPathProof(leaf)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "get tree proof for noteHash=%s", leaf) return nil, errors.Wrapf(err, "get tree proof for noteHash=%s", leaf)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment