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 }