Commit f89f1b0a authored by jiangpeng's avatar jiangpeng

privacy:update wallet utxo manage

* add utxo store key with asset exec * fix rescan nil pointer
parent 3ef9413b
......@@ -284,6 +284,7 @@ func showPrivacyAccountSpendCmd() *cobra.Command {
func showPrivacyAccountSpendFlag(cmd *cobra.Command) {
cmd.Flags().StringP("addr", "a", "", "account address")
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins")
cmd.Flags().StringP("symbol", "s", "BTY", "asset symbol, default BTY")
cmd.MarkFlagRequired("addr")
}
......@@ -291,10 +292,12 @@ func showPrivacyAccountSpendFlag(cmd *cobra.Command) {
func showPrivacyAccountSpend(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
addr, _ := cmd.Flags().GetString("addr")
exec, _ := cmd.Flags().GetString("exec")
symbol, _ := cmd.Flags().GetString("symbol")
params := pty.ReqPrivBal4AddrToken{
Addr: addr,
Token: symbol,
AssetExec: exec,
}
var res pty.UTXOHaveTxHashs
......@@ -453,7 +456,7 @@ func showPrivacyAccountInfoCmd() *cobra.Command {
func showPrivacyAccountInfoFlag(cmd *cobra.Command) {
cmd.Flags().StringP("addr", "a", "", "account address")
cmd.MarkFlagRequired("addr")
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins")
cmd.Flags().StringP("symbol", "s", "BTY", "asset symbol, default BTY")
cmd.Flags().Int32P("displaymode", "d", 0, "display mode.(0: display collect. 1:display available detail. 2:display frozen detail. 3:display all")
}
......@@ -461,6 +464,7 @@ func showPrivacyAccountInfoFlag(cmd *cobra.Command) {
func showPrivacyAccountInfo(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
addr, _ := cmd.Flags().GetString("addr")
exec, _ := cmd.Flags().GetString("exec")
token, _ := cmd.Flags().GetString("symbol")
mode, _ := cmd.Flags().GetInt32("displaymode")
if mode < 0 || mode > 3 {
......@@ -468,10 +472,11 @@ func showPrivacyAccountInfo(cmd *cobra.Command, args []string) {
return
}
params := pty.ReqPPrivacyAccount{
params := pty.ReqPrivacyAccount{
Addr: addr,
Token: token,
Displaymode: mode,
AssetExec: exec,
}
var res pty.ReplyPrivacyAccount
......@@ -546,6 +551,7 @@ func addListPrivacyTxsFlags(cmd *cobra.Command) {
//
cmd.Flags().Int32P("sendrecv", "", 0, "send or recv flag (0: send, 1: recv), default 0")
cmd.Flags().Int32P("count", "c", 10, "number of transactions, default 10")
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins")
cmd.Flags().StringP("token", "", types.BTY, "token name.(BTY supported)")
cmd.Flags().Int32P("direction", "d", 1, "query direction (0: pre page, 1: next page), valid with seedtxhash param")
cmd.Flags().StringP("seedtxhash", "", "", "seed trasnaction hash")
......@@ -559,7 +565,9 @@ func listPrivacyTxsFlags(cmd *cobra.Command, args []string) {
sendRecvFlag, _ := cmd.Flags().GetInt32("sendrecv")
tokenname, _ := cmd.Flags().GetString("token")
seedtxhash, _ := cmd.Flags().GetString("seedtxhash")
exec, _ := cmd.Flags().GetString("exec")
params := pty.ReqPrivacyTransactionList{
AssetExec: exec,
Tokenname: tokenname,
SendRecvFlag: sendRecvFlag,
Direction: direction,
......
......@@ -43,8 +43,8 @@ func (p *privacy) Exec_Public2Privacy(payload *ty.Public2Privacy, tx *types.Tran
value := types.Encode(keyOutput)
receipt.KV = append(receipt.KV, &types.KeyValue{Key: key, Value: value})
}
receiptLogs := p.buildPrivacyReceiptLog(payload.GetAssetExec(), payload.GetTokenname(), payload.GetOutput().GetKeyoutput())
privacylog.Debug("testkey", "output", payload.GetOutput().Keyoutput)
receiptLogs := p.buildPrivacyReceiptLog(payload.GetAssetExec(), payload.GetTokenname(), payload.GetOutput())
execlog := &types.ReceiptLog{Ty: ty.TyLogPrivacyOutput, Log: types.Encode(receiptLogs)}
receipt.Logs = append(receipt.Logs, execlog)
......@@ -79,7 +79,7 @@ func (p *privacy) Exec_Privacy2Privacy(payload *ty.Privacy2Privacy, tx *types.Tr
value := types.Encode(keyOutput)
receipt.KV = append(receipt.KV, &types.KeyValue{Key: key, Value: value})
}
receiptLogs := p.buildPrivacyReceiptLog(payload.GetAssetExec(), payload.GetTokenname(), payload.GetOutput().GetKeyoutput())
receiptLogs := p.buildPrivacyReceiptLog(payload.GetAssetExec(), payload.GetTokenname(), payload.GetOutput())
execlog = &types.ReceiptLog{Ty: ty.TyLogPrivacyOutput, Log: types.Encode(receiptLogs)}
receipt.Logs = append(receipt.Logs, execlog)
......@@ -125,7 +125,7 @@ func (p *privacy) Exec_Privacy2Public(payload *ty.Privacy2Public, tx *types.Tran
receipt.KV = append(receipt.KV, &types.KeyValue{Key: key, Value: value})
}
receiptLog := p.buildPrivacyReceiptLog(payload.GetAssetExec(), payload.GetTokenname(), payload.GetOutput().GetKeyoutput())
receiptLog := p.buildPrivacyReceiptLog(payload.GetAssetExec(), payload.GetTokenname(), payload.GetOutput())
execlog = &types.ReceiptLog{Ty: ty.TyLogPrivacyOutput, Log: types.Encode(receiptLog)}
receipt.Logs = append(receipt.Logs, execlog)
......@@ -146,14 +146,14 @@ func (p *privacy) createAccountDB(exec, symbol string) (*account.DB, error) {
return account.NewAccountDB(cfg, exec, symbol, p.GetStateDB())
}
func (p *privacy) buildPrivacyReceiptLog(assetExec, assetSymbol string, output []*ty.KeyOutput) *ty.ReceiptPrivacyOutput {
func (p *privacy) buildPrivacyReceiptLog(assetExec, assetSymbol string, output *ty.PrivacyOutput) *ty.ReceiptPrivacyOutput {
if assetExec == "" {
assetExec = "coins"
}
receipt := &ty.ReceiptPrivacyOutput{
AssetExec: assetExec,
AssetSymbol: assetSymbol,
Keyoutput: output,
Keyoutput: output.Keyoutput,
}
return receipt
......
......@@ -208,8 +208,7 @@ func (p *privacy) CheckTx(tx *types.Transaction, index int) error {
return types.ErrActionNotSupport
}
privacylog.Debug("PrivacyTrading CheckTx", "txhash", txhashstr, "action type ", action.Ty)
assertExec := action.GetAssertExec()
token := action.GetTokenName()
assertExec, token := action.GetAssetExecSymbol()
if token == "" {
return types.ErrInvalidParam
}
......
......@@ -208,6 +208,7 @@ message ReplyPrivacyPkPair {
message ReqPrivBal4AddrToken {
string addr = 1;
string token = 2;
string assetExec = 3;
}
message ReplyPrivacyBalance {
......@@ -226,6 +227,7 @@ message PrivacyDBStore {
int64 height = 8;
int32 txindex = 9;
bytes blockhash = 10;
string assetExec = 11;
}
message UTXO {
......@@ -274,6 +276,7 @@ message FTXOsSTXOsInOneTx {
int64 expire = 3;
string txhash = 4;
repeated UTXO utxos = 5;
string assetExec = 6;
}
message RealKeyInput {
......@@ -314,11 +317,6 @@ message ReplyCacheTxList {
}
message ReqPrivacyAccount {
string tokenname = 1;
string addr = 2;
}
message ReqPPrivacyAccount {
string addr = 1;
string token = 2;
// 设定显示的数据类型信息
......@@ -327,6 +325,7 @@ message ReqPPrivacyAccount {
// 2: 显示FTXO明细
// 3: 全部显示
int32 displaymode = 3;
string assetExec = 4;
}
// 请求隐私账户信息的应答
......@@ -354,6 +353,7 @@ message ReqPrivacyTransactionList {
string from = 5;
string address = 6;
bytes seedtxhash = 7;
string assetExec = 8;
}
message ReqRescanUtxos {
......
......@@ -50,7 +50,7 @@ func (g *channelClient) CreateRawTransaction(ctx context.Context, in *pty.ReqCre
}
// ShowPrivacyAccountInfo display privacy account information for json rpc
func (c *Jrpc) ShowPrivacyAccountInfo(in *pty.ReqPPrivacyAccount, result *json.RawMessage) error {
func (c *Jrpc) ShowPrivacyAccountInfo(in *pty.ReqPrivacyAccount, result *json.RawMessage) error {
reply, err := c.cli.ExecWalletFunc(pty.PrivacyX, "ShowPrivacyAccountInfo", in)
if err != nil {
return err
......
......@@ -72,7 +72,7 @@ func testShowPrivacyKey(t *testing.T, jrpc *jsonclient.JSONClient) error {
}
func testShowPrivacyAccountInfo(t *testing.T, jrpc *jsonclient.JSONClient) error {
params := pty.ReqPPrivacyAccount{
params := pty.ReqPrivacyAccount{
Addr: "1JSRSwp16NvXiTjYBYK9iUQ9wqp3sCxz2p",
Token: types.BTY,
Displaymode: 1,
......
......@@ -41,7 +41,7 @@ func TestRPC_Call(t *testing.T) {
assert.NotNil(t, jsonClient)
//调用:
params := pty.ReqPPrivacyAccount{
params := pty.ReqPrivacyAccount{
Addr: "addr",
Token: "token",
Displaymode: 3,
......
......@@ -81,7 +81,7 @@ func (t *PrivacyType) GetLogMap() map[int64]*types.LogInfo {
return map[int64]*types.LogInfo{
TyLogPrivacyFee: {Ty: reflect.TypeOf(types.ReceiptExecAccountTransfer{}), Name: "LogPrivacyFee"},
TyLogPrivacyInput: {Ty: reflect.TypeOf(PrivacyInput{}), Name: "LogPrivacyInput"},
TyLogPrivacyOutput: {Ty: reflect.TypeOf(PrivacyOutput{}), Name: "LogPrivacyOutput"},
TyLogPrivacyOutput: {Ty: reflect.TypeOf(ReceiptPrivacyOutput{}), Name: "LogPrivacyOutput"},
}
}
......@@ -168,26 +168,14 @@ func (action *PrivacyAction) GetActionName() string {
return "unknow-privacy"
}
// GetTokenName get action token name
func (action *PrivacyAction) GetTokenName() string {
// GetAssetExecSymbol get assert exec and symbol
func (action *PrivacyAction) GetAssetExecSymbol() (assetExec, assetSymbol string) {
if action.GetTy() == ActionPublic2Privacy && action.GetPublic2Privacy() != nil {
return action.GetPublic2Privacy().GetTokenname()
return action.GetPublic2Privacy().GetAssetExec(), action.GetPublic2Privacy().GetTokenname()
} else if action.GetTy() == ActionPrivacy2Privacy && action.GetPrivacy2Privacy() != nil {
return action.GetPrivacy2Privacy().GetTokenname()
return action.GetPrivacy2Privacy().GetAssetExec(), action.GetPrivacy2Privacy().GetTokenname()
} else if action.GetTy() == ActionPrivacy2Public && action.GetPrivacy2Public() != nil {
return action.GetPrivacy2Public().GetTokenname()
return action.GetPrivacy2Public().GetAssetExec(), action.GetPrivacy2Public().GetTokenname()
}
return ""
}
// GetAssertExec get assert exec
func (action *PrivacyAction) GetAssertExec() string {
if action.GetTy() == ActionPublic2Privacy && action.GetPublic2Privacy() != nil {
return action.GetPublic2Privacy().GetAssetExec()
} else if action.GetTy() == ActionPrivacy2Privacy && action.GetPrivacy2Privacy() != nil {
return action.GetPrivacy2Privacy().GetAssetExec()
} else if action.GetTy() == ActionPrivacy2Public && action.GetPrivacy2Public() != nil {
return action.GetPrivacy2Public().GetAssetExec()
}
return ""
return "", ""
}
......@@ -44,7 +44,7 @@ func (m *PrivacyAction) Reset() { *m = PrivacyAction{} }
func (m *PrivacyAction) String() string { return proto.CompactTextString(m) }
func (*PrivacyAction) ProtoMessage() {}
func (*PrivacyAction) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{0}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{0}
}
func (m *PrivacyAction) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrivacyAction.Unmarshal(m, b)
......@@ -229,7 +229,7 @@ func (m *Public2Privacy) Reset() { *m = Public2Privacy{} }
func (m *Public2Privacy) String() string { return proto.CompactTextString(m) }
func (*Public2Privacy) ProtoMessage() {}
func (*Public2Privacy) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{1}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{1}
}
func (m *Public2Privacy) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Public2Privacy.Unmarshal(m, b)
......@@ -300,7 +300,7 @@ func (m *Privacy2Privacy) Reset() { *m = Privacy2Privacy{} }
func (m *Privacy2Privacy) String() string { return proto.CompactTextString(m) }
func (*Privacy2Privacy) ProtoMessage() {}
func (*Privacy2Privacy) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{2}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{2}
}
func (m *Privacy2Privacy) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Privacy2Privacy.Unmarshal(m, b)
......@@ -379,7 +379,7 @@ func (m *Privacy2Public) Reset() { *m = Privacy2Public{} }
func (m *Privacy2Public) String() string { return proto.CompactTextString(m) }
func (*Privacy2Public) ProtoMessage() {}
func (*Privacy2Public) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{3}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{3}
}
func (m *Privacy2Public) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Privacy2Public.Unmarshal(m, b)
......@@ -462,7 +462,7 @@ func (m *UTXOGlobalIndex) Reset() { *m = UTXOGlobalIndex{} }
func (m *UTXOGlobalIndex) String() string { return proto.CompactTextString(m) }
func (*UTXOGlobalIndex) ProtoMessage() {}
func (*UTXOGlobalIndex) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{4}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{4}
}
func (m *UTXOGlobalIndex) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UTXOGlobalIndex.Unmarshal(m, b)
......@@ -510,7 +510,7 @@ func (m *KeyInput) Reset() { *m = KeyInput{} }
func (m *KeyInput) String() string { return proto.CompactTextString(m) }
func (*KeyInput) ProtoMessage() {}
func (*KeyInput) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{5}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{5}
}
func (m *KeyInput) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_KeyInput.Unmarshal(m, b)
......@@ -562,7 +562,7 @@ func (m *PrivacyInput) Reset() { *m = PrivacyInput{} }
func (m *PrivacyInput) String() string { return proto.CompactTextString(m) }
func (*PrivacyInput) ProtoMessage() {}
func (*PrivacyInput) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{6}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{6}
}
func (m *PrivacyInput) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrivacyInput.Unmarshal(m, b)
......@@ -602,7 +602,7 @@ func (m *KeyOutput) Reset() { *m = KeyOutput{} }
func (m *KeyOutput) String() string { return proto.CompactTextString(m) }
func (*KeyOutput) ProtoMessage() {}
func (*KeyOutput) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{7}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{7}
}
func (m *KeyOutput) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_KeyOutput.Unmarshal(m, b)
......@@ -648,7 +648,7 @@ func (m *PrivacyOutput) Reset() { *m = PrivacyOutput{} }
func (m *PrivacyOutput) String() string { return proto.CompactTextString(m) }
func (*PrivacyOutput) ProtoMessage() {}
func (*PrivacyOutput) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{8}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{8}
}
func (m *PrivacyOutput) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrivacyOutput.Unmarshal(m, b)
......@@ -694,7 +694,7 @@ func (m *GroupUTXOGlobalIndex) Reset() { *m = GroupUTXOGlobalIndex{} }
func (m *GroupUTXOGlobalIndex) String() string { return proto.CompactTextString(m) }
func (*GroupUTXOGlobalIndex) ProtoMessage() {}
func (*GroupUTXOGlobalIndex) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{9}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{9}
}
func (m *GroupUTXOGlobalIndex) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupUTXOGlobalIndex.Unmarshal(m, b)
......@@ -743,7 +743,7 @@ func (m *LocalUTXOItem) Reset() { *m = LocalUTXOItem{} }
func (m *LocalUTXOItem) String() string { return proto.CompactTextString(m) }
func (*LocalUTXOItem) ProtoMessage() {}
func (*LocalUTXOItem) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{10}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{10}
}
func (m *LocalUTXOItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LocalUTXOItem.Unmarshal(m, b)
......@@ -810,7 +810,7 @@ func (m *ReqUTXOPubKeys) Reset() { *m = ReqUTXOPubKeys{} }
func (m *ReqUTXOPubKeys) String() string { return proto.CompactTextString(m) }
func (*ReqUTXOPubKeys) ProtoMessage() {}
func (*ReqUTXOPubKeys) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{11}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{11}
}
func (m *ReqUTXOPubKeys) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqUTXOPubKeys.Unmarshal(m, b)
......@@ -856,7 +856,7 @@ func (m *PublicKeyData) Reset() { *m = PublicKeyData{} }
func (m *PublicKeyData) String() string { return proto.CompactTextString(m) }
func (*PublicKeyData) ProtoMessage() {}
func (*PublicKeyData) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{12}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{12}
}
func (m *PublicKeyData) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PublicKeyData.Unmarshal(m, b)
......@@ -896,7 +896,7 @@ func (m *GroupUTXOPubKey) Reset() { *m = GroupUTXOPubKey{} }
func (m *GroupUTXOPubKey) String() string { return proto.CompactTextString(m) }
func (*GroupUTXOPubKey) ProtoMessage() {}
func (*GroupUTXOPubKey) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{13}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{13}
}
func (m *GroupUTXOPubKey) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GroupUTXOPubKey.Unmarshal(m, b)
......@@ -941,7 +941,7 @@ func (m *ResUTXOPubKeys) Reset() { *m = ResUTXOPubKeys{} }
func (m *ResUTXOPubKeys) String() string { return proto.CompactTextString(m) }
func (*ResUTXOPubKeys) ProtoMessage() {}
func (*ResUTXOPubKeys) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{14}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{14}
}
func (m *ResUTXOPubKeys) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResUTXOPubKeys.Unmarshal(m, b)
......@@ -981,7 +981,7 @@ func (m *ReqPrivacyToken) Reset() { *m = ReqPrivacyToken{} }
func (m *ReqPrivacyToken) String() string { return proto.CompactTextString(m) }
func (*ReqPrivacyToken) ProtoMessage() {}
func (*ReqPrivacyToken) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{15}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{15}
}
func (m *ReqPrivacyToken) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqPrivacyToken.Unmarshal(m, b)
......@@ -1034,7 +1034,7 @@ func (m *AmountDetail) Reset() { *m = AmountDetail{} }
func (m *AmountDetail) String() string { return proto.CompactTextString(m) }
func (*AmountDetail) ProtoMessage() {}
func (*AmountDetail) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{16}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{16}
}
func (m *AmountDetail) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AmountDetail.Unmarshal(m, b)
......@@ -1079,7 +1079,7 @@ func (m *ReplyPrivacyAmounts) Reset() { *m = ReplyPrivacyAmounts{} }
func (m *ReplyPrivacyAmounts) String() string { return proto.CompactTextString(m) }
func (*ReplyPrivacyAmounts) ProtoMessage() {}
func (*ReplyPrivacyAmounts) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{17}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{17}
}
func (m *ReplyPrivacyAmounts) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyPrivacyAmounts.Unmarshal(m, b)
......@@ -1117,7 +1117,7 @@ func (m *ReplyUTXOsOfAmount) Reset() { *m = ReplyUTXOsOfAmount{} }
func (m *ReplyUTXOsOfAmount) String() string { return proto.CompactTextString(m) }
func (*ReplyUTXOsOfAmount) ProtoMessage() {}
func (*ReplyUTXOsOfAmount) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{18}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{18}
}
func (m *ReplyUTXOsOfAmount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyUTXOsOfAmount.Unmarshal(m, b)
......@@ -1157,7 +1157,7 @@ func (m *ReceiptPrivacyOutput) Reset() { *m = ReceiptPrivacyOutput{} }
func (m *ReceiptPrivacyOutput) String() string { return proto.CompactTextString(m) }
func (*ReceiptPrivacyOutput) ProtoMessage() {}
func (*ReceiptPrivacyOutput) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{19}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{19}
}
func (m *ReceiptPrivacyOutput) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReceiptPrivacyOutput.Unmarshal(m, b)
......@@ -1210,7 +1210,7 @@ func (m *AmountsOfUTXO) Reset() { *m = AmountsOfUTXO{} }
func (m *AmountsOfUTXO) String() string { return proto.CompactTextString(m) }
func (*AmountsOfUTXO) ProtoMessage() {}
func (*AmountsOfUTXO) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{20}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{20}
}
func (m *AmountsOfUTXO) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AmountsOfUTXO.Unmarshal(m, b)
......@@ -1248,7 +1248,7 @@ func (m *TokenNamesOfUTXO) Reset() { *m = TokenNamesOfUTXO{} }
func (m *TokenNamesOfUTXO) String() string { return proto.CompactTextString(m) }
func (*TokenNamesOfUTXO) ProtoMessage() {}
func (*TokenNamesOfUTXO) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{21}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{21}
}
func (m *TokenNamesOfUTXO) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TokenNamesOfUTXO.Unmarshal(m, b)
......@@ -1288,7 +1288,7 @@ func (m *UTXOGlobalIndex4Print) Reset() { *m = UTXOGlobalIndex4Print{} }
func (m *UTXOGlobalIndex4Print) String() string { return proto.CompactTextString(m) }
func (*UTXOGlobalIndex4Print) ProtoMessage() {}
func (*UTXOGlobalIndex4Print) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{22}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{22}
}
func (m *UTXOGlobalIndex4Print) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UTXOGlobalIndex4Print.Unmarshal(m, b)
......@@ -1335,7 +1335,7 @@ func (m *KeyInput4Print) Reset() { *m = KeyInput4Print{} }
func (m *KeyInput4Print) String() string { return proto.CompactTextString(m) }
func (*KeyInput4Print) ProtoMessage() {}
func (*KeyInput4Print) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{23}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{23}
}
func (m *KeyInput4Print) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_KeyInput4Print.Unmarshal(m, b)
......@@ -1388,7 +1388,7 @@ func (m *KeyOutput4Print) Reset() { *m = KeyOutput4Print{} }
func (m *KeyOutput4Print) String() string { return proto.CompactTextString(m) }
func (*KeyOutput4Print) ProtoMessage() {}
func (*KeyOutput4Print) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{24}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{24}
}
func (m *KeyOutput4Print) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_KeyOutput4Print.Unmarshal(m, b)
......@@ -1433,7 +1433,7 @@ func (m *PrivacyInput4Print) Reset() { *m = PrivacyInput4Print{} }
func (m *PrivacyInput4Print) String() string { return proto.CompactTextString(m) }
func (*PrivacyInput4Print) ProtoMessage() {}
func (*PrivacyInput4Print) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{25}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{25}
}
func (m *PrivacyInput4Print) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrivacyInput4Print.Unmarshal(m, b)
......@@ -1472,7 +1472,7 @@ func (m *PrivacyOutput4Print) Reset() { *m = PrivacyOutput4Print{} }
func (m *PrivacyOutput4Print) String() string { return proto.CompactTextString(m) }
func (*PrivacyOutput4Print) ProtoMessage() {}
func (*PrivacyOutput4Print) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{26}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{26}
}
func (m *PrivacyOutput4Print) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrivacyOutput4Print.Unmarshal(m, b)
......@@ -1520,7 +1520,7 @@ func (m *Public2Privacy4Print) Reset() { *m = Public2Privacy4Print{} }
func (m *Public2Privacy4Print) String() string { return proto.CompactTextString(m) }
func (*Public2Privacy4Print) ProtoMessage() {}
func (*Public2Privacy4Print) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{27}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{27}
}
func (m *Public2Privacy4Print) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Public2Privacy4Print.Unmarshal(m, b)
......@@ -1583,7 +1583,7 @@ func (m *Privacy2Privacy4Print) Reset() { *m = Privacy2Privacy4Print{} }
func (m *Privacy2Privacy4Print) String() string { return proto.CompactTextString(m) }
func (*Privacy2Privacy4Print) ProtoMessage() {}
func (*Privacy2Privacy4Print) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{28}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{28}
}
func (m *Privacy2Privacy4Print) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Privacy2Privacy4Print.Unmarshal(m, b)
......@@ -1653,7 +1653,7 @@ func (m *Privacy2Public4Print) Reset() { *m = Privacy2Public4Print{} }
func (m *Privacy2Public4Print) String() string { return proto.CompactTextString(m) }
func (*Privacy2Public4Print) ProtoMessage() {}
func (*Privacy2Public4Print) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{29}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{29}
}
func (m *Privacy2Public4Print) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Privacy2Public4Print.Unmarshal(m, b)
......@@ -1724,7 +1724,7 @@ func (m *PrivacyAction4Print) Reset() { *m = PrivacyAction4Print{} }
func (m *PrivacyAction4Print) String() string { return proto.CompactTextString(m) }
func (*PrivacyAction4Print) ProtoMessage() {}
func (*PrivacyAction4Print) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{30}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{30}
}
func (m *PrivacyAction4Print) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrivacyAction4Print.Unmarshal(m, b)
......@@ -1908,7 +1908,7 @@ func (m *ReplyPrivacyPkPair) Reset() { *m = ReplyPrivacyPkPair{} }
func (m *ReplyPrivacyPkPair) String() string { return proto.CompactTextString(m) }
func (*ReplyPrivacyPkPair) ProtoMessage() {}
func (*ReplyPrivacyPkPair) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{31}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{31}
}
func (m *ReplyPrivacyPkPair) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyPrivacyPkPair.Unmarshal(m, b)
......@@ -1945,6 +1945,7 @@ func (m *ReplyPrivacyPkPair) GetPubkeypair() string {
type ReqPrivBal4AddrToken struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"`
AssetExec string `protobuf:"bytes,3,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1954,7 +1955,7 @@ func (m *ReqPrivBal4AddrToken) Reset() { *m = ReqPrivBal4AddrToken{} }
func (m *ReqPrivBal4AddrToken) String() string { return proto.CompactTextString(m) }
func (*ReqPrivBal4AddrToken) ProtoMessage() {}
func (*ReqPrivBal4AddrToken) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{32}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{32}
}
func (m *ReqPrivBal4AddrToken) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqPrivBal4AddrToken.Unmarshal(m, b)
......@@ -1988,6 +1989,13 @@ func (m *ReqPrivBal4AddrToken) GetToken() string {
return ""
}
func (m *ReqPrivBal4AddrToken) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
type ReplyPrivacyBalance struct {
Onetimeaddr string `protobuf:"bytes,1,opt,name=onetimeaddr,proto3" json:"onetimeaddr,omitempty"`
Balance int64 `protobuf:"varint,2,opt,name=balance,proto3" json:"balance,omitempty"`
......@@ -2000,7 +2008,7 @@ func (m *ReplyPrivacyBalance) Reset() { *m = ReplyPrivacyBalance{} }
func (m *ReplyPrivacyBalance) String() string { return proto.CompactTextString(m) }
func (*ReplyPrivacyBalance) ProtoMessage() {}
func (*ReplyPrivacyBalance) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{33}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{33}
}
func (m *ReplyPrivacyBalance) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyPrivacyBalance.Unmarshal(m, b)
......@@ -2045,6 +2053,7 @@ type PrivacyDBStore struct {
Height int64 `protobuf:"varint,8,opt,name=height,proto3" json:"height,omitempty"`
Txindex int32 `protobuf:"varint,9,opt,name=txindex,proto3" json:"txindex,omitempty"`
Blockhash []byte `protobuf:"bytes,10,opt,name=blockhash,proto3" json:"blockhash,omitempty"`
AssetExec string `protobuf:"bytes,11,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -2054,7 +2063,7 @@ func (m *PrivacyDBStore) Reset() { *m = PrivacyDBStore{} }
func (m *PrivacyDBStore) String() string { return proto.CompactTextString(m) }
func (*PrivacyDBStore) ProtoMessage() {}
func (*PrivacyDBStore) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{34}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{34}
}
func (m *PrivacyDBStore) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrivacyDBStore.Unmarshal(m, b)
......@@ -2144,6 +2153,13 @@ func (m *PrivacyDBStore) GetBlockhash() []byte {
return nil
}
func (m *PrivacyDBStore) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
type UTXO struct {
Amount int64 `protobuf:"varint,1,opt,name=amount,proto3" json:"amount,omitempty"`
UtxoBasic *UTXOBasic `protobuf:"bytes,2,opt,name=utxoBasic,proto3" json:"utxoBasic,omitempty"`
......@@ -2156,7 +2172,7 @@ func (m *UTXO) Reset() { *m = UTXO{} }
func (m *UTXO) String() string { return proto.CompactTextString(m) }
func (*UTXO) ProtoMessage() {}
func (*UTXO) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{35}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{35}
}
func (m *UTXO) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UTXO.Unmarshal(m, b)
......@@ -2203,7 +2219,7 @@ func (m *UTXOHaveTxHash) Reset() { *m = UTXOHaveTxHash{} }
func (m *UTXOHaveTxHash) String() string { return proto.CompactTextString(m) }
func (*UTXOHaveTxHash) ProtoMessage() {}
func (*UTXOHaveTxHash) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{36}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{36}
}
func (m *UTXOHaveTxHash) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UTXOHaveTxHash.Unmarshal(m, b)
......@@ -2255,7 +2271,7 @@ func (m *UTXOs) Reset() { *m = UTXOs{} }
func (m *UTXOs) String() string { return proto.CompactTextString(m) }
func (*UTXOs) ProtoMessage() {}
func (*UTXOs) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{37}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{37}
}
func (m *UTXOs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UTXOs.Unmarshal(m, b)
......@@ -2293,7 +2309,7 @@ func (m *UTXOHaveTxHashs) Reset() { *m = UTXOHaveTxHashs{} }
func (m *UTXOHaveTxHashs) String() string { return proto.CompactTextString(m) }
func (*UTXOHaveTxHashs) ProtoMessage() {}
func (*UTXOHaveTxHashs) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{38}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{38}
}
func (m *UTXOHaveTxHashs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UTXOHaveTxHashs.Unmarshal(m, b)
......@@ -2334,7 +2350,7 @@ func (m *ReqUTXOGlobalIndex) Reset() { *m = ReqUTXOGlobalIndex{} }
func (m *ReqUTXOGlobalIndex) String() string { return proto.CompactTextString(m) }
func (*ReqUTXOGlobalIndex) ProtoMessage() {}
func (*ReqUTXOGlobalIndex) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{39}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{39}
}
func (m *ReqUTXOGlobalIndex) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqUTXOGlobalIndex.Unmarshal(m, b)
......@@ -2394,7 +2410,7 @@ func (m *UTXOBasic) Reset() { *m = UTXOBasic{} }
func (m *UTXOBasic) String() string { return proto.CompactTextString(m) }
func (*UTXOBasic) ProtoMessage() {}
func (*UTXOBasic) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{40}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{40}
}
func (m *UTXOBasic) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UTXOBasic.Unmarshal(m, b)
......@@ -2440,7 +2456,7 @@ func (m *UTXOIndex4Amount) Reset() { *m = UTXOIndex4Amount{} }
func (m *UTXOIndex4Amount) String() string { return proto.CompactTextString(m) }
func (*UTXOIndex4Amount) ProtoMessage() {}
func (*UTXOIndex4Amount) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{41}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{41}
}
func (m *UTXOIndex4Amount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UTXOIndex4Amount.Unmarshal(m, b)
......@@ -2485,7 +2501,7 @@ func (m *ResUTXOGlobalIndex) Reset() { *m = ResUTXOGlobalIndex{} }
func (m *ResUTXOGlobalIndex) String() string { return proto.CompactTextString(m) }
func (*ResUTXOGlobalIndex) ProtoMessage() {}
func (*ResUTXOGlobalIndex) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{42}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{42}
}
func (m *ResUTXOGlobalIndex) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResUTXOGlobalIndex.Unmarshal(m, b)
......@@ -2519,6 +2535,7 @@ type FTXOsSTXOsInOneTx struct {
Expire int64 `protobuf:"varint,3,opt,name=expire,proto3" json:"expire,omitempty"`
Txhash string `protobuf:"bytes,4,opt,name=txhash,proto3" json:"txhash,omitempty"`
Utxos []*UTXO `protobuf:"bytes,5,rep,name=utxos,proto3" json:"utxos,omitempty"`
AssetExec string `protobuf:"bytes,6,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -2528,7 +2545,7 @@ func (m *FTXOsSTXOsInOneTx) Reset() { *m = FTXOsSTXOsInOneTx{} }
func (m *FTXOsSTXOsInOneTx) String() string { return proto.CompactTextString(m) }
func (*FTXOsSTXOsInOneTx) ProtoMessage() {}
func (*FTXOsSTXOsInOneTx) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{43}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{43}
}
func (m *FTXOsSTXOsInOneTx) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FTXOsSTXOsInOneTx.Unmarshal(m, b)
......@@ -2583,6 +2600,13 @@ func (m *FTXOsSTXOsInOneTx) GetUtxos() []*UTXO {
return nil
}
func (m *FTXOsSTXOsInOneTx) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
type RealKeyInput struct {
Realinputkey int32 `protobuf:"varint,1,opt,name=realinputkey,proto3" json:"realinputkey,omitempty"`
Onetimeprivkey []byte `protobuf:"bytes,2,opt,name=onetimeprivkey,proto3" json:"onetimeprivkey,omitempty"`
......@@ -2595,7 +2619,7 @@ func (m *RealKeyInput) Reset() { *m = RealKeyInput{} }
func (m *RealKeyInput) String() string { return proto.CompactTextString(m) }
func (*RealKeyInput) ProtoMessage() {}
func (*RealKeyInput) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{44}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{44}
}
func (m *RealKeyInput) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RealKeyInput.Unmarshal(m, b)
......@@ -2640,7 +2664,7 @@ func (m *UTXOBasics) Reset() { *m = UTXOBasics{} }
func (m *UTXOBasics) String() string { return proto.CompactTextString(m) }
func (*UTXOBasics) ProtoMessage() {}
func (*UTXOBasics) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{45}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{45}
}
func (m *UTXOBasics) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UTXOBasics.Unmarshal(m, b)
......@@ -2692,7 +2716,7 @@ func (m *CreateTransactionCache) Reset() { *m = CreateTransactionCache{}
func (m *CreateTransactionCache) String() string { return proto.CompactTextString(m) }
func (*CreateTransactionCache) ProtoMessage() {}
func (*CreateTransactionCache) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{46}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{46}
}
func (m *CreateTransactionCache) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateTransactionCache.Unmarshal(m, b)
......@@ -2787,7 +2811,7 @@ func (m *ReqCacheTxList) Reset() { *m = ReqCacheTxList{} }
func (m *ReqCacheTxList) String() string { return proto.CompactTextString(m) }
func (*ReqCacheTxList) ProtoMessage() {}
func (*ReqCacheTxList) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{47}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{47}
}
func (m *ReqCacheTxList) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqCacheTxList.Unmarshal(m, b)
......@@ -2832,7 +2856,7 @@ func (m *ReplyCacheTxList) Reset() { *m = ReplyCacheTxList{} }
func (m *ReplyCacheTxList) String() string { return proto.CompactTextString(m) }
func (*ReplyCacheTxList) ProtoMessage() {}
func (*ReplyCacheTxList) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{48}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{48}
}
func (m *ReplyCacheTxList) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyCacheTxList.Unmarshal(m, b)
......@@ -2860,8 +2884,15 @@ func (m *ReplyCacheTxList) GetTxs() []*types.Transaction {
}
type ReqPrivacyAccount struct {
Tokenname string `protobuf:"bytes,1,opt,name=tokenname,proto3" json:"tokenname,omitempty"`
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"`
// 设定显示的数据类型信息
// 0: 只显示账户的数值信息
// 1: 显示UTXO明细
// 2: 显示FTXO明细
// 3: 全部显示
Displaymode int32 `protobuf:"varint,3,opt,name=displaymode,proto3" json:"displaymode,omitempty"`
AssetExec string `protobuf:"bytes,4,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -2871,7 +2902,7 @@ func (m *ReqPrivacyAccount) Reset() { *m = ReqPrivacyAccount{} }
func (m *ReqPrivacyAccount) String() string { return proto.CompactTextString(m) }
func (*ReqPrivacyAccount) ProtoMessage() {}
func (*ReqPrivacyAccount) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{49}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{49}
}
func (m *ReqPrivacyAccount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqPrivacyAccount.Unmarshal(m, b)
......@@ -2891,13 +2922,6 @@ func (m *ReqPrivacyAccount) XXX_DiscardUnknown() {
var xxx_messageInfo_ReqPrivacyAccount proto.InternalMessageInfo
func (m *ReqPrivacyAccount) GetTokenname() string {
if m != nil {
return m.Tokenname
}
return ""
}
func (m *ReqPrivacyAccount) GetAddr() string {
if m != nil {
return m.Addr
......@@ -2905,63 +2929,25 @@ func (m *ReqPrivacyAccount) GetAddr() string {
return ""
}
type ReqPPrivacyAccount struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"`
// 设定显示的数据类型信息
// 0: 只显示账户的数值信息
// 1: 显示UTXO明细
// 2: 显示FTXO明细
// 3: 全部显示
Displaymode int32 `protobuf:"varint,3,opt,name=displaymode,proto3" json:"displaymode,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReqPPrivacyAccount) Reset() { *m = ReqPPrivacyAccount{} }
func (m *ReqPPrivacyAccount) String() string { return proto.CompactTextString(m) }
func (*ReqPPrivacyAccount) ProtoMessage() {}
func (*ReqPPrivacyAccount) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{50}
}
func (m *ReqPPrivacyAccount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqPPrivacyAccount.Unmarshal(m, b)
}
func (m *ReqPPrivacyAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReqPPrivacyAccount.Marshal(b, m, deterministic)
}
func (dst *ReqPPrivacyAccount) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReqPPrivacyAccount.Merge(dst, src)
}
func (m *ReqPPrivacyAccount) XXX_Size() int {
return xxx_messageInfo_ReqPPrivacyAccount.Size(m)
}
func (m *ReqPPrivacyAccount) XXX_DiscardUnknown() {
xxx_messageInfo_ReqPPrivacyAccount.DiscardUnknown(m)
}
var xxx_messageInfo_ReqPPrivacyAccount proto.InternalMessageInfo
func (m *ReqPPrivacyAccount) GetAddr() string {
func (m *ReqPrivacyAccount) GetToken() string {
if m != nil {
return m.Addr
return m.Token
}
return ""
}
func (m *ReqPPrivacyAccount) GetToken() string {
func (m *ReqPrivacyAccount) GetDisplaymode() int32 {
if m != nil {
return m.Token
return m.Displaymode
}
return ""
return 0
}
func (m *ReqPPrivacyAccount) GetDisplaymode() int32 {
func (m *ReqPrivacyAccount) GetAssetExec() string {
if m != nil {
return m.Displaymode
return m.AssetExec
}
return 0
return ""
}
// 请求隐私账户信息的应答
......@@ -2980,7 +2966,7 @@ func (m *ReplyPrivacyAccount) Reset() { *m = ReplyPrivacyAccount{} }
func (m *ReplyPrivacyAccount) String() string { return proto.CompactTextString(m) }
func (*ReplyPrivacyAccount) ProtoMessage() {}
func (*ReplyPrivacyAccount) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{51}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{50}
}
func (m *ReplyPrivacyAccount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyPrivacyAccount.Unmarshal(m, b)
......@@ -3033,7 +3019,7 @@ func (m *ReqCreateCacheTxKey) Reset() { *m = ReqCreateCacheTxKey{} }
func (m *ReqCreateCacheTxKey) String() string { return proto.CompactTextString(m) }
func (*ReqCreateCacheTxKey) ProtoMessage() {}
func (*ReqCreateCacheTxKey) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{52}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{51}
}
func (m *ReqCreateCacheTxKey) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqCreateCacheTxKey.Unmarshal(m, b)
......@@ -3078,6 +3064,7 @@ type ReqPrivacyTransactionList struct {
From string `protobuf:"bytes,5,opt,name=from,proto3" json:"from,omitempty"`
Address string `protobuf:"bytes,6,opt,name=address,proto3" json:"address,omitempty"`
Seedtxhash []byte `protobuf:"bytes,7,opt,name=seedtxhash,proto3" json:"seedtxhash,omitempty"`
AssetExec string `protobuf:"bytes,8,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -3087,7 +3074,7 @@ func (m *ReqPrivacyTransactionList) Reset() { *m = ReqPrivacyTransaction
func (m *ReqPrivacyTransactionList) String() string { return proto.CompactTextString(m) }
func (*ReqPrivacyTransactionList) ProtoMessage() {}
func (*ReqPrivacyTransactionList) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{53}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{52}
}
func (m *ReqPrivacyTransactionList) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqPrivacyTransactionList.Unmarshal(m, b)
......@@ -3156,6 +3143,13 @@ func (m *ReqPrivacyTransactionList) GetSeedtxhash() []byte {
return nil
}
func (m *ReqPrivacyTransactionList) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
type ReqRescanUtxos struct {
Addrs []string `protobuf:"bytes,1,rep,name=addrs,proto3" json:"addrs,omitempty"`
Flag int32 `protobuf:"varint,2,opt,name=flag,proto3" json:"flag,omitempty"`
......@@ -3168,7 +3162,7 @@ func (m *ReqRescanUtxos) Reset() { *m = ReqRescanUtxos{} }
func (m *ReqRescanUtxos) String() string { return proto.CompactTextString(m) }
func (*ReqRescanUtxos) ProtoMessage() {}
func (*ReqRescanUtxos) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{54}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{53}
}
func (m *ReqRescanUtxos) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqRescanUtxos.Unmarshal(m, b)
......@@ -3214,7 +3208,7 @@ func (m *RepRescanResult) Reset() { *m = RepRescanResult{} }
func (m *RepRescanResult) String() string { return proto.CompactTextString(m) }
func (*RepRescanResult) ProtoMessage() {}
func (*RepRescanResult) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{55}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{54}
}
func (m *RepRescanResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RepRescanResult.Unmarshal(m, b)
......@@ -3260,7 +3254,7 @@ func (m *RepRescanUtxos) Reset() { *m = RepRescanUtxos{} }
func (m *RepRescanUtxos) String() string { return proto.CompactTextString(m) }
func (*RepRescanUtxos) ProtoMessage() {}
func (*RepRescanUtxos) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{56}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{55}
}
func (m *RepRescanUtxos) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RepRescanUtxos.Unmarshal(m, b)
......@@ -3305,7 +3299,7 @@ func (m *ReqEnablePrivacy) Reset() { *m = ReqEnablePrivacy{} }
func (m *ReqEnablePrivacy) String() string { return proto.CompactTextString(m) }
func (*ReqEnablePrivacy) ProtoMessage() {}
func (*ReqEnablePrivacy) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{57}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{56}
}
func (m *ReqEnablePrivacy) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqEnablePrivacy.Unmarshal(m, b)
......@@ -3345,7 +3339,7 @@ func (m *PriAddrResult) Reset() { *m = PriAddrResult{} }
func (m *PriAddrResult) String() string { return proto.CompactTextString(m) }
func (*PriAddrResult) ProtoMessage() {}
func (*PriAddrResult) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{58}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{57}
}
func (m *PriAddrResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PriAddrResult.Unmarshal(m, b)
......@@ -3397,7 +3391,7 @@ func (m *RepEnablePrivacy) Reset() { *m = RepEnablePrivacy{} }
func (m *RepEnablePrivacy) String() string { return proto.CompactTextString(m) }
func (*RepEnablePrivacy) ProtoMessage() {}
func (*RepEnablePrivacy) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{59}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{58}
}
func (m *RepEnablePrivacy) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RepEnablePrivacy.Unmarshal(m, b)
......@@ -3438,7 +3432,7 @@ func (m *PrivacySignatureParam) Reset() { *m = PrivacySignatureParam{} }
func (m *PrivacySignatureParam) String() string { return proto.CompactTextString(m) }
func (*PrivacySignatureParam) ProtoMessage() {}
func (*PrivacySignatureParam) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{60}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{59}
}
func (m *PrivacySignatureParam) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PrivacySignatureParam.Unmarshal(m, b)
......@@ -3493,7 +3487,7 @@ func (m *WalletAccountPrivacy) Reset() { *m = WalletAccountPrivacy{} }
func (m *WalletAccountPrivacy) String() string { return proto.CompactTextString(m) }
func (*WalletAccountPrivacy) ProtoMessage() {}
func (*WalletAccountPrivacy) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{61}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{60}
}
func (m *WalletAccountPrivacy) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WalletAccountPrivacy.Unmarshal(m, b)
......@@ -3566,7 +3560,7 @@ func (m *ReqCreatePrivacyTx) Reset() { *m = ReqCreatePrivacyTx{} }
func (m *ReqCreatePrivacyTx) String() string { return proto.CompactTextString(m) }
func (*ReqCreatePrivacyTx) ProtoMessage() {}
func (*ReqCreatePrivacyTx) Descriptor() ([]byte, []int) {
return fileDescriptor_privacy_84669f04cb5de16e, []int{62}
return fileDescriptor_privacy_6ecd2799f7ad9b76, []int{61}
}
func (m *ReqCreatePrivacyTx) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReqCreatePrivacyTx.Unmarshal(m, b)
......@@ -3709,7 +3703,6 @@ func init() {
proto.RegisterType((*ReqCacheTxList)(nil), "types.ReqCacheTxList")
proto.RegisterType((*ReplyCacheTxList)(nil), "types.ReplyCacheTxList")
proto.RegisterType((*ReqPrivacyAccount)(nil), "types.ReqPrivacyAccount")
proto.RegisterType((*ReqPPrivacyAccount)(nil), "types.ReqPPrivacyAccount")
proto.RegisterType((*ReplyPrivacyAccount)(nil), "types.ReplyPrivacyAccount")
proto.RegisterType((*ReqCreateCacheTxKey)(nil), "types.ReqCreateCacheTxKey")
proto.RegisterType((*ReqPrivacyTransactionList)(nil), "types.ReqPrivacyTransactionList")
......@@ -3905,153 +3898,154 @@ var _Privacy_serviceDesc = grpc.ServiceDesc{
Metadata: "privacy.proto",
}
func init() { proto.RegisterFile("privacy.proto", fileDescriptor_privacy_84669f04cb5de16e) }
var fileDescriptor_privacy_84669f04cb5de16e = []byte{
// 2318 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0x4d, 0x6f, 0x1c, 0x49,
0xd9, 0xee, 0x19, 0x8f, 0xed, 0x7e, 0x3c, 0xb6, 0x27, 0x15, 0xdb, 0xeb, 0x4c, 0xa2, 0xc8, 0x6f,
0xed, 0x2a, 0x6f, 0x58, 0x90, 0xd1, 0x06, 0x4b, 0xfb, 0x41, 0xd0, 0xae, 0xc7, 0x71, 0x12, 0xcb,
0x9b, 0xd8, 0x94, 0xbd, 0xe2, 0x43, 0x20, 0x51, 0xd3, 0x53, 0x1e, 0xb7, 0xdc, 0xd3, 0xdd, 0xee,
0xee, 0xb1, 0x67, 0x4e, 0xcb, 0x69, 0xc5, 0x81, 0x03, 0x87, 0x15, 0x1c, 0x40, 0xdc, 0xe0, 0xcc,
0x9f, 0x80, 0x13, 0x27, 0xfe, 0x00, 0xe2, 0x0f, 0xf0, 0x1b, 0x50, 0x7d, 0x74, 0x77, 0x55, 0x4d,
0x8f, 0x9d, 0x25, 0xe6, 0x32, 0xea, 0x7a, 0xea, 0xa9, 0xa7, 0x9e, 0xef, 0x8f, 0x1a, 0x58, 0x8a,
0x13, 0xff, 0x92, 0x7a, 0xe3, 0xad, 0x38, 0x89, 0xb2, 0x08, 0x35, 0xb2, 0x71, 0xcc, 0xd2, 0x76,
0xd3, 0x8b, 0x06, 0x83, 0x28, 0x94, 0xc0, 0xf6, 0x9d, 0x2c, 0xa1, 0x61, 0x4a, 0xbd, 0xcc, 0xcf,
0x41, 0xf8, 0xdf, 0x0e, 0x2c, 0x1d, 0xc9, 0x93, 0x3b, 0x02, 0x8e, 0x3e, 0x85, 0xe5, 0x78, 0xd8,
0x0d, 0x7c, 0xef, 0x89, 0xa2, 0xb8, 0xe1, 0x6c, 0x3a, 0x8f, 0x17, 0x9f, 0xac, 0x6d, 0x09, 0x92,
0x5b, 0x47, 0x72, 0x53, 0x1d, 0x7a, 0x39, 0x43, 0x2c, 0x74, 0xd4, 0x81, 0x15, 0xf5, 0x59, 0x50,
0xa8, 0x09, 0x0a, 0xeb, 0x39, 0x05, 0xb5, 0x5b, 0x92, 0xb0, 0x0f, 0x08, 0x26, 0x72, 0x90, 0xa0,
0xbe, 0x51, 0x37, 0x99, 0xc8, 0x49, 0x88, 0x4d, 0xc1, 0x84, 0x81, 0x8e, 0x96, 0xa1, 0x96, 0x8d,
0x37, 0x66, 0x37, 0x9d, 0xc7, 0x0d, 0x52, 0xcb, 0xc6, 0x9d, 0x79, 0x68, 0x5c, 0xd2, 0x60, 0xc8,
0xf0, 0x9f, 0x1d, 0x58, 0x36, 0x45, 0x40, 0x0f, 0xc0, 0xcd, 0xa2, 0x73, 0x16, 0x86, 0x74, 0xc0,
0x84, 0xb0, 0x2e, 0x29, 0x01, 0x68, 0x1d, 0xe6, 0xe8, 0x20, 0x1a, 0x86, 0x99, 0x90, 0xa2, 0x4e,
0xd4, 0x0a, 0x21, 0x98, 0x0d, 0xa3, 0x8c, 0x6d, 0x34, 0xc4, 0x01, 0xf1, 0x8d, 0xbe, 0x03, 0x73,
0xd1, 0x30, 0x8b, 0x87, 0xd9, 0xc6, 0xbc, 0x60, 0x77, 0xd5, 0x64, 0xf7, 0x50, 0xec, 0x11, 0x85,
0xc3, 0xef, 0xa5, 0x69, 0xca, 0xb2, 0xbd, 0x11, 0xf3, 0x36, 0x16, 0xe4, 0xbd, 0x05, 0x00, 0xff,
0xc3, 0x81, 0x15, 0x4b, 0x53, 0xb7, 0xc8, 0xe9, 0xb7, 0xa0, 0xe1, 0x87, 0x9c, 0xd1, 0x39, 0xc1,
0xe8, 0x5d, 0x93, 0xd1, 0x7d, 0xbe, 0x45, 0x24, 0xc6, 0xad, 0x0a, 0xf5, 0x2f, 0xae, 0x7d, 0xc3,
0x76, 0x6f, 0x29, 0x53, 0x5d, 0x93, 0x89, 0xdb, 0x3c, 0x12, 0x02, 0xb9, 0xa4, 0x96, 0x45, 0xa5,
0x8c, 0xb3, 0xdf, 0x40, 0xc6, 0xc6, 0x5b, 0xcb, 0xb8, 0x07, 0x2b, 0x5f, 0x9c, 0xfc, 0xf8, 0xf0,
0x45, 0x10, 0x75, 0x69, 0xb0, 0x1f, 0xf6, 0xd8, 0x88, 0x4b, 0x91, 0x8d, 0xce, 0x68, 0x7a, 0x26,
0xf8, 0x6d, 0x12, 0xb5, 0x42, 0x6d, 0x58, 0x88, 0x86, 0x99, 0xcf, 0x71, 0x94, 0xaf, 0x16, 0x6b,
0xfc, 0x4b, 0x07, 0x16, 0x0e, 0x98, 0x64, 0x53, 0x53, 0x83, 0x63, 0xa8, 0xe1, 0x33, 0x58, 0x19,
0x66, 0xa3, 0x48, 0xbb, 0x6b, 0xa3, 0xb6, 0x59, 0xd7, 0x62, 0xcd, 0xe2, 0x84, 0xd8, 0xe8, 0x9c,
0x85, 0x73, 0x36, 0xde, 0x1f, 0xd0, 0x3e, 0x53, 0xcc, 0x15, 0x6b, 0xfc, 0x7d, 0x68, 0xea, 0xca,
0x42, 0xdf, 0x16, 0xb8, 0x52, 0xa7, 0x8e, 0xb8, 0x66, 0x45, 0x5d, 0x93, 0x33, 0x4a, 0x0a, 0x04,
0xbc, 0x0f, 0xee, 0x39, 0x53, 0x9a, 0x9b, 0xca, 0xff, 0x7b, 0xb0, 0x14, 0x85, 0x2c, 0xf3, 0x07,
0x2c, 0x1e, 0x76, 0xcf, 0x99, 0xcc, 0x14, 0x4d, 0x62, 0x02, 0xf1, 0xcf, 0x8b, 0x1c, 0x75, 0x58,
0x18, 0x80, 0xc4, 0xc3, 0xee, 0x01, 0x1b, 0x67, 0x23, 0x41, 0xb1, 0x49, 0x4a, 0x00, 0xda, 0x12,
0x37, 0x2b, 0x7b, 0x4a, 0x75, 0xb4, 0x14, 0x9f, 0x05, 0x47, 0xa4, 0x44, 0xc1, 0x31, 0xac, 0xbe,
0x48, 0xa2, 0x61, 0x5c, 0x61, 0xb5, 0xff, 0x8d, 0xd2, 0xf1, 0xef, 0x1d, 0x58, 0xfa, 0x3c, 0xf2,
0x68, 0xc0, 0x31, 0xf7, 0x33, 0x36, 0xe0, 0x77, 0x9d, 0x31, 0xbf, 0x7f, 0x56, 0xdc, 0x25, 0x57,
0x68, 0x03, 0xe6, 0xb3, 0x91, 0xaf, 0xee, 0xe0, 0x0e, 0x92, 0x2f, 0x0d, 0xdf, 0xa9, 0x9b, 0xbe,
0xa3, 0xf9, 0xdb, 0xac, 0xe1, 0x6f, 0x13, 0xea, 0x6e, 0x54, 0xa9, 0xfb, 0x4b, 0x58, 0x26, 0xec,
0x82, 0xb3, 0x76, 0x24, 0x54, 0x9a, 0x16, 0x31, 0xfa, 0xda, 0x8e, 0x51, 0x0e, 0x40, 0x87, 0xb0,
0xda, 0xaf, 0xd0, 0x9f, 0x52, 0xca, 0x7d, 0xa5, 0x94, 0x2a, 0x15, 0x93, 0xca, 0x83, 0xf8, 0x5d,
0x58, 0x92, 0xc9, 0xe1, 0x80, 0x8d, 0x9f, 0xd1, 0x8c, 0xf2, 0x68, 0xef, 0xd1, 0x8c, 0x0a, 0xa7,
0x6b, 0x12, 0xf1, 0x8d, 0x77, 0x60, 0xa5, 0x20, 0x29, 0xf9, 0x9c, 0x6a, 0xb0, 0x75, 0x98, 0x2b,
0xdc, 0x8b, 0x13, 0x50, 0x2b, 0x7c, 0xc2, 0x05, 0x4d, 0x75, 0x41, 0x3b, 0xd0, 0xea, 0x9b, 0x44,
0x53, 0xe5, 0xe9, 0xeb, 0xb6, 0x18, 0x72, 0x9b, 0x4c, 0xe0, 0x63, 0x1f, 0x56, 0x08, 0xbb, 0x50,
0x0e, 0x7b, 0xc2, 0xb5, 0x64, 0x26, 0x0c, 0xc7, 0x4a, 0x18, 0x68, 0x13, 0x16, 0xc5, 0xe2, 0x78,
0x3c, 0xe8, 0x46, 0x81, 0xb0, 0xb3, 0x4b, 0x74, 0x90, 0x26, 0x58, 0x5d, 0x17, 0x0c, 0x3f, 0x85,
0xe6, 0x8e, 0xf8, 0x7a, 0xc6, 0x32, 0xea, 0x07, 0x53, 0x15, 0xb0, 0x0a, 0x0d, 0x4f, 0x4b, 0xa2,
0x72, 0x81, 0x5f, 0xc3, 0x5d, 0xc2, 0xe2, 0x60, 0x9c, 0xd7, 0x7f, 0x81, 0x9b, 0xa2, 0x0f, 0xa1,
0x49, 0x35, 0xa2, 0x4a, 0xfe, 0x3c, 0x7b, 0xea, 0xf7, 0x11, 0x03, 0x11, 0x13, 0x40, 0x09, 0xa7,
0xc7, 0x95, 0x91, 0x1e, 0x9e, 0x4a, 0x4c, 0xf4, 0x14, 0x96, 0x03, 0xdd, 0xd5, 0x73, 0x85, 0xe6,
0x29, 0xd6, 0x88, 0x03, 0x62, 0xe1, 0xe2, 0xaf, 0x1c, 0x58, 0x25, 0xcc, 0x63, 0x7e, 0x9c, 0x4d,
0xa4, 0x80, 0xb7, 0x52, 0xa9, 0x91, 0x24, 0xea, 0x37, 0x27, 0x89, 0xdf, 0x38, 0xb0, 0xa4, 0x34,
0x74, 0x78, 0xca, 0xf9, 0x43, 0x3b, 0xe0, 0x4a, 0xf1, 0x5f, 0xd1, 0x58, 0xc9, 0xf4, 0xae, 0xa1,
0x24, 0x85, 0xa8, 0x56, 0xaf, 0x68, 0xbc, 0x17, 0x66, 0xc9, 0x98, 0x94, 0xa7, 0xda, 0x4f, 0x61,
0xd9, 0xdc, 0x44, 0x2d, 0xa8, 0x73, 0x3f, 0x95, 0xe6, 0xe3, 0x9f, 0xdc, 0x76, 0xa2, 0x73, 0xc9,
0x6d, 0x27, 0x16, 0x9f, 0xd4, 0x3e, 0x72, 0xf0, 0x6f, 0x1d, 0x68, 0x9d, 0xe4, 0x51, 0x98, 0x73,
0xf5, 0x4c, 0x85, 0x6a, 0x5a, 0x72, 0xf5, 0x48, 0x71, 0x65, 0xe3, 0x4a, 0x40, 0x5a, 0x32, 0x56,
0x1c, 0xe4, 0x8c, 0x99, 0x9b, 0x3a, 0x63, 0x6e, 0x05, 0x63, 0xae, 0xce, 0xd8, 0x01, 0xac, 0x59,
0x21, 0xbd, 0x7d, 0x94, 0xf8, 0x32, 0x10, 0x55, 0x5e, 0x92, 0x74, 0xaa, 0xea, 0x60, 0xcd, 0xaa,
0x83, 0xbf, 0x76, 0x60, 0x39, 0x2f, 0x2f, 0x25, 0x99, 0x4a, 0x37, 0x7f, 0x3e, 0x2d, 0x31, 0x3f,
0xa8, 0x4e, 0xcc, 0x92, 0xdc, 0xcd, 0x35, 0xd1, 0xd5, 0x6a, 0xe2, 0x21, 0xac, 0x14, 0xfe, 0x71,
0x03, 0x3b, 0x95, 0xc5, 0xcd, 0xb5, 0xb3, 0xed, 0x0b, 0x40, 0x7a, 0x91, 0x55, 0x34, 0x3f, 0x98,
0x28, 0xb5, 0x6b, 0x56, 0xa9, 0x55, 0xcc, 0x97, 0x05, 0xd7, 0x87, 0xbb, 0x46, 0x88, 0x28, 0x4a,
0x13, 0xb5, 0xd2, 0xd5, 0x6b, 0xe5, 0xf6, 0x64, 0xad, 0x5c, 0xb7, 0xc3, 0x40, 0xdd, 0xa4, 0x05,
0xc3, 0xd7, 0x0e, 0xac, 0x9a, 0x4d, 0x74, 0x79, 0xd9, 0x2d, 0x35, 0xa8, 0x4f, 0xac, 0xae, 0xb3,
0x5d, 0xd5, 0x91, 0x29, 0xce, 0x14, 0x26, 0xfe, 0x9b, 0x03, 0x6b, 0x56, 0xcb, 0x7c, 0xeb, 0x7c,
0x7d, 0xd7, 0x6c, 0x9c, 0xef, 0x55, 0x34, 0x95, 0x8a, 0x2b, 0xd5, 0x5a, 0xfe, 0x37, 0x82, 0xfc,
0x95, 0xeb, 0xd7, 0x68, 0x93, 0x6f, 0x45, 0x8e, 0x7a, 0x95, 0x1c, 0xb3, 0xdf, 0x58, 0x8e, 0xc6,
0x1b, 0xcb, 0xf1, 0x55, 0xad, 0xf0, 0x49, 0x39, 0x5d, 0x2a, 0x31, 0xf6, 0xa6, 0xcc, 0x98, 0xf7,
0x2b, 0x67, 0x4c, 0x79, 0xa8, 0x62, 0xd2, 0x7c, 0x39, 0x6d, 0xd2, 0x7c, 0x50, 0x3d, 0x69, 0x16,
0x84, 0x26, 0xe6, 0xcd, 0xbd, 0x29, 0xf3, 0xe6, 0xfd, 0xca, 0x79, 0x53, 0x63, 0xe8, 0x0d, 0xa7,
0xce, 0x9f, 0x01, 0xd2, 0x4b, 0xed, 0xd1, 0xf9, 0x11, 0xf5, 0x13, 0xf4, 0x08, 0x96, 0xd3, 0xb3,
0xe8, 0xea, 0x78, 0xe8, 0x79, 0x2c, 0x4d, 0x4f, 0x87, 0x81, 0x50, 0xc3, 0x02, 0xb1, 0xa0, 0xe8,
0x21, 0x80, 0x4c, 0x16, 0x31, 0xf5, 0x13, 0x41, 0xde, 0x25, 0x1a, 0x04, 0x7f, 0xc6, 0x6b, 0xa4,
0xe8, 0x38, 0x3a, 0x34, 0xd8, 0xde, 0xe9, 0xf5, 0x12, 0xd9, 0x76, 0x20, 0x98, 0xa5, 0xbd, 0x5e,
0xa2, 0x1c, 0x45, 0x7c, 0xf3, 0xac, 0x2d, 0x1c, 0x26, 0xcf, 0xda, 0x62, 0x81, 0x7f, 0x68, 0xb6,
0x02, 0x1d, 0x1a, 0xd0, 0xd0, 0x63, 0xbc, 0x8c, 0xaa, 0x64, 0xa5, 0xd1, 0xd1, 0x41, 0xbc, 0x3f,
0xed, 0x4a, 0x64, 0xe5, 0x73, 0xf9, 0x12, 0xff, 0xa5, 0x56, 0x8c, 0x7a, 0xcf, 0x3a, 0xc7, 0x59,
0x94, 0x30, 0x2b, 0xfd, 0x97, 0x6d, 0xa9, 0xe1, 0xd5, 0xb5, 0xe9, 0x5e, 0x6d, 0x34, 0x3f, 0xaa,
0x68, 0xec, 0x5b, 0xc3, 0x93, 0xcc, 0xe0, 0x18, 0x9a, 0xd9, 0xa8, 0xe8, 0x21, 0x89, 0xea, 0x73,
0x0d, 0x18, 0x7a, 0x1f, 0x5a, 0x4a, 0x92, 0x02, 0x28, 0x82, 0xba, 0x49, 0x26, 0xe0, 0x5c, 0x6b,
0xd1, 0x55, 0xc8, 0x12, 0x11, 0xc3, 0x2e, 0x91, 0x0b, 0xad, 0x69, 0x5f, 0x98, 0xd6, 0xb4, 0xbb,
0x66, 0xd3, 0xfe, 0x00, 0xdc, 0x6e, 0x10, 0x79, 0xe7, 0x42, 0x09, 0x20, 0x07, 0x97, 0x02, 0x80,
0x5f, 0xc3, 0xac, 0xa8, 0xe1, 0xd3, 0x0a, 0xca, 0x16, 0xb8, 0xbc, 0x54, 0x75, 0x68, 0xea, 0x7b,
0xca, 0xd3, 0x5b, 0x5a, 0x65, 0x13, 0x70, 0x52, 0xa2, 0xe0, 0x18, 0x96, 0x39, 0xfc, 0x25, 0xbd,
0x64, 0x27, 0xa3, 0x97, 0x5c, 0xd3, 0xd7, 0x74, 0xc8, 0x99, 0xc0, 0x50, 0xea, 0x57, 0x2b, 0xf3,
0xc6, 0xfa, 0xcd, 0x37, 0xbe, 0x0f, 0x0d, 0xd1, 0xfd, 0xa1, 0xff, 0x83, 0x06, 0x87, 0xe6, 0xcd,
0xde, 0xa2, 0x76, 0x88, 0xc8, 0x1d, 0x4c, 0xe4, 0x9c, 0x5c, 0x72, 0x97, 0xa2, 0x4f, 0x65, 0x01,
0xd7, 0x40, 0x56, 0xf1, 0x33, 0x0f, 0x10, 0x1b, 0x1b, 0xff, 0xca, 0xe1, 0x81, 0x76, 0x61, 0x4f,
0x72, 0x6f, 0xdb, 0x2c, 0xb6, 0x61, 0x61, 0xe0, 0x8f, 0x76, 0x0b, 0x27, 0x6c, 0x90, 0x62, 0xad,
0xa9, 0x74, 0x76, 0xb3, 0xae, 0xf5, 0xe6, 0x29, 0xb8, 0x85, 0x8a, 0xaa, 0x46, 0x46, 0xc7, 0x78,
0x13, 0xbb, 0x71, 0x4e, 0x2f, 0x9b, 0x89, 0xa3, 0xaa, 0x49, 0x59, 0x02, 0x31, 0x81, 0x96, 0xe8,
0x9d, 0x45, 0x77, 0xb3, 0x33, 0xb0, 0x18, 0x34, 0x6d, 0xfe, 0x28, 0x37, 0x91, 0x39, 0x22, 0x97,
0x76, 0x55, 0x76, 0xfa, 0x09, 0x57, 0x69, 0x6a, 0xab, 0x74, 0x17, 0x5a, 0x7c, 0x5b, 0xbf, 0x49,
0xb5, 0xd1, 0xef, 0x68, 0x84, 0xf4, 0x6d, 0x32, 0x71, 0x00, 0xff, 0xc1, 0x81, 0x3b, 0xcf, 0xb9,
0xbf, 0x1c, 0xf3, 0x9f, 0xfd, 0xf0, 0x30, 0x64, 0x27, 0xa3, 0x9b, 0x8b, 0x5c, 0xca, 0xc2, 0x1e,
0x4b, 0x72, 0x57, 0x95, 0x2b, 0x0e, 0x67, 0xa3, 0xd8, 0x4f, 0x58, 0x9e, 0x26, 0xe4, 0xca, 0x9a,
0x85, 0xcb, 0x9e, 0xb3, 0xf0, 0xd0, 0xc6, 0x54, 0x0f, 0xfd, 0x29, 0x34, 0x09, 0xa3, 0x41, 0xf1,
0x0a, 0x83, 0xa1, 0x99, 0x30, 0x1a, 0x88, 0x7a, 0x98, 0x37, 0xc3, 0x0d, 0x62, 0xc0, 0x78, 0x4e,
0xcf, 0xfb, 0xbb, 0xc4, 0xbf, 0x2c, 0x0d, 0x65, 0x41, 0xf1, 0x36, 0x40, 0xa1, 0xe9, 0xb4, 0xb4,
0x85, 0x73, 0xbd, 0x2d, 0xfe, 0x5e, 0x83, 0xf5, 0xdd, 0x84, 0xd1, 0x8c, 0x9d, 0x94, 0x4f, 0xb9,
0xbb, 0xd4, 0x3b, 0x63, 0x7a, 0x83, 0xde, 0x94, 0x0d, 0xfa, 0x43, 0x00, 0x4f, 0xe0, 0xf2, 0x7b,
0x55, 0x7a, 0xd6, 0x20, 0xdc, 0xab, 0x53, 0xbf, 0x1f, 0x8a, 0x5d, 0xa9, 0xb3, 0x62, 0x2d, 0xb4,
0x9c, 0xd1, 0x6c, 0x98, 0xaa, 0xd4, 0xaa, 0x56, 0x68, 0x1b, 0x16, 0xb5, 0x47, 0x64, 0xd5, 0x0a,
0xa0, 0x7c, 0xc0, 0x28, 0x77, 0x88, 0x8e, 0xa6, 0xd9, 0x6c, 0xce, 0xb0, 0xd9, 0x87, 0x52, 0xa1,
0x45, 0xa7, 0x3b, 0x6f, 0x8c, 0x9a, 0xba, 0xee, 0x89, 0x81, 0x88, 0xfe, 0x3f, 0xd7, 0xd7, 0x82,
0x38, 0x71, 0xc7, 0xd6, 0x57, 0xaa, 0x14, 0x66, 0xfa, 0x92, 0x6b, 0xf9, 0x12, 0xee, 0x88, 0x97,
0x0e, 0xa1, 0xbf, 0x93, 0xd1, 0xe7, 0x7e, 0x9a, 0x55, 0x96, 0xcc, 0x6b, 0xcb, 0x13, 0xfe, 0x08,
0x5a, 0xa2, 0x74, 0xea, 0x54, 0xde, 0x83, 0x7a, 0x36, 0xca, 0x8d, 0x59, 0xa5, 0x1d, 0xbe, 0x8d,
0xf7, 0xe0, 0x4e, 0xf9, 0x50, 0xb0, 0xe3, 0x89, 0xa1, 0xfc, 0x06, 0xe7, 0xcf, 0xd9, 0xab, 0x95,
0xec, 0xe1, 0x5f, 0x88, 0x94, 0x77, 0x64, 0xd1, 0x79, 0xe3, 0xda, 0xcf, 0xd3, 0x5f, 0xcf, 0x4f,
0xe3, 0x80, 0x8e, 0x07, 0x51, 0x8f, 0xa9, 0xfc, 0xa6, 0x83, 0xf0, 0x97, 0xd6, 0x43, 0x81, 0xba,
0x02, 0x97, 0x4e, 0xcb, 0xbd, 0xa0, 0xa9, 0x19, 0xa1, 0xd0, 0x3f, 0x86, 0xc6, 0xa9, 0x4a, 0x32,
0x15, 0x38, 0x62, 0xeb, 0x0d, 0x18, 0x78, 0xc5, 0x19, 0xb8, 0x90, 0x8e, 0xaf, 0xf4, 0xcc, 0xab,
0xf2, 0xf5, 0xba, 0xda, 0x80, 0x79, 0x1e, 0xe8, 0x65, 0x08, 0xe6, 0x4b, 0xfc, 0x4f, 0x07, 0xee,
0x69, 0x4f, 0x34, 0xa5, 0x5d, 0x84, 0xf1, 0xae, 0xa7, 0x8a, 0xa1, 0xc9, 0x9d, 0x97, 0x30, 0xef,
0xf2, 0x79, 0x40, 0xfb, 0x6a, 0x5c, 0x35, 0x60, 0x9c, 0x42, 0xcf, 0x4f, 0x98, 0x0c, 0x11, 0x29,
0x4e, 0x09, 0x28, 0x1f, 0x63, 0x64, 0x64, 0x35, 0x0a, 0x7b, 0x9d, 0x26, 0xd1, 0x20, 0x9f, 0x35,
0xf8, 0x37, 0x97, 0x80, 0xdb, 0x8d, 0xa5, 0xa9, 0x8a, 0x9b, 0x7c, 0xc9, 0x43, 0x3b, 0x65, 0xac,
0xa7, 0x12, 0xdb, 0xbc, 0x10, 0x4f, 0x83, 0xe0, 0x4f, 0x84, 0x63, 0x13, 0x96, 0x7a, 0x34, 0xfc,
0x42, 0x28, 0x79, 0x15, 0x1a, 0xfc, 0xb0, 0x74, 0x4a, 0x97, 0xc8, 0x85, 0xb8, 0xb5, 0x94, 0x42,
0x7c, 0xe3, 0x8f, 0x61, 0x85, 0xb0, 0x58, 0x9e, 0x25, 0x2c, 0x1d, 0x06, 0xd5, 0xce, 0x54, 0x75,
0xf4, 0x8c, 0x5f, 0x1b, 0xeb, 0xd7, 0xe6, 0x58, 0x4e, 0x89, 0x85, 0x3a, 0xd0, 0x4a, 0xcc, 0x0b,
0x52, 0x6b, 0xf4, 0xb4, 0xee, 0x27, 0x13, 0xf8, 0xf8, 0x31, 0x8f, 0xba, 0x8b, 0xbd, 0x90, 0x76,
0x03, 0x96, 0xff, 0x3b, 0x52, 0x88, 0x58, 0xd3, 0x44, 0xc4, 0xfb, 0xe2, 0xf1, 0x98, 0x37, 0xc5,
0xd7, 0x0b, 0xb3, 0x9f, 0x1e, 0x1e, 0x08, 0x61, 0x16, 0x88, 0xf8, 0xe6, 0x09, 0x75, 0x90, 0xf6,
0xd5, 0xd0, 0xc4, 0x3f, 0x71, 0x47, 0x84, 0xba, 0x79, 0xe9, 0x16, 0xcc, 0x27, 0x4a, 0x06, 0xf3,
0x5d, 0xcb, 0xb8, 0x94, 0xe4, 0x48, 0xf8, 0x4f, 0xe5, 0x8c, 0x7a, 0xec, 0xf7, 0x43, 0x9a, 0x0d,
0x13, 0x76, 0x44, 0x13, 0x3a, 0xe0, 0x36, 0x95, 0x5e, 0x78, 0x32, 0x8e, 0x99, 0x52, 0x98, 0x06,
0x41, 0x1f, 0x00, 0xf0, 0x98, 0xea, 0x8a, 0xfc, 0xa6, 0x14, 0x56, 0x91, 0xf8, 0x34, 0x24, 0xf4,
0x31, 0x2c, 0x25, 0x5a, 0x12, 0x4d, 0x55, 0x85, 0xae, 0x4c, 0xb0, 0x26, 0x26, 0xfe, 0xa3, 0x03,
0xab, 0x3f, 0xa2, 0x41, 0xc0, 0x32, 0x15, 0xee, 0xb9, 0xc0, 0x0f, 0x01, 0x2e, 0x7d, 0x76, 0xa5,
0xba, 0x10, 0x59, 0x6e, 0x34, 0x08, 0x8f, 0x66, 0xb1, 0x4a, 0xfc, 0xcb, 0x83, 0x22, 0xf4, 0x74,
0x10, 0xc7, 0x48, 0x63, 0x16, 0xf6, 0x14, 0x09, 0xf9, 0xaf, 0x83, 0x0e, 0x12, 0x41, 0x26, 0x96,
0x8a, 0x88, 0x7c, 0xc5, 0x36, 0x60, 0xf8, 0xeb, 0x9a, 0xc8, 0x7b, 0x32, 0x29, 0xe4, 0xa1, 0x7c,
0x53, 0xf3, 0x60, 0xea, 0xb8, 0x36, 0xa1, 0xe3, 0x69, 0xb3, 0x46, 0x3e, 0x41, 0xcf, 0x6a, 0x13,
0x74, 0x55, 0xc4, 0xda, 0x7f, 0x41, 0x99, 0x93, 0x1b, 0xd8, 0x93, 0x9b, 0x6a, 0x2c, 0x65, 0x3a,
0x58, 0x2c, 0x1a, 0x4b, 0x2f, 0xef, 0xdb, 0x54, 0x43, 0xd3, 0x34, 0x1a, 0x1a, 0xa3, 0x99, 0x5d,
0xb2, 0x9a, 0xd9, 0x27, 0xbf, 0xab, 0xc1, 0xbc, 0xf6, 0x2f, 0xea, 0xf1, 0x59, 0x74, 0xa5, 0x94,
0xc3, 0x55, 0xdf, 0x2a, 0x2c, 0x7f, 0x71, 0x9c, 0x25, 0x7e, 0xd8, 0x6f, 0xdf, 0x2b, 0x43, 0xce,
0x1a, 0x4f, 0xf1, 0x0c, 0xfa, 0x01, 0x2c, 0xea, 0xc1, 0xbc, 0x56, 0x9e, 0xd6, 0xc0, 0xed, 0x35,
0x3b, 0x6a, 0x05, 0x18, 0xcf, 0xa0, 0x5d, 0x58, 0x32, 0x83, 0xe5, 0x9d, 0x92, 0x80, 0xb1, 0xd1,
0x2e, 0x37, 0xcc, 0xf0, 0xc2, 0x33, 0xe8, 0x05, 0xac, 0x4a, 0x1b, 0x13, 0x7a, 0xa5, 0xa5, 0x6a,
0x54, 0x32, 0x6e, 0xfb, 0x40, 0xbb, 0xa2, 0xe2, 0xe2, 0x99, 0xee, 0x9c, 0xf8, 0xc7, 0xfb, 0x7b,
0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x61, 0xaa, 0x59, 0x2a, 0x1f, 0x00, 0x00,
func init() { proto.RegisterFile("privacy.proto", fileDescriptor_privacy_6ecd2799f7ad9b76) }
var fileDescriptor_privacy_6ecd2799f7ad9b76 = []byte{
// 2329 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0xcb, 0x6f, 0x1c, 0x49,
0xf9, 0xee, 0x79, 0xd8, 0xee, 0xcf, 0x63, 0x7b, 0x52, 0xb1, 0xbd, 0xce, 0x24, 0x8a, 0xfc, 0xab,
0x5d, 0xe5, 0x17, 0x16, 0x64, 0xb4, 0xc1, 0xd2, 0x3e, 0x08, 0x5a, 0x3c, 0x8e, 0x93, 0x58, 0xde,
0xc4, 0xa6, 0xec, 0x15, 0x0f, 0x01, 0x52, 0x4d, 0x4f, 0xd9, 0x6e, 0xb9, 0xa7, 0xbb, 0xdd, 0xdd,
0x63, 0xcf, 0x1c, 0xd0, 0x72, 0x5a, 0x71, 0xe0, 0xc0, 0x61, 0x05, 0x07, 0x24, 0x6e, 0xf0, 0x47,
0x70, 0x87, 0x13, 0xe2, 0xc0, 0x7f, 0xc0, 0x3f, 0xc0, 0x7f, 0x80, 0x84, 0xea, 0xd1, 0xdd, 0x55,
0x35, 0x3d, 0x76, 0x96, 0x98, 0xcb, 0xa8, 0xeb, 0xab, 0xaf, 0xbe, 0xfa, 0xde, 0x8f, 0x1a, 0x58,
0x8c, 0x13, 0xff, 0x92, 0x7a, 0xe3, 0xcd, 0x38, 0x89, 0xb2, 0x08, 0x35, 0xb3, 0x71, 0xcc, 0xd2,
0x4e, 0xcb, 0x8b, 0x06, 0x83, 0x28, 0x94, 0xc0, 0xce, 0x9d, 0x2c, 0xa1, 0x61, 0x4a, 0xbd, 0xcc,
0xcf, 0x41, 0xf8, 0x5f, 0x0e, 0x2c, 0x1e, 0xca, 0x93, 0xdb, 0x02, 0x8e, 0x3e, 0x85, 0xa5, 0x78,
0xd8, 0x0b, 0x7c, 0xef, 0x89, 0xa2, 0xb8, 0xee, 0x6c, 0x38, 0x8f, 0x17, 0x9e, 0xac, 0x6e, 0x0a,
0x92, 0x9b, 0x87, 0x72, 0x53, 0x1d, 0x7a, 0x39, 0x43, 0x2c, 0x74, 0xd4, 0x85, 0x65, 0xf5, 0x59,
0x50, 0xa8, 0x09, 0x0a, 0x6b, 0x39, 0x05, 0xb5, 0x5b, 0x92, 0xb0, 0x0f, 0x08, 0x26, 0x72, 0x90,
0xa0, 0xbe, 0x5e, 0x37, 0x99, 0xc8, 0x49, 0x88, 0x4d, 0xc1, 0x84, 0x81, 0x8e, 0x96, 0xa0, 0x96,
0x8d, 0xd7, 0x1b, 0x1b, 0xce, 0xe3, 0x26, 0xa9, 0x65, 0xe3, 0xee, 0x1c, 0x34, 0x2f, 0x69, 0x30,
0x64, 0xf8, 0x4f, 0x0e, 0x2c, 0x99, 0x22, 0xa0, 0x07, 0xe0, 0x66, 0xd1, 0x39, 0x0b, 0x43, 0x3a,
0x60, 0x42, 0x58, 0x97, 0x94, 0x00, 0xb4, 0x06, 0xb3, 0x74, 0x10, 0x0d, 0xc3, 0x4c, 0x48, 0x51,
0x27, 0x6a, 0x85, 0x10, 0x34, 0xc2, 0x28, 0x63, 0xeb, 0x4d, 0x71, 0x40, 0x7c, 0xa3, 0x6f, 0xc1,
0x6c, 0x34, 0xcc, 0xe2, 0x61, 0xb6, 0x3e, 0x27, 0xd8, 0x5d, 0x31, 0xd9, 0x3d, 0x10, 0x7b, 0x44,
0xe1, 0xf0, 0x7b, 0x69, 0x9a, 0xb2, 0x6c, 0x77, 0xc4, 0xbc, 0xf5, 0x79, 0x79, 0x6f, 0x01, 0xc0,
0xff, 0x70, 0x60, 0xd9, 0xd2, 0xd4, 0x2d, 0x72, 0xfa, 0x0d, 0x68, 0xfa, 0x21, 0x67, 0x74, 0x56,
0x30, 0x7a, 0xd7, 0x64, 0x74, 0x8f, 0x6f, 0x11, 0x89, 0x71, 0xab, 0x42, 0xfd, 0x93, 0x6b, 0xdf,
0xb0, 0xdd, 0x5b, 0xca, 0x54, 0xd7, 0x64, 0xe2, 0x36, 0x8f, 0x84, 0x40, 0x2e, 0xa9, 0x65, 0x51,
0x29, 0x63, 0xe3, 0x6b, 0xc8, 0xd8, 0x7c, 0x6b, 0x19, 0x77, 0x61, 0xf9, 0xf3, 0xe3, 0x1f, 0x1d,
0xbc, 0x08, 0xa2, 0x1e, 0x0d, 0xf6, 0xc2, 0x3e, 0x1b, 0x71, 0x29, 0xb2, 0xd1, 0x19, 0x4d, 0xcf,
0x04, 0xbf, 0x2d, 0xa2, 0x56, 0xa8, 0x03, 0xf3, 0xd1, 0x30, 0xf3, 0x39, 0x8e, 0xf2, 0xd5, 0x62,
0x8d, 0x7f, 0xe9, 0xc0, 0xfc, 0x3e, 0x93, 0x6c, 0x6a, 0x6a, 0x70, 0x0c, 0x35, 0x7c, 0x1f, 0x96,
0x87, 0xd9, 0x28, 0xd2, 0xee, 0x5a, 0xaf, 0x6d, 0xd4, 0xb5, 0x58, 0xb3, 0x38, 0x21, 0x36, 0x3a,
0x67, 0xe1, 0x9c, 0x8d, 0xf7, 0x06, 0xf4, 0x94, 0x29, 0xe6, 0x8a, 0x35, 0xfe, 0x2e, 0xb4, 0x74,
0x65, 0xa1, 0x6f, 0x0a, 0x5c, 0xa9, 0x53, 0x47, 0x5c, 0xb3, 0xac, 0xae, 0xc9, 0x19, 0x25, 0x05,
0x02, 0xde, 0x03, 0xf7, 0x9c, 0x29, 0xcd, 0x4d, 0xe5, 0xff, 0x3d, 0x58, 0x8c, 0x42, 0x96, 0xf9,
0x03, 0x16, 0x0f, 0x7b, 0xe7, 0x4c, 0x66, 0x8a, 0x16, 0x31, 0x81, 0xf8, 0x67, 0x45, 0x8e, 0x3a,
0x28, 0x0c, 0x40, 0xe2, 0x61, 0x6f, 0x9f, 0x8d, 0xb3, 0x91, 0xa0, 0xd8, 0x22, 0x25, 0x00, 0x6d,
0x8a, 0x9b, 0x95, 0x3d, 0xa5, 0x3a, 0xda, 0x8a, 0xcf, 0x82, 0x23, 0x52, 0xa2, 0xe0, 0x18, 0x56,
0x5e, 0x24, 0xd1, 0x30, 0xae, 0xb0, 0xda, 0xff, 0x46, 0xe9, 0xf8, 0xf7, 0x0e, 0x2c, 0x7e, 0x16,
0x79, 0x34, 0xe0, 0x98, 0x7b, 0x19, 0x1b, 0xf0, 0xbb, 0xce, 0x98, 0x7f, 0x7a, 0x56, 0xdc, 0x25,
0x57, 0x68, 0x1d, 0xe6, 0xb2, 0x91, 0xaf, 0xee, 0xe0, 0x0e, 0x92, 0x2f, 0x0d, 0xdf, 0xa9, 0x9b,
0xbe, 0xa3, 0xf9, 0x5b, 0xc3, 0xf0, 0xb7, 0x09, 0x75, 0x37, 0xab, 0xd4, 0xfd, 0x05, 0x2c, 0x11,
0x76, 0xc1, 0x59, 0x3b, 0x14, 0x2a, 0x4d, 0x8b, 0x18, 0x7d, 0x6d, 0xc7, 0x28, 0x07, 0xa0, 0x03,
0x58, 0x39, 0xad, 0xd0, 0x9f, 0x52, 0xca, 0x7d, 0xa5, 0x94, 0x2a, 0x15, 0x93, 0xca, 0x83, 0xf8,
0x5d, 0x58, 0x94, 0xc9, 0x61, 0x9f, 0x8d, 0x9f, 0xd1, 0x8c, 0xf2, 0x68, 0xef, 0xd3, 0x8c, 0x0a,
0xa7, 0x6b, 0x11, 0xf1, 0x8d, 0xb7, 0x61, 0xb9, 0x20, 0x29, 0xf9, 0x9c, 0x6a, 0xb0, 0x35, 0x98,
0x2d, 0xdc, 0x8b, 0x13, 0x50, 0x2b, 0x7c, 0xcc, 0x05, 0x4d, 0x75, 0x41, 0xbb, 0xd0, 0x3e, 0x35,
0x89, 0xa6, 0xca, 0xd3, 0xd7, 0x6c, 0x31, 0xe4, 0x36, 0x99, 0xc0, 0xc7, 0x3e, 0x2c, 0x13, 0x76,
0xa1, 0x1c, 0xf6, 0x98, 0x6b, 0xc9, 0x4c, 0x18, 0x8e, 0x95, 0x30, 0xd0, 0x06, 0x2c, 0x88, 0xc5,
0xd1, 0x78, 0xd0, 0x8b, 0x02, 0x61, 0x67, 0x97, 0xe8, 0x20, 0x4d, 0xb0, 0xba, 0x2e, 0x18, 0x7e,
0x0a, 0xad, 0x6d, 0xf1, 0xf5, 0x8c, 0x65, 0xd4, 0x0f, 0xa6, 0x2a, 0x60, 0x05, 0x9a, 0x9e, 0x96,
0x44, 0xe5, 0x02, 0xbf, 0x86, 0xbb, 0x84, 0xc5, 0xc1, 0x38, 0xaf, 0xff, 0x02, 0x37, 0x45, 0x1f,
0x42, 0x8b, 0x6a, 0x44, 0x95, 0xfc, 0x79, 0xf6, 0xd4, 0xef, 0x23, 0x06, 0x22, 0x26, 0x80, 0x12,
0x4e, 0x8f, 0x2b, 0x23, 0x3d, 0x38, 0x91, 0x98, 0xe8, 0x29, 0x2c, 0x05, 0xba, 0xab, 0xe7, 0x0a,
0xcd, 0x53, 0xac, 0x11, 0x07, 0xc4, 0xc2, 0xc5, 0x5f, 0x3a, 0xb0, 0x42, 0x98, 0xc7, 0xfc, 0x38,
0x9b, 0x48, 0x01, 0x6f, 0xa5, 0x52, 0x23, 0x49, 0xd4, 0x6f, 0x4e, 0x12, 0xbf, 0x71, 0x60, 0x51,
0x69, 0xe8, 0xe0, 0x84, 0xf3, 0x87, 0xb6, 0xc1, 0x95, 0xe2, 0xbf, 0xa2, 0xb1, 0x92, 0xe9, 0x5d,
0x43, 0x49, 0x0a, 0x51, 0xad, 0x5e, 0xd1, 0x78, 0x37, 0xcc, 0x92, 0x31, 0x29, 0x4f, 0x75, 0x9e,
0xc2, 0x92, 0xb9, 0x89, 0xda, 0x50, 0xe7, 0x7e, 0x2a, 0xcd, 0xc7, 0x3f, 0xb9, 0xed, 0x44, 0xe7,
0x92, 0xdb, 0x4e, 0x2c, 0x3e, 0xa9, 0x7d, 0xe4, 0xe0, 0xdf, 0x3a, 0xd0, 0x3e, 0xce, 0xa3, 0x30,
0xe7, 0xea, 0x99, 0x0a, 0xd5, 0xb4, 0xe4, 0xea, 0x91, 0xe2, 0xca, 0xc6, 0x95, 0x80, 0xb4, 0x64,
0xac, 0x38, 0xc8, 0x19, 0x33, 0x37, 0x75, 0xc6, 0xdc, 0x0a, 0xc6, 0x5c, 0x9d, 0xb1, 0x7d, 0x58,
0xb5, 0x42, 0x7a, 0xeb, 0x30, 0xf1, 0x65, 0x20, 0xaa, 0xbc, 0x24, 0xe9, 0x54, 0xd5, 0xc1, 0x9a,
0x55, 0x07, 0x7f, 0xed, 0xc0, 0x52, 0x5e, 0x5e, 0x4a, 0x32, 0x95, 0x6e, 0xfe, 0x7c, 0x5a, 0x62,
0x7e, 0x50, 0x9d, 0x98, 0x25, 0xb9, 0x9b, 0x6b, 0xa2, 0xab, 0xd5, 0xc4, 0x03, 0x58, 0x2e, 0xfc,
0xe3, 0x06, 0x76, 0x2a, 0x8b, 0x9b, 0x6b, 0x67, 0xdb, 0x17, 0x80, 0xf4, 0x22, 0xab, 0x68, 0x7e,
0x30, 0x51, 0x6a, 0x57, 0xad, 0x52, 0xab, 0x98, 0x2f, 0x0b, 0xae, 0x0f, 0x77, 0x8d, 0x10, 0x51,
0x94, 0x26, 0x6a, 0xa5, 0xab, 0xd7, 0xca, 0xad, 0xc9, 0x5a, 0xb9, 0x66, 0x87, 0x81, 0xba, 0x49,
0x0b, 0x86, 0xaf, 0x1c, 0x58, 0x31, 0x9b, 0xe8, 0xf2, 0xb2, 0x5b, 0x6a, 0x50, 0x9f, 0x58, 0x5d,
0x67, 0xa7, 0xaa, 0x23, 0x53, 0x9c, 0x29, 0x4c, 0xfc, 0x57, 0x07, 0x56, 0xad, 0x96, 0xf9, 0xd6,
0xf9, 0xfa, 0xb6, 0xd9, 0x38, 0xdf, 0xab, 0x68, 0x2a, 0x15, 0x57, 0xaa, 0xb5, 0xfc, 0x6f, 0x04,
0xf9, 0x0b, 0xd7, 0xaf, 0xd1, 0x26, 0xdf, 0x8a, 0x1c, 0xf5, 0x2a, 0x39, 0x1a, 0x5f, 0x5b, 0x8e,
0xe6, 0x1b, 0xcb, 0xf1, 0x65, 0xad, 0xf0, 0x49, 0x39, 0x5d, 0x2a, 0x31, 0x76, 0xa7, 0xcc, 0x98,
0xf7, 0x2b, 0x67, 0x4c, 0x79, 0xa8, 0x62, 0xd2, 0x7c, 0x39, 0x6d, 0xd2, 0x7c, 0x50, 0x3d, 0x69,
0x16, 0x84, 0x26, 0xe6, 0xcd, 0xdd, 0x29, 0xf3, 0xe6, 0xfd, 0xca, 0x79, 0x53, 0x63, 0xe8, 0x0d,
0xa7, 0xce, 0x9f, 0x02, 0xd2, 0x4b, 0xed, 0xe1, 0xf9, 0x21, 0xf5, 0x13, 0xf4, 0x08, 0x96, 0xd2,
0xb3, 0xe8, 0xea, 0x68, 0xe8, 0x79, 0x2c, 0x4d, 0x4f, 0x86, 0x81, 0x50, 0xc3, 0x3c, 0xb1, 0xa0,
0xe8, 0x21, 0x80, 0x4c, 0x16, 0x31, 0xf5, 0x13, 0x41, 0xde, 0x25, 0x1a, 0x04, 0xff, 0x9c, 0xd7,
0x48, 0xd1, 0x71, 0x74, 0x69, 0xb0, 0xb5, 0xdd, 0xef, 0x27, 0xb2, 0xed, 0x40, 0xd0, 0xa0, 0xfd,
0x7e, 0xa2, 0x1c, 0x45, 0x7c, 0xf3, 0xac, 0x2d, 0x1c, 0x26, 0xcf, 0xda, 0xd9, 0x64, 0x83, 0x52,
0xb7, 0x27, 0x9a, 0x1f, 0x98, 0x8d, 0x42, 0x97, 0x06, 0x34, 0xf4, 0x18, 0x2f, 0xb2, 0x2a, 0x95,
0x69, 0xb7, 0xe8, 0x20, 0xde, 0xbd, 0xf6, 0x24, 0xb2, 0xf2, 0xc8, 0x7c, 0x89, 0xff, 0x5e, 0x2b,
0x06, 0xc1, 0x67, 0xdd, 0xa3, 0x2c, 0x4a, 0x98, 0x55, 0x1c, 0xca, 0xa6, 0xd5, 0xf0, 0xf9, 0xda,
0x74, 0x9f, 0x37, 0x5a, 0x23, 0x55, 0x52, 0xf6, 0xac, 0xd1, 0x4a, 0xe6, 0x77, 0x0c, 0xad, 0x6c,
0x54, 0x74, 0x98, 0x44, 0x75, 0xc1, 0x06, 0x0c, 0xbd, 0x0f, 0x6d, 0x25, 0x49, 0x01, 0x14, 0x21,
0xdf, 0x22, 0x13, 0x70, 0xae, 0xd3, 0xe8, 0x2a, 0x64, 0x89, 0x88, 0x70, 0x97, 0xc8, 0x85, 0xd6,
0xd2, 0xcf, 0x4f, 0x6b, 0xe9, 0x5d, 0xb3, 0xa5, 0x7f, 0x00, 0x6e, 0x2f, 0x88, 0xbc, 0x73, 0xa1,
0x04, 0x90, 0x63, 0x4d, 0x01, 0x30, 0x6d, 0xb4, 0x60, 0xdb, 0xe8, 0x35, 0x34, 0x44, 0xfd, 0x9f,
0x56, 0x8c, 0x36, 0xc1, 0xe5, 0x65, 0xae, 0x4b, 0x53, 0xdf, 0x53, 0x51, 0xd2, 0xd6, 0xaa, 0xa2,
0x80, 0x93, 0x12, 0x05, 0xc7, 0xb0, 0xc4, 0xe1, 0x2f, 0xe9, 0x25, 0x3b, 0x1e, 0xbd, 0xe4, 0xf7,
0x5f, 0xd3, 0x5d, 0x67, 0x02, 0x43, 0x19, 0x47, 0xad, 0xcc, 0x1b, 0xeb, 0x37, 0xdf, 0xf8, 0x3e,
0x34, 0x45, 0xe7, 0x88, 0xfe, 0x0f, 0x9a, 0x1c, 0x9a, 0x37, 0x8a, 0x0b, 0xda, 0x21, 0x22, 0x77,
0x30, 0x91, 0x33, 0x76, 0xc9, 0x5d, 0x8a, 0x3e, 0x95, 0xc5, 0x5f, 0x03, 0x59, 0x85, 0xd3, 0x3c,
0x40, 0x6c, 0x6c, 0xfc, 0x2b, 0x87, 0x07, 0xe9, 0x85, 0x3d, 0x05, 0xbe, 0x6d, 0xa3, 0xd9, 0x81,
0xf9, 0x81, 0x3f, 0xda, 0x29, 0x5c, 0xb4, 0x49, 0x8a, 0xb5, 0xa6, 0xd2, 0xc6, 0x46, 0x5d, 0xeb,
0xeb, 0x53, 0x70, 0x0b, 0x15, 0x55, 0x8d, 0x9b, 0x8e, 0xf1, 0x9e, 0x76, 0xe3, 0x8c, 0x5f, 0x36,
0x22, 0x87, 0x55, 0x53, 0xb6, 0x04, 0x62, 0x02, 0x6d, 0xd1, 0x77, 0x8b, 0xce, 0x68, 0x7b, 0x60,
0x31, 0x68, 0xda, 0xfc, 0x51, 0x6e, 0x22, 0x73, 0xbc, 0x2e, 0xed, 0xaa, 0xec, 0xf4, 0x63, 0xae,
0xd2, 0xd4, 0x56, 0xe9, 0x0e, 0xb4, 0xf9, 0xb6, 0x7e, 0x93, 0x6a, 0xc1, 0xdf, 0xd1, 0x08, 0xe9,
0xdb, 0x64, 0xe2, 0x00, 0xfe, 0xb3, 0x03, 0x77, 0x9e, 0x73, 0x7f, 0x39, 0xe2, 0x3f, 0x7b, 0xe1,
0x41, 0xc8, 0x8e, 0x47, 0x37, 0x17, 0xc8, 0x94, 0x85, 0x7d, 0x96, 0xe4, 0xae, 0x2a, 0x57, 0x1c,
0xce, 0x46, 0xb1, 0x9f, 0xb0, 0x3c, 0x89, 0xc8, 0x95, 0x35, 0x47, 0x97, 0xfd, 0x6a, 0xe1, 0xa1,
0xcd, 0x69, 0x1e, 0x6a, 0xba, 0xcd, 0xac, 0x1d, 0xad, 0x3f, 0x81, 0x16, 0x61, 0x34, 0x28, 0xde,
0x77, 0x30, 0xb4, 0x12, 0x46, 0x03, 0x51, 0x69, 0xf3, 0x36, 0xbb, 0x49, 0x0c, 0x18, 0xaf, 0x16,
0x79, 0xe7, 0x98, 0xf8, 0x97, 0xa5, 0x19, 0x2d, 0x28, 0xde, 0x02, 0x28, 0xec, 0x90, 0x96, 0x96,
0x72, 0xae, 0xb7, 0xd4, 0xdf, 0x6a, 0xb0, 0xb6, 0x93, 0x30, 0x9a, 0xb1, 0xe3, 0xf2, 0x91, 0x78,
0x87, 0x7a, 0x67, 0x4c, 0x6f, 0xfd, 0x5b, 0xb2, 0xf5, 0x7f, 0x08, 0xe0, 0x09, 0x5c, 0x7e, 0xaf,
0x4a, 0xed, 0x1a, 0x84, 0xfb, 0x7c, 0xea, 0x9f, 0x86, 0x62, 0x57, 0x6a, 0xb4, 0x58, 0x0b, 0x1b,
0x64, 0x34, 0x1b, 0xa6, 0x2a, 0x2d, 0xab, 0x15, 0xda, 0x82, 0x05, 0xed, 0x79, 0x5a, 0x35, 0x19,
0x28, 0x1f, 0x5d, 0xca, 0x1d, 0xa2, 0xa3, 0x69, 0x16, 0x9d, 0x35, 0x2c, 0xfa, 0xa1, 0x54, 0x68,
0xd1, 0x43, 0xcf, 0x19, 0x43, 0xac, 0xae, 0x7b, 0x62, 0x20, 0xa2, 0xff, 0xcf, 0xf5, 0x35, 0x2f,
0x4e, 0xdc, 0xb1, 0xf5, 0x95, 0x6a, 0x06, 0x2e, 0x3d, 0xcd, 0xb5, 0x3c, 0x0d, 0x77, 0xc5, 0x1b,
0x8a, 0xd0, 0xdf, 0xf1, 0xe8, 0x33, 0x3f, 0xcd, 0x2a, 0x8b, 0xf1, 0xb5, 0xa5, 0x0d, 0x7f, 0x04,
0x6d, 0x51, 0x76, 0x75, 0x2a, 0xef, 0x41, 0x3d, 0x1b, 0xe5, 0xc6, 0xac, 0xd2, 0x0e, 0xdf, 0xc6,
0xbf, 0x80, 0x3b, 0xe5, 0x13, 0xc4, 0xb6, 0xe7, 0xe5, 0x5d, 0xe0, 0x1b, 0x76, 0x03, 0x1b, 0xb0,
0xd0, 0xf7, 0xd3, 0x38, 0xa0, 0xe3, 0x41, 0xd4, 0x67, 0x2a, 0x6b, 0xe9, 0x20, 0xd3, 0xbb, 0x1b,
0xb6, 0x77, 0x7f, 0x61, 0x3d, 0x2c, 0x28, 0x06, 0x70, 0xe9, 0x8a, 0xdc, 0xb6, 0x2d, 0x4d, 0xb5,
0x85, 0x56, 0x31, 0x34, 0x4f, 0x54, 0x62, 0xa9, 0xc0, 0x11, 0x5b, 0x37, 0xb3, 0x87, 0x5f, 0x71,
0x06, 0x2e, 0xa4, 0x3b, 0x2b, 0xed, 0xf1, 0x3a, 0x7d, 0x7d, 0x72, 0x58, 0x87, 0x39, 0x1e, 0xdc,
0x65, 0x60, 0xe5, 0x4b, 0xfc, 0x6f, 0x07, 0xee, 0x69, 0x4f, 0x3a, 0xa5, 0xb6, 0x85, 0x49, 0xae,
0xa7, 0x8a, 0xa1, 0xc5, 0x5d, 0x92, 0x30, 0xef, 0xf2, 0x79, 0x40, 0x4f, 0xd5, 0x78, 0x6b, 0xc0,
0x38, 0x85, 0xbe, 0x9f, 0x30, 0xe9, 0xf8, 0x52, 0x9c, 0x12, 0x50, 0x3e, 0xde, 0xc8, 0x78, 0x69,
0x16, 0xd6, 0x3c, 0x49, 0xa2, 0x41, 0x3e, 0x9b, 0xf0, 0x6f, 0x2e, 0x01, 0xb7, 0x2a, 0x4b, 0x53,
0x15, 0x0d, 0xf9, 0x92, 0x07, 0x6c, 0xca, 0x58, 0x5f, 0x25, 0xb3, 0x39, 0x21, 0x9e, 0x06, 0xb9,
0xe1, 0x45, 0xfb, 0x13, 0xe1, 0xcc, 0x84, 0xa5, 0x1e, 0x0d, 0x3f, 0x17, 0x26, 0x58, 0x81, 0x26,
0x27, 0x2d, 0x1d, 0xd1, 0x25, 0x72, 0x21, 0x78, 0x2a, 0x65, 0x14, 0xdf, 0xf8, 0x63, 0x58, 0x26,
0x2c, 0x96, 0x67, 0x09, 0x4b, 0x87, 0x41, 0xb5, 0x23, 0x56, 0x1d, 0x3d, 0xe3, 0xd7, 0xc6, 0xfa,
0xb5, 0x39, 0x96, 0x53, 0x62, 0xa1, 0x2e, 0xb4, 0x13, 0xf3, 0x82, 0xd4, 0x1a, 0x64, 0xad, 0xfb,
0xc9, 0x04, 0x3e, 0x7e, 0xcc, 0x23, 0xed, 0x62, 0x37, 0xa4, 0xbd, 0x80, 0xe5, 0xff, 0xb5, 0x14,
0x22, 0xd6, 0x34, 0x11, 0xf1, 0x9e, 0x78, 0x8a, 0xe6, 0x2d, 0xf6, 0xf5, 0xc2, 0xec, 0xa5, 0x07,
0xfb, 0x42, 0x98, 0x79, 0x22, 0xbe, 0x79, 0x12, 0x1d, 0xa4, 0xa7, 0xaa, 0xb7, 0xe6, 0x9f, 0xb8,
0x2b, 0xc2, 0xdb, 0xbc, 0x74, 0x13, 0xe6, 0x12, 0x25, 0x83, 0xf9, 0x4a, 0x66, 0x5c, 0x4a, 0x72,
0x24, 0xfc, 0xc7, 0x72, 0xe2, 0x3d, 0xf2, 0x4f, 0x43, 0x9a, 0x0d, 0x13, 0x76, 0x48, 0x13, 0x3a,
0xe0, 0x16, 0x97, 0x3e, 0x7a, 0x3c, 0x8e, 0x99, 0x52, 0x98, 0x06, 0x41, 0x1f, 0x00, 0xf0, 0x88,
0xeb, 0x89, 0x9c, 0xa6, 0x14, 0x56, 0x91, 0xec, 0x34, 0x24, 0xf4, 0x31, 0x2c, 0x26, 0x5a, 0xe2,
0x4c, 0x55, 0xcd, 0xae, 0x4c, 0xaa, 0x26, 0x26, 0xfe, 0x83, 0x03, 0x2b, 0x3f, 0xa4, 0x41, 0xc0,
0x32, 0x95, 0x0c, 0x72, 0x81, 0x1f, 0x02, 0x5c, 0xfa, 0xec, 0x4a, 0xf5, 0x25, 0xb2, 0xc4, 0x68,
0x10, 0x1e, 0xeb, 0x62, 0x95, 0xf8, 0x97, 0xfb, 0x45, 0x60, 0xea, 0x20, 0x8e, 0x91, 0xc6, 0x2c,
0xec, 0x2b, 0x12, 0xf2, 0x3f, 0x0c, 0x1d, 0x24, 0x42, 0x50, 0x2c, 0x15, 0x11, 0xf9, 0x26, 0x6e,
0xc0, 0xf0, 0x57, 0x35, 0xd1, 0xfc, 0xc9, 0x94, 0x91, 0x07, 0xfa, 0x4d, 0xed, 0x84, 0xa9, 0xe3,
0xda, 0x84, 0x8e, 0xa7, 0xcd, 0x26, 0xf9, 0x3c, 0xde, 0xd0, 0xe6, 0xf1, 0xaa, 0x78, 0xb6, 0xff,
0xd0, 0x32, 0xe7, 0x40, 0xb0, 0xe7, 0x40, 0xd5, 0x6a, 0xca, 0x64, 0xb1, 0x50, 0xb4, 0x9a, 0x5e,
0xde, 0xc9, 0xa9, 0x16, 0xa7, 0x65, 0xb4, 0x38, 0x46, 0xe4, 0x2f, 0x5a, 0x91, 0xff, 0xe4, 0x77,
0x35, 0x98, 0xd3, 0xfe, 0x93, 0x3d, 0x3a, 0x8b, 0xae, 0x94, 0x72, 0xb8, 0xea, 0xdb, 0x85, 0xe5,
0x2f, 0x8e, 0xb2, 0xc4, 0x0f, 0x4f, 0x3b, 0xf7, 0xca, 0x90, 0xb3, 0x86, 0x5d, 0x3c, 0x83, 0xbe,
0x07, 0x0b, 0x7a, 0x30, 0xaf, 0x96, 0xa7, 0x35, 0x70, 0x67, 0xd5, 0x8e, 0x5a, 0x01, 0xc6, 0x33,
0x68, 0x07, 0x16, 0xcd, 0x60, 0x79, 0xa7, 0x24, 0x60, 0x6c, 0x74, 0xca, 0x0d, 0x33, 0xbc, 0xf0,
0x0c, 0x7a, 0x01, 0x2b, 0xd2, 0xc6, 0x84, 0x5e, 0x69, 0x89, 0x1c, 0x95, 0x8c, 0xdb, 0x3e, 0xd0,
0xa9, 0xa8, 0xb2, 0x78, 0xa6, 0x37, 0x2b, 0xfe, 0x3f, 0xff, 0xce, 0x7f, 0x02, 0x00, 0x00, 0xff,
0xff, 0x60, 0x83, 0x9e, 0xc4, 0x78, 0x1f, 0x00, 0x00,
}
......@@ -67,7 +67,7 @@ func (policy *privacyPolicy) On_CreateTransaction(req *privacytypes.ReqCreatePri
return reply, err
}
func (policy *privacyPolicy) On_ShowPrivacyAccountInfo(req *privacytypes.ReqPPrivacyAccount) (types.Message, error) {
func (policy *privacyPolicy) On_ShowPrivacyAccountInfo(req *privacytypes.ReqPrivacyAccount) (types.Message, error) {
policy.getWalletOperate().GetMutex().Lock()
defer policy.getWalletOperate().GetMutex().Unlock()
reply, err := policy.getPrivacyAccountInfo(req)
......
......@@ -96,45 +96,37 @@ func calcAddrKey(addr string) []byte {
}
// calcPrivacyUTXOPrefix4Addr 获取指定地址下可用UTXO信息索引的KEY值前缀
func calcPrivacyUTXOPrefix4Addr(token, addr string) []byte {
return []byte(fmt.Sprintf("%s-%s-%s-", AvailUTXOs, token, addr))
func calcPrivacyUTXOPrefix4Addr(assetExec, token, addr string) []byte {
return []byte(fmt.Sprintf("%s-%s-%s-%s-", AvailUTXOs, assetExec, token, addr))
}
// calcFTXOsKeyPrefix 获取指定地址下由于交易未被确认而让交易使用到的UTXO处于冻结状态信息的KEY值前缀
func calcFTXOsKeyPrefix(token, addr string) []byte {
var prefix string
if len(token) > 0 && len(addr) > 0 {
prefix = fmt.Sprintf("%s:%s-%s-", FrozenUTXOs, token, addr)
} else if len(token) > 0 {
prefix = fmt.Sprintf("%s:%s-", FrozenUTXOs, token)
} else {
prefix = fmt.Sprintf("%s:", FrozenUTXOs)
}
return []byte(prefix)
func calcFTXOsKeyPrefix(assetExec, token, addr string) []byte {
return []byte(fmt.Sprintf("%s:%s-%s-%s-", FrozenUTXOs, assetExec, token, addr))
}
// calcSendPrivacyTxKey 计算以指定地址作为发送地址的交易信息索引
// addr为发送地址
// key为通过calcTxKey(heightstr)计算出来的值
func calcSendPrivacyTxKey(tokenname, addr, key string) []byte {
return []byte(fmt.Sprintf("%s:%s-%s-%s", SendPrivacyTx, tokenname, addr, key))
func calcSendPrivacyTxKey(assetExec, tokenname, addr, key string) []byte {
return []byte(fmt.Sprintf("%s:%s-%s-%s-%s", SendPrivacyTx, assetExec, tokenname, addr, key))
}
// calcRecvPrivacyTxKey 计算以指定地址作为接收地址的交易信息索引
// addr为接收地址
// key为通过calcTxKey(heightstr)计算出来的值
func calcRecvPrivacyTxKey(tokenname, addr, key string) []byte {
return []byte(fmt.Sprintf("%s:%s-%s-%s", RecvPrivacyTx, tokenname, addr, key))
func calcRecvPrivacyTxKey(assetExec, tokenname, addr, key string) []byte {
return []byte(fmt.Sprintf("%s:%s-%s-%s-%s", RecvPrivacyTx, assetExec, tokenname, addr, key))
}
// calcUTXOKey4TokenAddr 计算当前地址可用UTXO的Key健值
func calcUTXOKey4TokenAddr(token, addr, txhash string, index int) []byte {
return []byte(fmt.Sprintf("%s-%s-%s-%s-%d", AvailUTXOs, token, addr, txhash, index))
func calcUTXOKey4TokenAddr(assetExec, token, addr, txhash string, index int) []byte {
return []byte(fmt.Sprintf("%s-%s-%s-%s-%s-%d", AvailUTXOs, assetExec, token, addr, txhash, index))
}
// calcKey4FTXOsInTx 交易构建以后,将可用UTXO冻结的健值
func calcKey4FTXOsInTx(token, addr, txhash string) []byte {
return []byte(fmt.Sprintf("%s:%s-%s-%s", FrozenUTXOs, token, addr, txhash))
func calcKey4FTXOsInTx(assetExec, token, addr, txhash string) []byte {
return []byte(fmt.Sprintf("%s:%s-%s-%s-%s", FrozenUTXOs, assetExec, token, addr, txhash))
}
// calcRescanUtxosFlagKey 新账户导入时扫描区块上该地址相关的UTXO信息
......@@ -151,17 +143,17 @@ func calcKey4STXOsInTx(txhash string) []byte {
}
// calcSTXOTokenAddrTxKey 计算当前地址已花费的UTXO
func calcSTXOTokenAddrTxKey(token, addr, txhash string) []byte {
return []byte(fmt.Sprintf("%s-%s-%s-%s", PrivacySTXO, token, addr, txhash))
func calcSTXOTokenAddrTxKey(assetExec, token, addr, txhash string) []byte {
return []byte(fmt.Sprintf("%s-%s-%s-%s-%s", PrivacySTXO, assetExec, token, addr, txhash))
}
func calcSTXOPrefix4Addr(token, addr string) []byte {
return []byte(fmt.Sprintf("%s-%s-%s-", PrivacySTXO, token, addr))
func calcSTXOPrefix4Addr(assetExec, token, addr string) []byte {
return []byte(fmt.Sprintf("%s-%s-%s-%s-", PrivacySTXO, assetExec, token, addr))
}
// calcRevertSendTxKey 交易因为区块回退而将已经花费的UTXO移动到冻结UTXO队列的健值
func calcRevertSendTxKey(tokenname, addr, txhash string) []byte {
return []byte(fmt.Sprintf("%s:%s-%s-%s", RevertSendtx, tokenname, addr, txhash))
func calcRevertSendTxKey(assetExec, tokenname, addr, txhash string) []byte {
return []byte(fmt.Sprintf("%s:%s-%s-%s-%s", RevertSendtx, assetExec, tokenname, addr, txhash))
}
//通过height*100000+index 查询Tx交易信息
......
......@@ -252,7 +252,7 @@ func (policy *privacyPolicy) showPrivacyKeyPair(reqAddr *types.ReqString) (*priv
return replyPrivacyPkPair, nil
}
func (policy *privacyPolicy) getPrivacyAccountInfo(req *privacytypes.ReqPPrivacyAccount) (*privacytypes.ReplyPrivacyAccount, error) {
func (policy *privacyPolicy) getPrivacyAccountInfo(req *privacytypes.ReqPrivacyAccount) (*privacytypes.ReplyPrivacyAccount, error) {
addr := strings.Trim(req.GetAddr(), " ")
token := req.GetToken()
reply := &privacytypes.ReplyPrivacyAccount{}
......@@ -262,7 +262,7 @@ func (policy *privacyPolicy) getPrivacyAccountInfo(req *privacytypes.ReqPPrivacy
}
// 搜索可用余额
privacyDBStore, err := policy.store.listAvailableUTXOs(token, addr)
privacyDBStore, err := policy.store.listAvailableUTXOs(req.GetAssetExec(), token, addr)
if err != nil {
bizlog.Error("getPrivacyAccountInfo", "listAvailableUTXOs")
return nil, err
......@@ -286,7 +286,7 @@ func (policy *privacyPolicy) getPrivacyAccountInfo(req *privacytypes.ReqPPrivacy
// 搜索冻结余额
utxos = make([]*privacytypes.UTXO, 0)
ftxoslice, err := policy.store.listFrozenUTXOs(token, addr)
ftxoslice, err := policy.store.listFrozenUTXOs(req.GetAssetExec(), token, addr)
if err == nil && ftxoslice != nil {
for _, ele := range ftxoslice {
utxos = append(utxos, ele.Utxos...)
......@@ -302,11 +302,11 @@ func (policy *privacyPolicy) getPrivacyAccountInfo(req *privacytypes.ReqPPrivacy
// 优先选择UTXO高度与当前高度建个12个区块以上的UTXO
// 如果选择还不够则再从老到新选择12个区块内的UTXO
// 当该地址上的可用UTXO比较多时,可以考虑改进算法,优先选择币值小的,花掉小票,然后再选择币值接近的,减少找零,最后才选择大面值的找零
func (policy *privacyPolicy) selectUTXO(token, addr string, amount int64) ([]*txOutputInfo, error) {
func (policy *privacyPolicy) selectUTXO(assetExec, token, addr string, amount int64) ([]*txOutputInfo, error) {
if len(token) == 0 || len(addr) == 0 || amount <= 0 {
return nil, types.ErrInvalidParam
}
wutxos, err := policy.store.getPrivacyTokenUTXOs(token, addr)
wutxos, err := policy.store.getPrivacyTokenUTXOs(assetExec, token, addr)
if err != nil {
return nil, types.ErrInsufficientBalance
}
......@@ -364,7 +364,7 @@ buildInput 构建隐私交易的输入信息
func (policy *privacyPolicy) buildInput(privacykeyParirs *privacy.Privacy, buildInfo *buildInputInfo) (*privacytypes.PrivacyInput, []*privacytypes.UTXOBasics, []*privacytypes.RealKeyInput, []*txOutputInfo, error) {
operater := policy.getWalletOperate()
//挑选满足额度的utxo
selectedUtxo, err := policy.selectUTXO(buildInfo.assetSymbol, buildInfo.sender, buildInfo.amount)
selectedUtxo, err := policy.selectUTXO(buildInfo.assetExec, buildInfo.assetSymbol, buildInfo.sender, buildInfo.amount)
if err != nil {
bizlog.Error("buildInput", "Failed to selectOutput for amount", buildInfo.amount,
"Due to cause", err)
......@@ -632,7 +632,7 @@ func (policy *privacyPolicy) createPrivacy2PrivacyTx(req *privacytypes.ReqCreate
}
// 创建交易成功,将已经使用掉的UTXO冻结,需要注意此处获取的txHash和交易发送时的一致
policy.saveFTXOInfo(tx.GetExpire(), req.Tokenname, req.GetFrom(), hex.EncodeToString(tx.Hash()), selectedUtxo)
policy.saveFTXOInfo(tx.GetExpire(), req.GetAssetExec(), req.Tokenname, req.GetFrom(), hex.EncodeToString(tx.Hash()), selectedUtxo)
tx.Signature = &types.Signature{
Signature: types.Encode(&privacytypes.PrivacySignatureParam{
ActionType: action.Ty,
......@@ -721,7 +721,7 @@ func (policy *privacyPolicy) createPrivacy2PublicTx(req *privacytypes.ReqCreateP
}
}
// 创建交易成功,将已经使用掉的UTXO冻结,需要注意此处获取的txHash和交易发送时的一致
policy.saveFTXOInfo(tx.GetExpire(), req.Tokenname, req.GetFrom(), hex.EncodeToString(tx.Hash()), selectedUtxo)
policy.saveFTXOInfo(tx.GetExpire(), req.GetAssetExec(), req.Tokenname, req.GetFrom(), hex.EncodeToString(tx.Hash()), selectedUtxo)
tx.Signature = &types.Signature{
Signature: types.Encode(&privacytypes.PrivacySignatureParam{
ActionType: action.Ty,
......@@ -732,9 +732,9 @@ func (policy *privacyPolicy) createPrivacy2PublicTx(req *privacytypes.ReqCreateP
return tx, nil
}
func (policy *privacyPolicy) saveFTXOInfo(expire int64, assertSymbol, sender, txhash string, selectedUtxos []*txOutputInfo) {
func (policy *privacyPolicy) saveFTXOInfo(expire int64, assetExec, assetSymbol, sender, txhash string, selectedUtxos []*txOutputInfo) {
//将已经作为本次交易输入的utxo进行冻结,防止产生双花交易
policy.store.moveUTXO2FTXO(expire, assertSymbol, sender, txhash, selectedUtxos)
policy.store.moveUTXO2FTXO(expire, assetExec, assetSymbol, sender, txhash, selectedUtxos)
//TODO:需要加入超时处理,需要将此处的txhash写入到数据库中,以免钱包瞬间奔溃后没有对该笔隐私交易的记录,
//TODO:然后当该交易得到执行之后,没法将FTXO转化为STXO,added by hezhengjun on 2018.6.5
}
......@@ -815,7 +815,7 @@ func (policy *privacyPolicy) reqUtxosByAddr(addrs []string) {
} else {
storeAddrs = append(storeAddrs, addrs...)
}
policy.store.saveREscanUTXOsAddresses(storeAddrs)
policy.store.saveREscanUTXOsAddresses(storeAddrs, privacytypes.UtxoFlagScaning)
cfg := policy.getWalletOperate().GetAPI().GetConfig()
reqAddr := address.ExecAddress(cfg.ExecName(privacytypes.PrivacyX))
......@@ -881,7 +881,7 @@ func (policy *privacyPolicy) reqUtxosByAddr(addrs []string) {
policy.SetRescanFlag(privacytypes.UtxoFlagNoScan)
// 删除privacyInput
policy.deleteScanPrivacyInputUtxo()
policy.store.saveREscanUTXOsAddresses(storeAddrs)
policy.store.saveREscanUTXOsAddresses(storeAddrs, privacytypes.UtxoFlagScanEnd)
}
//TODO:input也可能时混淆的utxo, 需要增加判定实际的utxo
......@@ -906,7 +906,7 @@ func (policy *privacyPolicy) getPrivacyTxDetailByHashs(ReqHashes *types.ReqHashe
var privacyInfo []addrAndprivacy
if len(addrs) > 0 {
for _, addr := range addrs {
if privacy, err := policy.getPrivacykeyPair(addr); err != nil {
if privacy, err := policy.getPrivacykeyPair(addr); err == nil {
priInfo := &addrAndprivacy{
Addr: &addr,
PrivacyKeyPair: privacy,
......@@ -925,10 +925,7 @@ func (policy *privacyPolicy) showPrivacyAccountsSpend(req *privacytypes.ReqPrivB
if ok, err := policy.isRescanUtxosFlagScaning(); ok {
return nil, err
}
addr := req.GetAddr()
token := req.GetToken()
utxoHaveTxHashs, err := policy.store.listSpendUTXOs(token, addr)
utxoHaveTxHashs, err := policy.store.listSpendUTXOs(req.GetAssetExec(), req.GetToken(), req.GetAddr())
if err != nil {
return nil, err
}
......@@ -992,18 +989,18 @@ func (policy *privacyPolicy) buildAndStoreWalletTxDetail(param *buildStoreWallet
if param.isprivacy {
//额外存储可以快速定位到接收隐私的交易
if sendTx == param.sendRecvFlag {
param.newbatch.Set(calcSendPrivacyTxKey(param.tokenname, param.senderRecver, heightstr), key)
param.newbatch.Set(calcSendPrivacyTxKey(param.assetExec, param.tokenname, param.senderRecver, heightstr), key)
} else if recvTx == param.sendRecvFlag {
param.newbatch.Set(calcRecvPrivacyTxKey(param.tokenname, param.senderRecver, heightstr), key)
param.newbatch.Set(calcRecvPrivacyTxKey(param.assetExec, param.tokenname, param.senderRecver, heightstr), key)
}
}
} else {
param.newbatch.Delete(calcTxKey(heightstr))
if param.isprivacy {
if sendTx == param.sendRecvFlag {
param.newbatch.Delete(calcSendPrivacyTxKey(param.tokenname, param.senderRecver, heightstr))
param.newbatch.Delete(calcSendPrivacyTxKey(param.assetExec, param.tokenname, param.senderRecver, heightstr))
} else if recvTx == param.sendRecvFlag {
param.newbatch.Delete(calcRecvPrivacyTxKey(param.tokenname, param.senderRecver, heightstr))
param.newbatch.Delete(calcRecvPrivacyTxKey(param.assetExec, param.tokenname, param.senderRecver, heightstr))
}
}
}
......@@ -1068,7 +1065,10 @@ func (policy *privacyPolicy) addDelPrivacyTxsFromBlock(tx *types.Transaction, in
bizlog.Error("addDelPrivacyTxsFromBlock", "txhash", txhashstr, "addDelType", addDelType, "index", index, "privacyOutput is", privacyOutput)
return
}
tokenname := privateAction.GetTokenName()
assetExec, tokenname := privateAction.GetAssetExecSymbol()
if assetExec == "" {
assetExec = "coins"
}
RpubKey := privacyOutput.GetRpubKeytx()
totalUtxosLeft := len(privacyOutput.Keyoutput)
......@@ -1099,6 +1099,7 @@ func (policy *privacyPolicy) addDelPrivacyTxsFromBlock(tx *types.Transaction, in
if types.ExecOk == txExecRes {
if AddTx == addDelType {
info2store := &privacytypes.PrivacyDBStore{
AssetExec: assetExec,
Txhash: txhash,
Tokenname: tokenname,
Amount: output.Amount,
......@@ -1128,7 +1129,7 @@ func (policy *privacyPolicy) addDelPrivacyTxsFromBlock(tx *types.Transaction, in
policy.store.setUTXO(info.Addr, &txhashstr, indexoutput, info2store, newbatch)
bizlog.Info("addDelPrivacyTxsFromBlock", "add tx txhash", txhashstr, "setUTXO addr ", *info.Addr, "indexoutput", indexoutput)
} else {
policy.store.unsetUTXO(info.Addr, &txhashstr, indexoutput, tokenname, newbatch)
policy.store.unsetUTXO(assetExec, tokenname, *info.Addr, txhashstr, indexoutput, newbatch)
bizlog.Info("addDelPrivacyTxsFromBlock", "delete tx txhash", txhashstr, "unsetUTXO addr ", *info.Addr, "indexoutput", indexoutput)
}
} else {
......@@ -1146,6 +1147,7 @@ func (policy *privacyPolicy) addDelPrivacyTxsFromBlock(tx *types.Transaction, in
//匹配次数达到2次,不再对本钱包中的其他地址进行匹配尝试
bizlog.Debug("addDelPrivacyTxsFromBlock", "txhash", txhashstr, "address", *info.Addr, "totalUtxosLeft", totalUtxosLeft, "matchedCount", matchedCount)
param := &buildStoreWalletTxDetailParam{
assetExec: assetExec,
tokenname: tokenname,
block: block,
tx: tx,
......@@ -1185,6 +1187,7 @@ func (policy *privacyPolicy) addDelPrivacyTxsFromBlock(tx *types.Transaction, in
}
//该交易正常执行完毕,删除对其的关注
param := &buildStoreWalletTxDetailParam{
assetExec: assetExec,
tokenname: tokenname,
block: block,
tx: tx,
......@@ -1204,6 +1207,7 @@ func (policy *privacyPolicy) addDelPrivacyTxsFromBlock(tx *types.Transaction, in
for _, ftxo := range stxosInOneTx {
if ftxo.Txhash == txhashstr {
param := &buildStoreWalletTxDetailParam{
assetExec: assetExec,
tokenname: tokenname,
block: block,
tx: tx,
......
......@@ -171,6 +171,7 @@ func (policy *privacyPolicy) SignTransaction(key crypto.PrivKey, req *types.ReqS
}
type buildStoreWalletTxDetailParam struct {
assetExec string
tokenname string
block *types.BlockDetail
tx *types.Transaction
......
......@@ -399,7 +399,7 @@ func Test_PrivacyAccountInfo(t *testing.T) {
mock.init()
testCases := []struct {
req *ty.ReqPPrivacyAccount
req *ty.ReqPrivacyAccount
needReply *ty.ReplyPrivacyAccount
needError error
}{
......@@ -407,7 +407,7 @@ func Test_PrivacyAccountInfo(t *testing.T) {
needError: types.ErrInvalidParam,
},
{
req: &ty.ReqPPrivacyAccount{
req: &ty.ReqPrivacyAccount{
Addr: testAddrs[0],
Token: types.BTY,
Displaymode: 0,
......
......@@ -151,14 +151,14 @@ func (store *privacyStore) setWalletAccountPrivacy(addr string, privacy *privacy
return nil
}
func (store *privacyStore) listAvailableUTXOs(token, addr string) ([]*privacytypes.PrivacyDBStore, error) {
func (store *privacyStore) listAvailableUTXOs(assetExec, token, addr string) ([]*privacytypes.PrivacyDBStore, error) {
if 0 == len(addr) {
bizlog.Error("listWalletPrivacyAccount addr is nil")
return nil, types.ErrInvalidParam
}
list := store.NewListHelper()
onetimeAccbytes := list.PrefixScan(calcPrivacyUTXOPrefix4Addr(token, addr))
onetimeAccbytes := list.PrefixScan(calcPrivacyUTXOPrefix4Addr(assetExec, token, addr))
if len(onetimeAccbytes) == 0 {
bizlog.Error("listWalletPrivacyAccount ", "addr not exist", addr)
return nil, nil
......@@ -182,13 +182,13 @@ func (store *privacyStore) listAvailableUTXOs(token, addr string) ([]*privacytyp
return privacyDBStoreSlice, nil
}
func (store *privacyStore) listFrozenUTXOs(token, addr string) ([]*privacytypes.FTXOsSTXOsInOneTx, error) {
func (store *privacyStore) listFrozenUTXOs(assetExec, token, addr string) ([]*privacytypes.FTXOsSTXOsInOneTx, error) {
if 0 == len(addr) {
bizlog.Error("listFrozenUTXOs addr is nil")
return nil, types.ErrInvalidParam
}
list := store.NewListHelper()
values := list.List(calcFTXOsKeyPrefix(token, addr), nil, 0, 0)
values := list.List(calcFTXOsKeyPrefix(assetExec, token, addr), nil, 0, 0)
if len(values) == 0 {
bizlog.Error("listFrozenUTXOs ", "addr not exist", addr)
return nil, nil
......@@ -227,9 +227,9 @@ func (store *privacyStore) getWalletPrivacyTxDetails(param *privacytypes.ReqPriv
if len(param.Seedtxhash) == 0 {
var keyPrefix []byte
if param.SendRecvFlag == sendTx {
keyPrefix = calcSendPrivacyTxKey(param.Tokenname, param.Address, "")
keyPrefix = calcSendPrivacyTxKey(param.AssetExec, param.Tokenname, param.Address, "")
} else {
keyPrefix = calcRecvPrivacyTxKey(param.Tokenname, param.Address, "")
keyPrefix = calcRecvPrivacyTxKey(param.AssetExec, param.Tokenname, param.Address, "")
}
txkeybytes := list.IteratorScanFromLast(keyPrefix, param.Count)
for _, keybyte := range txkeybytes {
......@@ -248,9 +248,9 @@ func (store *privacyStore) getWalletPrivacyTxDetails(param *privacytypes.ReqPriv
list := store.NewListHelper()
var txkeybytes [][]byte
if param.SendRecvFlag == sendTx {
txkeybytes = list.IteratorScan([]byte(SendPrivacyTx), calcSendPrivacyTxKey(param.Tokenname, param.Address, string(param.Seedtxhash)), param.Count, param.Direction)
txkeybytes = list.IteratorScan([]byte(SendPrivacyTx), calcSendPrivacyTxKey(param.AssetExec, param.Tokenname, param.Address, string(param.Seedtxhash)), param.Count, param.Direction)
} else {
txkeybytes = list.IteratorScan([]byte(RecvPrivacyTx), calcRecvPrivacyTxKey(param.Tokenname, param.Address, string(param.Seedtxhash)), param.Count, param.Direction)
txkeybytes = list.IteratorScan([]byte(RecvPrivacyTx), calcRecvPrivacyTxKey(param.AssetExec, param.Tokenname, param.Address, string(param.Seedtxhash)), param.Count, param.Direction)
}
for _, keybyte := range txkeybytes {
value, err := store.Get(keybyte)
......@@ -287,9 +287,9 @@ func (store *privacyStore) getWalletPrivacyTxDetails(param *privacytypes.ReqPriv
return txDetails, nil
}
func (store *privacyStore) getPrivacyTokenUTXOs(token, addr string) (*walletUTXOs, error) {
func (store *privacyStore) getPrivacyTokenUTXOs(assetExec, token, addr string) (*walletUTXOs, error) {
list := store.NewListHelper()
prefix := calcPrivacyUTXOPrefix4Addr(token, addr)
prefix := calcPrivacyUTXOPrefix4Addr(assetExec, token, addr)
values := list.List(prefix, nil, 0, 0)
wutxos := new(walletUTXOs)
if len(values) == 0 {
......@@ -330,11 +330,16 @@ func (store *privacyStore) getPrivacyTokenUTXOs(token, addr string) (*walletUTXO
//calcKey4UTXOsSpentInTx------>types.FTXOsSTXOsInOneTx,将当前交易的所有花费的utxo进行打包,设置为ftxo,同时通过支付交易hash索引
//calcKey4FTXOsInTx----------->calcKey4UTXOsSpentInTx,创建该交易冻结的所有的utxo的信息
//状态转移,将utxo转移至ftxo,同时记录该生成tx的花费的utxo,这样在确认执行成功之后就可以快速将相应的FTXO转换成STXO
func (store *privacyStore) moveUTXO2FTXO(expire int64, token, sender, txhash string, selectedUtxos []*txOutputInfo) {
FTXOsInOneTx := &privacytypes.FTXOsSTXOsInOneTx{}
func (store *privacyStore) moveUTXO2FTXO(expire int64, assetExec, token, sender, txhash string, selectedUtxos []*txOutputInfo) {
FTXOsInOneTx := &privacytypes.FTXOsSTXOsInOneTx{
AssetExec: assetExec,
Tokenname: token,
Sender: sender,
Txhash: txhash,
}
newbatch := store.NewBatch(true)
for _, txOutputInfo := range selectedUtxos {
key := calcUTXOKey4TokenAddr(token, sender, hex.EncodeToString(txOutputInfo.utxoGlobalIndex.Txhash), int(txOutputInfo.utxoGlobalIndex.Outindex))
key := calcUTXOKey4TokenAddr(assetExec, token, sender, hex.EncodeToString(txOutputInfo.utxoGlobalIndex.Txhash), int(txOutputInfo.utxoGlobalIndex.Outindex))
newbatch.Delete(key)
utxo := &privacytypes.UTXO{
Amount: txOutputInfo.amount,
......@@ -345,9 +350,6 @@ func (store *privacyStore) moveUTXO2FTXO(expire int64, token, sender, txhash str
}
FTXOsInOneTx.Utxos = append(FTXOsInOneTx.Utxos, utxo)
}
FTXOsInOneTx.Tokenname = token
FTXOsInOneTx.Sender = sender
FTXOsInOneTx.Txhash = txhash
FTXOsInOneTx.SetExpire(expire)
//设置在该交易中花费的UTXO
key1 := calcKey4UTXOsSpentInTx(txhash)
......@@ -355,7 +357,7 @@ func (store *privacyStore) moveUTXO2FTXO(expire int64, token, sender, txhash str
newbatch.Set(key1, value1)
//设置ftxo的key,使其能够方便地获取到对应的交易花费的utxo
key2 := calcKey4FTXOsInTx(token, sender, txhash)
key2 := calcKey4FTXOsInTx(assetExec, token, sender, txhash)
value2 := key1
newbatch.Set(key2, value2)
......@@ -407,11 +409,11 @@ func (store *privacyStore) getRescanUtxosFlag4Addr(req *privacytypes.ReqRescanUt
return &repRescanUtxos, nil
}
func (store *privacyStore) saveREscanUTXOsAddresses(addrs []string) {
func (store *privacyStore) saveREscanUTXOsAddresses(addrs []string, scanFlag int32) {
newbatch := store.NewBatch(true)
for _, addr := range addrs {
data := &types.Int64{
Data: int64(privacytypes.UtxoFlagNoScan),
Data: int64(scanFlag),
}
value := types.Encode(data)
newbatch.Set(calcRescanUtxosFlagKey(addr), value)
......@@ -457,9 +459,7 @@ func (store *privacyStore) updateScanInputUTXOs(utxoGlobalIndexs []*privacytypes
}
newbatch := store.NewBatch(true)
var utxos []*privacytypes.UTXO
var owner string
var token string
var txhash string
var owner, token, txhash, assetExec string
for _, utxoGlobal := range utxoGlobalIndexs {
accPrivacy, err := store.isUTXOExist(hex.EncodeToString(utxoGlobal.Txhash), int(utxoGlobal.Outindex))
if err == nil && accPrivacy != nil {
......@@ -479,28 +479,29 @@ func (store *privacyStore) updateScanInputUTXOs(utxoGlobalIndexs []*privacytypes
newbatch.Delete(key)
}
if len(utxos) > 0 {
store.moveUTXO2STXO(owner, token, txhash, utxos, newbatch)
store.moveUTXO2STXO(assetExec, owner, token, txhash, utxos, newbatch)
}
newbatch.Write()
}
func (store *privacyStore) moveUTXO2STXO(owner, token, txhash string, utxos []*privacytypes.UTXO, newbatch db.Batch) {
func (store *privacyStore) moveUTXO2STXO(assetExec, owner, token, txhash string, utxos []*privacytypes.UTXO, newbatch db.Batch) {
if len(utxos) == 0 {
return
}
FTXOsInOneTx := &privacytypes.FTXOsSTXOsInOneTx{}
FTXOsInOneTx.Utxos = utxos
FTXOsInOneTx.Sender = owner
FTXOsInOneTx.Tokenname = token
FTXOsInOneTx.Txhash = txhash
FTXOsInOneTx := &privacytypes.FTXOsSTXOsInOneTx{
AssetExec: assetExec,
Tokenname: token,
Sender: owner,
Txhash: txhash,
Utxos: utxos,
}
for _, utxo := range utxos {
Txhash := utxo.UtxoBasic.UtxoGlobalIndex.Txhash
Outindex := utxo.UtxoBasic.UtxoGlobalIndex.Outindex
//删除存在的UTXO索引
key := calcUTXOKey4TokenAddr(token, owner, hex.EncodeToString(Txhash), int(Outindex))
key := calcUTXOKey4TokenAddr(assetExec, token, owner, hex.EncodeToString(Txhash), int(Outindex))
newbatch.Delete(key)
}
......@@ -515,7 +516,7 @@ func (store *privacyStore) moveUTXO2STXO(owner, token, txhash string, utxos []*p
newbatch.Set(key2, value2)
// 在此处加入stxo-token-addr-txhash 作为key,便于查找花费出去交易
key3 := calcSTXOTokenAddrTxKey(FTXOsInOneTx.Tokenname, FTXOsInOneTx.Sender, FTXOsInOneTx.Txhash)
key3 := calcSTXOTokenAddrTxKey(assetExec, FTXOsInOneTx.Tokenname, FTXOsInOneTx.Sender, FTXOsInOneTx.Txhash)
value3 := key1
newbatch.Set(key3, value3)
......@@ -555,21 +556,28 @@ func (store *privacyStore) selectCurrentWalletPrivacyTx(txDetal *types.Transacti
var RpubKey []byte
var privacyOutput *privacytypes.PrivacyOutput
var privacyInput *privacytypes.PrivacyInput
var tokenname string
var tokenname, assetExec string
if privacytypes.ActionPublic2Privacy == privateAction.Ty {
RpubKey = privateAction.GetPublic2Privacy().GetOutput().GetRpubKeytx()
privacyOutput = privateAction.GetPublic2Privacy().GetOutput()
tokenname = privateAction.GetPublic2Privacy().GetTokenname()
assetExec = privateAction.GetPublic2Privacy().GetAssetExec()
} else if privacytypes.ActionPrivacy2Privacy == privateAction.Ty {
RpubKey = privateAction.GetPrivacy2Privacy().GetOutput().GetRpubKeytx()
privacyOutput = privateAction.GetPrivacy2Privacy().GetOutput()
tokenname = privateAction.GetPrivacy2Privacy().GetTokenname()
privacyInput = privateAction.GetPrivacy2Privacy().GetInput()
assetExec = privateAction.GetPrivacy2Privacy().GetAssetExec()
} else if privacytypes.ActionPrivacy2Public == privateAction.Ty {
RpubKey = privateAction.GetPrivacy2Public().GetOutput().GetRpubKeytx()
privacyOutput = privateAction.GetPrivacy2Public().GetOutput()
tokenname = privateAction.GetPrivacy2Public().GetTokenname()
privacyInput = privateAction.GetPrivacy2Public().GetInput()
assetExec = privateAction.GetPrivacy2Public().GetAssetExec()
}
if assetExec == "" {
assetExec = "coins"
}
//处理output
......@@ -607,6 +615,7 @@ func (store *privacyStore) selectCurrentWalletPrivacyTx(txDetal *types.Transacti
}
info2store := &privacytypes.PrivacyDBStore{
AssetExec: assetExec,
Txhash: txhashInbytes,
Tokenname: tokenname,
Amount: output.Amount,
......@@ -680,7 +689,7 @@ func (store *privacyStore) setUTXO(addr, txhash *string, outindex int, dbStore *
utxoKey := calcUTXOKey(*txhash, outindex)
bizlog.Debug("setUTXO", "addr", *addr, "tx with hash", *txhash, "amount:", dbStore.Amount/types.Coin)
newbatch.Set(calcUTXOKey4TokenAddr(dbStore.Tokenname, *addr, *txhash, outindex), utxoKey)
newbatch.Set(calcUTXOKey4TokenAddr(dbStore.AssetExec, dbStore.Tokenname, *addr, *txhash, outindex), utxoKey)
newbatch.Set(utxoKey, privacyStorebyte)
return nil
}
......@@ -697,12 +706,12 @@ func (store *privacyStore) storeScanPrivacyInputUTXO(utxoGlobalIndexs []*privacy
}
}
func (store *privacyStore) listSpendUTXOs(token, addr string) (*privacytypes.UTXOHaveTxHashs, error) {
func (store *privacyStore) listSpendUTXOs(assetExec, token, addr string) (*privacytypes.UTXOHaveTxHashs, error) {
if 0 == len(addr) {
bizlog.Error("listSpendUTXOs addr is nil")
return nil, types.ErrInvalidParam
}
prefix := calcSTXOPrefix4Addr(token, addr)
prefix := calcSTXOPrefix4Addr(assetExec, token, addr)
list := store.NewListHelper()
Key4FTXOsInTxs := list.PrefixScan(prefix)
//if len(Key4FTXOsInTxs) == 0 {
......@@ -785,10 +794,10 @@ func (store *privacyStore) getFTXOlist() ([]*privacytypes.FTXOsSTXOsInOneTx, [][
revertFTXOTxs, _, _ := store.getWalletFtxoStxo(RevertSendtx)
var keys [][]byte
for _, ftxo := range curFTXOTxs {
keys = append(keys, calcKey4FTXOsInTx(ftxo.Tokenname, ftxo.Sender, ftxo.Txhash))
keys = append(keys, calcKey4FTXOsInTx(ftxo.AssetExec, ftxo.Tokenname, ftxo.Sender, ftxo.Txhash))
}
for _, ftxo := range revertFTXOTxs {
keys = append(keys, calcRevertSendTxKey(ftxo.Tokenname, ftxo.Sender, ftxo.Txhash))
keys = append(keys, calcRevertSendTxKey(ftxo.AssetExec, ftxo.Tokenname, ftxo.Sender, ftxo.Txhash))
}
curFTXOTxs = append(curFTXOTxs, revertFTXOTxs...)
return curFTXOTxs, keys
......@@ -826,7 +835,7 @@ func (store *privacyStore) moveFTXO2STXO(key1 []byte, txhash string, newbatch db
if nil != err {
bizlog.Error("moveFTXO2STXO", "Failed to decode FTXOsSTXOsInOneTx for value", value)
}
key3 := calcSTXOTokenAddrTxKey(ftxosInOneTx.Tokenname, ftxosInOneTx.Sender, ftxosInOneTx.Txhash)
key3 := calcSTXOTokenAddrTxKey(ftxosInOneTx.AssetExec, ftxosInOneTx.Tokenname, ftxosInOneTx.Sender, ftxosInOneTx.Txhash)
newbatch.Set(key3, value2)
newbatch.Write()
......@@ -872,7 +881,7 @@ func (store *privacyStore) moveFTXO2UTXO(key1 []byte, newbatch db.Batch) {
for _, ftxo := range ftxosInOneTx.Utxos {
utxohash := hex.EncodeToString(ftxo.UtxoBasic.UtxoGlobalIndex.Txhash)
outindex := int(ftxo.UtxoBasic.UtxoGlobalIndex.Outindex)
key := calcUTXOKey4TokenAddr(ftxosInOneTx.Tokenname, ftxosInOneTx.Sender, utxohash, outindex)
key := calcUTXOKey4TokenAddr(ftxosInOneTx.AssetExec, ftxosInOneTx.Tokenname, ftxosInOneTx.Sender, utxohash, outindex)
value := calcUTXOKey(utxohash, int(ftxo.UtxoBasic.UtxoGlobalIndex.Outindex))
bizlog.Debug("moveFTXO2UTXO", "addr", ftxosInOneTx.Sender, "tx with hash", utxohash, "amount", ftxo.Amount/types.Coin)
newbatch.Set(key, value)
......@@ -887,25 +896,25 @@ func (store *privacyStore) moveFTXO2UTXO(key1 []byte, newbatch db.Batch) {
// 4.清除UTXO信息
// addr 使用UTXO的地址
// txhash 使用UTXO的交易哈希,没有0x
func (store *privacyStore) unsetUTXO(addr, txhash *string, outindex int, token string, newbatch db.Batch) error {
if 0 == len(*addr) || 0 == len(*txhash) || outindex < 0 || len(token) <= 0 {
bizlog.Error("unsetUTXO", "InvalidParam addr", *addr, "txhash", *txhash, "outindex", outindex, "token", token)
func (store *privacyStore) unsetUTXO(assetExec, token, addr, txhash string, outindex int, newbatch db.Batch) error {
if 0 == len(addr) || 0 == len(txhash) || outindex < 0 || len(token) <= 0 {
bizlog.Error("unsetUTXO", "InvalidParam addr", addr, "txhash", txhash, "outindex", outindex, "token", token)
return types.ErrInvalidParam
}
// 1.删除可用UTXO列表的索引关系
ftxokey := calcUTXOKey(*txhash, outindex)
ftxokey := calcUTXOKey(txhash, outindex)
newbatch.Delete(ftxokey)
// 2.删除冻结UTXO列表的索引关系
ftxokey = calcKey4FTXOsInTx(token, *addr, *txhash)
ftxokey = calcKey4FTXOsInTx(assetExec, token, addr, txhash)
newbatch.Delete(ftxokey)
// 3.删除回退冻结UTXO列表中的索引关系
ftxokey = calcRevertSendTxKey(token, *addr, *txhash)
ftxokey = calcRevertSendTxKey(assetExec, token, addr, txhash)
newbatch.Delete(ftxokey)
// 4.清除可用UTXO索引信息
utxokey := calcUTXOKey4TokenAddr(token, *addr, *txhash, outindex)
utxokey := calcUTXOKey4TokenAddr(assetExec, token, addr, txhash, outindex)
newbatch.Delete(utxokey)
bizlog.Debug("PrivacyTrading unsetUTXO", "addr", *addr, "tx with hash", *txhash, "outindex", outindex)
bizlog.Debug("PrivacyTrading unsetUTXO", "addr", addr, "tx with hash", txhash, "outindex", outindex)
return nil
}
......@@ -938,11 +947,11 @@ func (store *privacyStore) moveSTXO2FTXO(tx *types.Transaction, txhash string, n
}
//删除stxo-token-addr-txhash key
key3 := calcSTXOTokenAddrTxKey(ftxosInOneTx.Tokenname, ftxosInOneTx.Sender, ftxosInOneTx.Txhash)
key3 := calcSTXOTokenAddrTxKey(ftxosInOneTx.AssetExec, ftxosInOneTx.Tokenname, ftxosInOneTx.Sender, ftxosInOneTx.Txhash)
newbatch.Delete(key3)
//设置在该交易中花费的UTXO
key1 := calcRevertSendTxKey(ftxosInOneTx.Tokenname, ftxosInOneTx.Sender, txhash)
key1 := calcRevertSendTxKey(ftxosInOneTx.AssetExec, ftxosInOneTx.Tokenname, ftxosInOneTx.Sender, txhash)
value1 := value2
newbatch.Set(key1, value1)
bizlog.Info("moveSTXO2FTXO", "txhash ", txhash)
......
......@@ -73,12 +73,12 @@ func testStore_unsetUTXO(t *testing.T) {
addr := ""
txhash := ""
batch := store.NewBatch(true)
err := store.unsetUTXO(&addr, &txhash, 0, "", batch)
err := store.unsetUTXO("", "", addr, txhash, 0, batch)
assert.NotNil(t, err)
addr = "16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp"
txhash = "TXHASH"
err = store.unsetUTXO(&addr, &txhash, 0, "BTY", batch)
err = store.unsetUTXO("coins", "BTY", addr, txhash, 0, batch)
assert.NoError(t, err)
}
......@@ -174,10 +174,11 @@ func testStore_moveUTXO2FTXO(t *testing.T) {
func testStore_getPrivacyTokenUTXOs(t *testing.T) {
store := createStore(t)
utxos, err := store.getPrivacyTokenUTXOs("", "")
utxos, err := store.getPrivacyTokenUTXOs("", "", "")
assert.Nil(t, err)
assert.NotNil(t, utxos)
assetExec := "coins"
token := "BTY"
addr := "getPrivacyTokenUTXOs"
......@@ -186,12 +187,12 @@ func testStore_getPrivacyTokenUTXOs(t *testing.T) {
bt, err := proto.Marshal(data)
assert.NoError(t, err)
key := fmt.Sprintf("Key%d", n)
err = store.Set(calcUTXOKey4TokenAddr(token, addr, "txhash", n), []byte(key))
err = store.Set(calcUTXOKey4TokenAddr(assetExec, token, addr, "txhash", n), []byte(key))
assert.NoError(t, err)
err = store.Set([]byte(key), bt)
assert.NoError(t, err)
}
utxos, err = store.getPrivacyTokenUTXOs(token, addr)
utxos, err = store.getPrivacyTokenUTXOs(assetExec, token, addr)
assert.NoError(t, err)
assert.Equal(t, 5, len(utxos.utxos))
}
......@@ -209,27 +210,28 @@ func testStore_getWalletPrivacyTxDetails(t *testing.T) {
func testStore_listFrozenUTXOs(t *testing.T) {
store := createStore(t)
assetExec := "coins"
token := "BTY"
addr := "26htvcBNSEA7fZhAdLJphDwQRQJaHpyHTq"
txs, err := store.listFrozenUTXOs("", "")
txs, err := store.listFrozenUTXOs("", "", "")
assert.Nil(t, txs)
assert.NotNil(t, err)
txs, err = store.listFrozenUTXOs(token, addr)
txs, err = store.listFrozenUTXOs(assetExec, token, addr)
assert.Nil(t, txs)
assert.Nil(t, err)
tx := &pt.FTXOsSTXOsInOneTx{Tokenname: "BTY"}
bt, err := proto.Marshal(tx)
assert.NoError(t, err)
err = store.Set(calcKey4FTXOsInTx(token, addr, "TXHASH"), bt)
err = store.Set(calcKey4FTXOsInTx(assetExec, token, addr, "TXHASH"), bt)
assert.NoError(t, err)
txs, err = store.listFrozenUTXOs(token, addr)
txs, err = store.listFrozenUTXOs(assetExec, token, addr)
assert.Nil(t, txs)
assert.NotNil(t, err)
err = store.Set(calcKey4FTXOsInTx(token, addr, "TXHASH"), []byte("DataKey"))
err = store.Set(calcKey4FTXOsInTx(assetExec, token, addr, "TXHASH"), []byte("DataKey"))
assert.NoError(t, err)
err = store.Set([]byte("DataKey"), bt)
assert.NoError(t, err)
txs, err = store.listFrozenUTXOs(token, addr)
txs, err = store.listFrozenUTXOs(assetExec, token, addr)
assert.NoError(t, err)
assert.Equal(t, 1, len(txs))
assert.Equal(t, true, proto.Equal(tx, txs[0]))
......@@ -237,27 +239,29 @@ func testStore_listFrozenUTXOs(t *testing.T) {
func testStore_listAvailableUTXOs(t *testing.T) {
store := createStore(t)
utxos, err := store.listAvailableUTXOs("", "")
utxos, err := store.listAvailableUTXOs("", "", "")
assert.Nil(t, utxos)
assert.Equal(t, err, types.ErrInvalidParam)
addr := "16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTq"
assetExec := "coins"
token := "BTY"
txhash := "123456"
utxo := &pt.PrivacyDBStore{
AssetExec: assetExec,
Tokenname: "BTY",
}
key := calcUTXOKey4TokenAddr(token, addr, txhash, 0)
key := calcUTXOKey4TokenAddr(assetExec, token, addr, txhash, 0)
bt, err := proto.Marshal(utxo)
assert.NoError(t, err)
err = store.Set(key, []byte("AccKey"))
assert.NoError(t, err)
utxos, err = store.listAvailableUTXOs(token, addr)
utxos, err = store.listAvailableUTXOs(assetExec, token, addr)
assert.Nil(t, utxos)
assert.NotNil(t, err)
err = store.Set([]byte("AccKey"), bt)
assert.NoError(t, err)
utxos, err = store.listAvailableUTXOs(token, addr)
utxos, err = store.listAvailableUTXOs(assetExec, token, addr)
assert.NoError(t, err)
assert.Equal(t, 1, len(utxos))
assert.Equal(t, true, proto.Equal(utxo, utxos[0]))
......
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