github.com/ontio/ontology@v1.14.4/vm/evm/runtime/contract.go (about)

     1  // Copyright (C) 2021 The Ontology Authors
     2  package runtime
     3  
     4  import (
     5  	"math/big"
     6  	"strings"
     7  
     8  	"github.com/ethereum/go-ethereum/accounts/abi"
     9  	"github.com/ethereum/go-ethereum/common"
    10  	"github.com/ethereum/go-ethereum/common/hexutil"
    11  	"github.com/holiman/uint256"
    12  	"github.com/ontio/ontology/common/log"
    13  )
    14  
    15  type Contract struct {
    16  	Abi        abi.ABI
    17  	Cfg        *Config
    18  	Address    common.Address
    19  	AutoCommit bool
    20  }
    21  
    22  func Ensure(err error) {
    23  	if err != nil {
    24  		panic(err)
    25  	}
    26  }
    27  
    28  func Create2Contract(cfg *Config, jsonABI, hexCode string, salt uint64, params ...interface{}) *Contract {
    29  	contractBin, err := hexutil.Decode(hexCode)
    30  	Ensure(err)
    31  
    32  	cabi, err := abi.JSON(strings.NewReader(jsonABI))
    33  	Ensure(err)
    34  	var p []byte
    35  	if len(params) != 0 {
    36  		p, err = cabi.Pack("", params...)
    37  		Ensure(err)
    38  	}
    39  	deploy := append(contractBin, p...)
    40  
    41  	_, ctAddr, leftGas, err := Create2(deploy, cfg, uint256.NewInt().SetUint64(salt))
    42  	Ensure(err)
    43  
    44  	log.Infof("deploy code at: %s, used gas: %d", ctAddr.String(), cfg.GasLimit-leftGas)
    45  
    46  	return &Contract{
    47  		Abi:     cabi,
    48  		Cfg:     cfg,
    49  		Address: ctAddr,
    50  	}
    51  }
    52  
    53  func CreateContract(cfg *Config, jsonABI string, hexCode string, params ...interface{}) *Contract {
    54  	contractBin, err := hexutil.Decode(hexCode)
    55  	Ensure(err)
    56  
    57  	cabi, err := abi.JSON(strings.NewReader(jsonABI))
    58  	Ensure(err)
    59  	var p []byte
    60  	if len(params) != 0 {
    61  		p, err = cabi.Pack("", params...)
    62  		Ensure(err)
    63  	}
    64  	deploy := append(contractBin, p...)
    65  
    66  	_, ctAddr, leftGas, err := Create(deploy, cfg)
    67  	Ensure(err)
    68  
    69  	log.Infof("deploy code at: %s, used gas: %d", ctAddr.String(), cfg.GasLimit-leftGas)
    70  
    71  	return &Contract{
    72  		Abi:     cabi,
    73  		Cfg:     cfg,
    74  		Address: ctAddr,
    75  	}
    76  }
    77  
    78  func NewContract(cfg *Config, jsonABI string, addr common.Address) *Contract {
    79  	cabi, err := abi.JSON(strings.NewReader(jsonABI))
    80  	Ensure(err)
    81  
    82  	return &Contract{
    83  		Abi:     cabi,
    84  		Cfg:     cfg,
    85  		Address: addr,
    86  	}
    87  }
    88  
    89  func (self *Contract) Call(method string, params ...interface{}) ([]byte, uint64, error) {
    90  	input, err := self.Abi.Pack(method, params...)
    91  	Ensure(err)
    92  
    93  	ret, gas, err := Call(self.Address, input, self.Cfg)
    94  	if self.AutoCommit {
    95  		err := self.Cfg.State.Commit()
    96  		Ensure(err)
    97  	}
    98  	return ret, self.Cfg.GasLimit - gas, err
    99  }
   100  
   101  func (self *Contract) Balance() *big.Int {
   102  	return self.Cfg.State.GetBalance(self.Address)
   103  }
   104  
   105  func (self *Contract) BalanceOf(addr common.Address) *big.Int {
   106  	return self.Cfg.State.GetBalance(addr)
   107  }