-
Notifications
You must be signed in to change notification settings - Fork 117
/
claim.go
128 lines (115 loc) · 4.51 KB
/
claim.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package types
import (
"encoding/json"
"fmt"
oracletypes "github.com/Sifchain/sifnode/x/oracle/types"
"strconv"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)
// NewEthBridgeClaim is a constructor function for NewEthBridgeClaim
func NewEthBridgeClaim(
ethereumChainID int64,
bridgeContract EthereumAddress,
nonce int64,
symbol string,
tokenContact EthereumAddress,
ethereumSender EthereumAddress,
cosmosReceiver sdk.AccAddress,
validator sdk.ValAddress,
amount sdk.Int,
claimType ClaimType,
) *EthBridgeClaim {
return &EthBridgeClaim{
EthereumChainId: ethereumChainID,
BridgeContractAddress: bridgeContract.String(),
Nonce: nonce,
Symbol: symbol,
TokenContractAddress: tokenContact.String(),
EthereumSender: ethereumSender.String(),
CosmosReceiver: cosmosReceiver.String(),
ValidatorAddress: validator.String(),
Amount: amount,
ClaimType: claimType,
}
}
// OracleClaimContent is the details of how the content of the claim for each validator will be stored in the oracle
type OracleClaimContent struct {
CosmosReceiver sdk.AccAddress `json:"cosmos_receiver" yaml:"cosmos_receiver"`
Amount sdk.Int `json:"amount" yaml:"amount"`
Symbol string `json:"symbol" yaml:"symbol"`
TokenContractAddress EthereumAddress `json:"token_contract_address" yaml:"token_contract_address"`
ClaimType ClaimType `json:"claim_type" yaml:"claim_type"`
}
// NewOracleClaimContent is a constructor function for OracleClaim
func NewOracleClaimContent(
cosmosReceiver sdk.AccAddress, amount sdk.Int, symbol string, tokenContractAddress EthereumAddress, claimType ClaimType,
) OracleClaimContent {
return OracleClaimContent{
CosmosReceiver: cosmosReceiver,
Amount: amount,
Symbol: symbol,
TokenContractAddress: tokenContractAddress,
ClaimType: claimType,
}
}
// CreateOracleClaimFromEthClaim converts a specific ethereum bridge claim to a general oracle claim to be used by
// the oracle module. The oracle module expects every claim for a particular prophecy to have the same id, so this id
// must be created in a deterministic way that all validators can follow.
// For this, we use the Nonce an Ethereum Sender provided,
// as all validators will see this same data from the smart contract.
func CreateOracleClaimFromEthClaim(ethClaim *EthBridgeClaim) (oracletypes.Claim, error) {
oracleID := strconv.FormatInt(ethClaim.EthereumChainId, 10) + strconv.FormatInt(ethClaim.Nonce, 10) +
ethClaim.EthereumSender
cosmosReceiver, err := sdk.AccAddressFromBech32(ethClaim.CosmosReceiver)
if err != nil {
return oracletypes.Claim{}, err
}
claimContent := NewOracleClaimContent(cosmosReceiver, ethClaim.Amount,
ethClaim.Symbol, NewEthereumAddress(ethClaim.TokenContractAddress), ethClaim.ClaimType)
claimBytes, err := json.Marshal(claimContent)
if err != nil {
return oracletypes.Claim{}, err
}
claimString := string(claimBytes)
claim := oracletypes.NewClaim(oracleID, ethClaim.ValidatorAddress, claimString)
return claim, nil
}
// CreateEthClaimFromOracleString converts a string
// from any generic claim from the oracle module into an ethereum bridge specific claim.
func CreateEthClaimFromOracleString(
ethereumChainID int64,
bridgeContract EthereumAddress,
nonce int64,
ethereumAddress EthereumAddress,
validator sdk.ValAddress,
oracleClaimString string,
) (*EthBridgeClaim, error) {
oracleClaim, err := CreateOracleClaimFromOracleString(oracleClaimString)
if err != nil {
return nil, err
}
return NewEthBridgeClaim(
ethereumChainID,
bridgeContract,
nonce,
oracleClaim.Symbol,
oracleClaim.TokenContractAddress,
ethereumAddress,
oracleClaim.CosmosReceiver,
validator,
oracleClaim.Amount,
oracleClaim.ClaimType,
), nil
}
// CreateOracleClaimFromOracleString converts a JSON string into an OracleClaimContent struct used by this module.
// In general, it is expected that the oracle module will store claims in this JSON format
// and so this should be used to convert oracle claims.
func CreateOracleClaimFromOracleString(oracleClaimString string) (OracleClaimContent, error) {
var oracleClaimContent OracleClaimContent
bz := []byte(oracleClaimString)
if err := json.Unmarshal(bz, &oracleClaimContent); err != nil {
return OracleClaimContent{}, sdkerrors.Wrap(ErrJSONMarshalling, fmt.Sprintf("failed to parse claim: %s", err.Error()))
}
return oracleClaimContent, nil
}