mirror of https://github.com/certusone/wasmd.git
65 lines
2.1 KiB
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,
|
|
}
|