Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
34fd2055
Commit
34fd2055
authored
May 12, 2020
by
whisker
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor x2ethereum contract
parent
98a98728
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
749 additions
and
1159 deletions
+749
-1159
commands.go
plugin/dapp/x2Ethereum/commands/commands.go
+19
-10
query.go
plugin/dapp/x2Ethereum/commands/query.go
+1
-1
ethereumRelayerCmd.go
plugin/dapp/x2Ethereum/ebcli/ethereumRelayerCmd.go
+0
-3
parser.go
plugin/dapp/x2Ethereum/ebrelayer/ethtxs/parser.go
+11
-0
address.go
plugin/dapp/x2Ethereum/executor/common/address.go
+0
-32
common_test.go
plugin/dapp/x2Ethereum/executor/common/common_test.go
+0
-17
claim.go
plugin/dapp/x2Ethereum/executor/ethbridge/claim.go
+4
-43
expectedkeeper.go
plugin/dapp/x2Ethereum/executor/ethbridge/expectedkeeper.go
+0
-15
keeper.go
plugin/dapp/x2Ethereum/executor/ethbridge/keeper.go
+29
-36
msgburn.go
plugin/dapp/x2Ethereum/executor/ethbridge/msgburn.go
+0
-62
msgcreateclaim.go
plugin/dapp/x2Ethereum/executor/ethbridge/msgcreateclaim.go
+0
-70
msglock.go
plugin/dapp/x2Ethereum/executor/ethbridge/msglock.go
+0
-64
exec.go
plugin/dapp/x2Ethereum/executor/exec.go
+27
-28
keeper.go
plugin/dapp/x2Ethereum/executor/oracle/keeper.go
+64
-148
prophecy.go
plugin/dapp/x2Ethereum/executor/oracle/prophecy.go
+83
-94
status.go
plugin/dapp/x2Ethereum/executor/oracle/status.go
+0
-44
query.go
plugin/dapp/x2Ethereum/executor/query.go
+14
-33
x2ethereum.go
plugin/dapp/x2Ethereum/executor/x2ethereum.go
+5
-1
x2ethereumaction.go
plugin/dapp/x2Ethereum/executor/x2ethereumaction.go
+331
-276
x2ethereum.proto
plugin/dapp/x2Ethereum/proto/x2ethereum.proto
+4
-1
testProcess.md
plugin/dapp/x2Ethereum/testProcess.md
+0
-68
errors.go
plugin/dapp/x2Ethereum/types/errors.go
+1
-0
kv.go
plugin/dapp/x2Ethereum/types/kv.go
+2
-2
oracle.pb.go
plugin/dapp/x2Ethereum/types/oracle.pb.go
+1
-2
utils.go
plugin/dapp/x2Ethereum/types/utils.go
+7
-0
x2ethereum.pb.go
plugin/dapp/x2Ethereum/types/x2ethereum.pb.go
+146
-109
No files found.
plugin/dapp/x2Ethereum/commands/commands.go
View file @
34fd2055
...
@@ -94,9 +94,6 @@ func addEth2Chain33Flags(cmd *cobra.Command) {
...
@@ -94,9 +94,6 @@ func addEth2Chain33Flags(cmd *cobra.Command) {
cmd
.
Flags
()
.
Int64
(
"claimtype"
,
0
,
"the type of this claim,lock=1,burn=2"
)
cmd
.
Flags
()
.
Int64
(
"claimtype"
,
0
,
"the type of this claim,lock=1,burn=2"
)
_
=
cmd
.
MarkFlagRequired
(
"claimtype"
)
_
=
cmd
.
MarkFlagRequired
(
"claimtype"
)
cmd
.
Flags
()
.
Int64
(
"decimal"
,
0
,
"the decimal of this token"
)
_
=
cmd
.
MarkFlagRequired
(
"decimal"
)
}
}
func
Eth2Chain33
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
func
Eth2Chain33
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
...
@@ -111,7 +108,13 @@ func Eth2Chain33(cmd *cobra.Command, args []string) {
...
@@ -111,7 +108,13 @@ func Eth2Chain33(cmd *cobra.Command, args []string) {
validator
,
_
:=
cmd
.
Flags
()
.
GetString
(
"validator"
)
validator
,
_
:=
cmd
.
Flags
()
.
GetString
(
"validator"
)
amount
,
_
:=
cmd
.
Flags
()
.
GetFloat64
(
"amount"
)
amount
,
_
:=
cmd
.
Flags
()
.
GetFloat64
(
"amount"
)
claimtype
,
_
:=
cmd
.
Flags
()
.
GetInt64
(
"claimtype"
)
claimtype
,
_
:=
cmd
.
Flags
()
.
GetInt64
(
"claimtype"
)
decimal
,
_
:=
cmd
.
Flags
()
.
GetInt64
(
"decimal"
)
nodeAddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"node_addr"
)
decimal
,
err
:=
utils
.
GetDecimalsFromNode
(
tcontract
,
nodeAddr
)
if
err
!=
nil
{
fmt
.
Println
(
"get decimal error"
)
return
}
params
:=
&
types3
.
Eth2Chain33
{
params
:=
&
types3
.
Eth2Chain33
{
EthereumChainID
:
ethid
,
EthereumChainID
:
ethid
,
...
@@ -123,7 +126,7 @@ func Eth2Chain33(cmd *cobra.Command, args []string) {
...
@@ -123,7 +126,7 @@ func Eth2Chain33(cmd *cobra.Command, args []string) {
EthereumSender
:
sender
,
EthereumSender
:
sender
,
Chain33Receiver
:
receiver
,
Chain33Receiver
:
receiver
,
ValidatorAddress
:
validator
,
ValidatorAddress
:
validator
,
Amount
:
strconv
.
FormatFloat
(
types3
.
MultiplySpecifyTimes
(
amount
,
decimal
)
,
'f'
,
4
,
64
),
Amount
:
strconv
.
FormatFloat
(
amount
*
1e8
,
'f'
,
4
,
64
),
ClaimType
:
claimtype
,
ClaimType
:
claimtype
,
Decimals
:
decimal
,
Decimals
:
decimal
,
}
}
...
@@ -157,7 +160,13 @@ func WithdrawEth(cmd *cobra.Command, args []string) {
...
@@ -157,7 +160,13 @@ func WithdrawEth(cmd *cobra.Command, args []string) {
validator
,
_
:=
cmd
.
Flags
()
.
GetString
(
"validator"
)
validator
,
_
:=
cmd
.
Flags
()
.
GetString
(
"validator"
)
amount
,
_
:=
cmd
.
Flags
()
.
GetFloat64
(
"amount"
)
amount
,
_
:=
cmd
.
Flags
()
.
GetFloat64
(
"amount"
)
claimtype
,
_
:=
cmd
.
Flags
()
.
GetInt64
(
"claimtype"
)
claimtype
,
_
:=
cmd
.
Flags
()
.
GetInt64
(
"claimtype"
)
decimal
,
_
:=
cmd
.
Flags
()
.
GetInt64
(
"decimal"
)
nodeAddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"node_addr"
)
decimal
,
err
:=
utils
.
GetDecimalsFromNode
(
tcontract
,
nodeAddr
)
if
err
!=
nil
{
fmt
.
Println
(
"get decimal error"
)
return
}
params
:=
&
types3
.
Eth2Chain33
{
params
:=
&
types3
.
Eth2Chain33
{
EthereumChainID
:
ethid
,
EthereumChainID
:
ethid
,
...
@@ -226,7 +235,7 @@ func burn(cmd *cobra.Command, args []string) {
...
@@ -226,7 +235,7 @@ func burn(cmd *cobra.Command, args []string) {
params
:=
&
types3
.
Chain33ToEth
{
params
:=
&
types3
.
Chain33ToEth
{
TokenContract
:
contract
,
TokenContract
:
contract
,
EthereumReceiver
:
receiver
,
EthereumReceiver
:
receiver
,
Amount
:
types3
.
TrimZeroAndDot
(
strconv
.
FormatFloat
(
types3
.
MultiplySpecifyTimes
(
amount
,
decimal
)
,
'f'
,
4
,
64
)),
Amount
:
types3
.
TrimZeroAndDot
(
strconv
.
FormatFloat
(
amount
*
1e8
,
'f'
,
4
,
64
)),
LocalCoinSymbol
:
csymbol
,
LocalCoinSymbol
:
csymbol
,
Decimals
:
decimal
,
Decimals
:
decimal
,
}
}
...
@@ -319,7 +328,7 @@ func CreateRawAddValidatorTxCmd() *cobra.Command {
...
@@ -319,7 +328,7 @@ func CreateRawAddValidatorTxCmd() *cobra.Command {
}
}
addValidatorFlags
(
cmd
)
addValidatorFlags
(
cmd
)
cmd
.
Flags
()
.
Int64P
(
"power"
,
"p"
,
0
,
"validator power set"
)
cmd
.
Flags
()
.
Int64P
(
"power"
,
"p"
,
0
,
"validator power set
,must be 1-100
"
)
_
=
cmd
.
MarkFlagRequired
(
"power"
)
_
=
cmd
.
MarkFlagRequired
(
"power"
)
return
cmd
return
cmd
}
}
...
@@ -377,7 +386,7 @@ func CreateRawModifyValidatorTxCmd() *cobra.Command {
...
@@ -377,7 +386,7 @@ func CreateRawModifyValidatorTxCmd() *cobra.Command {
addValidatorFlags
(
cmd
)
addValidatorFlags
(
cmd
)
cmd
.
Flags
()
.
Int64P
(
"power"
,
"p"
,
0
,
"validator power set"
)
cmd
.
Flags
()
.
Int64P
(
"power"
,
"p"
,
0
,
"validator power set
,must be 1-100
"
)
_
=
cmd
.
MarkFlagRequired
(
"power"
)
_
=
cmd
.
MarkFlagRequired
(
"power"
)
return
cmd
return
cmd
}
}
...
@@ -409,7 +418,7 @@ func CreateRawSetConsensusTxCmd() *cobra.Command {
...
@@ -409,7 +418,7 @@ func CreateRawSetConsensusTxCmd() *cobra.Command {
}
}
func
addSetConsensusFlags
(
cmd
*
cobra
.
Command
)
{
func
addSetConsensusFlags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
Int64P
(
"power"
,
"p"
,
0
,
"the power you want to set consensus need"
)
cmd
.
Flags
()
.
Int64P
(
"power"
,
"p"
,
0
,
"the power you want to set consensus need
,must be 1-100
"
)
_
=
cmd
.
MarkFlagRequired
(
"power"
)
_
=
cmd
.
MarkFlagRequired
(
"power"
)
}
}
...
...
plugin/dapp/x2Ethereum/commands/query.go
View file @
34fd2055
...
@@ -122,7 +122,7 @@ func queryConsensus(cmd *cobra.Command, args []string) {
...
@@ -122,7 +122,7 @@ func queryConsensus(cmd *cobra.Command, args []string) {
FuncName
:
types2
.
FuncQueryConsensusThreshold
,
FuncName
:
types2
.
FuncQueryConsensusThreshold
,
}
}
channel
:=
&
types2
.
Receipt
Set
ConsensusThreshold
{}
channel
:=
&
types2
.
Receipt
Query
ConsensusThreshold
{}
ctx
:=
jsonclient
.
NewRPCCtx
(
rpcLaddr
,
"Chain33.Query"
,
query
,
channel
)
ctx
:=
jsonclient
.
NewRPCCtx
(
rpcLaddr
,
"Chain33.Query"
,
query
,
channel
)
ctx
.
Run
()
ctx
.
Run
()
}
}
...
...
plugin/dapp/x2Ethereum/ebcli/ethereumRelayerCmd.go
View file @
34fd2055
...
@@ -13,9 +13,6 @@ import (
...
@@ -13,9 +13,6 @@ import (
"github.com/spf13/cobra"
"github.com/spf13/cobra"
)
)
// todo
// 所有amount要做bigint处理,还要做只保留四位的截断处理
// EthereumRelayerCmd command func
// EthereumRelayerCmd command func
func
EthereumRelayerCmd
()
*
cobra
.
Command
{
func
EthereumRelayerCmd
()
*
cobra
.
Command
{
cmd
:=
&
cobra
.
Command
{
cmd
:=
&
cobra
.
Command
{
...
...
plugin/dapp/x2Ethereum/ebrelayer/ethtxs/parser.go
View file @
34fd2055
...
@@ -42,6 +42,12 @@ func LogLockToEthBridgeClaim(event *events.LockEvent, ethereumChainID int64, bri
...
@@ -42,6 +42,12 @@ func LogLockToEthBridgeClaim(event *events.LockEvent, ethereumChainID int64, bri
witnessClaim
.
Symbol
=
event
.
Symbol
witnessClaim
.
Symbol
=
event
.
Symbol
witnessClaim
.
EthereumSender
=
event
.
From
.
String
()
witnessClaim
.
EthereumSender
=
event
.
From
.
String
()
witnessClaim
.
Chain33Receiver
=
string
(
recipient
)
witnessClaim
.
Chain33Receiver
=
string
(
recipient
)
if
decimal
>
8
{
event
.
Value
=
event
.
Value
.
Quo
(
event
.
Value
,
big
.
NewInt
(
int64
(
types
.
MultiplySpecifyTimes
(
1
,
decimal
-
8
))))
}
else
{
event
.
Value
=
event
.
Value
.
Mul
(
event
.
Value
,
big
.
NewInt
(
int64
(
types
.
MultiplySpecifyTimes
(
1
,
8
-
decimal
))))
}
witnessClaim
.
Amount
=
event
.
Value
.
String
()
witnessClaim
.
Amount
=
event
.
Value
.
String
()
witnessClaim
.
ClaimType
=
types
.
LOCK_CLAIM_TYPE
witnessClaim
.
ClaimType
=
types
.
LOCK_CLAIM_TYPE
...
@@ -97,6 +103,11 @@ func ParseBurnLockTxReceipt(claimType events.Event, receipt *chain33Types.Receip
...
@@ -97,6 +103,11 @@ func ParseBurnLockTxReceipt(claimType events.Event, receipt *chain33Types.Receip
chain33ToEth
.
Amount
=
types
.
TrimZeroAndDot
(
chain33ToEth
.
Amount
)
chain33ToEth
.
Amount
=
types
.
TrimZeroAndDot
(
chain33ToEth
.
Amount
)
amount
=
big
.
NewInt
(
1
)
amount
=
big
.
NewInt
(
1
)
amount
,
_
=
amount
.
SetString
(
chain33ToEth
.
Amount
,
10
)
amount
,
_
=
amount
.
SetString
(
chain33ToEth
.
Amount
,
10
)
if
chain33ToEth
.
Decimals
>
8
{
amount
=
amount
.
Mul
(
amount
,
big
.
NewInt
(
int64
(
types
.
MultiplySpecifyTimes
(
1
,
chain33ToEth
.
Decimals
-
8
))))
}
else
{
amount
=
amount
.
Quo
(
amount
,
big
.
NewInt
(
int64
(
types
.
MultiplySpecifyTimes
(
1
,
8
-
chain33ToEth
.
Decimals
))))
}
txslog
.
Info
(
"ParseBurnLockTxReceipt"
,
"chain33Sender"
,
chain33Sender
,
"ethereumReceiver"
,
ethereumReceiver
.
String
(),
"tokenContractAddress"
,
tokenContractAddress
.
String
(),
"symbol"
,
symbol
,
"amount"
,
amount
.
String
())
txslog
.
Info
(
"ParseBurnLockTxReceipt"
,
"chain33Sender"
,
chain33Sender
,
"ethereumReceiver"
,
ethereumReceiver
.
String
(),
"tokenContractAddress"
,
tokenContractAddress
.
String
(),
"symbol"
,
symbol
,
"amount"
,
amount
.
String
())
// Package the event data into a Chain33Msg
// Package the event data into a Chain33Msg
...
...
plugin/dapp/x2Ethereum/executor/common/address.go
deleted
100644 → 0
View file @
98a98728
package
common
import
(
"fmt"
"reflect"
gethCommon
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
)
// EthereumAddress defines a standard ethereum address
type
EthAddress
gethCommon
.
Address
// NewEthereumAddress is a constructor function for EthereumAddress
func
NewEthereumAddress
(
address
string
)
EthAddress
{
return
EthAddress
(
gethCommon
.
HexToAddress
(
address
))
}
// Route should return the name of the module
func
(
ethAddr
EthAddress
)
String
()
string
{
return
gethCommon
.
Address
(
ethAddr
)
.
String
()
}
// MarshalJSON marshals the etherum address to JSON
func
(
ethAddr
EthAddress
)
MarshalJSON
()
([]
byte
,
error
)
{
return
[]
byte
(
fmt
.
Sprintf
(
"
\"
%v
\"
"
,
ethAddr
.
String
())),
nil
}
// UnmarshalJSON unmarshals an ethereum address
func
(
ethAddr
*
EthAddress
)
UnmarshalJSON
(
input
[]
byte
)
error
{
return
hexutil
.
UnmarshalFixedJSON
(
reflect
.
TypeOf
(
gethCommon
.
Address
{}),
input
,
ethAddr
[
:
])
}
plugin/dapp/x2Ethereum/executor/common/common_test.go
deleted
100644 → 0
View file @
98a98728
package
common
import
(
"fmt"
"math"
"math/big"
"testing"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
)
func
TestAddToStringMap
(
t
*
testing
.
T
)
{
bn
:=
big
.
NewInt
(
1
)
ss
:=
types
.
TrimZeroAndDot
(
fmt
.
Sprintf
(
"%.0f"
,
types
.
MultiplySpecifyTimes
(
math
.
Trunc
(
5
*
1e4
),
14
)))
bn
,
ok
:=
bn
.
SetString
(
ss
,
10
)
fmt
.
Println
(
bn
,
ok
)
}
plugin/dapp/x2Ethereum/executor/ethbridge/claim.go
View file @
34fd2055
package
ethbridge
package
ethbridge
import
(
import
(
"encoding/json"
"errors"
"errors"
"fmt"
"fmt"
"github.com/golang/protobuf/proto"
"strconv"
"strconv"
log
"github.com/33cn/chain33/common/log/log15"
log
"github.com/33cn/chain33/common/log/log15"
...
@@ -15,22 +15,6 @@ var (
...
@@ -15,22 +15,6 @@ var (
elog
=
log
.
New
(
"module"
,
"ethbridge"
)
elog
=
log
.
New
(
"module"
,
"ethbridge"
)
)
)
func
NewEthBridgeClaim
(
ethereumChainID
int64
,
bridgeContract
string
,
nonce
int64
,
localCoinSymbol
,
localCoinExec
string
,
tokenContact
string
,
ethereumSender
string
,
chain33Receiver
string
,
validator
string
,
amount
string
,
claimType
int64
)
types
.
Eth2Chain33
{
return
types
.
Eth2Chain33
{
EthereumChainID
:
ethereumChainID
,
BridgeContractAddress
:
bridgeContract
,
Nonce
:
nonce
,
TokenContractAddress
:
tokenContact
,
EthereumSender
:
ethereumSender
,
Chain33Receiver
:
chain33Receiver
,
ValidatorAddress
:
validator
,
Amount
:
amount
,
ClaimType
:
claimType
,
LocalCoinSymbol
:
localCoinSymbol
,
LocalCoinExec
:
localCoinExec
,
}
}
func
NewOracleClaimContent
(
chain33Receiver
string
,
amount
string
,
claimType
,
decimals
int64
)
types
.
OracleClaimContent
{
func
NewOracleClaimContent
(
chain33Receiver
string
,
amount
string
,
claimType
,
decimals
int64
)
types
.
OracleClaimContent
{
return
types
.
OracleClaimContent
{
return
types
.
OracleClaimContent
{
Chain33Receiver
:
chain33Receiver
,
Chain33Receiver
:
chain33Receiver
,
...
@@ -53,14 +37,14 @@ func CreateOracleClaimFromEthClaim(ethClaim types.Eth2Chain33) (types.OracleClai
...
@@ -53,14 +37,14 @@ func CreateOracleClaimFromEthClaim(ethClaim types.Eth2Chain33) (types.OracleClai
if
ethClaim
.
ClaimType
!=
int64
(
types
.
LOCK_CLAIM_TYPE
)
&&
ethClaim
.
ClaimType
!=
int64
(
types
.
BURN_CLAIM_TYPE
)
{
if
ethClaim
.
ClaimType
!=
int64
(
types
.
LOCK_CLAIM_TYPE
)
&&
ethClaim
.
ClaimType
!=
int64
(
types
.
BURN_CLAIM_TYPE
)
{
return
types
.
OracleClaim
{},
types
.
ErrInvalidClaimType
return
types
.
OracleClaim
{},
types
.
ErrInvalidClaimType
}
}
oracleID
:=
strconv
.
Itoa
(
int
(
ethClaim
.
EthereumChainID
))
+
strconv
.
Itoa
(
int
(
ethClaim
.
Nonce
))
+
ethClaim
.
EthereumSender
oracleID
:=
strconv
.
Itoa
(
int
(
ethClaim
.
EthereumChainID
))
+
strconv
.
Itoa
(
int
(
ethClaim
.
Nonce
))
+
ethClaim
.
EthereumSender
+
ethClaim
.
TokenContractAddress
if
ethClaim
.
ClaimType
==
int64
(
types
.
LOCK_CLAIM_TYPE
)
{
if
ethClaim
.
ClaimType
==
int64
(
types
.
LOCK_CLAIM_TYPE
)
{
oracleID
=
oracleID
+
"lock"
oracleID
=
oracleID
+
"lock"
}
else
if
ethClaim
.
ClaimType
==
int64
(
types
.
BURN_CLAIM_TYPE
)
{
}
else
if
ethClaim
.
ClaimType
==
int64
(
types
.
BURN_CLAIM_TYPE
)
{
oracleID
=
oracleID
+
"burn"
oracleID
=
oracleID
+
"burn"
}
}
claimContent
:=
NewOracleClaimContent
(
ethClaim
.
Chain33Receiver
,
ethClaim
.
Amount
,
ethClaim
.
ClaimType
,
ethClaim
.
Decimals
)
claimContent
:=
NewOracleClaimContent
(
ethClaim
.
Chain33Receiver
,
ethClaim
.
Amount
,
ethClaim
.
ClaimType
,
ethClaim
.
Decimals
)
claimBytes
,
err
:=
json
.
Marshal
(
claimContent
)
claimBytes
,
err
:=
proto
.
Marshal
(
&
claimContent
)
if
err
!=
nil
{
if
err
!=
nil
{
return
types
.
OracleClaim
{},
err
return
types
.
OracleClaim
{},
err
}
}
...
@@ -69,34 +53,11 @@ func CreateOracleClaimFromEthClaim(ethClaim types.Eth2Chain33) (types.OracleClai
...
@@ -69,34 +53,11 @@ func CreateOracleClaimFromEthClaim(ethClaim types.Eth2Chain33) (types.OracleClai
return
claim
,
nil
return
claim
,
nil
}
}
// 通过oracleclaim反向构造ethchain33结构
func
CreateEthClaimFromOracleString
(
ethereumChainID
int64
,
bridgeContract
string
,
nonce
int64
,
localCoinSymbol
,
localCoinExec
string
,
tokenContract
string
,
ethereumAddress
string
,
validator
string
,
oracleClaimString
string
)
(
types
.
Eth2Chain33
,
error
)
{
oracleClaim
,
err
:=
CreateOracleClaimFromOracleString
(
oracleClaimString
)
if
err
!=
nil
{
elog
.
Error
(
"CreateEthClaimFromOracleString"
,
"CreateOracleClaimFromOracleString error"
,
err
)
return
types
.
Eth2Chain33
{},
err
}
return
NewEthBridgeClaim
(
ethereumChainID
,
bridgeContract
,
nonce
,
localCoinSymbol
,
localCoinExec
,
tokenContract
,
ethereumAddress
,
oracleClaim
.
Chain33Receiver
,
validator
,
oracleClaim
.
Amount
,
oracleClaim
.
ClaimType
,
),
nil
}
func
CreateOracleClaimFromOracleString
(
oracleClaimString
string
)
(
types
.
OracleClaimContent
,
error
)
{
func
CreateOracleClaimFromOracleString
(
oracleClaimString
string
)
(
types
.
OracleClaimContent
,
error
)
{
var
oracleClaimContent
types
.
OracleClaimContent
var
oracleClaimContent
types
.
OracleClaimContent
bz
:=
[]
byte
(
oracleClaimString
)
bz
:=
[]
byte
(
oracleClaimString
)
if
err
:=
json
.
Unmarshal
(
bz
,
&
oracleClaimContent
);
err
!=
nil
{
if
err
:=
proto
.
Unmarshal
(
bz
,
&
oracleClaimContent
);
err
!=
nil
{
return
types
.
OracleClaimContent
{},
errors
.
New
(
fmt
.
Sprintf
(
"failed to parse claim: %s"
,
err
.
Error
()))
return
types
.
OracleClaimContent
{},
errors
.
New
(
fmt
.
Sprintf
(
"failed to parse claim: %s"
,
err
.
Error
()))
}
}
...
...
plugin/dapp/x2Ethereum/executor/ethbridge/expectedkeeper.go
deleted
100644 → 0
View file @
98a98728
package
ethbridge
import
(
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/executor/oracle"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
)
// OracleKeeper defines the expected oracle keeper
type
OracleKeeper
interface
{
ProcessClaim
(
claim
types
.
OracleClaim
)
(
oracle
.
Status
,
error
)
GetProphecy
(
id
string
)
(
oracle
.
Prophecy
,
error
)
GetValidatorArray
()
([]
types
.
MsgValidator
,
error
)
SetConsensusThreshold
(
ConsensusThreshold
int64
)
GetConsensusThreshold
()
int64
}
plugin/dapp/x2Ethereum/executor/ethbridge/keeper.go
View file @
34fd2055
package
ethbridge
package
ethbridge
import
(
import
(
"
encoding/json
"
"
github.com/golang/protobuf/proto
"
"strconv"
"strconv"
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/account"
...
@@ -13,11 +13,11 @@ import (
...
@@ -13,11 +13,11 @@ import (
)
)
type
Keeper
struct
{
type
Keeper
struct
{
oracleKeeper
OracleKeeper
oracleKeeper
oracle
.
OracleKeeper
db
dbm
.
KV
db
dbm
.
KV
}
}
func
NewKeeper
(
oracleKeeper
OracleKeeper
,
db
dbm
.
KV
)
Keeper
{
func
NewKeeper
(
oracleKeeper
oracle
.
OracleKeeper
,
db
dbm
.
KV
)
Keeper
{
return
Keeper
{
return
Keeper
{
oracleKeeper
:
oracleKeeper
,
oracleKeeper
:
oracleKeeper
,
db
:
db
,
db
:
db
,
...
@@ -25,16 +25,16 @@ func NewKeeper(oracleKeeper OracleKeeper, db dbm.KV) Keeper {
...
@@ -25,16 +25,16 @@ func NewKeeper(oracleKeeper OracleKeeper, db dbm.KV) Keeper {
}
}
// 处理接收到的ethchain33请求
// 处理接收到的ethchain33请求
func
(
k
Keeper
)
ProcessClaim
(
claim
types
.
Eth2Chain33
)
(
oracle
.
Status
,
error
)
{
func
(
k
Keeper
)
ProcessClaim
(
claim
types
.
Eth2Chain33
)
(
*
types
.
Prophecy
Status
,
error
)
{
oracleClaim
,
err
:=
CreateOracleClaimFromEthClaim
(
claim
)
oracleClaim
,
err
:=
CreateOracleClaimFromEthClaim
(
claim
)
if
err
!=
nil
{
if
err
!=
nil
{
elog
.
Error
(
"CreateEthClaimFromOracleString"
,
"CreateOracleClaimFromOracleString error"
,
err
)
elog
.
Error
(
"CreateEthClaimFromOracleString"
,
"CreateOracleClaimFromOracleString error"
,
err
)
return
oracle
.
Status
{}
,
err
return
nil
,
err
}
}
status
,
err
:=
k
.
oracleKeeper
.
ProcessClaim
(
oracleClaim
)
status
,
err
:=
k
.
oracleKeeper
.
ProcessClaim
(
oracleClaim
)
if
err
!=
nil
{
if
err
!=
nil
{
return
oracle
.
Status
{}
,
err
return
nil
,
err
}
}
return
status
,
nil
return
status
,
nil
}
}
...
@@ -52,14 +52,7 @@ func (k Keeper) ProcessSuccessfulClaimForLock(claim, execAddr, tokenSymbol, toke
...
@@ -52,14 +52,7 @@ func (k Keeper) ProcessSuccessfulClaimForLock(claim, execAddr, tokenSymbol, toke
if
oracleClaim
.
ClaimType
==
int64
(
types
.
LOCK_CLAIM_TYPE
)
{
if
oracleClaim
.
ClaimType
==
int64
(
types
.
LOCK_CLAIM_TYPE
)
{
//铸币到相关的tokenSymbolBank账户下
//铸币到相关的tokenSymbolBank账户下
d
:=
oracleClaim
.
Decimals
amount
,
_
:=
strconv
.
ParseInt
(
types
.
TrimZeroAndDot
(
oracleClaim
.
Amount
),
10
,
64
)
var
amount
int64
if
d
>
8
{
amount
=
int64
(
types
.
Toeth
(
oracleClaim
.
Amount
,
d
-
8
))
}
else
{
a
,
_
:=
strconv
.
ParseFloat
(
types
.
TrimZeroAndDot
(
oracleClaim
.
Amount
),
64
)
amount
=
int64
(
types
.
MultiplySpecifyTimes
(
a
,
8
-
d
))
}
receipt
,
err
=
accDB
.
Mint
(
execAddr
,
amount
)
receipt
,
err
=
accDB
.
Mint
(
execAddr
,
amount
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -103,12 +96,6 @@ func (k Keeper) ProcessSuccessfulClaimForBurn(claim, execAddr, tokenSymbol strin
...
@@ -103,12 +96,6 @@ func (k Keeper) ProcessSuccessfulClaimForBurn(claim, execAddr, tokenSymbol strin
// ProcessBurn processes the burn of bridged coins from the given sender
// ProcessBurn processes the burn of bridged coins from the given sender
func
(
k
Keeper
)
ProcessBurn
(
address
,
execAddr
,
amount
,
tokenAddress
string
,
d
int64
,
accDB
*
account
.
DB
)
(
*
types2
.
Receipt
,
error
)
{
func
(
k
Keeper
)
ProcessBurn
(
address
,
execAddr
,
amount
,
tokenAddress
string
,
d
int64
,
accDB
*
account
.
DB
)
(
*
types2
.
Receipt
,
error
)
{
var
a
int64
var
a
int64
if
d
>
8
{
a
=
int64
(
types
.
Toeth
(
amount
,
d
-
8
))
}
else
{
aa
,
_
:=
strconv
.
ParseFloat
(
types
.
TrimZeroAndDot
(
amount
),
64
)
a
=
int64
(
types
.
MultiplySpecifyTimes
(
aa
,
8
-
d
))
}
receipt
,
err
:=
accDB
.
ExecWithdraw
(
execAddr
,
address
,
a
)
receipt
,
err
:=
accDB
.
ExecWithdraw
(
execAddr
,
address
,
a
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
...
@@ -135,7 +122,6 @@ func (k Keeper) ProcessLock(address, to, execAddr, amount string, accDB *account
...
@@ -135,7 +122,6 @@ func (k Keeper) ProcessLock(address, to, execAddr, amount string, accDB *account
return
receipt
,
nil
return
receipt
,
nil
}
}
//todo
// 对于相同的地址该如何处理?
// 对于相同的地址该如何处理?
// 现有方案是相同地址就报错
// 现有方案是相同地址就报错
func
(
k
Keeper
)
ProcessAddValidator
(
address
string
,
power
int64
)
(
*
types2
.
Receipt
,
error
)
{
func
(
k
Keeper
)
ProcessAddValidator
(
address
string
,
power
int64
)
(
*
types2
.
Receipt
,
error
)
{
...
@@ -146,9 +132,13 @@ func (k Keeper) ProcessAddValidator(address string, power int64) (*types2.Receip
...
@@ -146,9 +132,13 @@ func (k Keeper) ProcessAddValidator(address string, power int64) (*types2.Receip
return
nil
,
err
return
nil
,
err
}
}
if
validatorMaps
==
nil
{
validatorMaps
=
new
(
types
.
ValidatorList
)
}
elog
.
Info
(
"ProcessLogInValidator"
,
"pre validatorMaps"
,
validatorMaps
,
"Add Address"
,
address
,
"Add power"
,
power
)
elog
.
Info
(
"ProcessLogInValidator"
,
"pre validatorMaps"
,
validatorMaps
,
"Add Address"
,
address
,
"Add power"
,
power
)
var
totalPower
int64
var
totalPower
int64
for
_
,
p
:=
range
validatorMaps
{
for
_
,
p
:=
range
validatorMaps
.
Validators
{
if
p
.
Address
!=
address
{
if
p
.
Address
!=
address
{
totalPower
+=
p
.
Power
totalPower
+=
p
.
Power
}
else
{
}
else
{
...
@@ -156,18 +146,21 @@ func (k Keeper) ProcessAddValidator(address string, power int64) (*types2.Receip
...
@@ -156,18 +146,21 @@ func (k Keeper) ProcessAddValidator(address string, power int64) (*types2.Receip
}
}
}
}
v
alidatorMaps
=
append
(
validatorMaps
,
types
.
MsgValidator
{
v
s
:=
append
(
validatorMaps
.
Validators
,
&
types
.
MsgValidator
{
Address
:
address
,
Address
:
address
,
Power
:
power
,
Power
:
power
,
})
})
v
,
_
:=
json
.
Marshal
(
validatorMaps
)
validatorMaps
.
Validators
=
vs
v
,
_
:=
proto
.
Marshal
(
validatorMaps
)
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalValidatorMapsPrefix
(),
Value
:
v
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalValidatorMapsPrefix
(),
Value
:
v
})
totalPower
+=
power
totalPower
+=
power
totalP
:=
types
.
ReceiptQueryTotalPower
{
totalP
:=
types
.
ReceiptQueryTotalPower
{
TotalPower
:
totalPower
,
TotalPower
:
totalPower
,
}
}
totalPBytes
,
_
:=
json
.
Marshal
(
totalP
)
totalPBytes
,
_
:=
proto
.
Marshal
(
&
totalP
)
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalLastTotalPowerPrefix
(),
Value
:
totalPBytes
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalLastTotalPowerPrefix
(),
Value
:
totalPBytes
})
return
receipt
,
nil
return
receipt
,
nil
}
}
...
@@ -183,13 +176,13 @@ func (k Keeper) ProcessRemoveValidator(address string) (*types2.Receipt, error)
...
@@ -183,13 +176,13 @@ func (k Keeper) ProcessRemoveValidator(address string) (*types2.Receipt, error)
elog
.
Info
(
"ProcessLogOutValidator"
,
"pre validatorMaps"
,
validatorMaps
,
"Delete Address"
,
address
)
elog
.
Info
(
"ProcessLogOutValidator"
,
"pre validatorMaps"
,
validatorMaps
,
"Delete Address"
,
address
)
var
totalPower
int64
var
totalPower
int64
va
r
validatorRes
[]
types
.
MsgValidator
va
lidatorRes
:=
new
(
types
.
ValidatorList
)
for
_
,
p
:=
range
validatorMaps
{
for
_
,
p
:=
range
validatorMaps
.
Validators
{
if
address
!=
p
.
Address
{
if
address
!=
p
.
Address
{
validatorRes
=
append
(
validatorRes
,
p
)
v
:=
append
(
validatorRes
.
Validators
,
p
)
validatorRes
.
Validators
=
v
totalPower
+=
p
.
Power
totalPower
+=
p
.
Power
}
else
{
}
else
{
//oracle.RemoveAddrFromValidatorMap(validatorMaps, index)
exist
=
true
exist
=
true
continue
continue
}
}
...
@@ -199,12 +192,12 @@ func (k Keeper) ProcessRemoveValidator(address string) (*types2.Receipt, error)
...
@@ -199,12 +192,12 @@ func (k Keeper) ProcessRemoveValidator(address string) (*types2.Receipt, error)
return
nil
,
types
.
ErrAddressNotExist
return
nil
,
types
.
ErrAddressNotExist
}
}
v
,
_
:=
json
.
Marshal
(
validatorRes
)
v
,
_
:=
proto
.
Marshal
(
validatorRes
)
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalValidatorMapsPrefix
(),
Value
:
v
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalValidatorMapsPrefix
(),
Value
:
v
})
totalP
:=
types
.
ReceiptQueryTotalPower
{
totalP
:=
types
.
ReceiptQueryTotalPower
{
TotalPower
:
totalPower
,
TotalPower
:
totalPower
,
}
}
totalPBytes
,
_
:=
json
.
Marshal
(
totalP
)
totalPBytes
,
_
:=
proto
.
Marshal
(
&
totalP
)
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalLastTotalPowerPrefix
(),
Value
:
totalPBytes
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalLastTotalPowerPrefix
(),
Value
:
totalPBytes
})
return
receipt
,
nil
return
receipt
,
nil
}
}
...
@@ -221,11 +214,11 @@ func (k Keeper) ProcessModifyValidator(address string, power int64) (*types2.Rec
...
@@ -221,11 +214,11 @@ func (k Keeper) ProcessModifyValidator(address string, power int64) (*types2.Rec
elog
.
Info
(
"ProcessModifyValidator"
,
"pre validatorMaps"
,
validatorMaps
,
"Modify Address"
,
address
,
"Modify power"
,
power
)
elog
.
Info
(
"ProcessModifyValidator"
,
"pre validatorMaps"
,
validatorMaps
,
"Modify Address"
,
address
,
"Modify power"
,
power
)
var
totalPower
int64
var
totalPower
int64
for
index
,
p
:=
range
validatorMaps
{
for
index
,
p
:=
range
validatorMaps
.
Validators
{
if
address
!=
p
.
Address
{
if
address
!=
p
.
Address
{
totalPower
+=
p
.
Power
totalPower
+=
p
.
Power
}
else
{
}
else
{
validatorMaps
[
index
]
.
Power
=
power
validatorMaps
.
Validators
[
index
]
.
Power
=
power
exist
=
true
exist
=
true
totalPower
+=
power
totalPower
+=
power
}
}
...
@@ -235,18 +228,18 @@ func (k Keeper) ProcessModifyValidator(address string, power int64) (*types2.Rec
...
@@ -235,18 +228,18 @@ func (k Keeper) ProcessModifyValidator(address string, power int64) (*types2.Rec
return
nil
,
types
.
ErrAddressNotExist
return
nil
,
types
.
ErrAddressNotExist
}
}
v
,
_
:=
json
.
Marshal
(
validatorMaps
)
v
,
_
:=
proto
.
Marshal
(
validatorMaps
)
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalValidatorMapsPrefix
(),
Value
:
v
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalValidatorMapsPrefix
(),
Value
:
v
})
totalP
:=
types
.
ReceiptQueryTotalPower
{
totalP
:=
types
.
ReceiptQueryTotalPower
{
TotalPower
:
totalPower
,
TotalPower
:
totalPower
,
}
}
totalPBytes
,
_
:=
json
.
Marshal
(
totalP
)
totalPBytes
,
_
:=
proto
.
Marshal
(
&
totalP
)
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalLastTotalPowerPrefix
(),
Value
:
totalPBytes
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types2
.
KeyValue
{
Key
:
types
.
CalLastTotalPowerPrefix
(),
Value
:
totalPBytes
})
return
receipt
,
nil
return
receipt
,
nil
}
}
func
(
k
Keeper
)
ProcessSetConsensusNeeded
(
ConsensusThreshold
int64
)
(
int64
,
int64
,
error
)
{
func
(
k
*
Keeper
)
ProcessSetConsensusNeeded
(
ConsensusThreshold
int64
)
(
int64
,
int64
,
error
)
{
preCon
:=
k
.
oracleKeeper
.
GetConsensusThreshold
()
preCon
:=
k
.
oracleKeeper
.
GetConsensusThreshold
()
k
.
oracleKeeper
.
SetConsensusThreshold
(
ConsensusThreshold
)
k
.
oracleKeeper
.
SetConsensusThreshold
(
ConsensusThreshold
)
nowCon
:=
k
.
oracleKeeper
.
GetConsensusThreshold
()
nowCon
:=
k
.
oracleKeeper
.
GetConsensusThreshold
()
...
...
plugin/dapp/x2Ethereum/executor/ethbridge/msgburn.go
deleted
100644 → 0
View file @
98a98728
package
ethbridge
import
(
"strconv"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/executor/common"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
gethCommon
"github.com/ethereum/go-ethereum/common"
)
type
Msg_Burn
struct
{
EthereumChainID
int64
`json:"ethereum_chain_id" yaml:"ethereum_chain_id"`
TokenContract
common
.
EthAddress
`json:"token_contract_address" yaml:"token_contract_address"`
Chain33Sender
string
`json:"chain33_sender" yaml:"chain33_sender"`
EthereumReceiver
common
.
EthAddress
`json:"ethereum_receiver" yaml:"ethereum_receiver"`
Amount
uint64
`json:"amount" yaml:"amount"`
}
func
NewMsgBurn
(
ethereumChainID
int64
,
tokenContract
string
,
chain33Sender
string
,
ethereumReceiver
string
,
amount
uint64
)
Msg_Burn
{
return
Msg_Burn
{
EthereumChainID
:
ethereumChainID
,
TokenContract
:
common
.
NewEthereumAddress
(
tokenContract
),
Chain33Sender
:
chain33Sender
,
EthereumReceiver
:
common
.
NewEthereumAddress
(
ethereumReceiver
),
Amount
:
amount
,
}
}
// Route should return the name of the module
func
(
msg
Msg_Burn
)
Route
()
string
{
return
types
.
ModuleName
}
// Type should return the action
func
(
msg
Msg_Burn
)
Type
()
string
{
return
"burn"
}
// ValidateBasic runs stateless checks on the message
func
(
msg
Msg_Burn
)
ValidateBasic
()
error
{
if
strconv
.
Itoa
(
int
(
msg
.
EthereumChainID
))
==
""
{
return
types
.
ErrInvalidChainID
}
if
msg
.
TokenContract
.
String
()
==
""
{
return
types
.
ErrInvalidEthAddress
}
if
!
gethCommon
.
IsHexAddress
(
msg
.
TokenContract
.
String
())
{
return
types
.
ErrInvalidEthAddress
}
if
types
.
AddressIsEmpty
(
msg
.
Chain33Sender
)
{
return
types
.
ErrInvalidAddress
}
if
msg
.
EthereumReceiver
.
String
()
==
""
{
return
types
.
ErrInvalidEthAddress
}
if
!
gethCommon
.
IsHexAddress
(
msg
.
EthereumReceiver
.
String
())
{
return
types
.
ErrInvalidEthAddress
}
return
nil
}
plugin/dapp/x2Ethereum/executor/ethbridge/msgcreateclaim.go
deleted
100644 → 0
View file @
98a98728
package
ethbridge
import
(
"errors"
"fmt"
"strings"
"github.com/33cn/chain33/common/address"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
gethCommon
"github.com/ethereum/go-ethereum/common"
)
// MsgCreateEthBridgeClaim defines a message for creating claims on the ethereum bridge
type
MsgCreateEthBridgeClaim
types
.
Eth2Chain33
// NewMsgCreateEthBridgeClaim is a constructor function for MsgCreateBridgeClaim
func
NewMsgCreateEthBridgeClaim
(
ethBridgeClaim
types
.
Eth2Chain33
)
MsgCreateEthBridgeClaim
{
return
MsgCreateEthBridgeClaim
(
ethBridgeClaim
)
}
// Route should return the name of the module
func
(
msg
MsgCreateEthBridgeClaim
)
Route
()
string
{
return
types
.
ModuleName
}
// Type should return the action
func
(
msg
MsgCreateEthBridgeClaim
)
Type
()
string
{
return
"create_bridge_claim"
}
// ValidateBasic runs stateless checks on the message
func
(
msg
MsgCreateEthBridgeClaim
)
ValidateBasic
()
error
{
if
types
.
AddressIsEmpty
(
msg
.
Chain33Receiver
)
{
return
types
.
ErrInvalidAddress
}
if
types
.
AddressIsEmpty
(
msg
.
ValidatorAddress
)
{
return
types
.
ErrInvalidAddress
}
if
msg
.
Nonce
<
0
{
return
types
.
ErrInvalidEthNonce
}
if
!
gethCommon
.
IsHexAddress
(
msg
.
EthereumSender
)
{
return
types
.
ErrInvalidEthAddress
}
if
!
gethCommon
.
IsHexAddress
(
msg
.
BridgeContractAddress
)
{
return
types
.
ErrInvalidEthAddress
}
if
strings
.
ToLower
(
msg
.
LocalCoinSymbol
)
==
"eth"
&&
msg
.
TokenContractAddress
!=
"0x0000000000000000000000000000000000000000"
{
return
types
.
ErrInvalidEthSymbol
}
return
nil
}
// MapOracleClaimsToEthBridgeClaims maps a set of generic oracle claim data into EthBridgeClaim objects
func
MapOracleClaimsToEthBridgeClaims
(
ethereumChainID
int
,
bridgeContract
string
,
nonce
int
,
symbol
string
,
tokenContract
string
,
ethereumSender
string
,
oracleValidatorClaims
map
[
string
]
string
,
f
func
(
int
,
string
,
int
,
string
,
string
,
string
,
string
,
string
)
(
types
.
Eth2Chain33
,
error
))
([]
types
.
Eth2Chain33
,
error
)
{
mappedClaims
:=
make
([]
types
.
Eth2Chain33
,
len
(
oracleValidatorClaims
))
i
:=
0
for
validator
,
validatorClaim
:=
range
oracleValidatorClaims
{
parseErr
:=
address
.
CheckAddress
(
validator
)
if
parseErr
!=
nil
{
return
nil
,
errors
.
New
(
fmt
.
Sprintf
(
"failed to parse claim: %s"
,
parseErr
))
}
mappedClaim
,
err
:=
f
(
ethereumChainID
,
bridgeContract
,
nonce
,
symbol
,
tokenContract
,
ethereumSender
,
validator
,
validatorClaim
)
if
err
!=
nil
{
return
nil
,
err
}
mappedClaims
[
i
]
=
mappedClaim
i
++
}
return
mappedClaims
,
nil
}
plugin/dapp/x2Ethereum/executor/ethbridge/msglock.go
deleted
100644 → 0
View file @
98a98728
package
ethbridge
import
(
"strconv"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/executor/common"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
gethCommon
"github.com/ethereum/go-ethereum/common"
)
// MsgLock defines a message for locking coins and triggering a related event
type
MsgLock
struct
{
EthereumChainID
int
`json:"ethereum_chain_id" yaml:"ethereum_chain_id"`
TokenContract
common
.
EthAddress
`json:"token_contract_address" yaml:"token_contract_address"`
Chain33Sender
string
`json:"chain33_sender" yaml:"chain33_sender"`
EthereumReceiver
common
.
EthAddress
`json:"ethereum_receiver" yaml:"ethereum_receiver"`
Amount
uint64
`json:"amount" yaml:"amount"`
}
// NewMsgLock is a constructor function for MsgLock
func
NewMsgLock
(
ethereumChainID
int
,
tokenContract
string
,
cosmosSender
string
,
ethereumReceiver
string
,
amount
uint64
)
MsgLock
{
return
MsgLock
{
EthereumChainID
:
ethereumChainID
,
TokenContract
:
common
.
NewEthereumAddress
(
tokenContract
),
Chain33Sender
:
cosmosSender
,
EthereumReceiver
:
common
.
NewEthereumAddress
(
ethereumReceiver
),
Amount
:
amount
,
}
}
// Route should return the name of the module
func
(
msg
MsgLock
)
Route
()
string
{
return
types
.
ModuleName
}
// Type should return the action
func
(
msg
MsgLock
)
Type
()
string
{
return
"lock"
}
// ValidateBasic runs stateless checks on the message
func
(
msg
MsgLock
)
ValidateBasic
()
error
{
if
strconv
.
Itoa
(
msg
.
EthereumChainID
)
==
""
{
return
types
.
ErrInvalidChainID
}
if
msg
.
TokenContract
.
String
()
==
""
{
return
types
.
ErrInvalidEthAddress
}
if
!
gethCommon
.
IsHexAddress
(
msg
.
TokenContract
.
String
())
{
return
types
.
ErrInvalidEthAddress
}
if
types
.
AddressIsEmpty
(
msg
.
Chain33Sender
)
{
return
types
.
ErrInvalidAddress
}
if
msg
.
EthereumReceiver
.
String
()
==
""
{
return
types
.
ErrInvalidEthAddress
}
if
!
gethCommon
.
IsHexAddress
(
msg
.
EthereumReceiver
.
String
())
{
return
types
.
ErrInvalidEthAddress
}
return
nil
}
plugin/dapp/x2Ethereum/executor/exec.go
View file @
34fd2055
...
@@ -19,57 +19,56 @@ import (
...
@@ -19,57 +19,56 @@ import (
// 然后relayer端订阅到该消息后向chain33发送该类型消息
// 然后relayer端订阅到该消息后向chain33发送该类型消息
// 本端在验证该类型的请求合理后铸币,并生成相同数额的token
// 本端在验证该类型的请求合理后铸币,并生成相同数额的token
func
(
x
*
x2ethereum
)
Exec_Eth2Chain33
(
payload
*
x2ethereumtypes
.
Eth2Chain33
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
x
*
x2ethereum
)
Exec_Eth2Chain33
(
payload
*
x2ethereumtypes
.
Eth2Chain33
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
action
,
defaultCon
:=
newAction
(
x
,
tx
,
int32
(
index
))
action
:=
newAction
(
x
,
tx
,
int32
(
index
))
if
action
==
nil
{
if
action
==
nil
{
return
nil
,
errors
.
New
(
"Create Action Error"
)
return
nil
,
errors
.
New
(
"Create Action Error"
)
}
}
if
payload
.
ValidatorAddress
==
""
{
payload
.
ValidatorAddress
=
address
.
PubKeyToAddr
(
tx
.
Signature
.
Pubkey
)
payload
.
ValidatorAddress
=
address
.
PubKeyToAddr
(
tx
.
Signature
.
Pubkey
)
}
return
action
.
procMsgEth2Chain33
(
payload
,
defaultCon
)
return
action
.
procMsgEth2Chain33
(
payload
)
}
}
//
将因ethereum端锁定的eth或者erc20而在chain33端生成的token返还
//
WithdrawChain33类型的交易是将Eth端因Chain33端锁定所生成的token返还给Chain33端(Burn)
func
(
x
*
x2ethereum
)
Exec_Withdraw
Eth
(
payload
*
x2ethereumtypes
.
Eth2Chain33
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
x
*
x2ethereum
)
Exec_Withdraw
Chain33
(
payload
*
x2ethereumtypes
.
Chain33ToEth
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
action
,
defaultCon
:=
newAction
(
x
,
tx
,
int32
(
index
))
action
:=
newAction
(
x
,
tx
,
int32
(
index
))
if
action
==
nil
{
if
action
==
nil
{
return
nil
,
errors
.
New
(
"Create Action Error"
)
return
nil
,
errors
.
New
(
"Create Action Error"
)
}
}
if
payload
.
ValidatorAddress
==
""
{
return
action
.
procMsgBurn
(
payload
)
payload
.
ValidatorAddress
=
address
.
PubKeyToAddr
(
tx
.
Signature
.
Pubkey
)
}
return
action
.
procWithdrawEth
(
payload
,
defaultCon
)
}
}
//---------------- Chain33(eth/erc20) --> Ethereum-------------------//
//---------------- Chain33(eth/erc20) --> Ethereum-------------------//
//
WithdrawChain33类型的交易是Chain33侧将本端生成的token返还到Ethereum端
//
将因ethereum端锁定的eth或者erc20而在chain33端生成的token返还
func
(
x
*
x2ethereum
)
Exec_Withdraw
Chain33
(
payload
*
x2ethereumtypes
.
Chain33ToEth
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
x
*
x2ethereum
)
Exec_Withdraw
Eth
(
payload
*
x2ethereumtypes
.
Eth2Chain33
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
action
,
defaultCon
:=
newAction
(
x
,
tx
,
int32
(
index
))
action
:=
newAction
(
x
,
tx
,
int32
(
index
))
if
action
==
nil
{
if
action
==
nil
{
return
nil
,
errors
.
New
(
"Create Action Error"
)
return
nil
,
errors
.
New
(
"Create Action Error"
)
}
}
return
action
.
procMsgBurn
(
payload
,
defaultCon
)
payload
.
ValidatorAddress
=
address
.
PubKeyToAddr
(
tx
.
Signature
.
Pubkey
)
return
action
.
procWithdrawEth
(
payload
)
}
}
// Chain33ToEth类型的交易是Chain33侧在本端发出申请
// Chain33ToEth类型的交易是Chain33侧在本端发出申请
// 在本端锁定一定数额的token,然后在ethereum端生成相同数额的token
// 在本端锁定一定数额的token,然后在ethereum端生成相同数额的token
func
(
x
*
x2ethereum
)
Exec_Chain33ToEth
(
payload
*
x2ethereumtypes
.
Chain33ToEth
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
x
*
x2ethereum
)
Exec_Chain33ToEth
(
payload
*
x2ethereumtypes
.
Chain33ToEth
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
action
,
defaultCon
:=
newAction
(
x
,
tx
,
int32
(
index
))
action
:=
newAction
(
x
,
tx
,
int32
(
index
))
if
action
==
nil
{
if
action
==
nil
{
return
nil
,
errors
.
New
(
"Create Action Error"
)
return
nil
,
errors
.
New
(
"Create Action Error"
)
}
}
return
action
.
procMsgLock
(
payload
,
defaultCon
)
return
action
.
procMsgLock
(
payload
)
}
}
// 转账功能
// 转账功能
func
(
x
*
x2ethereum
)
Exec_Transfer
(
payload
*
types
.
AssetsTransfer
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
x
*
x2ethereum
)
Exec_Transfer
(
payload
*
types
.
AssetsTransfer
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
action
,
defaultCon
:=
newAction
(
x
,
tx
,
int32
(
index
))
action
:=
newAction
(
x
,
tx
,
int32
(
index
))
if
action
==
nil
{
if
action
==
nil
{
return
nil
,
errors
.
New
(
"Create Action Error"
)
return
nil
,
errors
.
New
(
"Create Action Error"
)
}
}
return
action
.
procMsgTransfer
(
payload
,
defaultCon
)
return
action
.
procMsgTransfer
(
payload
)
}
}
//--------------------------合约管理员账户操作-------------------------//
//--------------------------合约管理员账户操作-------------------------//
...
@@ -78,11 +77,11 @@ func (x *x2ethereum) Exec_Transfer(payload *types.AssetsTransfer, tx *types.Tran
...
@@ -78,11 +77,11 @@ func (x *x2ethereum) Exec_Transfer(payload *types.AssetsTransfer, tx *types.Tran
func
(
x
*
x2ethereum
)
Exec_AddValidator
(
payload
*
x2ethereumtypes
.
MsgValidator
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
x
*
x2ethereum
)
Exec_AddValidator
(
payload
*
x2ethereumtypes
.
MsgValidator
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
err
:=
checkTxSignBySpecificAddr
(
tx
,
x2ethereumtypes
.
X2ethereumAdmin
)
err
:=
checkTxSignBySpecificAddr
(
tx
,
x2ethereumtypes
.
X2ethereumAdmin
)
if
err
==
nil
{
if
err
==
nil
{
action
,
defaultCon
:=
newAction
(
x
,
tx
,
int32
(
index
))
action
:=
newAction
(
x
,
tx
,
int32
(
index
))
if
action
==
nil
{
if
action
==
nil
{
return
nil
,
errors
.
New
(
"Create Action Error"
)
return
nil
,
errors
.
New
(
"Create Action Error"
)
}
}
return
action
.
procAddValidator
(
payload
,
defaultCon
)
return
action
.
procAddValidator
(
payload
)
}
}
return
nil
,
err
return
nil
,
err
}
}
...
@@ -91,11 +90,11 @@ func (x *x2ethereum) Exec_AddValidator(payload *x2ethereumtypes.MsgValidator, tx
...
@@ -91,11 +90,11 @@ func (x *x2ethereum) Exec_AddValidator(payload *x2ethereumtypes.MsgValidator, tx
func
(
x
*
x2ethereum
)
Exec_RemoveValidator
(
payload
*
x2ethereumtypes
.
MsgValidator
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
x
*
x2ethereum
)
Exec_RemoveValidator
(
payload
*
x2ethereumtypes
.
MsgValidator
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
err
:=
checkTxSignBySpecificAddr
(
tx
,
x2ethereumtypes
.
X2ethereumAdmin
)
err
:=
checkTxSignBySpecificAddr
(
tx
,
x2ethereumtypes
.
X2ethereumAdmin
)
if
err
==
nil
{
if
err
==
nil
{
action
,
defaultCon
:=
newAction
(
x
,
tx
,
int32
(
index
))
action
:=
newAction
(
x
,
tx
,
int32
(
index
))
if
action
==
nil
{
if
action
==
nil
{
return
nil
,
errors
.
New
(
"Create Action Error"
)
return
nil
,
errors
.
New
(
"Create Action Error"
)
}
}
return
action
.
procRemoveValidator
(
payload
,
defaultCon
)
return
action
.
procRemoveValidator
(
payload
)
}
}
return
nil
,
err
return
nil
,
err
}
}
...
@@ -104,11 +103,11 @@ func (x *x2ethereum) Exec_RemoveValidator(payload *x2ethereumtypes.MsgValidator,
...
@@ -104,11 +103,11 @@ func (x *x2ethereum) Exec_RemoveValidator(payload *x2ethereumtypes.MsgValidator,
func
(
x
*
x2ethereum
)
Exec_ModifyPower
(
payload
*
x2ethereumtypes
.
MsgValidator
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
x
*
x2ethereum
)
Exec_ModifyPower
(
payload
*
x2ethereumtypes
.
MsgValidator
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
err
:=
checkTxSignBySpecificAddr
(
tx
,
x2ethereumtypes
.
X2ethereumAdmin
)
err
:=
checkTxSignBySpecificAddr
(
tx
,
x2ethereumtypes
.
X2ethereumAdmin
)
if
err
==
nil
{
if
err
==
nil
{
action
,
defaultCon
:=
newAction
(
x
,
tx
,
int32
(
index
))
action
:=
newAction
(
x
,
tx
,
int32
(
index
))
if
action
==
nil
{
if
action
==
nil
{
return
nil
,
errors
.
New
(
"Create Action Error"
)
return
nil
,
errors
.
New
(
"Create Action Error"
)
}
}
return
action
.
procModifyValidator
(
payload
,
defaultCon
)
return
action
.
procModifyValidator
(
payload
)
}
}
return
nil
,
err
return
nil
,
err
}
}
...
@@ -117,7 +116,7 @@ func (x *x2ethereum) Exec_ModifyPower(payload *x2ethereumtypes.MsgValidator, tx
...
@@ -117,7 +116,7 @@ func (x *x2ethereum) Exec_ModifyPower(payload *x2ethereumtypes.MsgValidator, tx
func
(
x
*
x2ethereum
)
Exec_SetConsensusThreshold
(
payload
*
x2ethereumtypes
.
MsgConsensusThreshold
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
func
(
x
*
x2ethereum
)
Exec_SetConsensusThreshold
(
payload
*
x2ethereumtypes
.
MsgConsensusThreshold
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
err
:=
checkTxSignBySpecificAddr
(
tx
,
x2ethereumtypes
.
X2ethereumAdmin
)
err
:=
checkTxSignBySpecificAddr
(
tx
,
x2ethereumtypes
.
X2ethereumAdmin
)
if
err
==
nil
{
if
err
==
nil
{
action
,
_
:=
newAction
(
x
,
tx
,
int32
(
index
))
action
:=
newAction
(
x
,
tx
,
int32
(
index
))
if
action
==
nil
{
if
action
==
nil
{
return
nil
,
errors
.
New
(
"Create Action Error"
)
return
nil
,
errors
.
New
(
"Create Action Error"
)
}
}
...
...
plugin/dapp/x2Ethereum/executor/oracle/keeper.go
View file @
34fd2055
package
oracle
package
oracle
import
(
import
(
"
encoding/json
"
"
github.com/golang/protobuf/proto
"
"strings"
"strings"
dbm
"github.com/33cn/chain33/common/db"
dbm
"github.com/33cn/chain33/common/db"
...
@@ -15,154 +15,77 @@ var (
...
@@ -15,154 +15,77 @@ var (
olog
=
log
.
New
(
"module"
,
"oracle"
)
olog
=
log
.
New
(
"module"
,
"oracle"
)
)
)
type
Keeper
struct
{
type
Oracle
Keeper
struct
{
db
dbm
.
KV
db
dbm
.
KV
// 通过审核的最低阈值
// 通过审核的最低阈值
ConsensusThreshold
int64
ConsensusThreshold
int64
}
}
func
New
Keeper
(
db
dbm
.
KV
,
ConsensusThreshold
int64
)
*
Keeper
{
func
New
OracleKeeper
(
db
dbm
.
KV
,
ConsensusThreshold
int64
)
*
Oracle
Keeper
{
if
ConsensusThreshold
<=
0
||
ConsensusThreshold
>
100
{
if
ConsensusThreshold
<=
0
||
ConsensusThreshold
>
100
{
return
nil
return
nil
}
}
return
&
Keeper
{
return
&
Oracle
Keeper
{
db
:
db
,
db
:
db
,
ConsensusThreshold
:
ConsensusThreshold
,
ConsensusThreshold
:
ConsensusThreshold
,
}
}
}
}
func
(
k
*
Keeper
)
GetProphecy
(
id
string
)
(
Prophecy
,
error
)
{
func
(
k
*
OracleKeeper
)
GetProphecy
(
id
string
)
(
*
types
.
ReceiptEth
Prophecy
,
error
)
{
if
id
==
""
{
if
id
==
""
{
return
NewEmptyProphecy
(),
types
.
ErrInvalidIdentifier
return
NewEmptyProphecy
(),
types
.
ErrInvalidIdentifier
}
}
bz
,
err
:=
k
.
db
.
Get
(
types
.
CalProphecyPrefix
())
bz
,
err
:=
k
.
db
.
Get
(
types
.
CalProphecyPrefix
(
id
))
if
err
!=
nil
&&
err
!=
types2
.
ErrNotFound
{
if
err
!=
nil
&&
err
!=
types2
.
ErrNotFound
{
return
NewEmptyProphecy
(),
types
.
ErrProphecyGet
return
NewEmptyProphecy
(),
types
.
ErrProphecyGet
}
else
if
err
==
types2
.
ErrNotFound
{
}
else
if
err
==
types2
.
ErrNotFound
{
return
NewEmptyProphecy
(),
types
.
ErrProphecyNotFound
return
NewEmptyProphecy
(),
types
.
ErrProphecyNotFound
}
}
var
dbProphecys
[]
DBProphecy
var
dbProphecy
DB
Prophecy
var
dbProphecy
types
.
ReceiptEth
Prophecy
err
=
json
.
Unmarshal
(
bz
,
&
dbProphecys
)
err
=
proto
.
Unmarshal
(
bz
,
&
dbProphecy
)
if
err
!=
nil
{
if
err
!=
nil
{
return
NewEmptyProphecy
(),
types2
.
ErrUnmarshal
return
NewEmptyProphecy
(),
types2
.
ErrUnmarshal
}
}
return
&
dbProphecy
,
nil
var
exist
bool
for
_
,
p
:=
range
dbProphecys
{
if
p
.
ID
==
id
{
dbProphecy
=
p
exist
=
true
break
}
}
if
exist
{
deSerializedProphecy
,
err
:=
dbProphecy
.
DeserializeFromDB
()
if
err
!=
nil
{
return
NewEmptyProphecy
(),
types
.
ErrinternalDB
}
return
deSerializedProphecy
,
nil
}
else
{
return
NewEmptyProphecy
(),
types
.
ErrProphecyNotFound
}
}
}
// setProphecy saves a prophecy with an initial claim
// setProphecy saves a prophecy with an initial claim
func
(
k
*
Keeper
)
setProphecy
(
prophecy
Prophecy
)
error
{
func
(
k
*
OracleKeeper
)
setProphecy
(
prophecy
*
types
.
ReceiptEth
Prophecy
)
error
{
err
:=
k
.
checkProphecy
(
prophecy
)
err
:=
k
.
checkProphecy
(
prophecy
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
serializedProphecy
,
err
:=
prophecy
.
SerializeForDB
()
bz
,
err
:=
k
.
db
.
Get
(
types
.
CalProphecyPrefix
(
prophecy
.
ID
))
if
err
!=
nil
{
return
types
.
ErrinternalDB
}
bz
,
err
:=
k
.
db
.
Get
(
types
.
CalProphecyPrefix
())
if
err
!=
nil
&&
err
!=
types2
.
ErrNotFound
{
if
err
!=
nil
&&
err
!=
types2
.
ErrNotFound
{
return
types
.
ErrProphecyGet
return
types
.
ErrProphecyGet
}
}
var
dbProphecy
s
[]
DB
Prophecy
var
dbProphecy
types
.
ReceiptEth
Prophecy
if
err
!=
types2
.
ErrNotFound
{
if
err
!=
types2
.
ErrNotFound
{
err
=
json
.
Unmarshal
(
bz
,
&
dbProphecys
)
err
=
proto
.
Unmarshal
(
bz
,
&
dbProphecy
)
if
err
!=
nil
{
if
err
!=
nil
{
return
types2
.
ErrUnmarshal
return
types2
.
ErrUnmarshal
}
}
}
}
var
exist
bool
dbProphecy
=
*
prophecy
for
index
,
dbP
:=
range
dbProphecys
{
if
dbP
.
ID
==
serializedProphecy
.
ID
{
exist
=
true
dbProphecys
[
index
]
=
serializedProphecy
break
}
}
if
!
exist
{
dbProphecys
=
append
(
dbProphecys
,
serializedProphecy
)
}
serializedProphecyBytes
,
err
:=
json
.
Marshal
(
dbProphecys
)
serializedProphecyBytes
,
err
:=
proto
.
Marshal
(
&
dbProphecy
)
if
err
!=
nil
{
if
err
!=
nil
{
return
types2
.
ErrMarshal
return
types2
.
ErrMarshal
}
}
err
=
k
.
db
.
Set
(
types
.
CalProphecyPrefix
(),
serializedProphecyBytes
)
err
=
k
.
db
.
Set
(
types
.
CalProphecyPrefix
(
prophecy
.
ID
),
serializedProphecyBytes
)
if
err
!=
nil
{
if
err
!=
nil
{
return
types
.
ErrSetKV
return
types
.
ErrSetKV
}
}
return
nil
return
nil
}
}
// modifyProphecy saves a modified prophecy
func
(
k
*
OracleKeeper
)
checkProphecy
(
prophecy
*
types
.
ReceiptEthProphecy
)
error
{
func
(
k
*
Keeper
)
modifyProphecy
(
prophecy
Prophecy
)
error
{
err
:=
k
.
checkProphecy
(
prophecy
)
if
err
!=
nil
{
return
err
}
serializedProphecy
,
err
:=
prophecy
.
SerializeForDB
()
if
err
!=
nil
{
return
types
.
ErrinternalDB
}
bz
,
err
:=
k
.
db
.
Get
(
types
.
CalProphecyPrefix
())
if
err
!=
nil
&&
err
!=
types2
.
ErrNotFound
{
return
types
.
ErrProphecyGet
}
var
dbProphecys
[]
DBProphecy
if
err
!=
types2
.
ErrNotFound
{
err
=
json
.
Unmarshal
(
bz
,
&
dbProphecys
)
if
err
!=
nil
{
return
types2
.
ErrUnmarshal
}
}
for
index
,
dbP
:=
range
dbProphecys
{
if
dbP
.
ID
==
serializedProphecy
.
ID
{
dbProphecys
[
index
]
=
serializedProphecy
break
}
}
serializedProphecyBytes
,
err
:=
json
.
Marshal
(
dbProphecys
)
if
err
!=
nil
{
return
types2
.
ErrMarshal
}
err
=
k
.
db
.
Set
(
types
.
CalProphecyPrefix
(),
serializedProphecyBytes
)
if
err
!=
nil
{
return
types
.
ErrSetKV
}
return
nil
}
func
(
k
*
Keeper
)
checkProphecy
(
prophecy
Prophecy
)
error
{
if
prophecy
.
ID
==
""
{
if
prophecy
.
ID
==
""
{
return
types
.
ErrInvalidIdentifier
return
types
.
ErrInvalidIdentifier
}
}
...
@@ -172,23 +95,23 @@ func (k *Keeper) checkProphecy(prophecy Prophecy) error {
...
@@ -172,23 +95,23 @@ func (k *Keeper) checkProphecy(prophecy Prophecy) error {
return
nil
return
nil
}
}
func
(
k
*
Keeper
)
ProcessClaim
(
claim
types
.
OracleClaim
)
(
Status
,
error
)
{
func
(
k
*
OracleKeeper
)
ProcessClaim
(
claim
types
.
OracleClaim
)
(
*
types
.
Prophecy
Status
,
error
)
{
activeValidator
:=
k
.
checkActiveValidator
(
claim
.
ValidatorAddress
)
activeValidator
:=
k
.
checkActiveValidator
(
claim
.
ValidatorAddress
)
if
!
activeValidator
{
if
!
activeValidator
{
return
Status
{}
,
types
.
ErrInvalidValidator
return
nil
,
types
.
ErrInvalidValidator
}
}
if
strings
.
TrimSpace
(
claim
.
Content
)
==
""
{
if
strings
.
TrimSpace
(
claim
.
Content
)
==
""
{
return
Status
{}
,
types
.
ErrInvalidClaim
return
nil
,
types
.
ErrInvalidClaim
}
}
var
claimContent
types
.
OracleClaimContent
var
claimContent
types
.
OracleClaimContent
err
:=
json
.
Unmarshal
([]
byte
(
claim
.
Content
),
&
claimContent
)
err
:=
proto
.
Unmarshal
([]
byte
(
claim
.
Content
),
&
claimContent
)
if
err
!=
nil
{
if
err
!=
nil
{
return
Status
{}
,
types2
.
ErrUnmarshal
return
nil
,
types2
.
ErrUnmarshal
}
}
prophecy
,
err
:=
k
.
GetProphecy
(
claim
.
ID
)
prophecy
,
err
:=
k
.
GetProphecy
(
claim
.
ID
)
if
err
!=
nil
{
if
err
!=
nil
{
if
err
!=
types
.
ErrProphecyNotFound
{
if
err
!=
types
.
ErrProphecyNotFound
{
return
Status
{}
,
err
return
nil
,
err
}
}
prophecy
=
NewProphecy
(
claim
.
ID
)
prophecy
=
NewProphecy
(
claim
.
ID
)
}
else
{
}
else
{
...
@@ -199,40 +122,37 @@ func (k *Keeper) ProcessClaim(claim types.OracleClaim) (Status, error) {
...
@@ -199,40 +122,37 @@ func (k *Keeper) ProcessClaim(claim types.OracleClaim) (Status, error) {
}
}
}
}
if
!
exist
{
if
!
exist
{
prophecy
.
Status
.
Text
=
StatusText
(
types
.
EthBridgeStatus_FailedStatusText
)
prophecy
.
Status
.
Text
=
types
.
EthBridgeStatus_FailedStatusText
return
Status
{}
,
types
.
ErrClaimInconsist
return
nil
,
types
.
ErrClaimInconsist
}
}
if
claimContent
.
ClaimType
==
int64
(
types
.
LOCK_CLAIM_TYPE
)
{
if
prophecy
.
Status
.
Text
==
types
.
EthBridgeStatus_FailedStatusText
{
if
prophecy
.
Status
.
Text
==
StatusText
(
types
.
EthBridgeStatus_SuccessStatusText
)
||
prophecy
.
Status
.
Text
==
StatusText
(
types
.
EthBridgeStatus_FailedStatusText
)
{
return
nil
,
types
.
ErrProphecyFinalized
return
Status
{},
types
.
ErrProphecyFinalized
}
}
for
_
,
vc
:=
range
prophecy
.
ValidatorClaims
{
for
_
,
vc
:=
range
prophecy
.
ValidatorClaims
{
if
vc
.
Validator
==
claim
.
ValidatorAddress
&&
vc
.
Claim
!=
""
{
if
vc
.
Validator
==
claim
.
ValidatorAddress
&&
vc
.
Claim
!=
""
{
return
nil
,
types
.
ErrDuplicateMessage
return
Status
{},
types
.
ErrDuplicateMessage
}
}
}
else
if
claimContent
.
ClaimType
==
int64
(
types
.
BURN_CLAIM_TYPE
)
{
if
prophecy
.
Status
.
Text
==
StatusText
(
types
.
EthBridgeStatus_WithdrawedStatusText
)
||
prophecy
.
Status
.
Text
==
StatusText
(
types
.
EthBridgeStatus_FailedStatusText
)
{
return
Status
{},
types
.
ErrProphecyFinalized
}
}
}
}
}
}
prophecy
.
AddClaim
(
claim
.
ValidatorAddress
,
claim
.
Content
)
AddClaim
(
prophecy
,
claim
.
ValidatorAddress
,
claim
.
Content
)
prophecy
,
err
=
k
.
processCompletion
(
&
prophecy
,
claimContent
.
ClaimType
)
prophecy
,
err
=
k
.
processCompletion
(
prophecy
,
claimContent
.
ClaimType
)
if
err
!=
nil
{
return
nil
,
err
}
err
=
k
.
setProphecy
(
prophecy
)
err
=
k
.
setProphecy
(
prophecy
)
if
err
!=
nil
{
if
err
!=
nil
{
return
Status
{}
,
err
return
nil
,
err
}
}
return
prophecy
.
Status
,
nil
return
prophecy
.
Status
,
nil
}
}
func
(
k
*
Keeper
)
checkActiveValidator
(
validatorAddress
string
)
bool
{
func
(
k
*
Oracle
Keeper
)
checkActiveValidator
(
validatorAddress
string
)
bool
{
validatorMap
,
err
:=
k
.
GetValidatorArray
()
validatorMap
,
err
:=
k
.
GetValidatorArray
()
if
err
!=
nil
{
if
err
!=
nil
{
return
false
return
false
}
}
for
_
,
v
:=
range
validatorMap
{
for
_
,
v
:=
range
validatorMap
.
Validators
{
if
v
.
Address
==
validatorAddress
{
if
v
.
Address
==
validatorAddress
{
return
true
return
true
}
}
...
@@ -241,41 +161,37 @@ func (k *Keeper) checkActiveValidator(validatorAddress string) bool {
...
@@ -241,41 +161,37 @@ func (k *Keeper) checkActiveValidator(validatorAddress string) bool {
}
}
// 计算该prophecy是否达标
// 计算该prophecy是否达标
func
(
k
*
Keeper
)
processCompletion
(
prophecy
*
Prophecy
,
claimType
int64
)
(
Prophecy
,
error
)
{
func
(
k
*
OracleKeeper
)
processCompletion
(
prophecy
*
types
.
ReceiptEthProphecy
,
claimType
int64
)
(
*
types
.
ReceiptEth
Prophecy
,
error
)
{
address2power
:=
make
(
map
[
string
]
int64
)
address2power
:=
make
(
map
[
string
]
int64
)
validatorArrays
,
err
:=
k
.
GetValidatorArray
()
validatorArrays
,
err
:=
k
.
GetValidatorArray
()
if
err
!=
nil
{
if
err
!=
nil
{
return
*
prophecy
,
err
return
nil
,
err
}
}
for
_
,
validator
:=
range
validatorArrays
{
for
_
,
validator
:=
range
validatorArrays
.
Validators
{
address2power
[
validator
.
Address
]
=
validator
.
Power
address2power
[
validator
.
Address
]
=
validator
.
Power
}
}
highestClaim
,
highestClaimPower
,
totalClaimsPower
:=
prophecy
.
FindHighestClaim
(
address2power
)
highestClaim
,
highestClaimPower
,
totalClaimsPower
:=
FindHighestClaim
(
prophecy
,
address2power
)
totalPower
,
err
:=
k
.
GetLastTotalPower
()
totalPower
,
err
:=
k
.
GetLastTotalPower
()
if
err
!=
nil
{
if
err
!=
nil
{
return
*
prophecy
,
err
return
nil
,
err
}
}
highestConsensusRatio
:=
highestClaimPower
*
100
/
totalPower
highestConsensusRatio
:=
highestClaimPower
*
100
remainingPossibleClaimPower
:=
totalPower
-
totalClaimsPower
remainingPossibleClaimPower
:=
totalPower
-
totalClaimsPower
highestPossibleClaimPower
:=
highestClaimPower
+
remainingPossibleClaimPower
highestPossibleClaimPower
:=
highestClaimPower
+
remainingPossibleClaimPower
highestPossibleConsensusRatio
:=
highestPossibleClaimPower
*
100
/
totalPower
highestPossibleConsensusRatio
:=
highestPossibleClaimPower
*
100
olog
.
Info
(
"processCompletion"
,
"highestConsensusRatio"
,
highestConsensusRatio
,
"ConsensusThreshold"
,
k
.
ConsensusThreshold
,
"highestPossibleConsensusRatio"
,
highestPossibleConsensusRatio
)
olog
.
Info
(
"processCompletion"
,
"highestConsensusRatio"
,
highestConsensusRatio
/
totalPower
,
"ConsensusThreshold"
,
k
.
ConsensusThreshold
,
"highestPossibleConsensusRatio"
,
highestPossibleConsensusRatio
/
totalPower
)
if
highestConsensusRatio
>=
k
.
ConsensusThreshold
{
if
highestConsensusRatio
>=
k
.
ConsensusThreshold
*
totalPower
{
if
claimType
==
int64
(
types
.
LOCK_CLAIM_TYPE
)
{
prophecy
.
Status
.
Text
=
types
.
EthBridgeStatus_SuccessStatusText
prophecy
.
Status
.
Text
=
StatusText
(
types
.
EthBridgeStatus_SuccessStatusText
)
}
else
if
claimType
==
int64
(
types
.
BURN_CLAIM_TYPE
)
{
prophecy
.
Status
.
Text
=
StatusText
(
types
.
EthBridgeStatus_WithdrawedStatusText
)
}
prophecy
.
Status
.
FinalClaim
=
highestClaim
prophecy
.
Status
.
FinalClaim
=
highestClaim
}
else
if
highestPossibleConsensusRatio
<
k
.
ConsensusThreshold
{
}
else
if
highestPossibleConsensusRatio
<
k
.
ConsensusThreshold
*
totalPower
{
prophecy
.
Status
.
Text
=
StatusText
(
types
.
EthBridgeStatus_FailedStatusText
)
prophecy
.
Status
.
Text
=
types
.
EthBridgeStatus_FailedStatusText
}
}
return
*
prophecy
,
nil
return
prophecy
,
nil
}
}
// Load the last total validator power.
// Load the last total validator power.
func
(
k
*
Keeper
)
GetLastTotalPower
()
(
int64
,
error
)
{
func
(
k
*
Oracle
Keeper
)
GetLastTotalPower
()
(
int64
,
error
)
{
b
,
err
:=
k
.
db
.
Get
(
types
.
CalLastTotalPowerPrefix
())
b
,
err
:=
k
.
db
.
Get
(
types
.
CalLastTotalPowerPrefix
())
if
err
!=
nil
&&
err
!=
types2
.
ErrNotFound
{
if
err
!=
nil
&&
err
!=
types2
.
ErrNotFound
{
return
0
,
err
return
0
,
err
...
@@ -283,7 +199,7 @@ func (k *Keeper) GetLastTotalPower() (int64, error) {
...
@@ -283,7 +199,7 @@ func (k *Keeper) GetLastTotalPower() (int64, error) {
return
0
,
nil
return
0
,
nil
}
}
var
powers
types
.
ReceiptQueryTotalPower
var
powers
types
.
ReceiptQueryTotalPower
err
=
json
.
Unmarshal
(
b
,
&
powers
)
err
=
proto
.
Unmarshal
(
b
,
&
powers
)
if
err
!=
nil
{
if
err
!=
nil
{
return
0
,
types2
.
ErrUnmarshal
return
0
,
types2
.
ErrUnmarshal
}
}
...
@@ -291,19 +207,19 @@ func (k *Keeper) GetLastTotalPower() (int64, error) {
...
@@ -291,19 +207,19 @@ func (k *Keeper) GetLastTotalPower() (int64, error) {
}
}
// Set the last total validator power.
// Set the last total validator power.
func
(
k
*
Keeper
)
SetLastTotalPower
()
error
{
func
(
k
*
Oracle
Keeper
)
SetLastTotalPower
()
error
{
var
totalPower
int64
var
totalPower
int64
validatorArrays
,
err
:=
k
.
GetValidatorArray
()
validatorArrays
,
err
:=
k
.
GetValidatorArray
()
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
for
_
,
validator
:=
range
validatorArrays
{
for
_
,
validator
:=
range
validatorArrays
.
Validators
{
totalPower
+=
validator
.
Power
totalPower
+=
validator
.
Power
}
}
totalP
:=
types
.
ReceiptQueryTotalPower
{
totalP
:=
types
.
ReceiptQueryTotalPower
{
TotalPower
:
totalPower
,
TotalPower
:
totalPower
,
}
}
totalPBytes
,
_
:=
json
.
Marshal
(
totalP
)
totalPBytes
,
_
:=
proto
.
Marshal
(
&
totalP
)
err
=
k
.
db
.
Set
(
types
.
CalLastTotalPowerPrefix
(),
totalPBytes
)
err
=
k
.
db
.
Set
(
types
.
CalLastTotalPowerPrefix
(),
totalPBytes
)
if
err
!=
nil
{
if
err
!=
nil
{
return
types
.
ErrSetKV
return
types
.
ErrSetKV
...
@@ -311,25 +227,25 @@ func (k *Keeper) SetLastTotalPower() error {
...
@@ -311,25 +227,25 @@ func (k *Keeper) SetLastTotalPower() error {
return
nil
return
nil
}
}
func
(
k
*
Keeper
)
GetValidatorArray
()
([]
types
.
MsgValidator
,
error
)
{
func
(
k
*
OracleKeeper
)
GetValidatorArray
()
(
*
types
.
ValidatorList
,
error
)
{
validatorsBytes
,
err
:=
k
.
db
.
Get
(
types
.
CalValidatorMapsPrefix
())
validatorsBytes
,
err
:=
k
.
db
.
Get
(
types
.
CalValidatorMapsPrefix
())
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
var
validatorArrays
[]
types
.
MsgValidator
var
validatorArrays
types
.
ValidatorList
err
=
json
.
Unmarshal
(
validatorsBytes
,
&
validatorArrays
)
err
=
proto
.
Unmarshal
(
validatorsBytes
,
&
validatorArrays
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
types2
.
ErrUnmarshal
return
nil
,
types2
.
ErrUnmarshal
}
}
return
validatorArrays
,
nil
return
&
validatorArrays
,
nil
}
}
func
(
k
*
Keeper
)
SetConsensusThreshold
(
ConsensusThreshold
int64
)
{
func
(
k
*
Oracle
Keeper
)
SetConsensusThreshold
(
ConsensusThreshold
int64
)
{
k
.
ConsensusThreshold
=
ConsensusThreshold
k
.
ConsensusThreshold
=
ConsensusThreshold
olog
.
Info
(
"SetConsensusNeeded"
,
"nowConsensusNeeded"
,
k
.
ConsensusThreshold
)
olog
.
Info
(
"SetConsensusNeeded"
,
"nowConsensusNeeded"
,
k
.
ConsensusThreshold
)
return
return
}
}
func
(
k
*
Keeper
)
GetConsensusThreshold
()
int64
{
func
(
k
*
Oracle
Keeper
)
GetConsensusThreshold
()
int64
{
return
k
.
ConsensusThreshold
return
k
.
ConsensusThreshold
}
}
plugin/dapp/x2Ethereum/executor/oracle/prophecy.go
View file @
34fd2055
package
oracle
package
oracle
import
(
import
(
"encoding/json"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
)
)
type
Prophecy
struct
{
func
NewProphecy
(
id
string
)
*
types
.
ReceiptEthProphecy
{
ID
string
`json:"id"`
Status
Status
`json:"status"`
ClaimValidators
[]
*
types
.
ClaimValidators
`json:"claim_validators"`
ValidatorClaims
[]
*
types
.
ValidatorClaims
`json:"validator_claims"`
}
func
NewProphecy
(
id
string
)
Prophecy
{
status
:=
new
(
types
.
ProphecyStatus
)
return
Prophecy
{
status
.
Text
=
types
.
EthBridgeStatus_PendingStatusText
return
&
types
.
ReceiptEthProphecy
{
ID
:
id
,
ID
:
id
,
Status
:
NewStatus
(
StatusText
(
types
.
EthBridgeStatus_PendingStatusText
),
""
)
,
Status
:
status
,
ClaimValidators
:
*
new
([]
*
types
.
ClaimValidators
),
ClaimValidators
:
*
new
([]
*
types
.
ClaimValidators
),
ValidatorClaims
:
*
new
([]
*
types
.
ValidatorClaims
),
ValidatorClaims
:
*
new
([]
*
types
.
ValidatorClaims
),
}
}
}
}
func
NewEmptyProphecy
()
Prophecy
{
func
NewEmptyProphecy
()
*
types
.
ReceiptEth
Prophecy
{
return
NewProphecy
(
""
)
return
NewProphecy
(
""
)
}
}
type
DBProphecy
struct
{
//
ID
string
`json:"id"`
//type DBProphecy struct {
Status
Status
`json:"status"`
// ID string `json:"id"`
ClaimValidators
[]
byte
`json:"claim_validators"`
// Status Status `json:"status"`
ValidatorClaims
[]
byte
`json:"validator_claims"`
// ClaimValidators []byte `json:"claim_validators"`
}
// ValidatorClaims []byte `json:"validator_claims"`
//}
// SerializeForDB serializes a prophecy into a DBProphecy
//
func
(
prophecy
Prophecy
)
SerializeForDB
()
(
DBProphecy
,
error
)
{
//// SerializeForDB serializes a prophecy into a DBProphecy
claimValidators
,
err
:=
json
.
Marshal
(
prophecy
.
ClaimValidators
)
//func (prophecy Prophecy) SerializeForDB() (DBProphecy, error) {
if
err
!=
nil
{
// claimValidators, err := json.Marshal(prophecy.ClaimValidators)
return
DBProphecy
{},
err
// if err != nil {
}
// return DBProphecy{}, err
// }
validatorClaims
,
err
:=
json
.
Marshal
(
prophecy
.
ValidatorClaims
)
//
if
err
!=
nil
{
// validatorClaims, err := json.Marshal(prophecy.ValidatorClaims)
return
DBProphecy
{},
err
// if err != nil {
}
// return DBProphecy{}, err
// }
return
DBProphecy
{
//
ID
:
prophecy
.
ID
,
// return DBProphecy{
Status
:
prophecy
.
Status
,
// ID: prophecy.ID,
ClaimValidators
:
claimValidators
,
// Status: prophecy.Status,
ValidatorClaims
:
validatorClaims
,
// ClaimValidators: claimValidators,
},
nil
// ValidatorClaims: validatorClaims,
}
// }, nil
//}
// DeserializeFromDB deserializes a DBProphecy into a prophecy
//
func
(
dbProphecy
DBProphecy
)
DeserializeFromDB
()
(
Prophecy
,
error
)
{
//// DeserializeFromDB deserializes a DBProphecy into a prophecy
claimValidators
:=
new
([]
*
types
.
ClaimValidators
)
//func (dbProphecy DBProphecy) DeserializeFromDB() (Prophecy, error) {
err
:=
json
.
Unmarshal
(
dbProphecy
.
ClaimValidators
,
&
claimValidators
)
// claimValidators := new([]*types.ClaimValidators)
if
err
!=
nil
{
// err := json.Unmarshal(dbProphecy.ClaimValidators, &claimValidators)
return
Prophecy
{},
err
// if err != nil {
}
// return Prophecy{}, err
// }
validatorClaims
:=
new
([]
*
types
.
ValidatorClaims
)
//
err
=
json
.
Unmarshal
(
dbProphecy
.
ValidatorClaims
,
&
validatorClaims
)
// validatorClaims := new([]*types.ValidatorClaims)
if
err
!=
nil
{
// err = json.Unmarshal(dbProphecy.ValidatorClaims, &validatorClaims)
return
Prophecy
{},
err
// if err != nil {
}
// return Prophecy{}, err
// }
return
Prophecy
{
//
ID
:
dbProphecy
.
ID
,
// return Prophecy{
Status
:
dbProphecy
.
Status
,
// ID: dbProphecy.ID,
ClaimValidators
:
*
claimValidators
,
// Status: dbProphecy.Status,
ValidatorClaims
:
*
validatorClaims
,
// ClaimValidators: *claimValidators,
},
nil
// ValidatorClaims: *validatorClaims,
}
// }, nil
//}
// AddClaim adds a given claim to this prophecy
// AddClaim adds a given claim to this prophecy
func
(
prophecy
*
Prophecy
)
AddClaim
(
validator
string
,
claim
string
)
{
func
AddClaim
(
prophecy
*
types
.
ReceiptEthProphecy
,
validator
string
,
claim
string
)
{
claimValidators
:=
new
(
types
.
StringMap
)
claimValidators
:=
new
(
types
.
StringMap
)
if
len
(
prophecy
.
ClaimValidators
)
==
0
{
if
len
(
prophecy
.
ClaimValidators
)
==
0
{
prophecy
.
ClaimValidators
=
append
(
prophecy
.
ClaimValidators
,
&
types
.
ClaimValidators
{
prophecy
.
ClaimValidators
=
append
(
prophecy
.
ClaimValidators
,
&
types
.
ClaimValidators
{
...
@@ -95,29 +91,36 @@ func (prophecy *Prophecy) AddClaim(validator string, claim string) {
...
@@ -95,29 +91,36 @@ func (prophecy *Prophecy) AddClaim(validator string, claim string) {
}
}
}
}
if
len
(
prophecy
.
ValidatorClaims
)
==
0
{
//todo
prophecy
.
ValidatorClaims
=
append
(
prophecy
.
ValidatorClaims
,
&
types
.
ValidatorClaims
{
// validator不可能相同?
Validator
:
validator
,
//if len(prophecy.ValidatorClaims) == 0 {
Claim
:
claim
,
// prophecy.ValidatorClaims = append(prophecy.ValidatorClaims, &types.ValidatorClaims{
})
// Validator: validator,
}
else
{
// Claim: claim,
for
index
,
vc
:=
range
prophecy
.
ValidatorClaims
{
// })
if
vc
.
Validator
==
validator
{
//} else {
prophecy
.
ValidatorClaims
[
index
]
.
Claim
=
claim
// for index, vc := range prophecy.ValidatorClaims {
break
// if vc.Validator == validator {
}
else
{
// prophecy.ValidatorClaims[index].Claim = claim
prophecy
.
ValidatorClaims
=
append
(
prophecy
.
ValidatorClaims
,
&
types
.
ValidatorClaims
{
// break
Validator
:
validator
,
// } else {
Claim
:
claim
,
// prophecy.ValidatorClaims = append(prophecy.ValidatorClaims, &types.ValidatorClaims{
})
// Validator: validator,
}
// Claim: claim,
}
// })
}
// }
// }
//}
prophecy
.
ValidatorClaims
=
append
(
prophecy
.
ValidatorClaims
,
&
types
.
ValidatorClaims
{
Validator
:
validator
,
Claim
:
claim
,
})
}
}
// 遍历该prophecy所有claim,找出获得最多票数的claim
// 遍历该prophecy所有claim,找出获得最多票数的claim
func
(
prophecy
*
Prophecy
)
FindHighestClaim
(
validators
map
[
string
]
int64
)
(
string
,
int64
,
int64
)
{
func
FindHighestClaim
(
prophecy
*
types
.
ReceiptEthProphecy
,
validators
map
[
string
]
int64
)
(
string
,
int64
,
int64
)
{
totalClaimsPower
:=
int64
(
0
)
totalClaimsPower
:=
int64
(
0
)
highestClaimPower
:=
int64
(
-
1
)
highestClaimPower
:=
int64
(
-
1
)
highestClaim
:=
""
highestClaim
:=
""
...
@@ -135,17 +138,3 @@ func (prophecy *Prophecy) FindHighestClaim(validators map[string]int64) (string,
...
@@ -135,17 +138,3 @@ func (prophecy *Prophecy) FindHighestClaim(validators map[string]int64) (string,
}
}
return
highestClaim
,
highestClaimPower
,
totalClaimsPower
return
highestClaim
,
highestClaimPower
,
totalClaimsPower
}
}
// Status is a struct that contains the status of a given prophecy
type
Status
struct
{
Text
StatusText
`json:"text"`
FinalClaim
string
`json:"final_claim"`
}
// NewStatus returns a new Status with the given data contained
func
NewStatus
(
text
StatusText
,
finalClaim
string
)
Status
{
return
Status
{
Text
:
text
,
FinalClaim
:
finalClaim
,
}
}
plugin/dapp/x2Ethereum/executor/oracle/status.go
deleted
100644 → 0
View file @
98a98728
package
oracle
import
(
"encoding/json"
"fmt"
"strconv"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
)
// StatusText is an enum used to represent the status of the prophecy
type
StatusText
int
var
StatusTextToString
=
[
...
]
string
{
"pending"
,
"success"
,
"failed"
,
"withdrawed"
}
var
StringToStatusText
=
map
[
string
]
types
.
EthBridgeStatus
{
"pending"
:
types
.
EthBridgeStatus_PendingStatusText
,
"success"
:
types
.
EthBridgeStatus_SuccessStatusText
,
"failed"
:
types
.
EthBridgeStatus_FailedStatusText
,
"withdrawed"
:
types
.
EthBridgeStatus_WithdrawedStatusText
,
}
func
(
text
StatusText
)
String
()
string
{
return
StatusTextToString
[
text
]
}
func
(
text
StatusText
)
MarshalJSON
()
([]
byte
,
error
)
{
return
[]
byte
(
fmt
.
Sprintf
(
"
\"
%v
\"
"
,
text
.
String
())),
nil
}
func
(
text
*
StatusText
)
UnmarshalJSON
(
b
[]
byte
)
error
{
var
j
string
err
:=
json
.
Unmarshal
(
b
,
&
j
)
if
err
!=
nil
{
return
err
}
stringKey
,
err
:=
strconv
.
Unquote
(
string
(
b
))
if
err
!=
nil
{
return
err
}
// Note that if the string cannot be found then it will be set to the zero value, 'pending' in this case.
*
text
=
StatusText
(
StringToStatusText
[
stringKey
])
return
nil
}
plugin/dapp/x2Ethereum/executor/query.go
View file @
34fd2055
package
executor
package
executor
import
(
import
(
"
encoding/json
"
"
github.com/golang/protobuf/proto
"
"strconv"
"strconv"
"strings"
"strings"
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/types"
"github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/executor/oracle"
types2
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
types2
"github.com/33cn/plugin/plugin/dapp/x2Ethereum/types"
)
)
func
(
x
*
x2ethereum
)
Query_GetEthProphecy
(
in
*
types2
.
QueryEthProphecyParams
)
(
types
.
Message
,
error
)
{
func
(
x
*
x2ethereum
)
Query_GetEthProphecy
(
in
*
types2
.
QueryEthProphecyParams
)
(
types
.
Message
,
error
)
{
prophecy
:=
&
types2
.
ReceiptEthProphecy
{}
prophecyKey
:=
types2
.
CalProphecyPrefix
(
in
.
ID
)
prophecyKey
:=
types2
.
CalProphecyPrefix
()
var
dbProphecy
types2
.
ReceiptEthProphecy
var
dbProphecy
[]
oracle
.
DBProphecy
val
,
err
:=
x
.
GetStateDB
()
.
Get
(
prophecyKey
)
val
,
err
:=
x
.
GetStateDB
()
.
Get
(
prophecyKey
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
err
=
json
.
Unmarshal
(
val
,
&
dbProphecy
)
err
=
proto
.
Unmarshal
(
val
,
&
dbProphecy
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
types
.
ErrUnmarshal
return
nil
,
types
.
ErrUnmarshal
}
}
for
_
,
dbP
:=
range
dbProphecy
{
return
&
dbProphecy
,
nil
if
dbP
.
ID
==
in
.
ID
{
dbPD
,
err
:=
dbP
.
DeserializeFromDB
()
if
err
!=
nil
{
return
nil
,
err
}
prophecy
=
&
types2
.
ReceiptEthProphecy
{
ID
:
in
.
ID
,
Status
:
&
types2
.
ProphecyStatus
{
Text
:
types2
.
EthBridgeStatus
(
dbP
.
Status
.
Text
),
FinalClaim
:
dbP
.
Status
.
FinalClaim
,
},
ClaimValidators
:
dbPD
.
ClaimValidators
,
ValidatorClaims
:
dbPD
.
ValidatorClaims
,
}
return
prophecy
,
nil
}
}
return
nil
,
types2
.
ErrInvalidProphecyID
}
}
func
(
x
*
x2ethereum
)
Query_GetValidators
(
in
*
types2
.
QueryValidatorsParams
)
(
types
.
Message
,
error
)
{
func
(
x
*
x2ethereum
)
Query_GetValidators
(
in
*
types2
.
QueryValidatorsParams
)
(
types
.
Message
,
error
)
{
validatorsKey
:=
types2
.
CalValidatorMapsPrefix
()
validatorsKey
:=
types2
.
CalValidatorMapsPrefix
()
var
v
[]
*
types2
.
MsgValidator
var
v
types2
.
ValidatorList
vBytes
,
err
:=
x
.
GetStateDB
()
.
Get
(
validatorsKey
)
vBytes
,
err
:=
x
.
GetStateDB
()
.
Get
(
validatorsKey
)
if
err
!=
nil
{
if
err
!=
nil
{
elog
.
Error
(
"Query_GetValidators"
,
"GetValidators Err"
,
err
)
elog
.
Error
(
"Query_GetValidators"
,
"GetValidators Err"
,
err
)
return
nil
,
err
return
nil
,
err
}
}
err
=
json
.
Unmarshal
(
vBytes
,
&
v
)
err
=
proto
.
Unmarshal
(
vBytes
,
&
v
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
types
.
ErrUnmarshal
return
nil
,
types
.
ErrUnmarshal
}
}
if
in
.
Validator
!=
""
{
if
in
.
Validator
!=
""
{
validatorsRes
:=
new
(
types2
.
ReceiptQueryValidator
)
validatorsRes
:=
new
(
types2
.
ReceiptQueryValidator
)
for
_
,
vv
:=
range
v
{
for
_
,
vv
:=
range
v
.
Validators
{
if
vv
.
Address
==
in
.
Validator
{
if
vv
.
Address
==
in
.
Validator
{
val
:=
make
([]
*
types2
.
MsgValidator
,
1
)
val
:=
make
([]
*
types2
.
MsgValidator
,
1
)
val
[
0
]
=
vv
val
[
0
]
=
vv
...
@@ -81,10 +62,10 @@ func (x *x2ethereum) Query_GetValidators(in *types2.QueryValidatorsParams) (type
...
@@ -81,10 +62,10 @@ func (x *x2ethereum) Query_GetValidators(in *types2.QueryValidatorsParams) (type
}
else
{
}
else
{
validatorsRes
:=
new
(
types2
.
ReceiptQueryValidator
)
validatorsRes
:=
new
(
types2
.
ReceiptQueryValidator
)
var
totalPower
int64
var
totalPower
int64
for
_
,
vv
:=
range
v
{
for
_
,
vv
:=
range
v
.
Validators
{
totalPower
+=
vv
.
Power
totalPower
+=
vv
.
Power
}
}
validatorsRes
.
Validators
=
v
validatorsRes
.
Validators
=
v
.
Validators
validatorsRes
.
TotalPower
=
totalPower
validatorsRes
.
TotalPower
=
totalPower
return
validatorsRes
,
nil
return
validatorsRes
,
nil
}
}
...
@@ -99,7 +80,7 @@ func (x *x2ethereum) Query_GetTotalPower(in *types2.QueryTotalPowerParams) (type
...
@@ -99,7 +80,7 @@ func (x *x2ethereum) Query_GetTotalPower(in *types2.QueryTotalPowerParams) (type
elog
.
Error
(
"Query_GetTotalPower"
,
"GetTotalPower Err"
,
err
)
elog
.
Error
(
"Query_GetTotalPower"
,
"GetTotalPower Err"
,
err
)
return
nil
,
err
return
nil
,
err
}
}
err
=
json
.
Unmarshal
(
totalPowerBytes
,
&
totalPower
)
err
=
proto
.
Unmarshal
(
totalPowerBytes
,
totalPower
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
types
.
ErrUnmarshal
return
nil
,
types
.
ErrUnmarshal
}
}
...
@@ -107,7 +88,7 @@ func (x *x2ethereum) Query_GetTotalPower(in *types2.QueryTotalPowerParams) (type
...
@@ -107,7 +88,7 @@ func (x *x2ethereum) Query_GetTotalPower(in *types2.QueryTotalPowerParams) (type
}
}
func
(
x
*
x2ethereum
)
Query_GetConsensusThreshold
(
in
*
types2
.
QueryConsensusThresholdParams
)
(
types
.
Message
,
error
)
{
func
(
x
*
x2ethereum
)
Query_GetConsensusThreshold
(
in
*
types2
.
QueryConsensusThresholdParams
)
(
types
.
Message
,
error
)
{
consensus
:=
&
types2
.
Receipt
Set
ConsensusThreshold
{}
consensus
:=
&
types2
.
Receipt
Query
ConsensusThreshold
{}
consensusKey
:=
types2
.
CalConsensusThresholdPrefix
()
consensusKey
:=
types2
.
CalConsensusThresholdPrefix
()
consensusBytes
,
err
:=
x
.
GetStateDB
()
.
Get
(
consensusKey
)
consensusBytes
,
err
:=
x
.
GetStateDB
()
.
Get
(
consensusKey
)
...
@@ -115,7 +96,7 @@ func (x *x2ethereum) Query_GetConsensusThreshold(in *types2.QueryConsensusThresh
...
@@ -115,7 +96,7 @@ func (x *x2ethereum) Query_GetConsensusThreshold(in *types2.QueryConsensusThresh
elog
.
Error
(
"Query_GetConsensusNeeded"
,
"GetConsensusNeeded Err"
,
err
)
elog
.
Error
(
"Query_GetConsensusNeeded"
,
"GetConsensusNeeded Err"
,
err
)
return
nil
,
err
return
nil
,
err
}
}
err
=
json
.
Unmarshal
(
consensusBytes
,
&
consensus
)
err
=
proto
.
Unmarshal
(
consensusBytes
,
consensus
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
types
.
ErrUnmarshal
return
nil
,
types
.
ErrUnmarshal
}
}
...
...
plugin/dapp/x2Ethereum/executor/x2ethereum.go
View file @
34fd2055
...
@@ -53,7 +53,11 @@ func (x *x2ethereum) GetDriverName() string {
...
@@ -53,7 +53,11 @@ func (x *x2ethereum) GetDriverName() string {
}
}
// CheckTx 实现自定义检验交易接口,供框架调用
// CheckTx 实现自定义检验交易接口,供框架调用
// todo
// 实现
func
(
x
*
x2ethereum
)
CheckTx
(
tx
*
types
.
Transaction
,
index
int
)
error
{
func
(
x
*
x2ethereum
)
CheckTx
(
tx
*
types
.
Transaction
,
index
int
)
error
{
// implement code
//var action x2ethereumtypes.X2EthereumAction
//err := types.Decode(tx.Payload, &action)
//if action.Ty
return
nil
return
nil
}
}
plugin/dapp/x2Ethereum/executor/x2ethereumaction.go
View file @
34fd2055
package
executor
package
executor
import
(
import
(
"
encoding/json
"
"
github.com/golang/protobuf/proto
"
"strconv"
"strconv"
"strings"
"strings"
...
@@ -59,50 +59,55 @@ type action struct {
...
@@ -59,50 +59,55 @@ type action struct {
keeper
ethbridge
.
Keeper
keeper
ethbridge
.
Keeper
}
}
//todo
func
newAction
(
a
*
x2ethereum
,
tx
*
chain33types
.
Transaction
,
index
int32
)
*
action
{
//补充不同token的decimal数据库存储
func
newAction
(
a
*
x2ethereum
,
tx
*
chain33types
.
Transaction
,
index
int32
)
(
*
action
,
bool
)
{
var
defaultCon
=
false
hash
:=
tx
.
Hash
()
hash
:=
tx
.
Hash
()
fromaddr
:=
tx
.
From
()
fromaddr
:=
tx
.
From
()
var
ConsensusThreshold
int64
oracleKeeper
:=
oracle
.
NewOracleKeeper
(
a
.
GetStateDB
(),
types2
.
DefaultConsensusNeeded
)
consensusNeededBytes
,
err
:=
a
.
GetStateDB
()
.
Get
(
types2
.
CalConsensusThresholdPrefix
())
if
err
!=
nil
{
if
err
==
chain33types
.
ErrNotFound
{
ConsensusThreshold
=
types2
.
DefaultConsensusNeeded
cb
,
_
:=
json
.
Marshal
(
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
0
,
NowConsensusThreshold
:
ConsensusThreshold
,
})
_
=
a
.
GetStateDB
()
.
Set
(
types2
.
CalConsensusThresholdPrefix
(),
cb
)
defaultCon
=
true
}
else
{
return
nil
,
false
}
}
else
{
var
mc
types2
.
ReceiptSetConsensusThreshold
_
=
json
.
Unmarshal
(
consensusNeededBytes
,
&
mc
)
ConsensusThreshold
=
mc
.
NowConsensusThreshold
}
oracleKeeper
:=
oracle
.
NewKeeper
(
a
.
GetStateDB
(),
ConsensusThreshold
)
if
oracleKeeper
==
nil
{
if
oracleKeeper
==
nil
{
return
nil
,
true
return
nil
}
}
elog
.
Info
(
"newAction"
,
"newAction"
,
"done"
)
elog
.
Info
(
"newAction"
,
"newAction"
,
"done"
)
return
&
action
{
a
.
GetAPI
(),
a
.
GetCoinsAccount
(),
a
.
GetStateDB
(),
hash
,
fromaddr
,
return
&
action
{
a
.
GetAPI
(),
a
.
GetCoinsAccount
(),
a
.
GetStateDB
(),
hash
,
fromaddr
,
a
.
GetBlockTime
(),
a
.
GetHeight
(),
index
,
address
.
ExecAddress
(
string
(
tx
.
Execer
)),
ethbridge
.
NewKeeper
(
oracleKeeper
,
a
.
GetStateDB
())},
defaultCon
a
.
GetBlockTime
(),
a
.
GetHeight
(),
index
,
address
.
ExecAddress
(
string
(
tx
.
Execer
)),
ethbridge
.
NewKeeper
(
*
oracleKeeper
,
a
.
GetStateDB
())}
}
}
// ethereum ---> chain33
// ethereum ---> chain33
// lock
// lock
func
(
a
*
action
)
procMsgEth2Chain33
(
ethBridgeClaim
*
types2
.
Eth2Chain33
,
defaultCon
bool
)
(
*
chain33types
.
Receipt
,
error
)
{
func
(
a
*
action
)
procMsgEth2Chain33
(
ethBridgeClaim
*
types2
.
Eth2Chain33
)
(
*
chain33types
.
Receipt
,
error
)
{
receipt
:=
new
(
chain33types
.
Receipt
)
receipt
:=
new
(
chain33types
.
Receipt
)
ethBridgeClaim
.
LocalCoinSymbol
=
strings
.
ToLower
(
ethBridgeClaim
.
LocalCoinSymbol
)
ethBridgeClaim
.
LocalCoinSymbol
=
strings
.
ToLower
(
ethBridgeClaim
.
LocalCoinSymbol
)
msgEthBridgeClaim
:=
ethbridge
.
NewMsgCreateEthBridgeClaim
(
*
ethBridgeClaim
)
if
err
:=
msgEthBridgeClaim
.
ValidateBasic
();
err
!=
nil
{
consensusNeededBytes
,
err
:=
a
.
db
.
Get
(
types2
.
CalConsensusThresholdPrefix
())
return
nil
,
err
if
err
!=
nil
{
if
err
==
chain33types
.
ErrNotFound
{
setConsensusThreshold
:=
&
types2
.
ReceiptQueryConsensusThreshold
{
ConsensusThreshold
:
types2
.
DefaultConsensusNeeded
}
msgSetConsensusThresholdBytes
,
err
:=
proto
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
consensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
consensusThreshold
)})
}
else
{
return
nil
,
err
}
}
else
{
var
mc
types2
.
ReceiptQueryConsensusThreshold
_
=
proto
.
Unmarshal
(
consensusNeededBytes
,
&
mc
)
_
,
_
,
err
=
a
.
keeper
.
ProcessSetConsensusNeeded
(
mc
.
ConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
err
}
}
}
status
,
err
:=
a
.
keeper
.
ProcessClaim
(
*
ethBridgeClaim
)
status
,
err
:=
a
.
keeper
.
ProcessClaim
(
*
ethBridgeClaim
)
...
@@ -110,69 +115,32 @@ func (a *action) procMsgEth2Chain33(ethBridgeClaim *types2.Eth2Chain33, defaultC
...
@@ -110,69 +115,32 @@ func (a *action) procMsgEth2Chain33(ethBridgeClaim *types2.Eth2Chain33, defaultC
return
nil
,
err
return
nil
,
err
}
}
ID
:=
strconv
.
Itoa
(
int
(
msgEthBridgeClaim
.
EthereumChainID
))
+
strconv
.
Itoa
(
int
(
msgEthBridgeClaim
.
Nonce
))
+
msgEthBridgeClaim
.
EthereumSender
+
"lock"
ID
:=
strconv
.
Itoa
(
int
(
ethBridgeClaim
.
EthereumChainID
))
+
strconv
.
Itoa
(
int
(
ethBridgeClaim
.
Nonce
))
+
ethBridgeClaim
.
EthereumSender
+
ethBridgeClaim
.
TokenContractAddress
+
"lock"
//记录ethProphecy
//记录ethProphecy
bz
,
err
:=
a
.
db
.
Get
(
types2
.
CalProphecyPrefix
())
bz
,
err
:=
a
.
db
.
Get
(
types2
.
CalProphecyPrefix
(
ID
))
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
types2
.
ErrProphecyGet
return
nil
,
types2
.
ErrProphecyGet
}
}
var
dbProphecys
[]
oracle
.
DBProphecy
var
dbProphecy
types2
.
ReceiptEthProphecy
var
dbProphecy
oracle
.
DBProphecy
err
=
proto
.
Unmarshal
(
bz
,
&
dbProphecy
)
err
=
json
.
Unmarshal
(
bz
,
&
dbProphecys
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrUnmarshal
return
nil
,
chain33types
.
ErrUnmarshal
}
}
for
_
,
p
:=
range
dbProphecys
{
if
p
.
ID
==
ID
{
dbProphecy
=
p
break
}
}
dRes
,
err
:=
dbProphecy
.
DeserializeFromDB
()
if
err
!=
nil
{
return
nil
,
err
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalProphecyPrefix
(),
Key
:
types2
.
CalProphecyPrefix
(
ID
),
Value
:
bz
,
Value
:
bz
,
})
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TyProphecyLog
,
Log
:
chain33types
.
Encode
(
&
types2
.
ReceiptEthProphecy
{
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TyProphecyLog
,
Log
:
chain33types
.
Encode
(
&
dbProphecy
)})
ID
:
dRes
.
ID
,
Status
:
&
types2
.
ProphecyStatus
{
Text
:
types2
.
EthBridgeStatus
(
dRes
.
Status
.
Text
),
FinalClaim
:
dRes
.
Status
.
FinalClaim
,
},
ClaimValidators
:
dRes
.
ClaimValidators
,
ValidatorClaims
:
dRes
.
ValidatorClaims
,
})})
if
defaultCon
{
setConsensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
msgSetConsensusThresholdBytes
,
err
:=
json
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)})
}
if
status
.
Text
==
oracle
.
StatusText
(
types2
.
EthBridgeStatus_SuccessStatusText
)
{
if
status
.
Text
==
types2
.
EthBridgeStatus_SuccessStatusText
{
// mavl-x2ethereum-eth
// mavl-x2ethereum-eth
accDB
,
err
:=
account
.
NewAccountDB
(
a
.
api
.
GetConfig
(),
msgEthBridgeClaim
.
LocalCoinExec
,
strings
.
ToLower
(
msgEthBridgeClaim
.
LocalCoinSymbol
+
msgEthBridgeClaim
.
TokenContractAddress
),
a
.
db
)
// 这里为了区分相同tokensymbol不同tokenAddress做了级联处理
accDB
,
err
:=
account
.
NewAccountDB
(
a
.
api
.
GetConfig
(),
ethBridgeClaim
.
LocalCoinExec
,
strings
.
ToLower
(
ethBridgeClaim
.
LocalCoinSymbol
+
ethBridgeClaim
.
TokenContractAddress
),
a
.
db
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"relay procMsgEth2Chain33,exec=%s,sym=%s"
,
msgEthBridgeClaim
.
LocalCoinExec
,
msgE
thBridgeClaim
.
LocalCoinSymbol
)
return
nil
,
errors
.
Wrapf
(
err
,
"relay procMsgEth2Chain33,exec=%s,sym=%s"
,
ethBridgeClaim
.
LocalCoinExec
,
e
thBridgeClaim
.
LocalCoinSymbol
)
}
}
r
,
err
:=
a
.
keeper
.
ProcessSuccessfulClaimForLock
(
status
.
FinalClaim
,
a
.
execaddr
,
ethBridgeClaim
.
LocalCoinSymbol
,
ethBridgeClaim
.
TokenContractAddress
,
accDB
)
r
,
err
:=
a
.
keeper
.
ProcessSuccessfulClaimForLock
(
status
.
FinalClaim
,
a
.
execaddr
,
ethBridgeClaim
.
LocalCoinSymbol
,
ethBridgeClaim
.
TokenContractAddress
,
accDB
)
...
@@ -183,28 +151,28 @@ func (a *action) procMsgEth2Chain33(ethBridgeClaim *types2.Eth2Chain33, defaultC
...
@@ -183,28 +151,28 @@ func (a *action) procMsgEth2Chain33(ethBridgeClaim *types2.Eth2Chain33, defaultC
receipt
.
Logs
=
append
(
receipt
.
Logs
,
r
.
Logs
...
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
r
.
Logs
...
)
//记录成功lock的日志
//记录成功lock的日志
msgEthBridgeClaimBytes
,
err
:=
json
.
Marshal
(
msgE
thBridgeClaim
)
msgEthBridgeClaimBytes
,
err
:=
proto
.
Marshal
(
e
thBridgeClaim
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
return
nil
,
chain33types
.
ErrMarshal
}
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalEth2Chain33Prefix
(),
Value
:
msgEthBridgeClaimBytes
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalEth2Chain33Prefix
(),
Value
:
msgEthBridgeClaimBytes
})
execlog
:=
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TyEth2Chain33Log
,
Log
:
chain33types
.
Encode
(
&
types2
.
ReceiptEth2Chain33
{
execlog
:=
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TyEth2Chain33Log
,
Log
:
chain33types
.
Encode
(
&
types2
.
ReceiptEth2Chain33
{
EthereumChainID
:
msgE
thBridgeClaim
.
EthereumChainID
,
EthereumChainID
:
e
thBridgeClaim
.
EthereumChainID
,
BridgeContractAddress
:
msgE
thBridgeClaim
.
BridgeContractAddress
,
BridgeContractAddress
:
e
thBridgeClaim
.
BridgeContractAddress
,
Nonce
:
msgE
thBridgeClaim
.
Nonce
,
Nonce
:
e
thBridgeClaim
.
Nonce
,
LocalCoinSymbol
:
msgE
thBridgeClaim
.
LocalCoinSymbol
,
LocalCoinSymbol
:
e
thBridgeClaim
.
LocalCoinSymbol
,
LocalCoinExec
:
msgE
thBridgeClaim
.
LocalCoinExec
,
LocalCoinExec
:
e
thBridgeClaim
.
LocalCoinExec
,
TokenContractAddress
:
msgE
thBridgeClaim
.
TokenContractAddress
,
TokenContractAddress
:
e
thBridgeClaim
.
TokenContractAddress
,
EthereumSender
:
msgE
thBridgeClaim
.
EthereumSender
,
EthereumSender
:
e
thBridgeClaim
.
EthereumSender
,
Chain33Receiver
:
msgE
thBridgeClaim
.
Chain33Receiver
,
Chain33Receiver
:
e
thBridgeClaim
.
Chain33Receiver
,
ValidatorAddress
:
msgE
thBridgeClaim
.
ValidatorAddress
,
ValidatorAddress
:
e
thBridgeClaim
.
ValidatorAddress
,
Amount
:
msgE
thBridgeClaim
.
Amount
,
Amount
:
e
thBridgeClaim
.
Amount
,
ClaimType
:
msgE
thBridgeClaim
.
ClaimType
,
ClaimType
:
e
thBridgeClaim
.
ClaimType
,
XTxHash
:
a
.
txhash
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
XHeight
:
uint64
(
a
.
height
),
ProphecyID
:
ID
,
ProphecyID
:
ID
,
Decimals
:
msgE
thBridgeClaim
.
Decimals
,
Decimals
:
e
thBridgeClaim
.
Decimals
,
})}
})}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
...
@@ -216,13 +184,46 @@ func (a *action) procMsgEth2Chain33(ethBridgeClaim *types2.Eth2Chain33, defaultC
...
@@ -216,13 +184,46 @@ func (a *action) procMsgEth2Chain33(ethBridgeClaim *types2.Eth2Chain33, defaultC
// chain33 -> ethereum
// chain33 -> ethereum
// 返还在chain33上生成的erc20代币
// 返还在chain33上生成的erc20代币
func
(
a
*
action
)
procMsgBurn
(
msgBurn
*
types2
.
Chain33ToEth
,
defaultCon
bool
)
(
*
chain33types
.
Receipt
,
error
)
{
func
(
a
*
action
)
procMsgBurn
(
msgBurn
*
types2
.
Chain33ToEth
)
(
*
chain33types
.
Receipt
,
error
)
{
msgBurn
.
LocalCoinExec
=
types2
.
X2ethereumX
msgBurn
.
LocalCoinExec
=
types2
.
X2ethereumX
receipt
:=
new
(
chain33types
.
Receipt
)
consensusNeededBytes
,
err
:=
a
.
db
.
Get
(
types2
.
CalConsensusThresholdPrefix
())
if
err
!=
nil
{
if
err
==
chain33types
.
ErrNotFound
{
setConsensusThreshold
:=
&
types2
.
ReceiptQueryConsensusThreshold
{
ConsensusThreshold
:
types2
.
DefaultConsensusNeeded
}
msgSetConsensusThresholdBytes
,
err
:=
proto
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
consensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
consensusThreshold
)})
}
else
{
return
nil
,
err
}
}
else
{
var
mc
types2
.
ReceiptQueryConsensusThreshold
_
=
proto
.
Unmarshal
(
consensusNeededBytes
,
&
mc
)
_
,
_
,
err
=
a
.
keeper
.
ProcessSetConsensusNeeded
(
mc
.
ConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
err
}
}
accDB
,
err
:=
account
.
NewAccountDB
(
a
.
api
.
GetConfig
(),
msgBurn
.
LocalCoinExec
,
strings
.
ToLower
(
msgBurn
.
LocalCoinSymbol
+
msgBurn
.
TokenContract
),
a
.
db
)
accDB
,
err
:=
account
.
NewAccountDB
(
a
.
api
.
GetConfig
(),
msgBurn
.
LocalCoinExec
,
strings
.
ToLower
(
msgBurn
.
LocalCoinSymbol
+
msgBurn
.
TokenContract
),
a
.
db
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"relay procMsgBurn,exec=%s,sym=%s"
,
msgBurn
.
LocalCoinExec
,
msgBurn
.
LocalCoinSymbol
)
return
nil
,
errors
.
Wrapf
(
err
,
"relay procMsgBurn,exec=%s,sym=%s"
,
msgBurn
.
LocalCoinExec
,
msgBurn
.
LocalCoinSymbol
)
}
}
receipt
,
err
:
=
a
.
keeper
.
ProcessBurn
(
a
.
fromaddr
,
a
.
execaddr
,
msgBurn
.
Amount
,
msgBurn
.
TokenContract
,
msgBurn
.
Decimals
,
accDB
)
receipt
,
err
=
a
.
keeper
.
ProcessBurn
(
a
.
fromaddr
,
a
.
execaddr
,
msgBurn
.
Amount
,
msgBurn
.
TokenContract
,
msgBurn
.
Decimals
,
accDB
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -237,39 +238,54 @@ func (a *action) procMsgBurn(msgBurn *types2.Chain33ToEth, defaultCon bool) (*ch
...
@@ -237,39 +238,54 @@ func (a *action) procMsgBurn(msgBurn *types2.Chain33ToEth, defaultCon bool) (*ch
})}
})}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
msgBurnBytes
,
err
:=
json
.
Marshal
(
msgBurn
)
msgBurnBytes
,
err
:=
proto
.
Marshal
(
msgBurn
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
return
nil
,
chain33types
.
ErrMarshal
}
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalWithdrawChain33Prefix
(),
Value
:
msgBurnBytes
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalWithdrawChain33Prefix
(),
Value
:
msgBurnBytes
})
if
defaultCon
{
setConsensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
msgSetConsensusThresholdBytes
,
err
:=
json
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)})
}
receipt
.
Ty
=
chain33types
.
ExecOk
receipt
.
Ty
=
chain33types
.
ExecOk
return
receipt
,
nil
return
receipt
,
nil
}
}
func
(
a
*
action
)
procMsgLock
(
msgLock
*
types2
.
Chain33ToEth
,
defaultCon
bool
)
(
*
chain33types
.
Receipt
,
error
)
{
func
(
a
*
action
)
procMsgLock
(
msgLock
*
types2
.
Chain33ToEth
)
(
*
chain33types
.
Receipt
,
error
)
{
msgLock
.
LocalCoinExec
=
types2
.
X2ethereumX
msgLock
.
LocalCoinExec
=
types2
.
X2ethereumX
receipt
:=
new
(
chain33types
.
Receipt
)
consensusNeededBytes
,
err
:=
a
.
db
.
Get
(
types2
.
CalConsensusThresholdPrefix
())
if
err
!=
nil
{
if
err
==
chain33types
.
ErrNotFound
{
setConsensusThreshold
:=
&
types2
.
ReceiptQueryConsensusThreshold
{
ConsensusThreshold
:
types2
.
DefaultConsensusNeeded
}
msgSetConsensusThresholdBytes
,
err
:=
proto
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
consensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
consensusThreshold
)})
}
else
{
return
nil
,
err
}
}
else
{
var
mc
types2
.
ReceiptQueryConsensusThreshold
_
=
proto
.
Unmarshal
(
consensusNeededBytes
,
&
mc
)
_
,
_
,
err
=
a
.
keeper
.
ProcessSetConsensusNeeded
(
mc
.
ConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
err
}
}
accDB
:=
account
.
NewCoinsAccount
(
a
.
api
.
GetConfig
())
accDB
:=
account
.
NewCoinsAccount
(
a
.
api
.
GetConfig
())
accDB
.
SetDB
(
a
.
db
)
accDB
.
SetDB
(
a
.
db
)
receipt
,
err
:
=
a
.
keeper
.
ProcessLock
(
a
.
fromaddr
,
address
.
ExecAddress
(
msgLock
.
LocalCoinSymbol
),
a
.
execaddr
,
msgLock
.
Amount
,
accDB
)
receipt
,
err
=
a
.
keeper
.
ProcessLock
(
a
.
fromaddr
,
address
.
ExecAddress
(
msgLock
.
LocalCoinSymbol
),
a
.
execaddr
,
msgLock
.
Amount
,
accDB
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -284,42 +300,51 @@ func (a *action) procMsgLock(msgLock *types2.Chain33ToEth, defaultCon bool) (*ch
...
@@ -284,42 +300,51 @@ func (a *action) procMsgLock(msgLock *types2.Chain33ToEth, defaultCon bool) (*ch
})}
})}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
msgLockBytes
,
err
:=
json
.
Marshal
(
msgLock
)
msgLockBytes
,
err
:=
proto
.
Marshal
(
msgLock
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
return
nil
,
chain33types
.
ErrMarshal
}
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalChain33ToEthPrefix
(),
Value
:
msgLockBytes
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalChain33ToEthPrefix
(),
Value
:
msgLockBytes
})
if
defaultCon
{
setConsensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
msgSetConsensusThresholdBytes
,
err
:=
json
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)})
}
receipt
.
Ty
=
chain33types
.
ExecOk
receipt
.
Ty
=
chain33types
.
ExecOk
return
receipt
,
nil
return
receipt
,
nil
}
}
// ethereum -> chain33
// ethereum -> chain33
// burn
// burn
func
(
a
*
action
)
procWithdrawEth
(
withdrawEth
*
types2
.
Eth2Chain33
,
defaultCon
bool
)
(
*
chain33types
.
Receipt
,
error
)
{
func
(
a
*
action
)
procWithdrawEth
(
withdrawEth
*
types2
.
Eth2Chain33
)
(
*
chain33types
.
Receipt
,
error
)
{
elog
.
Info
(
"procWithdrawEth"
,
"receive a procWithdrawEth tx"
,
"start"
)
elog
.
Info
(
"procWithdrawEth"
,
"receive a procWithdrawEth tx"
,
"start"
)
receipt
:=
new
(
chain33types
.
Receipt
)
receipt
:=
new
(
chain33types
.
Receipt
)
msgWithdrawEth
:=
ethbridge
.
NewMsgCreateEthBridgeClaim
(
*
withdrawEth
)
if
err
:=
msgWithdrawEth
.
ValidateBasic
();
err
!=
nil
{
consensusNeededBytes
,
err
:=
a
.
db
.
Get
(
types2
.
CalConsensusThresholdPrefix
())
return
nil
,
err
if
err
!=
nil
{
if
err
==
chain33types
.
ErrNotFound
{
setConsensusThreshold
:=
&
types2
.
ReceiptQueryConsensusThreshold
{
ConsensusThreshold
:
types2
.
DefaultConsensusNeeded
}
msgSetConsensusThresholdBytes
,
err
:=
proto
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
consensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
consensusThreshold
)})
}
else
{
return
nil
,
err
}
}
else
{
var
mc
types2
.
ReceiptQueryConsensusThreshold
_
=
proto
.
Unmarshal
(
consensusNeededBytes
,
&
mc
)
_
,
_
,
err
=
a
.
keeper
.
ProcessSetConsensusNeeded
(
mc
.
ConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
err
}
}
}
status
,
err
:=
a
.
keeper
.
ProcessClaim
(
*
withdrawEth
)
status
,
err
:=
a
.
keeper
.
ProcessClaim
(
*
withdrawEth
)
...
@@ -327,65 +352,27 @@ func (a *action) procWithdrawEth(withdrawEth *types2.Eth2Chain33, defaultCon boo
...
@@ -327,65 +352,27 @@ func (a *action) procWithdrawEth(withdrawEth *types2.Eth2Chain33, defaultCon boo
return
nil
,
err
return
nil
,
err
}
}
ID
:=
strconv
.
Itoa
(
int
(
msgWithdrawEth
.
EthereumChainID
))
+
strconv
.
Itoa
(
int
(
msgWithdrawEth
.
Nonce
))
+
msgWithdrawEth
.
EthereumSender
+
"burn"
ID
:=
strconv
.
Itoa
(
int
(
withdrawEth
.
EthereumChainID
))
+
strconv
.
Itoa
(
int
(
withdrawEth
.
Nonce
))
+
withdrawEth
.
EthereumSender
+
withdrawEth
.
TokenContractAddress
+
"burn"
//记录ethProphecy
//记录ethProphecy
bz
,
err
:=
a
.
db
.
Get
(
types2
.
CalProphecyPrefix
())
bz
,
err
:=
a
.
db
.
Get
(
types2
.
CalProphecyPrefix
(
ID
))
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
types2
.
ErrProphecyGet
return
nil
,
types2
.
ErrProphecyGet
}
}
var
dbProphecys
[]
oracle
.
DBProphecy
var
dbProphecy
types2
.
ReceiptEthProphecy
var
dbProphecy
oracle
.
DBProphecy
err
=
proto
.
Unmarshal
(
bz
,
&
dbProphecy
)
err
=
json
.
Unmarshal
(
bz
,
&
dbProphecys
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrUnmarshal
return
nil
,
chain33types
.
ErrUnmarshal
}
}
for
_
,
p
:=
range
dbProphecys
{
if
p
.
ID
==
ID
{
dbProphecy
=
p
break
}
}
dRes
,
err
:=
dbProphecy
.
DeserializeFromDB
()
if
err
!=
nil
{
return
nil
,
err
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalProphecyPrefix
(),
Key
:
types2
.
CalProphecyPrefix
(
ID
),
Value
:
bz
,
Value
:
bz
,
})
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TyProphecyLog
,
Log
:
chain33types
.
Encode
(
&
types2
.
ReceiptEthProphecy
{
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TyProphecyLog
,
Log
:
chain33types
.
Encode
(
&
dbProphecy
)})
ID
:
dRes
.
ID
,
Status
:
&
types2
.
ProphecyStatus
{
Text
:
types2
.
EthBridgeStatus
(
dRes
.
Status
.
Text
),
FinalClaim
:
dRes
.
Status
.
FinalClaim
,
},
ClaimValidators
:
dRes
.
ClaimValidators
,
ValidatorClaims
:
dRes
.
ValidatorClaims
,
})})
if
defaultCon
{
setConsensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
msgSetConsensusThresholdBytes
,
err
:=
json
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)})
}
if
status
.
Text
==
oracle
.
StatusText
(
types2
.
EthBridgeStatus_WithdrawedStatusText
)
{
if
status
.
Text
==
types2
.
EthBridgeStatus_SuccessStatusText
{
accDB
:=
account
.
NewCoinsAccount
(
a
.
api
.
GetConfig
())
accDB
:=
account
.
NewCoinsAccount
(
a
.
api
.
GetConfig
())
accDB
.
SetDB
(
a
.
db
)
accDB
.
SetDB
(
a
.
db
)
r
,
err
:=
a
.
keeper
.
ProcessSuccessfulClaimForBurn
(
status
.
FinalClaim
,
a
.
execaddr
,
withdrawEth
.
LocalCoinSymbol
,
accDB
)
r
,
err
:=
a
.
keeper
.
ProcessSuccessfulClaimForBurn
(
status
.
FinalClaim
,
a
.
execaddr
,
withdrawEth
.
LocalCoinSymbol
,
accDB
)
...
@@ -395,28 +382,28 @@ func (a *action) procWithdrawEth(withdrawEth *types2.Eth2Chain33, defaultCon boo
...
@@ -395,28 +382,28 @@ func (a *action) procWithdrawEth(withdrawEth *types2.Eth2Chain33, defaultCon boo
receipt
.
KV
=
append
(
receipt
.
KV
,
r
.
KV
...
)
receipt
.
KV
=
append
(
receipt
.
KV
,
r
.
KV
...
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
r
.
Logs
...
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
r
.
Logs
...
)
msgWithdrawEthBytes
,
err
:=
json
.
Marshal
(
msgW
ithdrawEth
)
msgWithdrawEthBytes
,
err
:=
proto
.
Marshal
(
w
ithdrawEth
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
return
nil
,
chain33types
.
ErrMarshal
}
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalWithdrawEthPrefix
(),
Value
:
msgWithdrawEthBytes
})
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalWithdrawEthPrefix
(),
Value
:
msgWithdrawEthBytes
})
execlog
:=
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TyWithdrawEthLog
,
Log
:
chain33types
.
Encode
(
&
types2
.
ReceiptEth2Chain33
{
execlog
:=
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TyWithdrawEthLog
,
Log
:
chain33types
.
Encode
(
&
types2
.
ReceiptEth2Chain33
{
EthereumChainID
:
msgW
ithdrawEth
.
EthereumChainID
,
EthereumChainID
:
w
ithdrawEth
.
EthereumChainID
,
BridgeContractAddress
:
msgW
ithdrawEth
.
BridgeContractAddress
,
BridgeContractAddress
:
w
ithdrawEth
.
BridgeContractAddress
,
Nonce
:
msgW
ithdrawEth
.
Nonce
,
Nonce
:
w
ithdrawEth
.
Nonce
,
LocalCoinSymbol
:
msgW
ithdrawEth
.
LocalCoinSymbol
,
LocalCoinSymbol
:
w
ithdrawEth
.
LocalCoinSymbol
,
LocalCoinExec
:
msgW
ithdrawEth
.
LocalCoinExec
,
LocalCoinExec
:
w
ithdrawEth
.
LocalCoinExec
,
TokenContractAddress
:
msgW
ithdrawEth
.
TokenContractAddress
,
TokenContractAddress
:
w
ithdrawEth
.
TokenContractAddress
,
EthereumSender
:
msgW
ithdrawEth
.
EthereumSender
,
EthereumSender
:
w
ithdrawEth
.
EthereumSender
,
Chain33Receiver
:
msgW
ithdrawEth
.
Chain33Receiver
,
Chain33Receiver
:
w
ithdrawEth
.
Chain33Receiver
,
ValidatorAddress
:
msgW
ithdrawEth
.
ValidatorAddress
,
ValidatorAddress
:
w
ithdrawEth
.
ValidatorAddress
,
Amount
:
msgW
ithdrawEth
.
Amount
,
Amount
:
w
ithdrawEth
.
Amount
,
ClaimType
:
msgW
ithdrawEth
.
ClaimType
,
ClaimType
:
w
ithdrawEth
.
ClaimType
,
XTxHash
:
a
.
txhash
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
XHeight
:
uint64
(
a
.
height
),
ProphecyID
:
ID
,
ProphecyID
:
ID
,
Decimals
:
msgW
ithdrawEth
.
Decimals
,
Decimals
:
w
ithdrawEth
.
Decimals
,
})}
})}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
...
@@ -426,35 +413,50 @@ func (a *action) procWithdrawEth(withdrawEth *types2.Eth2Chain33, defaultCon boo
...
@@ -426,35 +413,50 @@ func (a *action) procWithdrawEth(withdrawEth *types2.Eth2Chain33, defaultCon boo
return
receipt
,
nil
return
receipt
,
nil
}
}
func
(
a
*
action
)
procMsgTransfer
(
msgTransfer
*
chain33types
.
AssetsTransfer
,
defaultCon
bool
)
(
*
chain33types
.
Receipt
,
error
)
{
func
(
a
*
action
)
procMsgTransfer
(
msgTransfer
*
chain33types
.
AssetsTransfer
)
(
*
chain33types
.
Receipt
,
error
)
{
token
:=
msgTransfer
.
GetCointoken
()
token
:=
msgTransfer
.
GetCointoken
()
receipt
:=
new
(
chain33types
.
Receipt
)
consensusNeededBytes
,
err
:=
a
.
db
.
Get
(
types2
.
CalConsensusThresholdPrefix
())
if
err
!=
nil
{
if
err
==
chain33types
.
ErrNotFound
{
setConsensusThreshold
:=
&
types2
.
ReceiptQueryConsensusThreshold
{
ConsensusThreshold
:
types2
.
DefaultConsensusNeeded
}
msgSetConsensusThresholdBytes
,
err
:=
proto
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
consensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
consensusThreshold
)})
}
else
{
return
nil
,
err
}
}
else
{
var
mc
types2
.
ReceiptQueryConsensusThreshold
_
=
proto
.
Unmarshal
(
consensusNeededBytes
,
&
mc
)
_
,
_
,
err
=
a
.
keeper
.
ProcessSetConsensusNeeded
(
mc
.
ConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
err
}
}
accDB
,
err
:=
account
.
NewAccountDB
(
a
.
api
.
GetConfig
(),
types2
.
X2ethereumX
,
token
,
a
.
db
)
accDB
,
err
:=
account
.
NewAccountDB
(
a
.
api
.
GetConfig
(),
types2
.
X2ethereumX
,
token
,
a
.
db
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
receipt
,
err
:
=
accDB
.
ExecTransfer
(
a
.
fromaddr
,
msgTransfer
.
To
,
address
.
ExecAddress
(
types2
.
X2ethereumX
),
msgTransfer
.
Amount
)
receipt
,
err
=
accDB
.
ExecTransfer
(
a
.
fromaddr
,
msgTransfer
.
To
,
address
.
ExecAddress
(
types2
.
X2ethereumX
),
msgTransfer
.
Amount
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
if
defaultCon
{
setConsensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
msgSetConsensusThresholdBytes
,
err
:=
json
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)})
}
receipt
.
Ty
=
chain33types
.
ExecOk
receipt
.
Ty
=
chain33types
.
ExecOk
return
receipt
,
nil
return
receipt
,
nil
}
}
...
@@ -462,10 +464,46 @@ func (a *action) procMsgTransfer(msgTransfer *chain33types.AssetsTransfer, defau
...
@@ -462,10 +464,46 @@ func (a *action) procMsgTransfer(msgTransfer *chain33types.AssetsTransfer, defau
//需要一笔交易来注册validator
//需要一笔交易来注册validator
//这里注册的validator的power之和可能不为1,需要在内部进行加权
//这里注册的validator的power之和可能不为1,需要在内部进行加权
//返回的回执中,KV包含所有validator的power值,Log中包含本次注册的validator的power值
//返回的回执中,KV包含所有validator的power值,Log中包含本次注册的validator的power值
func
(
a
*
action
)
procAddValidator
(
msgAddValidator
*
types2
.
MsgValidator
,
defaultCon
bool
)
(
*
chain33types
.
Receipt
,
error
)
{
func
(
a
*
action
)
procAddValidator
(
msgAddValidator
*
types2
.
MsgValidator
)
(
*
chain33types
.
Receipt
,
error
)
{
elog
.
Info
(
"procAddValidator"
,
"start"
,
msgAddValidator
)
elog
.
Info
(
"procAddValidator"
,
"start"
,
msgAddValidator
)
receipt
:=
new
(
chain33types
.
Receipt
)
consensusNeededBytes
,
err
:=
a
.
db
.
Get
(
types2
.
CalConsensusThresholdPrefix
())
if
err
!=
nil
{
if
err
==
chain33types
.
ErrNotFound
{
setConsensusThreshold
:=
&
types2
.
ReceiptQueryConsensusThreshold
{
ConsensusThreshold
:
types2
.
DefaultConsensusNeeded
}
msgSetConsensusThresholdBytes
,
err
:=
proto
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
consensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
consensusThreshold
)})
}
else
{
return
nil
,
err
}
}
else
{
var
mc
types2
.
ReceiptQueryConsensusThreshold
_
=
proto
.
Unmarshal
(
consensusNeededBytes
,
&
mc
)
_
,
_
,
err
=
a
.
keeper
.
ProcessSetConsensusNeeded
(
mc
.
ConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
err
}
}
if
!
types2
.
CheckPower
(
msgAddValidator
.
Power
)
{
return
nil
,
types2
.
ErrInvalidPower
}
receipt
,
err
:
=
a
.
keeper
.
ProcessAddValidator
(
msgAddValidator
.
Address
,
msgAddValidator
.
Power
)
receipt
,
err
=
a
.
keeper
.
ProcessAddValidator
(
msgAddValidator
.
Address
,
msgAddValidator
.
Power
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -478,32 +516,45 @@ func (a *action) procAddValidator(msgAddValidator *types2.MsgValidator, defaultC
...
@@ -478,32 +516,45 @@ func (a *action) procAddValidator(msgAddValidator *types2.MsgValidator, defaultC
})}
})}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
if
defaultCon
{
setConsensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
msgSetConsensusThresholdBytes
,
err
:=
json
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)})
}
receipt
.
Ty
=
chain33types
.
ExecOk
receipt
.
Ty
=
chain33types
.
ExecOk
return
receipt
,
nil
return
receipt
,
nil
}
}
func
(
a
*
action
)
procRemoveValidator
(
msgRemoveValidator
*
types2
.
MsgValidator
,
defaultCon
bool
)
(
*
chain33types
.
Receipt
,
error
)
{
func
(
a
*
action
)
procRemoveValidator
(
msgRemoveValidator
*
types2
.
MsgValidator
)
(
*
chain33types
.
Receipt
,
error
)
{
receipt
:=
new
(
chain33types
.
Receipt
)
receipt
:=
new
(
chain33types
.
Receipt
)
receipt
,
err
:=
a
.
keeper
.
ProcessRemoveValidator
(
msgRemoveValidator
.
Address
)
consensusNeededBytes
,
err
:=
a
.
db
.
Get
(
types2
.
CalConsensusThresholdPrefix
())
if
err
!=
nil
{
if
err
==
chain33types
.
ErrNotFound
{
setConsensusThreshold
:=
&
types2
.
ReceiptQueryConsensusThreshold
{
ConsensusThreshold
:
types2
.
DefaultConsensusNeeded
}
msgSetConsensusThresholdBytes
,
err
:=
proto
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
consensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
consensusThreshold
)})
}
else
{
return
nil
,
err
}
}
else
{
var
mc
types2
.
ReceiptQueryConsensusThreshold
_
=
proto
.
Unmarshal
(
consensusNeededBytes
,
&
mc
)
_
,
_
,
err
=
a
.
keeper
.
ProcessSetConsensusNeeded
(
mc
.
ConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
err
}
}
receipt
,
err
=
a
.
keeper
.
ProcessRemoveValidator
(
msgRemoveValidator
.
Address
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -516,32 +567,49 @@ func (a *action) procRemoveValidator(msgRemoveValidator *types2.MsgValidator, de
...
@@ -516,32 +567,49 @@ func (a *action) procRemoveValidator(msgRemoveValidator *types2.MsgValidator, de
})}
})}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
if
defaultCon
{
setConsensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
msgSetConsensusThresholdBytes
,
err
:=
json
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)})
}
receipt
.
Ty
=
chain33types
.
ExecOk
receipt
.
Ty
=
chain33types
.
ExecOk
return
receipt
,
nil
return
receipt
,
nil
}
}
func
(
a
*
action
)
procModifyValidator
(
msgModifyValidator
*
types2
.
MsgValidator
,
defaultCon
bool
)
(
*
chain33types
.
Receipt
,
error
)
{
func
(
a
*
action
)
procModifyValidator
(
msgModifyValidator
*
types2
.
MsgValidator
)
(
*
chain33types
.
Receipt
,
error
)
{
receipt
:=
new
(
chain33types
.
Receipt
)
receipt
:=
new
(
chain33types
.
Receipt
)
receipt
,
err
:=
a
.
keeper
.
ProcessModifyValidator
(
msgModifyValidator
.
Address
,
msgModifyValidator
.
Power
)
consensusNeededBytes
,
err
:=
a
.
db
.
Get
(
types2
.
CalConsensusThresholdPrefix
())
if
err
!=
nil
{
if
err
==
chain33types
.
ErrNotFound
{
setConsensusThreshold
:=
&
types2
.
ReceiptQueryConsensusThreshold
{
ConsensusThreshold
:
types2
.
DefaultConsensusNeeded
}
msgSetConsensusThresholdBytes
,
err
:=
proto
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
consensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
consensusThreshold
)})
}
else
{
return
nil
,
err
}
}
else
{
var
mc
types2
.
ReceiptQueryConsensusThreshold
_
=
proto
.
Unmarshal
(
consensusNeededBytes
,
&
mc
)
_
,
_
,
err
=
a
.
keeper
.
ProcessSetConsensusNeeded
(
mc
.
ConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
err
}
}
if
!
types2
.
CheckPower
(
msgModifyValidator
.
Power
)
{
return
nil
,
types2
.
ErrInvalidPower
}
receipt
,
err
=
a
.
keeper
.
ProcessModifyValidator
(
msgModifyValidator
.
Address
,
msgModifyValidator
.
Power
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -554,30 +622,15 @@ func (a *action) procModifyValidator(msgModifyValidator *types2.MsgValidator, de
...
@@ -554,30 +622,15 @@ func (a *action) procModifyValidator(msgModifyValidator *types2.MsgValidator, de
})}
})}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
if
defaultCon
{
setConsensusThreshold
:=
&
types2
.
ReceiptSetConsensusThreshold
{
PreConsensusThreshold
:
int64
(
0
),
NowConsensusThreshold
:
types2
.
DefaultConsensusNeeded
,
XTxHash
:
a
.
txhash
,
XHeight
:
uint64
(
a
.
height
),
}
msgSetConsensusThresholdBytes
,
err
:=
json
.
Marshal
(
setConsensusThreshold
)
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
chain33types
.
KeyValue
{
Key
:
types2
.
CalConsensusThresholdPrefix
(),
Value
:
msgSetConsensusThresholdBytes
,
})
receipt
.
Logs
=
append
(
receipt
.
Logs
,
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)})
}
receipt
.
Ty
=
chain33types
.
ExecOk
receipt
.
Ty
=
chain33types
.
ExecOk
return
receipt
,
nil
return
receipt
,
nil
}
}
func
(
a
*
action
)
procMsgSetConsensusThreshold
(
msgSetConsensusThreshold
*
types2
.
MsgConsensusThreshold
)
(
*
chain33types
.
Receipt
,
error
)
{
func
(
a
*
action
)
procMsgSetConsensusThreshold
(
msgSetConsensusThreshold
*
types2
.
MsgConsensusThreshold
)
(
*
chain33types
.
Receipt
,
error
)
{
receipt
:=
new
(
chain33types
.
Receipt
)
receipt
:=
new
(
chain33types
.
Receipt
)
if
!
types2
.
CheckPower
(
msgSetConsensusThreshold
.
ConsensusThreshold
)
{
return
nil
,
types2
.
ErrInvalidPower
}
preConsensusNeeded
,
nowConsensusNeeded
,
err
:=
a
.
keeper
.
ProcessSetConsensusNeeded
(
msgSetConsensusThreshold
.
ConsensusThreshold
)
preConsensusNeeded
,
nowConsensusNeeded
,
err
:=
a
.
keeper
.
ProcessSetConsensusNeeded
(
msgSetConsensusThreshold
.
ConsensusThreshold
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -593,7 +646,9 @@ func (a *action) procMsgSetConsensusThreshold(msgSetConsensusThreshold *types2.M
...
@@ -593,7 +646,9 @@ func (a *action) procMsgSetConsensusThreshold(msgSetConsensusThreshold *types2.M
execlog
:=
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)}
execlog
:=
&
chain33types
.
ReceiptLog
{
Ty
:
types2
.
TySetConsensusThresholdLog
,
Log
:
chain33types
.
Encode
(
setConsensusThreshold
)}
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
receipt
.
Logs
=
append
(
receipt
.
Logs
,
execlog
)
msgSetConsensusThresholdBytes
,
err
:=
json
.
Marshal
(
setConsensusThreshold
)
msgSetConsensusThresholdBytes
,
err
:=
proto
.
Marshal
(
&
types2
.
ReceiptQueryConsensusThreshold
{
ConsensusThreshold
:
nowConsensusNeeded
,
})
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
chain33types
.
ErrMarshal
return
nil
,
chain33types
.
ErrMarshal
}
}
...
...
plugin/dapp/x2Ethereum/proto/x2ethereum.proto
View file @
34fd2055
...
@@ -8,7 +8,6 @@ enum EthBridgeStatus {
...
@@ -8,7 +8,6 @@ enum EthBridgeStatus {
PendingStatusText
=
0
;
PendingStatusText
=
0
;
SuccessStatusText
=
1
;
SuccessStatusText
=
1
;
FailedStatusText
=
2
;
FailedStatusText
=
2
;
WithdrawedStatusText
=
3
;
}
}
message
X2ethereumAction
{
message
X2ethereumAction
{
...
@@ -138,6 +137,10 @@ message StringMap {
...
@@ -138,6 +137,10 @@ message StringMap {
repeated
string
validators
=
1
;
repeated
string
validators
=
1
;
}
}
message
ValidatorList
{
repeated
MsgValidator
validators
=
1
;
}
message
ProphecyStatus
{
message
ProphecyStatus
{
EthBridgeStatus
Text
=
1
;
EthBridgeStatus
Text
=
1
;
string
FinalClaim
=
2
;
string
FinalClaim
=
2
;
...
...
plugin/dapp/x2Ethereum/testProcess.md
deleted
100644 → 0
View file @
98a98728
# 测试流程
1.
起eth节点
```
cd /opt/src/github.com/cosmos/peggy/testnet-contracts
truffle develop
```
2.
起chain33节点
```
make docker-compose
```
3.
修改配置项,起relayer
修改 chain33Host,BridgeRegistry,pushHost,operatorAddr,deployerPrivateKey,validatorsAddr
注意:
BridgeRegistry 需要先起relayer然后部署完成后才有,然后停掉relayer,重新跑
4.
修改脚本中的私钥,跑部署脚本
```
./bridgeBankTest.sh
```
5.
在ethereum上发行bty
```
./ebcli_A relayer ethereum token4chain33 -s bty
```
6.
跑测试用例
```
./test.sh
```
7.
查询ispending的prophecy
```
./ebcli_A relayer ethereum ispending -i 1
```
8.
处理这个prophecy
```
./ebcli_A relayer ethereum process -i 1
```
9.
查询余额
```
./ebcli_A relayer ethereum balance -o 0x7B95B6EC7EbD73572298cEf32Bb54FA408207359 -a 0xbAf2646b8DaD8776fc74Bf4C8d59E6fB3720eddf
```
plugin/dapp/x2Ethereum/types/errors.go
View file @
34fd2055
...
@@ -27,6 +27,7 @@ var (
...
@@ -27,6 +27,7 @@ var (
ErrAddressExists
=
errors
.
New
(
"This address already exists"
)
ErrAddressExists
=
errors
.
New
(
"This address already exists"
)
ErrInvalidAdminAddress
=
errors
.
New
(
"This address is not admin address"
)
ErrInvalidAdminAddress
=
errors
.
New
(
"This address is not admin address"
)
ErrClaimInconsist
=
errors
.
New
(
"This claim does not consist with others"
)
ErrClaimInconsist
=
errors
.
New
(
"This claim does not consist with others"
)
ErrInvalidPower
=
errors
.
New
(
"This power is invalid"
)
)
)
//common
//common
...
...
plugin/dapp/x2Ethereum/types/kv.go
View file @
34fd2055
...
@@ -15,8 +15,8 @@ var (
...
@@ -15,8 +15,8 @@ var (
KeyPrefixLocalDB
=
"LODB-x2ethereum-"
KeyPrefixLocalDB
=
"LODB-x2ethereum-"
)
)
func
CalProphecyPrefix
()
[]
byte
{
func
CalProphecyPrefix
(
id
string
)
[]
byte
{
return
[]
byte
(
KeyPrefixStateDB
+
string
(
ProphecyKey
))
return
[]
byte
(
KeyPrefixStateDB
+
string
(
ProphecyKey
)
+
id
)
}
}
func
CalEth2Chain33Prefix
()
[]
byte
{
func
CalEth2Chain33Prefix
()
[]
byte
{
...
...
plugin/dapp/x2Ethereum/types/oracle.pb.go
View file @
34fd2055
...
@@ -5,9 +5,8 @@ package types
...
@@ -5,9 +5,8 @@ package types
import
(
import
(
fmt
"fmt"
fmt
"fmt"
math
"math"
proto
"github.com/golang/protobuf/proto"
proto
"github.com/golang/protobuf/proto"
math
"math"
)
)
// Reference imports to suppress errors if they are not otherwise used.
// Reference imports to suppress errors if they are not otherwise used.
...
...
plugin/dapp/x2Ethereum/types/utils.go
View file @
34fd2055
...
@@ -95,3 +95,10 @@ func TrimZeroAndDot(s string) string {
...
@@ -95,3 +95,10 @@ func TrimZeroAndDot(s string) string {
return
s
return
s
}
}
func
CheckPower
(
power
int64
)
bool
{
if
power
<=
0
||
power
>
100
{
return
false
}
return
true
}
plugin/dapp/x2Ethereum/types/x2ethereum.pb.go
View file @
34fd2055
...
@@ -6,11 +6,10 @@ package types
...
@@ -6,11 +6,10 @@ package types
import
(
import
(
context
"context"
context
"context"
fmt
"fmt"
fmt
"fmt"
math
"math"
types
"github.com/33cn/chain33/types"
types
"github.com/33cn/chain33/types"
proto
"github.com/golang/protobuf/proto"
proto
"github.com/golang/protobuf/proto"
grpc
"google.golang.org/grpc"
grpc
"google.golang.org/grpc"
math
"math"
)
)
// Reference imports to suppress errors if they are not otherwise used.
// Reference imports to suppress errors if they are not otherwise used.
...
@@ -27,24 +26,21 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
...
@@ -27,24 +26,21 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type
EthBridgeStatus
int32
type
EthBridgeStatus
int32
const
(
const
(
EthBridgeStatus_PendingStatusText
EthBridgeStatus
=
0
EthBridgeStatus_PendingStatusText
EthBridgeStatus
=
0
EthBridgeStatus_SuccessStatusText
EthBridgeStatus
=
1
EthBridgeStatus_SuccessStatusText
EthBridgeStatus
=
1
EthBridgeStatus_FailedStatusText
EthBridgeStatus
=
2
EthBridgeStatus_FailedStatusText
EthBridgeStatus
=
2
EthBridgeStatus_WithdrawedStatusText
EthBridgeStatus
=
3
)
)
var
EthBridgeStatus_name
=
map
[
int32
]
string
{
var
EthBridgeStatus_name
=
map
[
int32
]
string
{
0
:
"PendingStatusText"
,
0
:
"PendingStatusText"
,
1
:
"SuccessStatusText"
,
1
:
"SuccessStatusText"
,
2
:
"FailedStatusText"
,
2
:
"FailedStatusText"
,
3
:
"WithdrawedStatusText"
,
}
}
var
EthBridgeStatus_value
=
map
[
string
]
int32
{
var
EthBridgeStatus_value
=
map
[
string
]
int32
{
"PendingStatusText"
:
0
,
"PendingStatusText"
:
0
,
"SuccessStatusText"
:
1
,
"SuccessStatusText"
:
1
,
"FailedStatusText"
:
2
,
"FailedStatusText"
:
2
,
"WithdrawedStatusText"
:
3
,
}
}
func
(
x
EthBridgeStatus
)
String
()
string
{
func
(
x
EthBridgeStatus
)
String
()
string
{
...
@@ -1207,6 +1203,45 @@ func (m *StringMap) GetValidators() []string {
...
@@ -1207,6 +1203,45 @@ func (m *StringMap) GetValidators() []string {
return
nil
return
nil
}
}
type
ValidatorList
struct
{
Validators
[]
*
MsgValidator
`protobuf:"bytes,1,rep,name=validators,proto3" json:"validators,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
}
func
(
m
*
ValidatorList
)
Reset
()
{
*
m
=
ValidatorList
{}
}
func
(
m
*
ValidatorList
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ValidatorList
)
ProtoMessage
()
{}
func
(
*
ValidatorList
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
15
}
}
func
(
m
*
ValidatorList
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_ValidatorList
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
ValidatorList
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_ValidatorList
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
ValidatorList
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_ValidatorList
.
Merge
(
m
,
src
)
}
func
(
m
*
ValidatorList
)
XXX_Size
()
int
{
return
xxx_messageInfo_ValidatorList
.
Size
(
m
)
}
func
(
m
*
ValidatorList
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_ValidatorList
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_ValidatorList
proto
.
InternalMessageInfo
func
(
m
*
ValidatorList
)
GetValidators
()
[]
*
MsgValidator
{
if
m
!=
nil
{
return
m
.
Validators
}
return
nil
}
type
ProphecyStatus
struct
{
type
ProphecyStatus
struct
{
Text
EthBridgeStatus
`protobuf:"varint,1,opt,name=Text,proto3,enum=types.EthBridgeStatus" json:"Text,omitempty"`
Text
EthBridgeStatus
`protobuf:"varint,1,opt,name=Text,proto3,enum=types.EthBridgeStatus" json:"Text,omitempty"`
FinalClaim
string
`protobuf:"bytes,2,opt,name=FinalClaim,proto3" json:"FinalClaim,omitempty"`
FinalClaim
string
`protobuf:"bytes,2,opt,name=FinalClaim,proto3" json:"FinalClaim,omitempty"`
...
@@ -1219,7 +1254,7 @@ func (m *ProphecyStatus) Reset() { *m = ProphecyStatus{} }
...
@@ -1219,7 +1254,7 @@ func (m *ProphecyStatus) Reset() { *m = ProphecyStatus{} }
func
(
m
*
ProphecyStatus
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
ProphecyStatus
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ProphecyStatus
)
ProtoMessage
()
{}
func
(
*
ProphecyStatus
)
ProtoMessage
()
{}
func
(
*
ProphecyStatus
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ProphecyStatus
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
1
5
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
1
6
}
}
}
func
(
m
*
ProphecyStatus
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
ProphecyStatus
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1265,7 +1300,7 @@ func (m *QueryValidatorsParams) Reset() { *m = QueryValidatorsParams{} }
...
@@ -1265,7 +1300,7 @@ func (m *QueryValidatorsParams) Reset() { *m = QueryValidatorsParams{} }
func
(
m
*
QueryValidatorsParams
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
QueryValidatorsParams
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryValidatorsParams
)
ProtoMessage
()
{}
func
(
*
QueryValidatorsParams
)
ProtoMessage
()
{}
func
(
*
QueryValidatorsParams
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
QueryValidatorsParams
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
1
6
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
1
7
}
}
}
func
(
m
*
QueryValidatorsParams
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
QueryValidatorsParams
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1305,7 +1340,7 @@ func (m *ReceiptQueryValidator) Reset() { *m = ReceiptQueryValidator{} }
...
@@ -1305,7 +1340,7 @@ func (m *ReceiptQueryValidator) Reset() { *m = ReceiptQueryValidator{} }
func
(
m
*
ReceiptQueryValidator
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
ReceiptQueryValidator
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReceiptQueryValidator
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryValidator
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryValidator
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ReceiptQueryValidator
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
1
7
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
1
8
}
}
}
func
(
m
*
ReceiptQueryValidator
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
ReceiptQueryValidator
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1350,7 +1385,7 @@ func (m *QueryTotalPowerParams) Reset() { *m = QueryTotalPowerParams{} }
...
@@ -1350,7 +1385,7 @@ func (m *QueryTotalPowerParams) Reset() { *m = QueryTotalPowerParams{} }
func
(
m
*
QueryTotalPowerParams
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
QueryTotalPowerParams
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryTotalPowerParams
)
ProtoMessage
()
{}
func
(
*
QueryTotalPowerParams
)
ProtoMessage
()
{}
func
(
*
QueryTotalPowerParams
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
QueryTotalPowerParams
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
1
8
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
1
9
}
}
}
func
(
m
*
QueryTotalPowerParams
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
QueryTotalPowerParams
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1382,7 +1417,7 @@ func (m *ReceiptQueryTotalPower) Reset() { *m = ReceiptQueryTotalPower{}
...
@@ -1382,7 +1417,7 @@ func (m *ReceiptQueryTotalPower) Reset() { *m = ReceiptQueryTotalPower{}
func
(
m
*
ReceiptQueryTotalPower
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
ReceiptQueryTotalPower
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReceiptQueryTotalPower
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryTotalPower
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryTotalPower
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ReceiptQueryTotalPower
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
19
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
20
}
}
}
func
(
m
*
ReceiptQueryTotalPower
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
ReceiptQueryTotalPower
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1420,7 +1455,7 @@ func (m *QueryConsensusThresholdParams) Reset() { *m = QueryConsensusThr
...
@@ -1420,7 +1455,7 @@ func (m *QueryConsensusThresholdParams) Reset() { *m = QueryConsensusThr
func
(
m
*
QueryConsensusThresholdParams
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
QueryConsensusThresholdParams
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryConsensusThresholdParams
)
ProtoMessage
()
{}
func
(
*
QueryConsensusThresholdParams
)
ProtoMessage
()
{}
func
(
*
QueryConsensusThresholdParams
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
QueryConsensusThresholdParams
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
0
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
1
}
}
}
func
(
m
*
QueryConsensusThresholdParams
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
QueryConsensusThresholdParams
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1452,7 +1487,7 @@ func (m *ReceiptQueryConsensusThreshold) Reset() { *m = ReceiptQueryCons
...
@@ -1452,7 +1487,7 @@ func (m *ReceiptQueryConsensusThreshold) Reset() { *m = ReceiptQueryCons
func
(
m
*
ReceiptQueryConsensusThreshold
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
ReceiptQueryConsensusThreshold
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReceiptQueryConsensusThreshold
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryConsensusThreshold
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryConsensusThreshold
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ReceiptQueryConsensusThreshold
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
1
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
2
}
}
}
func
(
m
*
ReceiptQueryConsensusThreshold
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
ReceiptQueryConsensusThreshold
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1495,7 +1530,7 @@ func (m *QuerySymbolAssetsByTxTypeParams) Reset() { *m = QuerySymbolAsse
...
@@ -1495,7 +1530,7 @@ func (m *QuerySymbolAssetsByTxTypeParams) Reset() { *m = QuerySymbolAsse
func
(
m
*
QuerySymbolAssetsByTxTypeParams
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
QuerySymbolAssetsByTxTypeParams
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QuerySymbolAssetsByTxTypeParams
)
ProtoMessage
()
{}
func
(
*
QuerySymbolAssetsByTxTypeParams
)
ProtoMessage
()
{}
func
(
*
QuerySymbolAssetsByTxTypeParams
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
QuerySymbolAssetsByTxTypeParams
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
2
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
3
}
}
}
func
(
m
*
QuerySymbolAssetsByTxTypeParams
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
QuerySymbolAssetsByTxTypeParams
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1562,7 +1597,7 @@ func (m *ReceiptQuerySymbolAssets) Reset() { *m = ReceiptQuerySymbolAsse
...
@@ -1562,7 +1597,7 @@ func (m *ReceiptQuerySymbolAssets) Reset() { *m = ReceiptQuerySymbolAsse
func
(
m
*
ReceiptQuerySymbolAssets
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
ReceiptQuerySymbolAssets
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReceiptQuerySymbolAssets
)
ProtoMessage
()
{}
func
(
*
ReceiptQuerySymbolAssets
)
ProtoMessage
()
{}
func
(
*
ReceiptQuerySymbolAssets
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ReceiptQuerySymbolAssets
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
3
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
4
}
}
}
func
(
m
*
ReceiptQuerySymbolAssets
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
ReceiptQuerySymbolAssets
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1605,7 +1640,7 @@ func (m *ReceiptQuerySymbolAssetsByTxType) Reset() { *m = ReceiptQuerySy
...
@@ -1605,7 +1640,7 @@ func (m *ReceiptQuerySymbolAssetsByTxType) Reset() { *m = ReceiptQuerySy
func
(
m
*
ReceiptQuerySymbolAssetsByTxType
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
ReceiptQuerySymbolAssetsByTxType
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReceiptQuerySymbolAssetsByTxType
)
ProtoMessage
()
{}
func
(
*
ReceiptQuerySymbolAssetsByTxType
)
ProtoMessage
()
{}
func
(
*
ReceiptQuerySymbolAssetsByTxType
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ReceiptQuerySymbolAssetsByTxType
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
4
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
5
}
}
}
func
(
m
*
ReceiptQuerySymbolAssetsByTxType
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
ReceiptQuerySymbolAssetsByTxType
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1674,7 +1709,7 @@ func (m *QueryRelayerBalance) Reset() { *m = QueryRelayerBalance{} }
...
@@ -1674,7 +1709,7 @@ func (m *QueryRelayerBalance) Reset() { *m = QueryRelayerBalance{} }
func
(
m
*
QueryRelayerBalance
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
QueryRelayerBalance
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryRelayerBalance
)
ProtoMessage
()
{}
func
(
*
QueryRelayerBalance
)
ProtoMessage
()
{}
func
(
*
QueryRelayerBalance
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
QueryRelayerBalance
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
5
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
6
}
}
}
func
(
m
*
QueryRelayerBalance
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
QueryRelayerBalance
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1727,7 +1762,7 @@ func (m *ReceiptQueryRelayerBalance) Reset() { *m = ReceiptQueryRelayerB
...
@@ -1727,7 +1762,7 @@ func (m *ReceiptQueryRelayerBalance) Reset() { *m = ReceiptQueryRelayerB
func
(
m
*
ReceiptQueryRelayerBalance
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
ReceiptQueryRelayerBalance
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReceiptQueryRelayerBalance
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryRelayerBalance
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryRelayerBalance
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ReceiptQueryRelayerBalance
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
6
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
7
}
}
}
func
(
m
*
ReceiptQueryRelayerBalance
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
ReceiptQueryRelayerBalance
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1768,7 +1803,7 @@ func (m *ReceiptQueryRelayerBalanceForOneToken) Reset() { *m = ReceiptQu
...
@@ -1768,7 +1803,7 @@ func (m *ReceiptQueryRelayerBalanceForOneToken) Reset() { *m = ReceiptQu
func
(
m
*
ReceiptQueryRelayerBalanceForOneToken
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
ReceiptQueryRelayerBalanceForOneToken
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReceiptQueryRelayerBalanceForOneToken
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryRelayerBalanceForOneToken
)
ProtoMessage
()
{}
func
(
*
ReceiptQueryRelayerBalanceForOneToken
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ReceiptQueryRelayerBalanceForOneToken
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
7
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
8
}
}
}
func
(
m
*
ReceiptQueryRelayerBalanceForOneToken
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
ReceiptQueryRelayerBalanceForOneToken
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1821,7 +1856,7 @@ func (m *ReceiptTokenToTokenAddress) Reset() { *m = ReceiptTokenToTokenA
...
@@ -1821,7 +1856,7 @@ func (m *ReceiptTokenToTokenAddress) Reset() { *m = ReceiptTokenToTokenA
func
(
m
*
ReceiptTokenToTokenAddress
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
m
*
ReceiptTokenToTokenAddress
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReceiptTokenToTokenAddress
)
ProtoMessage
()
{}
func
(
*
ReceiptTokenToTokenAddress
)
ProtoMessage
()
{}
func
(
*
ReceiptTokenToTokenAddress
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ReceiptTokenToTokenAddress
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
8
}
return
fileDescriptor_1dd1834a817ceb21
,
[]
int
{
2
9
}
}
}
func
(
m
*
ReceiptTokenToTokenAddress
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
func
(
m
*
ReceiptTokenToTokenAddress
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
@@ -1866,6 +1901,7 @@ func init() {
...
@@ -1866,6 +1901,7 @@ func init() {
proto
.
RegisterType
((
*
ClaimValidators
)(
nil
),
"types.ClaimValidators"
)
proto
.
RegisterType
((
*
ClaimValidators
)(
nil
),
"types.ClaimValidators"
)
proto
.
RegisterType
((
*
ValidatorClaims
)(
nil
),
"types.ValidatorClaims"
)
proto
.
RegisterType
((
*
ValidatorClaims
)(
nil
),
"types.ValidatorClaims"
)
proto
.
RegisterType
((
*
StringMap
)(
nil
),
"types.StringMap"
)
proto
.
RegisterType
((
*
StringMap
)(
nil
),
"types.StringMap"
)
proto
.
RegisterType
((
*
ValidatorList
)(
nil
),
"types.ValidatorList"
)
proto
.
RegisterType
((
*
ProphecyStatus
)(
nil
),
"types.ProphecyStatus"
)
proto
.
RegisterType
((
*
ProphecyStatus
)(
nil
),
"types.ProphecyStatus"
)
proto
.
RegisterType
((
*
QueryValidatorsParams
)(
nil
),
"types.QueryValidatorsParams"
)
proto
.
RegisterType
((
*
QueryValidatorsParams
)(
nil
),
"types.QueryValidatorsParams"
)
proto
.
RegisterType
((
*
ReceiptQueryValidator
)(
nil
),
"types.ReceiptQueryValidator"
)
proto
.
RegisterType
((
*
ReceiptQueryValidator
)(
nil
),
"types.ReceiptQueryValidator"
)
...
@@ -1887,91 +1923,92 @@ func init() {
...
@@ -1887,91 +1923,92 @@ func init() {
}
}
var
fileDescriptor_1dd1834a817ceb21
=
[]
byte
{
var
fileDescriptor_1dd1834a817ceb21
=
[]
byte
{
// 134
4
bytes of a gzipped FileDescriptorProto
// 134
6
bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0xec
,
0x58
,
0xcb
,
0x6e
,
0xdb
,
0x46
,
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0xec
,
0x58
,
0xcb
,
0x6e
,
0xdb
,
0x46
,
0x17
,
0x36
,
0x45
,
0x49
,
0x0e
,
0x8f
,
0x14
,
0x5b
,
0x99
,
0x58
,
0xfe
,
0x09
,
0xc3
,
0x7f
,
0x22
,
0x10
,
0x14
,
0x35
,
0x45
,
0x49
,
0x0e
,
0xaf
,
0x64
,
0x5b
,
0x99
,
0x44
,
0x2e
,
0x61
,
0xb8
,
0x89
,
0x40
,
0xf4
,
0xbd
,
0x18
,
0x69
,
0x6b
,
0x14
,
0x76
,
0x7a
,
0xc9
,
0x26
,
0x8d
,
0x2d
,
0x2b
,
0x75
,
0x16
,
0x69
,
0xdc
,
0x61
,
0xa4
,
0xad
,
0x51
,
0xd8
,
0xe9
,
0x23
,
0x9b
,
0x34
,
0xb6
,
0xac
,
0xd4
,
0x01
,
0x9a
,
0xc6
,
0x1d
,
0x11
,
0x7b
,
0x03
,
0xb2
,
0x19
,
0x93
,
0x13
,
0x93
,
0x28
,
0x45
,
0x0a
,
0xe4
,
0xc8
,
0x96
,
0x96
,
0xdd
,
0x31
,
0x45
,
0x0b
,
0x64
,
0x33
,
0x26
,
0x27
,
0x26
,
0x51
,
0x8a
,
0x14
,
0xc8
,
0x91
,
0x2d
,
0x2d
,
0xbb
,
0x76
,
0xd5
,
0x57
,
0x69
,
0x97
,
0x5d
,
0xf4
,
0x35
,
0xb2
,
0xec
,
0xab
,
0x14
,
0x33
,
0x1c
,
0x92
,
0x43
,
0xed
,
0xaa
,
0xbf
,
0xd2
,
0x2e
,
0xbb
,
0xe8
,
0x6f
,
0x64
,
0xd9
,
0x5f
,
0x29
,
0x66
,
0x38
,
0x24
,
0x87
,
0x8a
,
0x56
,
0x8c
,
0xa0
,
0x8b
,
0x16
,
0xe8
,
0x72
,
0xbe
,
0x73
,
0xfb
,
0xce
,
0x65
,
0x0e
,
0x47
,
0x82
,
0x14
,
0xad
,
0x04
,
0x41
,
0x17
,
0x2d
,
0xd0
,
0xe5
,
0x9c
,
0xfb
,
0x3a
,
0xf7
,
0xc1
,
0x3b
,
0x23
,
0x41
,
0xde
,
0xfc
,
0x80
,
0x32
,
0x8f
,
0xc6
,
0x74
,
0x36
,
0xd9
,
0x9f
,
0xc6
,
0x11
,
0x8b
,
0x50
,
0x8b
,
0x2d
,
0x6f
,
0x7e
,
0x40
,
0x99
,
0x47
,
0x63
,
0x3a
,
0x9b
,
0xec
,
0x4f
,
0xe3
,
0x88
,
0x45
,
0xa8
,
0xc5
,
0x16
,
0xa6
,
0x34
,
0xd9
,
0xb9
,
0xc3
,
0x62
,
0x12
,
0x26
,
0xc4
,
0x61
,
0x7e
,
0x14
,
0xa6
,
0x92
,
0x9d
,
0xdb
,
0x53
,
0x9a
,
0xec
,
0xdc
,
0x64
,
0x31
,
0x09
,
0x13
,
0xe2
,
0x30
,
0x3f
,
0x0a
,
0x53
,
0xc9
,
0xce
,
0x06
,
0xc4
,
0x71
,
0xa2
,
0x59
,
0xc8
,
0xd2
,
0xa3
,
0xf5
,
0xba
,
0x09
,
0xbd
,
0xef
,
0x73
,
0xeb
,
0x23
,
0xa1
,
0x71
,
0x9c
,
0x68
,
0x16
,
0xb2
,
0xf4
,
0x68
,
0xbd
,
0x6a
,
0x42
,
0xef
,
0x87
,
0xdc
,
0xfa
,
0x48
,
0x68
,
0x89
,
0x3e
,
0x85
,
0x0e
,
0x65
,
0xde
,
0xc1
,
0xd0
,
0x23
,
0x7e
,
0x78
,
0x78
,
0x68
,
0x6a
,
0x03
,
0x6d
,
0xa2
,
0xcf
,
0xa1
,
0x43
,
0x99
,
0x77
,
0x30
,
0xf4
,
0x88
,
0x1f
,
0x1e
,
0x1e
,
0x9a
,
0xda
,
0x40
,
0xdb
,
0xaf
,
0x73
,
0x80
,
0xf6
,
0x85
,
0xcf
,
0xfd
,
0x51
,
0x21
,
0x39
,
0x5d
,
0xc3
,
0xaa
,
0x22
,
0xb7
,
0xbb
,
0xeb
,
0x1c
,
0xa0
,
0x7d
,
0xe1
,
0x73
,
0x7f
,
0x54
,
0x48
,
0x4e
,
0xd7
,
0xb0
,
0xaa
,
0xc8
,
0xed
,
0xae
,
0xf2
,
0x99
,
0xe7
,
0xc6
,
0xe4
,
0x6a
,
0xc4
,
0x3c
,
0xb3
,
0xb1
,
0xca
,
0x4e
,
0x51
,
0x44
,
0x5f
,
0xc0
,
0x7c
,
0xe6
,
0xb9
,
0x31
,
0xb9
,
0x1a
,
0x31
,
0xcf
,
0x6c
,
0xac
,
0xb2
,
0x53
,
0x14
,
0xd1
,
0x57
,
0xb0
,
0x66
,
0x76
,
0xcc
,
0x62
,
0xea
,
0xc2
,
0xf6
,
0xae
,
0xb4
,
0x95
,
0xa8
,
0x1d
,
0x8d
,
0x98
,
0x77
,
0xba
,
0x95
,
0x1d
,
0xb3
,
0x98
,
0xba
,
0xb0
,
0xbd
,
0x25
,
0x6d
,
0x25
,
0x6a
,
0x47
,
0x23
,
0xe6
,
0x9d
,
0xae
,
0x86
,
0xab
,
0xda
,
0xe8
,
0x11
,
0x74
,
0x1d
,
0x45
,
0xc5
,
0x6c
,
0xae
,
0xb2
,
0x2e
,
0xa9
,
0x72
,
0x53
,
0xe1
,
0xaa
,
0x36
,
0x7a
,
0x00
,
0x5d
,
0x47
,
0x51
,
0x31
,
0x9b
,
0xab
,
0xac
,
0x4b
,
0xaa
,
0xdc
,
0x94
,
0xe2
,
0xba
,
0xdf
,
0x92
,
0xc0
,
0x77
,
0x09
,
0x8b
,
0x62
,
0xb3
,
0x55
,
0x32
,
0x7d
,
0x9e
,
0x5c
,
0xe4
,
0xb8
,
0xee
,
0xf7
,
0x24
,
0xf0
,
0x5d
,
0xc2
,
0xa2
,
0xd8
,
0x6c
,
0x95
,
0x4c
,
0x9f
,
0x26
,
0x17
,
0xb9
,
0x22
,
0x6e
,
0xaa
,
0xaa
,
0x72
,
0xda
,
0x31
,
0x9d
,
0x44
,
0x97
,
0xb4
,
0xb0
,
0x6e
,
0xaf
,
0xb2
,
0xae
,
0x88
,
0x9b
,
0xaa
,
0xaa
,
0x9c
,
0x76
,
0x4c
,
0x27
,
0xd1
,
0x25
,
0x2d
,
0xac
,
0xdb
,
0xab
,
0xac
,
0xab
,
0x6a
,
0xa3
,
0xcf
,
0xa0
,
0x33
,
0x89
,
0x5c
,
0xff
,
0xd5
,
0xe2
,
0x2c
,
0xba
,
0xa2
,
0xb1
,
0xb9
,
0xbe
,
0xda
,
0xe8
,
0x0b
,
0xe8
,
0x4c
,
0x22
,
0xd7
,
0x7f
,
0xb9
,
0x38
,
0x8b
,
0xae
,
0x68
,
0x6c
,
0xae
,
0xaf
,
0xca
,
0x58
,
0xd5
,
0x44
,
0x36
,
0xf4
,
0x13
,
0xca
,
0x86
,
0x51
,
0x98
,
0xd0
,
0x30
,
0x99
,
0x25
,
0xb6
,
0x32
,
0x56
,
0x35
,
0x91
,
0x0d
,
0xfd
,
0x84
,
0xb2
,
0x61
,
0x14
,
0x26
,
0x34
,
0x4c
,
0x66
,
0x89
,
0xed
,
0x17
,
0xd3
,
0xc4
,
0x8b
,
0x02
,
0xd7
,
0xbc
,
0x25
,
0x5c
,
0xec
,
0x16
,
0x2e
,
0x96
,
0x75
,
0x4e
,
0xd7
,
0xc5
,
0x34
,
0xf1
,
0xa2
,
0xc0
,
0x35
,
0x6f
,
0x08
,
0x17
,
0xbb
,
0x85
,
0x8b
,
0x65
,
0x9d
,
0xd3
,
0x35
,
0x70
,
0xbd
,
0x31
,
0x3a
,
0x84
,
0x5b
,
0x62
,
0x5e
,
0x5e
,
0xd1
,
0xd8
,
0x34
,
0x84
,
0xa3
,
0xbe
,
0x74
,
0x5c
,
0x6f
,
0x8c
,
0x0e
,
0xe1
,
0x86
,
0x98
,
0x97
,
0x97
,
0x34
,
0x36
,
0x0d
,
0xe1
,
0xa8
,
0x2f
,
0x1d
,
0x74
,
0x94
,
0x24
,
0x94
,
0x25
,
0xb6
,
0x14
,
0x9e
,
0xae
,
0xe1
,
0x5c
,
0x11
,
0x6d
,
0x40
,
0x83
,
0x2d
,
0x1d
,
0x25
,
0x09
,
0x65
,
0x89
,
0x2d
,
0x85
,
0xa7
,
0x6b
,
0x38
,
0x57
,
0x44
,
0x9b
,
0xd0
,
0x60
,
0x0b
,
0x4c
,
0x18
,
0x68
,
0x7b
,
0x2d
,
0xdc
,
0x60
,
0x8b
,
0xe3
,
0x75
,
0x68
,
0x5d
,
0x92
,
0x60
,
0x46
,
0xad
,
0x13
,
0x06
,
0xda
,
0x5e
,
0x0b
,
0x37
,
0xd8
,
0xe2
,
0x78
,
0x1d
,
0x5a
,
0x97
,
0x24
,
0x98
,
0x51
,
0xeb
,
0x2f
,
0xa1
,
0x5f
,
0x1b
,
0x1f
,
0xed
,
0x03
,
0x72
,
0x96
,
0x99
,
0xf3
,
0x21
,
0xd3
,
0x71
,
0x8d
,
0xc4
,
0x6b
,
0xe8
,
0xd7
,
0xc6
,
0x47
,
0xfb
,
0x80
,
0x9c
,
0x65
,
0xe6
,
0x7c
,
0xc8
,
0x74
,
0x5c
,
0x23
,
0xb1
,
0x7a
,
0x0c
,
0x5d
,
0xb5
,
0x16
,
0xc8
,
0x84
,
0x75
,
0xe2
,
0xba
,
0x31
,
0x4d
,
0x12
,
0x61
,
0x64
,
0xe0
,
0x1e
,
0x42
,
0x57
,
0xad
,
0x05
,
0x32
,
0x61
,
0x9d
,
0xb8
,
0x6e
,
0x4c
,
0x93
,
0x44
,
0x18
,
0x19
,
0x38
,
0xec
,
0x88
,
0xb6
,
0xa0
,
0x35
,
0x15
,
0x95
,
0x6c
,
0x08
,
0x67
,
0xe9
,
0xc1
,
0x7a
,
0xad
,
0x43
,
0x47
,
0x3b
,
0xa2
,
0xdb
,
0xd0
,
0x9a
,
0x8a
,
0x4a
,
0x36
,
0x84
,
0xb3
,
0xf4
,
0x60
,
0xbd
,
0xd2
,
0xa1
,
0xa3
,
0x19
,
0x3e
,
0xb4
,
0x07
,
0x9b
,
0x23
,
0x39
,
0xef
,
0x02
,
0x7a
,
0x76
,
0x22
,
0x83
,
0x57
,
0x61
,
0xf4
,
0x0c
,
0x1f
,
0xda
,
0x83
,
0xad
,
0x91
,
0x9c
,
0x77
,
0x01
,
0x3d
,
0x39
,
0x91
,
0xc1
,
0xab
,
0x30
,
0xba
,
0x10
,
0xfa
,
0xc7
,
0xb1
,
0xef
,
0x5e
,
0xd0
,
0x61
,
0x14
,
0xb2
,
0x98
,
0x38
,
0xec
,
0x48
,
0xc6
,
0x6d
,
0x0f
,
0xfd
,
0xe3
,
0xd8
,
0x77
,
0x2f
,
0xe8
,
0x30
,
0x0a
,
0x59
,
0x4c
,
0x1c
,
0x76
,
0x24
,
0xe3
,
0x36
,
0x88
,
0xb8
,
0xf5
,
0x42
,
0xce
,
0xe2
,
0xab
,
0x28
,
0x74
,
0xa8
,
0x98
,
0x61
,
0x1d
,
0xa7
,
0x07
,
0x1e
,
0x44
,
0xdc
,
0x7a
,
0x21
,
0x67
,
0xf1
,
0x6d
,
0x14
,
0x3a
,
0x54
,
0xcc
,
0xb0
,
0x8e
,
0xd3
,
0x03
,
0x8f
,
0x35
,
0x88
,
0x1c
,
0x12
,
0x0c
,
0x23
,
0x3f
,
0x1c
,
0x2f
,
0x26
,
0xe7
,
0x51
,
0x20
,
0xa6
,
0xd4
,
0xc0
,
0x1a
,
0x44
,
0x0e
,
0x09
,
0x86
,
0x91
,
0x1f
,
0x8e
,
0x17
,
0x93
,
0xf3
,
0x28
,
0x10
,
0x53
,
0x6a
,
0xe0
,
0x55
,
0x18
,
0xbd
,
0x03
,
0xb7
,
0x73
,
0x68
,
0x34
,
0xa7
,
0x8e
,
0x18
,
0x49
,
0x03
,
0x97
,
0x41
,
0x74
,
0x2a
,
0x8c
,
0xde
,
0x83
,
0x8d
,
0x1c
,
0x1a
,
0xcd
,
0xa9
,
0x23
,
0x46
,
0xd2
,
0xc0
,
0x65
,
0x10
,
0x1d
,
0x00
,
0x5b
,
0x76
,
0xf4
,
0x23
,
0x0d
,
0xab
,
0xd4
,
0xda
,
0x42
,
0xb9
,
0x56
,
0x86
,
0xde
,
0x83
,
0x8d
,
0xc0
,
0x6d
,
0x3b
,
0xfa
,
0x89
,
0x86
,
0x55
,
0x6a
,
0x6d
,
0xa1
,
0x5c
,
0x2b
,
0x43
,
0x1f
,
0xc0
,
0x66
,
0x2c
,
0xc5
,
0x31
,
0x0d
,
0x5d
,
0x39
,
0x72
,
0x06
,
0xae
,
0xa0
,
0x9c
,
0xab
,
0x2c
,
0x16
,
0xa6
,
0x0e
,
0x96
,
0xe2
,
0x98
,
0x86
,
0xae
,
0x1c
,
0x39
,
0x03
,
0x57
,
0x50
,
0xce
,
0x55
,
0x16
,
0x0b
,
0x53
,
0x87
,
0xf5
,
0x2f
,
0x69
,
0x2c
,
0x06
,
0xcb
,
0xc0
,
0x55
,
0x18
,
0x3d
,
0x80
,
0x5e
,
0xde
,
0x98
,
0x8c
,
0x81
,
0xfa
,
0x97
,
0x34
,
0x16
,
0x83
,
0x65
,
0xe0
,
0x2a
,
0x8c
,
0xee
,
0x41
,
0x2f
,
0x6f
,
0x4c
,
0xc6
,
0xc0
,
0x21
,
0x54
,
0x97
,
0x70
,
0xb4
,
0x0d
,
0xed
,
0xa3
,
0x09
,
0x5f
,
0x3d
,
0x62
,
0x5a
,
0x0c
,
0x2c
,
0x4f
,
0x10
,
0xaa
,
0x4b
,
0x38
,
0xda
,
0x86
,
0xf6
,
0xd1
,
0x84
,
0xaf
,
0x1e
,
0x31
,
0x2d
,
0x06
,
0x96
,
0x27
,
0x68
,
0x17
,
0x8c
,
0x61
,
0x40
,
0xfc
,
0x89
,
0xbd
,
0x98
,
0x52
,
0xb3
,
0x23
,
0x6a
,
0x56
,
0x00
,
0x68
,
0xb4
,
0x0b
,
0xc6
,
0x30
,
0x20
,
0xfe
,
0xc4
,
0x5e
,
0x4c
,
0xa9
,
0xd9
,
0x11
,
0x35
,
0x2b
,
0x00
,
0xb4
,
0x07
,
0x6e
,
0x9d
,
0x50
,
0xc7
,
0x9f
,
0x90
,
0x20
,
0x31
,
0xbb
,
0x42
,
0x98
,
0x9f
,
0xad
,
0x5f
,
0x34
,
0x03
,
0x37
,
0x4e
,
0xa8
,
0xe3
,
0x4f
,
0x48
,
0x90
,
0x98
,
0x5d
,
0x21
,
0xcc
,
0xcf
,
0xd6
,
0xaf
,
0x1a
,
0x40
,
0x2f
,
0x62
,
0xe2
,
0x04
,
0x54
,
0xe8
,
0xf3
,
0x74
,
0x69
,
0xc8
,
0xea
,
0xe8
,
0x6b
,
0xf5
,
0xf4
,
0xa0
,
0x67
,
0x31
,
0x71
,
0x02
,
0x2a
,
0xf4
,
0x79
,
0xba
,
0x34
,
0x64
,
0x75
,
0xf4
,
0xb5
,
0x7a
,
0xfa
,
0x0b
,
0x4a
,
0x8d
,
0xeb
,
0x29
,
0xe9
,
0xab
,
0x28
,
0x35
,
0x2b
,
0x94
,
0x7e
,
0x6e
,
0x40
,
0x57
,
0xdd
,
0x05
,
0xa5
,
0xc6
,
0xf5
,
0x94
,
0xf4
,
0x55
,
0x94
,
0x9a
,
0x15
,
0x4a
,
0xbf
,
0x34
,
0xa0
,
0xab
,
0xee
,
0x37
,
0xbc
,
0x9b
,
0xa5
,
0x5e
,
0x48
,
0x2a
,
0x65
,
0x90
,
0x6b
,
0x49
,
0x2b
,
0xd9
,
0x98
,
0x94
,
0x4f
,
0x1b
,
0xde
,
0xcd
,
0x52
,
0x2f
,
0x24
,
0x95
,
0x32
,
0xc8
,
0xb5
,
0xa4
,
0x95
,
0x6c
,
0x4c
,
0xca
,
0xa7
,
0x19
,
0xe4
,
0xd5
,
0xce
,
0x3a
,
0x95
,
0x67
,
0xa6
,
0xa7
,
0xd5
,
0xae
,
0xe2
,
0x4a
,
0x6a
,
0xcd
,
0x52
,
0x0c
,
0xf2
,
0x6a
,
0x67
,
0x9d
,
0xca
,
0x33
,
0xd3
,
0xd3
,
0x6a
,
0x57
,
0x71
,
0x25
,
0xb5
,
0x66
,
0x29
,
0x6a
,
0x35
,
0x73
,
0xd8
,
0xba
,
0xe1
,
0x1c
,
0xb6
,
0xeb
,
0xe6
,
0x50
,
0x2d
,
0xc6
,
0x7a
,
0xa5
,
0x18
,
0xb5
,
0x9a
,
0x39
,
0x6c
,
0xbd
,
0xe1
,
0x1c
,
0xb6
,
0xeb
,
0xe6
,
0x50
,
0x2d
,
0xc6
,
0x7a
,
0xa5
,
0x18
,
0xbf
,
0x35
,
0x01
,
0x09
,
0x42
,
0x53
,
0xf6
,
0xdf
,
0x05
,
0xfc
,
0xb7
,
0x5e
,
0x40
,
0x13
,
0xd6
,
0xe7
,
0xbf
,
0x37
,
0x01
,
0x09
,
0x42
,
0x53
,
0xf6
,
0xff
,
0x07
,
0xf8
,
0x5f
,
0xfd
,
0x00
,
0x4d
,
0x58
,
0x9f
,
0xf6
,
0xfc
,
0x94
,
0x24
,
0x9e
,
0xb8
,
0x7f
,
0x5d
,
0x9c
,
0x1d
,
0x85
,
0xe4
,
0x94
,
0xfa
,
0x17
,
0x1e
,
0xdb
,
0xf3
,
0x53
,
0x92
,
0x78
,
0xe2
,
0xfb
,
0xeb
,
0xe2
,
0xec
,
0x28
,
0x24
,
0xa7
,
0xd4
,
0xbf
,
0xf0
,
0x33
,
0x6f
,
0x0f
,
0xb4
,
0xbd
,
0x26
,
0xce
,
0x8e
,
0xe8
,
0x1e
,
0xc0
,
0x59
,
0x1c
,
0x4d
,
0x3d
,
0xea
,
0x98
,
0xb9
,
0x31
,
0xd0
,
0xf6
,
0x9a
,
0x38
,
0x3b
,
0xa2
,
0x3b
,
0x00
,
0x67
,
0x71
,
0x34
,
0xf5
,
0xa8
,
0x2c
,
0x9e
,
0x9d
,
0x98
,
0x1b
,
0x22
,
0x9a
,
0x82
,
0x94
,
0x86
,
0x66
,
0xb3
,
0x32
,
0x34
,
0x7f
,
0x6a
,
0xb3
,
0x78
,
0x72
,
0x62
,
0x6e
,
0x8a
,
0x68
,
0x0a
,
0x52
,
0x1a
,
0x9a
,
0xad
,
0xca
,
0xd0
,
0xfc
,
0xa5
,
0x70
,
0x57
,
0x0e
,
0xcd
,
0x3f
,
0xfa
,
0x22
,
0xed
,
0x82
,
0x31
,
0x62
,
0x5e
,
0xe9
,
0x0a
,
0x15
,
0x40
,
0xc1
,
0x2d
,
0x39
,
0x34
,
0xff
,
0xea
,
0x0f
,
0x69
,
0x17
,
0x8c
,
0x11
,
0xf3
,
0x4a
,
0x9f
,
0x50
,
0x01
,
0x29
,
0xc3
,
0x76
,
0x25
,
0xc3
,
0x4b
,
0xe8
,
0xc9
,
0x04
,
0xdf
,
0xfa
,
0xa3
,
0xa6
,
0x76
,
0x45
,
0xbf
,
0x94
,
0x32
,
0x6c
,
0x57
,
0x32
,
0xbc
,
0x84
,
0x9e
,
0x4c
,
0xf0
,
0xad
,
0x2f
,
0x35
,
0xb5
,
0x2b
,
0xfa
,
0xb6
,
0x2b
,
0xcd
,
0x52
,
0x57
,
0xac
,
0x3f
,
0x34
,
0xd8
,
0x95
,
0x81
,
0xc7
,
0xb5
,
0x0f
,
0x80
,
0x87
,
0xb5
,
0x5d
,
0x69
,
0x96
,
0xba
,
0x62
,
0xfd
,
0xa9
,
0xc1
,
0xae
,
0x0c
,
0x3c
,
0xae
,
0x7d
,
0x00
,
0xdc
,
0xd0
,
0x9f
,
0xc6
,
0x74
,
0x78
,
0xdd
,
0xc7
,
0xb9
,
0x5e
,
0xc8
,
0xad
,
0xc2
,
0xe8
,
0xaa
,
0xc6
,
0x2a
,
0x87
,
0xfe
,
0x34
,
0xa6
,
0xc3
,
0xeb
,
0x2e
,
0xe7
,
0x7a
,
0x21
,
0xb7
,
0x0a
,
0xa3
,
0xab
,
0x1a
,
0xab
,
0x25
,
0x5c
,
0x2f
,
0x7c
,
0xab
,
0x04
,
0xf6
,
0x60
,
0xfb
,
0xeb
,
0x19
,
0x8d
,
0x17
,
0x23
,
0xe6
,
0x65
,
0x94
,
0x70
,
0xbd
,
0xf0
,
0xad
,
0x12
,
0xd8
,
0x83
,
0xed
,
0xef
,
0x66
,
0x34
,
0x5e
,
0x8c
,
0x98
,
0x97
,
0xc3
,
0x74
,
0x46
,
0x62
,
0x32
,
0x49
,
0xf8
,
0x2b
,
0x44
,
0x6e
,
0x11
,
0x03
,
0x37
,
0x9e
,
0x9d
,
0x58
,
0x0d
,
0xd3
,
0x19
,
0x89
,
0xc9
,
0x24
,
0xe1
,
0xaf
,
0x10
,
0xb9
,
0x45
,
0x0c
,
0xdc
,
0x78
,
0x72
,
0x62
,
0xaf
,
0x35
,
0x75
,
0xf3
,
0x64
,
0xca
,
0x55
,
0x35
,
0xf4
,
0x11
,
0xb4
,
0xc7
,
0x8c
,
0xb0
,
0x59
,
0x22
,
0xbd
,
0xd2
,
0xd4
,
0xcd
,
0x93
,
0x29
,
0x57
,
0xd5
,
0xd0
,
0x27
,
0xd0
,
0x1e
,
0x33
,
0xc2
,
0x66
,
0x89
,
0xdf
,
0xaa
,
0xd9
,
0x7b
,
0x27
,
0x33
,
0x48
,
0x85
,
0x58
,
0x2a
,
0xa1
,
0x27
,
0xb0
,
0x29
,
0xee
,
0x45
,
0x7c
,
0xab
,
0x66
,
0xef
,
0x9d
,
0xcc
,
0x20
,
0x15
,
0x62
,
0xa9
,
0x84
,
0x1e
,
0xc1
,
0x96
,
0xf8
,
0x2e
,
0xde
,
0xb6
,
0xc4
,
0xd4
,
0x07
,
0xfa
,
0x5e
,
0xe7
,
0x60
,
0x3b
,
0x7b
,
0x69
,
0x96
,
0xa5
,
0xb8
,
0xaa
,
0xf2
,
0xb6
,
0x25
,
0xa6
,
0x3e
,
0xd0
,
0xf7
,
0x3a
,
0x07
,
0xdb
,
0xd9
,
0x4b
,
0xb3
,
0x2c
,
0xc5
,
0x55
,
0xce
,
0x3d
,
0xe4
,
0x27
,
0x21
,
0xe3
,
0x5f
,
0x10
,
0xd5
,
0x43
,
0x45
,
0x8a
,
0xab
,
0xea
,
0xd6
,
0x0f
,
0x75
,
0xee
,
0x21
,
0x3f
,
0x09
,
0x19
,
0xbf
,
0x41
,
0x54
,
0x0f
,
0x15
,
0x29
,
0xae
,
0xaa
,
0x5b
,
0x3f
,
0x4b
,
0x1c
,
0xf8
,
0x84
,
0x38
,
0x1c
,
0x92
,
0x89
,
0xa5
,
0x07
,
0xf4
,
0x31
,
0xc0
,
0x65
,
0xc1
,
0x33
,
0x2e
,
0x71
,
0xe0
,
0x13
,
0xe2
,
0x70
,
0x48
,
0x26
,
0x96
,
0x1e
,
0xd0
,
0xa7
,
0x00
,
0x97
,
0x05
,
0xcf
,
0xcd
,
0xaf
,
0x27
,
0xa3
,
0x8c
,
0x59
,
0xec
,
0x87
,
0x17
,
0xcf
,
0xc9
,
0x14
,
0x2b
,
0x3a
,
0xd6
,
0x68
,
0x34
,
0xbf
,
0x9e
,
0x8c
,
0x32
,
0x66
,
0xb1
,
0x1f
,
0x5e
,
0x3c
,
0x25
,
0x53
,
0xac
,
0xe8
,
0x58
,
0xa3
,
0x89
,
0x1c
,
0x1f
,
0xf2
,
0x5c
,
0x41
,
0xba
,
0x2f
,
0x80
,
0x22
,
0x70
,
0x43
,
0x09
,
0x6c
,
0x7d
,
0x00
,
0x25
,
0x72
,
0x7c
,
0xc8
,
0x73
,
0x05
,
0xe9
,
0xbe
,
0x00
,
0x8a
,
0xc0
,
0x0d
,
0x25
,
0xb0
,
0xf5
,
0x11
,
0x46
,
0xee
,
0x9f
,
0x6f
,
0x02
,
0x85
,
0x85
,
0x36
,
0xd0
,
0xf9
,
0x26
,
0x50
,
0x62
,
0xbe
,
0x84
,
0x8d
,
0x18
,
0xb9
,
0x7f
,
0xbe
,
0x09
,
0x14
,
0x16
,
0xda
,
0x40
,
0xe7
,
0x9b
,
0x40
,
0x89
,
0x79
,
0x02
,
0x1b
,
0x72
,
0xb1
,
0xd1
,
0x03
,
0x68
,
0xda
,
0x74
,
0x9e
,
0x5e
,
0xef
,
0x8d
,
0xbc
,
0x2e
,
0x23
,
0xe6
,
0xa5
,
0x79
,
0xcc
,
0x6f
,
0xfc
,
0x84
,
0xa1
,
0xc3
,
0x25
,
0x83
,
0xfa
,
0x27
,
0x71
,
0xc9
,
0xcb
,
0x0b
,
0xd8
,
0xcb
,
0x5e
,
0xb6
,
0x44
,
0xe8
,
0x70
,
0xef
,
0x4f
,
0xfd
,
0x90
,
0x04
,
0x43
,
0x85
,
0x85
,
0x82
,
0x58
,
0x2c
,
0xb7
,
0x0c
,
0xdd
,
0x83
,
0xa6
,
0x4d
,
0xe7
,
0xe9
,
0x92
,
0xd8
,
0xcc
,
0xab
,
0x3b
,
0x62
,
0x5e
,
0x9f
,
0x40
,
0x5f
,
0x0c
,
0x4c
,
0x51
,
0x2c
,
0x39
,
0x2f
,
0x2b
,
0xf3
,
0xb2
,
0x02
,
0xe8
,
0xcb
,
0xe1
,
0x7a
,
0x65
,
0xc8
,
0xc6
,
0x0a
,
0x1d
,
0xce
,
0xf1
,
0xb1
,
0x1f
,
0x92
,
0x60
,
0xa8
,
0xe4
,
0xa2
,
0x20
,
0x29
,
0x5b
,
0xa3
,
0xc3
,
0xa5
,
0x6c
,
0xea
,
0xdf
,
0xeb
,
0x6a
,
0x8a
,
0x9c
,
0x24
,
0x8b
,
0x18
,
0x09
,
0xd6
,
0x67
,
0xd0
,
0x17
,
0x63
,
0x57
,
0x94
,
0x5c
,
0x4e
,
0xdd
,
0xca
,
0xea
,
0x58
,
0x01
,
0xf4
,
0xe5
,
0xce
,
0x94
,
0x5b
,
0xac
,
0x20
,
0xd6
,
0xff
,
0x24
,
0x49
,
0x3b
,
0x87
,
0x52
,
0x92
,
0xd6
,
0xe7
,
0xb0
,
0x08
,
0x96
,
0xad
,
0xdf
,
0x2a
,
0x45
,
0x4e
,
0x92
,
0x45
,
0x8c
,
0x04
,
0x67
,
0xca
,
0x2e
,
0x50
,
0x10
,
0xad
,
0xd2
,
0x28
,
0xe4
,
0x15
,
0x97
,
0xda
,
0x92
,
0xcb
,
0xfb
,
0xf0
,
0x7f
,
0x61
,
0xb2
,
0x7c
,
0xef
,
0xeb
,
0x1d
,
0x49
,
0xd2
,
0xce
,
0xa1
,
0x94
,
0xa4
,
0xf5
,
0x25
,
0x6c
,
0xab
,
0x34
,
0x0a
,
0x79
,
0xc5
,
0xa4
,
0xeb
,
0x33
,
0xb8
,
0xa7
,
0xba
,
0xfe
,
0x1b
,
0x5e
,
0xe9
,
0xbf
,
0x6a
,
0x70
,
0x5f
,
0xf8
,
0x4a
,
0xa5
,
0xb6
,
0xe4
,
0xf2
,
0x2e
,
0xbc
,
0x2b
,
0x4c
,
0x96
,
0xbf
,
0x5e
,
0xe9
,
0xfa
,
0x0c
,
0xee
,
0xa8
,
0x17
,
0x60
,
0xfa
,
0x8b
,
0xe1
,
0x78
,
0x61
,
0xcf
,
0xf9
,
0x47
,
0x44
,
0x56
,
0x7d
,
0x00
,
0x1d
,
0xc6
,
0xae
,
0xff
,
0x81
,
0xb7
,
0xfe
,
0x6f
,
0x1a
,
0xdc
,
0x15
,
0xbe
,
0xd2
,
0x35
,
0x9a
,
0xfe
,
0xee
,
0x38
,
0xb7
,
0xb5
,
0x5c
,
0x9a
,
0x69
,
0xdd
,
0x55
,
0x88
,
0xf7
,
0xc5
,
0xf5
,
0x63
,
0x2a
,
0x7e
,
0x86
,
0xca
,
0x5e
,
0xd8
,
0x73
,
0x7e
,
0x15
,
0xc9
,
0xaa
,
0x0f
,
0xa0
,
0xc3
,
0xf8
,
0xce
,
0x97
,
0xab
,
0x37
,
0xad
,
0x52
,
0x15
,
0x00
,
0x5f
,
0xc5
,
0x6c
,
0x9e
,
0xbf
,
0xc9
,
0x0c
,
0x2c
,
0x4f
,
0xdc
,
0x4a
,
0x38
,
0xe1
,
0xbb
,
0x0a
,
0xf1
,
0xbe
,
0xb8
,
0x7e
,
0x4c
,
0xc5
,
0x8f
,
0x59
,
0x59
,
0xaa
,
0x02
,
0xe0
,
0x0b
,
0x9d
,
0x1f
,
0x3a
,
0xb9
,
0xa5
,
0x0b
,
0x80
,
0xef
,
0x13
,
0x37
,
0x5d
,
0xbd
,
0x62
,
0x4d
,
0xeb
,
0x38
,
0x3b
,
0xcd
,
0xf3
,
0x97
,
0x9d
,
0x81
,
0xe5
,
0x89
,
0x5b
,
0x09
,
0x27
,
0xfc
,
0xba
,
0x94
,
0xbb
,
0xbe
,
0x00
,
0x5a
,
0xdf
,
0x80
,
0xa9
,
0x56
,
0x41
,
0x65
,
0x8e
,
0x1e
,
0x81
,
0x1e
,
0xd3
,
0xac
,
0xc7
,
0xef
,
0xcb
,
0xf8
,
0x56
,
0x72
,
0xd3
,
0x05
,
0x2e
,
0x96
,
0xbd
,
0x8e
,
0xb3
,
0xa3
,
0xf5
,
0x1c
,
0x4c
,
0xb5
,
0x0a
,
0x1e
,
0x5f
,
0xa7
,
0x9d
,
0xe5
,
0x89
,
0xb9
,
0x8d
,
0xf5
,
0xbb
,
0x06
,
0x83
,
0x37
,
0x69
,
0xde
,
0xa0
,
0x2a
,
0x73
,
0xf4
,
0x00
,
0xf4
,
0x98
,
0x66
,
0x3d
,
0xfe
,
0x50
,
0xf6
,
0xf8
,
0x3a
,
0xed
,
0x2c
,
0x4f
,
0x16
,
0x42
,
0x83
,
0x91
,
0xa0
,
0xf4
,
0x42
,
0x55
,
0xa1
,
0x55
,
0xf5
,
0x28
,
0xaa
,
0xd8
,
0xac
,
0x56
,
0xcc
,
0x6d
,
0xac
,
0x3f
,
0x34
,
0x18
,
0xbc
,
0x4e
,
0xf3
,
0x0d
,
0x6a
,
0x21
,
0x34
,
0x18
,
0x09
,
0x4a
,
0xb1
,
0x54
,
0xad
,
0x56
,
0xa5
,
0x5a
,
0x56
,
0x04
,
0x77
,
0x05
,
0x69
,
0x4c
,
0x03
,
0xb2
,
0xa0
,
0xf1
,
0xef
,
0x5c
,
0x15
,
0x5a
,
0x55
,
0x8f
,
0xa2
,
0x8a
,
0xcd
,
0x6a
,
0x15
,
0x4b
,
0xd5
,
0x6a
,
0x55
,
0xaa
,
0x31
,
0x09
,
0x08
,
0x7f
,
0x3d
,
0xbd
,
0x99
,
0xae
,
0xf2
,
0x05
,
0x6b
,
0x94
,
0xbf
,
0x60
,
0xa5
,
0x80
,
0x65
,
0x45
,
0x70
,
0x4b
,
0x90
,
0xc6
,
0x34
,
0x20
,
0x0b
,
0x1a
,
0x1f
,
0x93
,
0x80
,
0xf0
,
0x37
,
0xd8
,
0x7a
,
0x35
,
0xe0
,
0x4b
,
0xd8
,
0x51
,
0x8b
,
0x55
,
0x89
,
0xfb
,
0x58
,
0x6d
,
0xc3
,
0x87
,
0x35
,
0x6d
,
0xeb
,
0xe9
,
0x2a
,
0xf7
,
0x60
,
0xa3
,
0x7c
,
0x0f
,
0x96
,
0x02
,
0xea
,
0xd5
,
0x80
,
0x2f
,
0x60
,
0x47
,
0x28
,
0xeb
,
0x3f
,
0x8d
,
0xe2
,
0x17
,
0x21
,
0x15
,
0x4f
,
0x82
,
0xb4
,
0x17
,
0x3f
,
0x69
,
0xf0
,
0xee
,
0x2d
,
0x56
,
0x25
,
0xee
,
0x43
,
0xb5
,
0x0d
,
0x1f
,
0xd7
,
0xb4
,
0xa1
,
0xac
,
0xff
,
0x38
,
0x8a
,
0x9f
,
0x8d
,
0xd4
,
0x39
,
0xff
,
0xf3
,
0x14
,
0xcd
,
0xbe
,
0xc0
,
0xe7
,
0xf5
,
0xb9
,
0x37
,
0x6a
,
0xc7
,
0x76
,
0x85
,
0x54
,
0x3c
,
0x2c
,
0xd2
,
0x5e
,
0xfc
,
0xac
,
0xc1
,
0xfb
,
0x6f
,
0xa4
,
0xce
,
0xf9
,
0x9f
,
0xa7
,
0x45
,
0x86
,
0x4f
,
0xf2
,
0x0c
,
0x45
,
0x24
,
0x3b
,
0xb2
,
0x33
,
0x11
,
0xaf
,
0x8e
,
0x05
,
0x5d
,
0xa6
,
0x68
,
0x76
,
0x8f
,
0x9f
,
0xd7
,
0xe7
,
0xde
,
0xa8
,
0x1d
,
0xdb
,
0x15
,
0x19
,
0x3e
,
0xca
,
0x33
,
0x14
,
0x9c
,
0xe5
,
0x8e
,
0x2c
,
0x61
,
0x0f
,
0x22
,
0xf1
,
0x62
,
0x56
,
0x17
,
0x20
,
0xea
,
0xc3
,
0x9d
,
0x33
,
0x91
,
0xec
,
0xc8
,
0xce
,
0x44
,
0xbc
,
0x3a
,
0x16
,
0x74
,
0x99
,
0x72
,
0x96
,
0x9b
,
0xb6
,
0x84
,
0xdd
,
0x1a
,
0xba
,
0x7e
,
0x78
,
0x91
,
0x02
,
0x7c
,
0x1f
,
0xf6
,
0xd6
,
0x38
,
0x3c
,
0x9e
,
0x39
,
0x0e
,
0x4d
,
0x7b
,
0x2e
,
0xde
,
0xdd
,
0xea
,
0x02
,
0x44
,
0x7d
,
0xb8
,
0x79
,
0x46
,
0x43
,
0xd7
,
0x0f
,
0x2f
,
0x52
,
0x12
,
0x05
,
0xd6
,
0xd0
,
0x16
,
0xf4
,
0x9e
,
0x12
,
0x3f
,
0xa0
,
0xae
,
0x82
,
0x36
,
0x90
,
0x09
,
0x5b
,
0x80
,
0xef
,
0xc3
,
0xde
,
0x1a
,
0x87
,
0xc7
,
0x33
,
0xc7
,
0xa1
,
0x49
,
0xa2
,
0xc0
,
0x1a
,
0xba
,
0x0d
,
0xdf
,
0xc9
,
0x7f
,
0x52
,
0x4a
,
0x12
,
0xfd
,
0xa0
,
0x0b
,
0x50
,
0xfc
,
0xa7
,
0x74
,
0xde
,
0x16
,
0xff
,
0xbd
,
0xc7
,
0xc4
,
0x0f
,
0xa8
,
0xab
,
0xa0
,
0x8d
,
0x83
,
0x2e
,
0x40
,
0xf1
,
0xff
,
0xd3
,
0x79
,
0x5b
,
0x15
,
0x1d
,
0xfe
,
0x15
,
0x00
,
0x00
,
0xff
,
0xff
,
0xb7
,
0x6a
,
0xa5
,
0xfa
,
0x68
,
0x12
,
0x00
,
0x00
,
0xfc
,
0xaf
,
0x74
,
0xf8
,
0x77
,
0x00
,
0x00
,
0x00
,
0xff
,
0xff
,
0x1f
,
0xcd
,
0x0e
,
0x4f
,
0x94
,
0x12
,
0x00
,
0x00
,
}
}
// Reference imports to suppress errors if they are not otherwise used.
// Reference imports to suppress errors if they are not otherwise used.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment