51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
package contract
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/ethereum/go-ethereum"
|
|
"github.com/ethereum/go-ethereum/accounts/abi"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
"github.com/poanetwork/tokenbridge-monitor/entity"
|
|
"github.com/poanetwork/tokenbridge-monitor/ethclient"
|
|
)
|
|
|
|
type Contract struct {
|
|
address common.Address
|
|
client ethclient.Client
|
|
abi abi.ABI
|
|
}
|
|
|
|
func NewContract(client ethclient.Client, addr common.Address, abi abi.ABI) *Contract {
|
|
return &Contract{addr, client, abi}
|
|
}
|
|
|
|
func (c *Contract) AllEvents() map[string]bool {
|
|
events := make(map[string]bool, len(c.abi.Events))
|
|
for _, event := range c.abi.Events {
|
|
events[event.String()] = true
|
|
}
|
|
return events
|
|
}
|
|
|
|
func (c *Contract) Call(ctx context.Context, method string, args ...interface{}) ([]byte, error) {
|
|
data, err := c.abi.Pack(method, args...)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot encode abi calldata: %w", err)
|
|
}
|
|
res, err := c.client.CallContract(ctx, ethereum.CallMsg{
|
|
To: &c.address,
|
|
Data: data,
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot call %s(...): %w", method, err)
|
|
}
|
|
return res, nil
|
|
}
|
|
|
|
func (c *Contract) ParseLog(log *entity.Log) (string, map[string]interface{}, error) {
|
|
return ParseLog(c.abi, log)
|
|
}
|