wasmd/x/wasm/keeper/api.go

65 lines
2.1 KiB
Go

package keeper
import (
"errors"
wasmvm "github.com/CosmWasm/wasmvm/v3"
wasmvmtypes "github.com/CosmWasm/wasmvm/v3/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/CosmWasm/wasmd/x/wasm/types"
)
const (
// DefaultGasCostHumanAddress is how much SDK gas we charge to convert to a human address format
DefaultGasCostHumanAddress = 5
// DefaultGasCostCanonicalAddress is how much SDK gas we charge to convert to a canonical address format
DefaultGasCostCanonicalAddress = 4
// DefaultGasCostValidateAddress is how much SDK gas we charge to validate an address
DefaultGasCostValidateAddress = DefaultGasCostHumanAddress + DefaultGasCostCanonicalAddress
// DefaultDeserializationCostPerByte The formula should be `len(data) * deserializationCostPerByte`
DefaultDeserializationCostPerByte = 1
)
var (
costHumanize = DefaultGasCostHumanAddress * types.DefaultGasMultiplier
costCanonical = DefaultGasCostCanonicalAddress * types.DefaultGasMultiplier
costValidate = DefaultGasCostValidateAddress * types.DefaultGasMultiplier
costJSONDeserialization = wasmvmtypes.UFraction{
Numerator: DefaultDeserializationCostPerByte * types.DefaultGasMultiplier,
Denominator: 1,
}
)
func humanizeAddress(canon []byte) (string, uint64, error) {
if err := sdk.VerifyAddressFormat(canon); err != nil {
return "", costHumanize, err
}
return sdk.AccAddress(canon).String(), costHumanize, nil
}
func canonicalizeAddress(human string) ([]byte, uint64, error) {
bz, err := sdk.AccAddressFromBech32(human)
return bz, costCanonical, err
}
func validateAddress(human string) (uint64, error) {
canonicalized, err := sdk.AccAddressFromBech32(human)
if err != nil {
return costCanonical, err
}
// AccAddressFromBech32 already calls VerifyAddressFormat, so we can just humanize and compare
if canonicalized.String() != human {
return costValidate, errors.New("address not normalized")
}
return costValidate, nil
}
var cosmwasmAPI = wasmvm.GoAPI{
HumanizeAddress: humanizeAddress,
CanonicalizeAddress: canonicalizeAddress,
ValidateAddress: validateAddress,
}