@ -18,6 +18,7 @@ package abi
import (
"bytes"
"encoding/hex"
"fmt"
"log"
"math/big"
@ -418,3 +419,43 @@ func TestBareEvents(t *testing.T) {
}
}
}
// TestUnpackEvent is based on this contract:
// contract T {
// event received(address sender, uint amount, bytes memo);
// function receive(bytes memo) external payable {
// received(msg.sender, msg.value, memo);
// }
// }
// When receive("X") is called with sender 0x00... and value 1, it produces this tx receipt:
// receipt{status=1 cgas=23949 bloom=00000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000040200000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 logs=[log: b6818c8064f645cd82d99b59a1a267d6d61117ef [75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed] 000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158 9ae378b6d4409eada347a5dc0c180f186cb62dc68fcc0f043425eb917335aa28 0 95d429d309bb9d753954195fe2d69bd140b4ae731b9b5b605c34323de162cf00 0]}
func TestUnpackEvent ( t * testing . T ) {
const abiJSON = ` [ { "constant":false,"inputs":[ { "name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"}, { "anonymous":false,"inputs":[ { "indexed":false,"name":"sender","type":"address"}, { "indexed":false,"name":"amount","type":"uint256"}, { "indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}] `
abi , err := JSON ( strings . NewReader ( abiJSON ) )
if err != nil {
t . Fatal ( err )
}
const hexdata = ` 000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158 `
data , err := hex . DecodeString ( hexdata )
if err != nil {
t . Fatal ( err )
}
if len ( data ) % 32 == 0 {
t . Errorf ( "len(data) is %d, want a non-multiple of 32" , len ( data ) )
}
type ReceivedEvent struct {
Address common . Address
Amount * big . Int
Memo [ ] byte
}
var ev ReceivedEvent
err = abi . Unpack ( & ev , "received" , data )
if err != nil {
t . Error ( err )
} else {
t . Logf ( "len(data): %d; received event: %+v" , len ( data ) , ev )
}
}