core: store NEP5Transfer asset by ID instead of hash
To avoid problems with retrieving decimals for migrated contracts.
This commit is contained in:
parent
b9bdab8ec8
commit
0dd1730632
4 changed files with 21 additions and 17 deletions
|
@ -707,14 +707,6 @@ func parseUint160(addr []byte) util.Uint160 {
|
||||||
func (bc *Blockchain) processNEP5Transfer(cache *dao.Cached, h util.Uint256, b *block.Block, sc util.Uint160, from, to []byte, amount *big.Int) {
|
func (bc *Blockchain) processNEP5Transfer(cache *dao.Cached, h util.Uint256, b *block.Block, sc util.Uint160, from, to []byte, amount *big.Int) {
|
||||||
toAddr := parseUint160(to)
|
toAddr := parseUint160(to)
|
||||||
fromAddr := parseUint160(from)
|
fromAddr := parseUint160(from)
|
||||||
transfer := &state.NEP5Transfer{
|
|
||||||
Asset: sc,
|
|
||||||
From: fromAddr,
|
|
||||||
To: toAddr,
|
|
||||||
Block: b.Index,
|
|
||||||
Timestamp: b.Timestamp,
|
|
||||||
Tx: h,
|
|
||||||
}
|
|
||||||
var id int32
|
var id int32
|
||||||
nativeContract := bc.contracts.ByHash(sc)
|
nativeContract := bc.contracts.ByHash(sc)
|
||||||
if nativeContract != nil {
|
if nativeContract != nil {
|
||||||
|
@ -726,6 +718,14 @@ func (bc *Blockchain) processNEP5Transfer(cache *dao.Cached, h util.Uint256, b *
|
||||||
}
|
}
|
||||||
id = assetContract.ID
|
id = assetContract.ID
|
||||||
}
|
}
|
||||||
|
transfer := &state.NEP5Transfer{
|
||||||
|
Asset: id,
|
||||||
|
From: fromAddr,
|
||||||
|
To: toAddr,
|
||||||
|
Block: b.Index,
|
||||||
|
Timestamp: b.Timestamp,
|
||||||
|
Tx: h,
|
||||||
|
}
|
||||||
if !fromAddr.Equals(util.Uint160{}) {
|
if !fromAddr.Equals(util.Uint160{}) {
|
||||||
balances, err := cache.GetNEP5Balances(fromAddr)
|
balances, err := cache.GetNEP5Balances(fromAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -26,8 +26,8 @@ type NEP5TransferLog struct {
|
||||||
|
|
||||||
// NEP5Transfer represents a single NEP5 Transfer event.
|
// NEP5Transfer represents a single NEP5 Transfer event.
|
||||||
type NEP5Transfer struct {
|
type NEP5Transfer struct {
|
||||||
// Asset is a NEP5 contract hash.
|
// Asset is a NEP5 contract ID.
|
||||||
Asset util.Uint160
|
Asset int32
|
||||||
// Address is the address of the sender.
|
// Address is the address of the sender.
|
||||||
From util.Uint160
|
From util.Uint160
|
||||||
// To is the address of the receiver.
|
// To is the address of the receiver.
|
||||||
|
@ -132,7 +132,7 @@ func (t *NEP5Tracker) DecodeBinary(r *io.BinReader) {
|
||||||
|
|
||||||
// EncodeBinary implements io.Serializable interface.
|
// EncodeBinary implements io.Serializable interface.
|
||||||
func (t *NEP5Transfer) EncodeBinary(w *io.BinWriter) {
|
func (t *NEP5Transfer) EncodeBinary(w *io.BinWriter) {
|
||||||
w.WriteBytes(t.Asset[:])
|
w.WriteU32LE(uint32(t.Asset))
|
||||||
w.WriteBytes(t.Tx[:])
|
w.WriteBytes(t.Tx[:])
|
||||||
w.WriteBytes(t.From[:])
|
w.WriteBytes(t.From[:])
|
||||||
w.WriteBytes(t.To[:])
|
w.WriteBytes(t.To[:])
|
||||||
|
@ -150,7 +150,7 @@ func (t *NEP5Transfer) DecodeBinary(r *io.BinReader) {
|
||||||
|
|
||||||
// DecodeBinaryReturnCount decodes NEP5Transfer and returns the number of bytes read.
|
// DecodeBinaryReturnCount decodes NEP5Transfer and returns the number of bytes read.
|
||||||
func (t *NEP5Transfer) DecodeBinaryReturnCount(r *io.BinReader) int {
|
func (t *NEP5Transfer) DecodeBinaryReturnCount(r *io.BinReader) int {
|
||||||
r.ReadBytes(t.Asset[:])
|
t.Asset = int32(r.ReadU32LE())
|
||||||
r.ReadBytes(t.Tx[:])
|
r.ReadBytes(t.Tx[:])
|
||||||
r.ReadBytes(t.From[:])
|
r.ReadBytes(t.From[:])
|
||||||
r.ReadBytes(t.To[:])
|
r.ReadBytes(t.To[:])
|
||||||
|
@ -160,5 +160,5 @@ func (t *NEP5Transfer) DecodeBinaryReturnCount(r *io.BinReader) int {
|
||||||
amountBytes := make([]byte, amountLen)
|
amountBytes := make([]byte, amountLen)
|
||||||
r.ReadBytes(amountBytes)
|
r.ReadBytes(amountBytes)
|
||||||
t.Amount = *bigint.FromBytes(amountBytes)
|
t.Amount = *bigint.FromBytes(amountBytes)
|
||||||
return util.Uint160Size*3 + 8 + 4 + (8 + len(amountBytes)) + +util.Uint256Size
|
return 4 + util.Uint160Size*2 + 8 + 4 + (8 + len(amountBytes)) + +util.Uint256Size
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ func TestNEP5Tracker_EncodeBinary(t *testing.T) {
|
||||||
|
|
||||||
func TestNEP5Transfer_DecodeBinary(t *testing.T) {
|
func TestNEP5Transfer_DecodeBinary(t *testing.T) {
|
||||||
expected := &NEP5Transfer{
|
expected := &NEP5Transfer{
|
||||||
Asset: util.Uint160{1, 2, 3},
|
Asset: 123,
|
||||||
From: util.Uint160{5, 6, 7},
|
From: util.Uint160{5, 6, 7},
|
||||||
To: util.Uint160{8, 9, 10},
|
To: util.Uint160{8, 9, 10},
|
||||||
Amount: *big.NewInt(42),
|
Amount: *big.NewInt(42),
|
||||||
|
@ -78,7 +78,7 @@ func randomTransfer(r *rand.Rand) *NEP5Transfer {
|
||||||
return &NEP5Transfer{
|
return &NEP5Transfer{
|
||||||
Amount: *big.NewInt(int64(r.Uint64())),
|
Amount: *big.NewInt(int64(r.Uint64())),
|
||||||
Block: r.Uint32(),
|
Block: r.Uint32(),
|
||||||
Asset: random.Uint160(),
|
Asset: int32(random.Int(10, 10000000)),
|
||||||
From: random.Uint160(),
|
From: random.Uint160(),
|
||||||
To: random.Uint160(),
|
To: random.Uint160(),
|
||||||
Tx: random.Uint256(),
|
Tx: random.Uint256(),
|
||||||
|
|
|
@ -549,13 +549,17 @@ func (s *Server) getNEP5Transfers(ps request.Params) (interface{}, *response.Err
|
||||||
lg := s.chain.GetNEP5TransferLog(u)
|
lg := s.chain.GetNEP5TransferLog(u)
|
||||||
cache := make(map[util.Uint160]int64)
|
cache := make(map[util.Uint160]int64)
|
||||||
err = lg.ForEach(func(tr *state.NEP5Transfer) error {
|
err = lg.ForEach(func(tr *state.NEP5Transfer) error {
|
||||||
|
h, err := s.chain.GetContractScriptHash(tr.Asset)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
transfer := result.NEP5Transfer{
|
transfer := result.NEP5Transfer{
|
||||||
Timestamp: tr.Timestamp,
|
Timestamp: tr.Timestamp,
|
||||||
Asset: tr.Asset,
|
Asset: h,
|
||||||
Index: tr.Block,
|
Index: tr.Block,
|
||||||
TxHash: tr.Tx,
|
TxHash: tr.Tx,
|
||||||
}
|
}
|
||||||
d, err := s.getDecimals(tr.Asset, cache)
|
d, err := s.getDecimals(h, cache)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue