Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions config/errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package config

import (
"errors"
)

// ErrNilGasScheduleFactory signals that a nil gas schedule factory has been provided
var ErrNilGasScheduleFactory = errors.New("nil gas schedule factory has been provided")
43 changes: 43 additions & 0 deletions config/gas.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package config

import (
"github.com/multiversx/mx-chain-vm-go/executor"
)

var _ GasSchedule = (*GasCost)(nil)

func (g *GasCost) GetBaseOperationCost() *BaseOperationCost {
return &g.BaseOperationCost
}

func (g *GasCost) GetBigIntAPICost() *BigIntAPICost {
return &g.BigIntAPICost
}

func (g *GasCost) GetBigFloatAPICost() *BigFloatAPICost {
return &g.BigFloatAPICost
}

func (g *GasCost) GetBaseOpsAPICost() *BaseOpsAPICost {
return &g.BaseOpsAPICost
}

func (g *GasCost) GetManagedBufferAPICost() *ManagedBufferAPICost {
return &g.ManagedBufferAPICost
}

func (g *GasCost) GetManagedMapAPICost() *ManagedMapAPICost {
return &g.ManagedMapAPICost
}

func (g *GasCost) GetCryptoAPICost() *CryptoAPICost {
return &g.CryptoAPICost
}

func (g *GasCost) GetWASMOpcodeCost() *executor.WASMOpcodeCost {
return g.WASMOpcodeCost
}

func (g *GasCost) GetDynamicStorageLoad() *DynamicStorageLoadCostCoefficients {
return &g.DynamicStorageLoad
}
18 changes: 10 additions & 8 deletions config/gasSchedule.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/mitchellh/mapstructure"
logger "github.com/multiversx/mx-chain-logger-go"

"github.com/multiversx/mx-chain-vm-go/executor"
)

Expand All @@ -30,7 +31,7 @@ func CreateGasConfig(gasMap GasScheduleMap) (*GasCost, error) {
return nil, err
}

err = checkForZeroUint64Fields(*baseOps)
err = CheckForZeroUint64Fields(*baseOps)
if err != nil {
return nil, err
}
Expand All @@ -41,7 +42,7 @@ func CreateGasConfig(gasMap GasScheduleMap) (*GasCost, error) {
return nil, err
}

err = checkForZeroUint64Fields(*baseOpsAPI)
err = CheckForZeroUint64Fields(*baseOpsAPI)
if err != nil {
return nil, err
}
Expand All @@ -52,7 +53,7 @@ func CreateGasConfig(gasMap GasScheduleMap) (*GasCost, error) {
return nil, err
}

err = checkForZeroUint64Fields(*bigFloatOps)
err = CheckForZeroUint64Fields(*bigFloatOps)
if err != nil {
return nil, err
}
Expand All @@ -63,7 +64,7 @@ func CreateGasConfig(gasMap GasScheduleMap) (*GasCost, error) {
return nil, err
}

err = checkForZeroUint64Fields(*bigIntOps)
err = CheckForZeroUint64Fields(*bigIntOps)
if err != nil {
return nil, err
}
Expand All @@ -74,7 +75,7 @@ func CreateGasConfig(gasMap GasScheduleMap) (*GasCost, error) {
return nil, err
}

err = checkForZeroUint64Fields(*cryptOps)
err = CheckForZeroUint64Fields(*cryptOps)
if err != nil {
return nil, err
}
Expand All @@ -85,7 +86,7 @@ func CreateGasConfig(gasMap GasScheduleMap) (*GasCost, error) {
return nil, err
}

err = checkForZeroUint64Fields(*MBufferOps)
err = CheckForZeroUint64Fields(*MBufferOps)
if err != nil {
return nil, err
}
Expand All @@ -96,7 +97,7 @@ func CreateGasConfig(gasMap GasScheduleMap) (*GasCost, error) {
return nil, err
}

err = checkForZeroUint64Fields(*wasmOps)
err = CheckForZeroUint64Fields(*wasmOps)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -177,7 +178,8 @@ func getSignedCoefficient(coefficient uint64, sign uint64) int64 {
return int64(coefficient)
}

func checkForZeroUint64Fields(arg interface{}) error {
// CheckForZeroUint64Fields return error if operation gas cost has been set to zero
func CheckForZeroUint64Fields(arg interface{}) error {
v := reflect.ValueOf(arg)
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
Expand Down
15 changes: 15 additions & 0 deletions config/gasScheduleFactory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package config

type gasScheduleFactory struct{}

func NewGasScheduleFactory() *gasScheduleFactory {
return &gasScheduleFactory{}
}

func (f *gasScheduleFactory) CreateGasSchedule(gasMap GasScheduleMap) (GasSchedule, error) {
return CreateGasConfig(gasMap)
}

func (f *gasScheduleFactory) IsInterfaceNil() bool {
return f == nil
}
4 changes: 2 additions & 2 deletions config/gasSchedule_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@ func TestDecode_ZeroGasCostError(t *testing.T) {
err := mapstructure.Decode(gasMap, wasmCosts)
assert.Nil(t, err)

err = checkForZeroUint64Fields(*wasmCosts)
err = CheckForZeroUint64Fields(*wasmCosts)
assert.Nil(t, err)

gasMap["BrIf"] = 0
wasmCosts = &executor.WASMOpcodeCost{}
err = mapstructure.Decode(gasMap, wasmCosts)
assert.Nil(t, err)

err = checkForZeroUint64Fields(*wasmCosts)
err = CheckForZeroUint64Fields(*wasmCosts)
assert.Error(t, err)
}

Expand Down
22 changes: 22 additions & 0 deletions config/interface.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package config

import (
"github.com/multiversx/mx-chain-vm-go/executor"
)

type GasSchedule interface {
GetBaseOperationCost() *BaseOperationCost
GetBigIntAPICost() *BigIntAPICost
GetBigFloatAPICost() *BigFloatAPICost
GetBaseOpsAPICost() *BaseOpsAPICost
GetManagedBufferAPICost() *ManagedBufferAPICost
GetManagedMapAPICost() *ManagedMapAPICost
GetCryptoAPICost() *CryptoAPICost
GetWASMOpcodeCost() *executor.WASMOpcodeCost
GetDynamicStorageLoad() *DynamicStorageLoadCostCoefficients
}

type GasScheduleFactory interface {
CreateGasSchedule(gasMap GasScheduleMap) (GasSchedule, error)
IsInterfaceNil() bool
}
16 changes: 11 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
module github.com/multiversx/mx-chain-vm-go

go 1.23
go 1.23.0

replace (
github.com/multiversx/mx-chain-core-go => github.com/multiversx/mx-chain-core-sovereign-go v1.2.25-0.20251223075042-2f2f8092dc66
github.com/multiversx/mx-chain-scenario-go => github.com/multiversx/mx-chain-scenario-go v1.7.1-0.20251223080807-d2ad64a6fecf
github.com/multiversx/mx-chain-vm-common-go => github.com/multiversx/mx-chain-vm-common-sovereign-go v1.5.17-0.20251223080659-b248455c9554
)

require (
github.com/awalterschulze/gographviz v2.0.3+incompatible
Expand All @@ -18,7 +24,7 @@ require (
github.com/pelletier/go-toml v1.9.3
github.com/stretchr/testify v1.8.1
github.com/urfave/cli/v2 v2.27.1
golang.org/x/crypto v0.3.0
golang.org/x/crypto v0.33.0
)

require (
Expand All @@ -28,7 +34,7 @@ require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/denisbrodbeck/machineid v1.0.1 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/hashicorp/golang-lru v0.6.0 // indirect
github.com/herumi/bls-go-binary v1.28.2 // indirect
github.com/kr/pretty v0.3.0 // indirect
Expand All @@ -37,8 +43,8 @@ require (
github.com/rogpeppe/go-internal v1.8.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
golang.org/x/sys v0.2.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
golang.org/x/sys v0.30.0 // indirect
google.golang.org/protobuf v1.36.5 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
31 changes: 14 additions & 17 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,8 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
Expand Down Expand Up @@ -83,18 +82,18 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/multiversx/mx-chain-core-go v1.4.0 h1:p6FbfCzvMXF54kpS0B5mrjNWYpq4SEQqo0UvrMF7YVY=
github.com/multiversx/mx-chain-core-go v1.4.0/go.mod h1:IO+vspNan+gT0WOHnJ95uvWygiziHZvfXpff6KnxV7g=
github.com/multiversx/mx-chain-core-sovereign-go v1.2.25-0.20251223075042-2f2f8092dc66 h1:8TPVufnra2H8kKfO5KaQ8eF4cjTciAkMyoEGt3UbttY=
github.com/multiversx/mx-chain-core-sovereign-go v1.2.25-0.20251223075042-2f2f8092dc66/go.mod h1:cJw3+5HfcHb5uIf3f/0cjYBXq6jumM3TNeQAY8UQFF0=
github.com/multiversx/mx-chain-crypto-go v1.3.0 h1:0eK2bkDOMi8VbSPrB1/vGJSYT81IBtfL4zw+C4sWe/k=
github.com/multiversx/mx-chain-crypto-go v1.3.0/go.mod h1:nPIkxxzyTP8IquWKds+22Q2OJ9W7LtusC7cAosz7ojM=
github.com/multiversx/mx-chain-logger-go v1.1.0 h1:97x84A6L4RfCa6YOx1HpAFxZp1cf/WI0Qh112whgZNM=
github.com/multiversx/mx-chain-logger-go v1.1.0/go.mod h1:K9XgiohLwOsNACETMNL0LItJMREuEvTH6NsoXWXWg7g=
github.com/multiversx/mx-chain-scenario-go v1.6.0 h1:cwDFuS1pSc4YXnfiKKDTEb+QDY4fulPQaiRgIebnKxI=
github.com/multiversx/mx-chain-scenario-go v1.6.0/go.mod h1:GrSYu1SnMvsIm9djUz1X13224HcvdY6Nb5KHNT3xZPA=
github.com/multiversx/mx-chain-scenario-go v1.7.1-0.20251223080807-d2ad64a6fecf h1:mHN/6dQCx+/qSWihd+JjVA0eJPg2IgUsG+32pOTnAuY=
github.com/multiversx/mx-chain-scenario-go v1.7.1-0.20251223080807-d2ad64a6fecf/go.mod h1:Ch2zd6sPKQBNDQTwwajO4Y9dw2Ayi3REwCr/xJMfGog=
github.com/multiversx/mx-chain-storage-go v1.1.0 h1:M1Y9DqMrJ62s7Zw31+cyuqsnPIvlG4jLBJl5WzeZLe8=
github.com/multiversx/mx-chain-storage-go v1.1.0/go.mod h1:o6Jm7cjfPmcc6XpyihYWrd6sx3sgqwurrunw3ZrfyxI=
github.com/multiversx/mx-chain-vm-common-go v1.6.0 h1:M2zmf/ptEINciWxYCPLIkwOMTvvzWjELYYB+0MMQ5Gw=
github.com/multiversx/mx-chain-vm-common-go v1.6.0/go.mod h1:Lc7r4VDPYRDS0CVIaWAoLtf3YQn6PZEYHv4QtaOE2Z0=
github.com/multiversx/mx-chain-vm-common-sovereign-go v1.5.17-0.20251223080659-b248455c9554 h1:X9GMvQYbOCjAj7d9SCyzuetBW4Pxnn6jY2zB81s8GNA=
github.com/multiversx/mx-chain-vm-common-sovereign-go v1.5.17-0.20251223080659-b248455c9554/go.mod h1:zBdm+zbsrjbkv460uax2L5q+T46LxaE5jRTfen2gyb8=
github.com/multiversx/mx-components-big-int v1.1.0 h1:7aSJKago6vJQy9JeMOBRDYKHvsrj9OmrFWOucFUV+Kg=
github.com/multiversx/mx-components-big-int v1.1.0/go.mod h1:kcWw7hDe6cSz1wcBAqj/6sFH6ouSPsNeH9P7XlpZRcw=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
Expand Down Expand Up @@ -135,8 +134,8 @@ golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnf
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A=
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
Expand All @@ -161,8 +160,8 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
Expand All @@ -181,10 +180,8 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
Expand Down
6 changes: 6 additions & 0 deletions mock/context/blockChainHookStub.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ type BlockchainHookStub struct {
GetSnapshotCalled func() int
RevertToSnapshotCalled func(snapshot int) error
ExecuteSmartContractCallOnOtherVMCalled func(input *vmcommon.ContractCallInput) (*vmcommon.VMOutput, error)
ChainIDCalled func() []byte
}

// NewAddress mocked method
Expand Down Expand Up @@ -333,6 +334,11 @@ func (b *BlockchainHookStub) ExecuteSmartContractCallOnOtherVM(input *vmcommon.C
return nil, nil
}

// ChainID -
func (b *BlockchainHookStub) ChainID() []byte {
return make([]byte, 0)
}

// IsInterfaceNil mocked method
func (b *BlockchainHookStub) IsInterfaceNil() bool {
return b == nil
Expand Down
7 changes: 6 additions & 1 deletion mock/context/meteringContextMock.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package mock

import (
vmcommon "github.com/multiversx/mx-chain-vm-common-go"

"github.com/multiversx/mx-chain-vm-go/config"
"github.com/multiversx/mx-chain-vm-go/vmhost"
)
Expand Down Expand Up @@ -45,7 +46,7 @@ func (m *MeteringContextMock) SetGasSchedule(gasSchedule config.GasScheduleMap)
}

// GasSchedule mocked method
func (m *MeteringContextMock) GasSchedule() *config.GasCost {
func (m *MeteringContextMock) GasSchedule() config.GasSchedule {
return m.GasCost
}

Expand Down Expand Up @@ -214,3 +215,7 @@ func (m *MeteringContextMock) SetGasTracing(_ bool) {}
func (m *MeteringContextMock) GetGasTrace() map[string]map[string][]uint64 {
return nil
}

func (m *MeteringContextMock) IsInterfaceNil() bool {
return false
}
Loading
Loading