Add get balance history for ethereum type coins
parent
c913a022ef
commit
6f294a6241
|
@ -818,15 +818,34 @@ func (w *Worker) balanceHistoryHeightsFromTo(fromTime, toTime time.Time) (uint32
|
|||
}
|
||||
|
||||
func (w *Worker) balanceHistoryForTxid(addrDesc bchain.AddressDescriptor, txid string, fromUnix, toUnix uint32) (*BalanceHistory, error) {
|
||||
ta, err := w.db.GetTxAddresses(txid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
var time uint32
|
||||
var err error
|
||||
var ta *db.TxAddresses
|
||||
var bchainTx *bchain.Tx
|
||||
var height uint32
|
||||
if w.chainType == bchain.ChainBitcoinType {
|
||||
ta, err = w.db.GetTxAddresses(txid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if ta == nil {
|
||||
glog.Warning("DB inconsistency: tx ", txid, ": not found in txAddresses")
|
||||
return nil, nil
|
||||
}
|
||||
height = ta.Height
|
||||
} else if w.chainType == bchain.ChainEthereumType {
|
||||
var h int
|
||||
bchainTx, h, err = w.txCache.GetTransaction(txid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if bchainTx == nil {
|
||||
glog.Warning("Inconsistency: tx ", txid, ": not found in the blockchain")
|
||||
return nil, nil
|
||||
}
|
||||
height = uint32(h)
|
||||
}
|
||||
if ta == nil {
|
||||
glog.Warning("DB inconsistency: tx ", txid, ": not found in txAddresses")
|
||||
return nil, nil
|
||||
}
|
||||
time := w.is.GetBlockTime(ta.Height)
|
||||
time = w.is.GetBlockTime(height)
|
||||
if time < fromUnix || time >= toUnix {
|
||||
return nil, nil
|
||||
}
|
||||
|
@ -837,16 +856,58 @@ func (w *Worker) balanceHistoryForTxid(addrDesc bchain.AddressDescriptor, txid s
|
|||
ReceivedSat: &Amount{},
|
||||
Txid: txid,
|
||||
}
|
||||
for i := range ta.Inputs {
|
||||
tai := &ta.Inputs[i]
|
||||
if bytes.Equal(addrDesc, tai.AddrDesc) {
|
||||
(*big.Int)(bh.SentSat).Add((*big.Int)(bh.SentSat), &tai.ValueSat)
|
||||
if w.chainType == bchain.ChainBitcoinType {
|
||||
for i := range ta.Inputs {
|
||||
tai := &ta.Inputs[i]
|
||||
if bytes.Equal(addrDesc, tai.AddrDesc) {
|
||||
(*big.Int)(bh.SentSat).Add((*big.Int)(bh.SentSat), &tai.ValueSat)
|
||||
}
|
||||
}
|
||||
}
|
||||
for i := range ta.Outputs {
|
||||
tao := &ta.Outputs[i]
|
||||
if bytes.Equal(addrDesc, tao.AddrDesc) {
|
||||
(*big.Int)(bh.ReceivedSat).Add((*big.Int)(bh.ReceivedSat), &tao.ValueSat)
|
||||
for i := range ta.Outputs {
|
||||
tao := &ta.Outputs[i]
|
||||
if bytes.Equal(addrDesc, tao.AddrDesc) {
|
||||
(*big.Int)(bh.ReceivedSat).Add((*big.Int)(bh.ReceivedSat), &tao.ValueSat)
|
||||
}
|
||||
}
|
||||
} else if w.chainType == bchain.ChainEthereumType {
|
||||
var value big.Int
|
||||
ethTxData := eth.GetEthereumTxData(bchainTx)
|
||||
// add received amount only for OK transactions
|
||||
if ethTxData.Status == 1 {
|
||||
if len(bchainTx.Vout) > 0 {
|
||||
bchainVout := &bchainTx.Vout[0]
|
||||
value = bchainVout.ValueSat
|
||||
if len(bchainVout.ScriptPubKey.Addresses) > 0 {
|
||||
txAddrDesc, err := w.chainParser.GetAddrDescFromAddress(bchainVout.ScriptPubKey.Addresses[0])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if bytes.Equal(addrDesc, txAddrDesc) {
|
||||
(*big.Int)(bh.ReceivedSat).Add((*big.Int)(bh.ReceivedSat), &value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for i := range bchainTx.Vin {
|
||||
bchainVin := &bchainTx.Vin[i]
|
||||
if len(bchainVin.Addresses) > 0 {
|
||||
txAddrDesc, err := w.chainParser.GetAddrDescFromAddress(bchainVin.Addresses[0])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if bytes.Equal(addrDesc, txAddrDesc) {
|
||||
// add sent amount only for OK transactions, however fees always
|
||||
if ethTxData.Status == 1 {
|
||||
(*big.Int)(bh.SentSat).Add((*big.Int)(bh.SentSat), &value)
|
||||
}
|
||||
var feesSat big.Int
|
||||
// mempool txs do not have fees yet
|
||||
if ethTxData.GasUsed != nil {
|
||||
feesSat.Mul(ethTxData.GasPrice, ethTxData.GasUsed)
|
||||
}
|
||||
(*big.Int)(bh.SentSat).Add((*big.Int)(bh.SentSat), &feesSat)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return &bh, nil
|
||||
|
|
|
@ -74,9 +74,9 @@ func erc20GetTransfersFromLog(logs []*rpcLog) ([]bchain.Erc20Transfer, error) {
|
|||
return nil, err
|
||||
}
|
||||
r = append(r, bchain.Erc20Transfer{
|
||||
Contract: strings.ToLower(l.Address),
|
||||
From: strings.ToLower(from),
|
||||
To: strings.ToLower(to),
|
||||
Contract: EIP55AddressFromAddress(l.Address),
|
||||
From: EIP55AddressFromAddress(from),
|
||||
To: EIP55AddressFromAddress(to),
|
||||
Tokens: t,
|
||||
})
|
||||
}
|
||||
|
@ -97,9 +97,9 @@ func erc20GetTransfersFromTx(tx *rpcTransaction) ([]bchain.Erc20Transfer, error)
|
|||
return nil, errors.New("Data is not a number")
|
||||
}
|
||||
r = append(r, bchain.Erc20Transfer{
|
||||
Contract: strings.ToLower(tx.To),
|
||||
From: strings.ToLower(tx.From),
|
||||
To: strings.ToLower(to),
|
||||
Contract: EIP55AddressFromAddress(tx.To),
|
||||
From: EIP55AddressFromAddress(tx.From),
|
||||
To: EIP55AddressFromAddress(to),
|
||||
Tokens: t,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -202,6 +202,15 @@ func EIP55Address(addrDesc bchain.AddressDescriptor) string {
|
|||
return string(result)
|
||||
}
|
||||
|
||||
// EIP55AddressFromAddress returns an EIP55-compliant hex string representation of the address
|
||||
func EIP55AddressFromAddress(address string) string {
|
||||
b, err := hex.DecodeString(address)
|
||||
if err != nil {
|
||||
return address
|
||||
}
|
||||
return EIP55Address(b)
|
||||
}
|
||||
|
||||
// GetAddressesFromAddrDesc returns addresses for given address descriptor with flag if the addresses are searchable
|
||||
func (p *EthereumParser) GetAddressesFromAddrDesc(addrDesc bchain.AddressDescriptor) ([]string, bool, error) {
|
||||
return []string{EIP55Address(addrDesc)}, true, nil
|
||||
|
|
Loading…
Reference in New Issue