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) {
|
func (w *Worker) balanceHistoryForTxid(addrDesc bchain.AddressDescriptor, txid string, fromUnix, toUnix uint32) (*BalanceHistory, error) {
|
||||||
ta, err := w.db.GetTxAddresses(txid)
|
var time uint32
|
||||||
if err != nil {
|
var err error
|
||||||
return nil, err
|
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 {
|
time = w.is.GetBlockTime(height)
|
||||||
glog.Warning("DB inconsistency: tx ", txid, ": not found in txAddresses")
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
time := w.is.GetBlockTime(ta.Height)
|
|
||||||
if time < fromUnix || time >= toUnix {
|
if time < fromUnix || time >= toUnix {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
@ -837,16 +856,58 @@ func (w *Worker) balanceHistoryForTxid(addrDesc bchain.AddressDescriptor, txid s
|
||||||
ReceivedSat: &Amount{},
|
ReceivedSat: &Amount{},
|
||||||
Txid: txid,
|
Txid: txid,
|
||||||
}
|
}
|
||||||
for i := range ta.Inputs {
|
if w.chainType == bchain.ChainBitcoinType {
|
||||||
tai := &ta.Inputs[i]
|
for i := range ta.Inputs {
|
||||||
if bytes.Equal(addrDesc, tai.AddrDesc) {
|
tai := &ta.Inputs[i]
|
||||||
(*big.Int)(bh.SentSat).Add((*big.Int)(bh.SentSat), &tai.ValueSat)
|
if bytes.Equal(addrDesc, tai.AddrDesc) {
|
||||||
|
(*big.Int)(bh.SentSat).Add((*big.Int)(bh.SentSat), &tai.ValueSat)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
for i := range ta.Outputs {
|
||||||
for i := range ta.Outputs {
|
tao := &ta.Outputs[i]
|
||||||
tao := &ta.Outputs[i]
|
if bytes.Equal(addrDesc, tao.AddrDesc) {
|
||||||
if bytes.Equal(addrDesc, tao.AddrDesc) {
|
(*big.Int)(bh.ReceivedSat).Add((*big.Int)(bh.ReceivedSat), &tao.ValueSat)
|
||||||
(*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
|
return &bh, nil
|
||||||
|
|
|
@ -74,9 +74,9 @@ func erc20GetTransfersFromLog(logs []*rpcLog) ([]bchain.Erc20Transfer, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
r = append(r, bchain.Erc20Transfer{
|
r = append(r, bchain.Erc20Transfer{
|
||||||
Contract: strings.ToLower(l.Address),
|
Contract: EIP55AddressFromAddress(l.Address),
|
||||||
From: strings.ToLower(from),
|
From: EIP55AddressFromAddress(from),
|
||||||
To: strings.ToLower(to),
|
To: EIP55AddressFromAddress(to),
|
||||||
Tokens: t,
|
Tokens: t,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -97,9 +97,9 @@ func erc20GetTransfersFromTx(tx *rpcTransaction) ([]bchain.Erc20Transfer, error)
|
||||||
return nil, errors.New("Data is not a number")
|
return nil, errors.New("Data is not a number")
|
||||||
}
|
}
|
||||||
r = append(r, bchain.Erc20Transfer{
|
r = append(r, bchain.Erc20Transfer{
|
||||||
Contract: strings.ToLower(tx.To),
|
Contract: EIP55AddressFromAddress(tx.To),
|
||||||
From: strings.ToLower(tx.From),
|
From: EIP55AddressFromAddress(tx.From),
|
||||||
To: strings.ToLower(to),
|
To: EIP55AddressFromAddress(to),
|
||||||
Tokens: t,
|
Tokens: t,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -202,6 +202,15 @@ func EIP55Address(addrDesc bchain.AddressDescriptor) string {
|
||||||
return string(result)
|
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
|
// GetAddressesFromAddrDesc returns addresses for given address descriptor with flag if the addresses are searchable
|
||||||
func (p *EthereumParser) GetAddressesFromAddrDesc(addrDesc bchain.AddressDescriptor) ([]string, bool, error) {
|
func (p *EthereumParser) GetAddressesFromAddrDesc(addrDesc bchain.AddressDescriptor) ([]string, bool, error) {
|
||||||
return []string{EIP55Address(addrDesc)}, true, nil
|
return []string{EIP55Address(addrDesc)}, true, nil
|
||||||
|
|
Loading…
Reference in New Issue