123 lines
3.2 KiB
Go
123 lines
3.2 KiB
Go
|
package bindings
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
|
||
|
wasmvmtypes "github.com/CosmWasm/wasmvm/types"
|
||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||
|
|
||
|
bindingstypes "github.com/wormhole-foundation/wormchain/x/tokenfactory/bindings/types"
|
||
|
)
|
||
|
|
||
|
// CustomQuerier dispatches custom CosmWasm bindings queries.
|
||
|
func CustomQuerier(qp *QueryPlugin) func(ctx sdk.Context, request json.RawMessage) ([]byte, error) {
|
||
|
return func(ctx sdk.Context, request json.RawMessage) ([]byte, error) {
|
||
|
var contractQuery bindingstypes.TokenFactoryQuery
|
||
|
if err := json.Unmarshal(request, &contractQuery); err != nil {
|
||
|
return nil, sdkerrors.Wrap(err, "osmosis query")
|
||
|
}
|
||
|
if contractQuery.Token == nil {
|
||
|
return nil, sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "nil token field")
|
||
|
}
|
||
|
tokenQuery := contractQuery.Token
|
||
|
|
||
|
switch {
|
||
|
case tokenQuery.FullDenom != nil:
|
||
|
creator := tokenQuery.FullDenom.CreatorAddr
|
||
|
subdenom := tokenQuery.FullDenom.Subdenom
|
||
|
|
||
|
fullDenom, err := GetFullDenom(creator, subdenom)
|
||
|
if err != nil {
|
||
|
return nil, sdkerrors.Wrap(err, "osmo full denom query")
|
||
|
}
|
||
|
|
||
|
res := bindingstypes.FullDenomResponse{
|
||
|
Denom: fullDenom,
|
||
|
}
|
||
|
|
||
|
bz, err := json.Marshal(res)
|
||
|
if err != nil {
|
||
|
return nil, sdkerrors.Wrap(err, "failed to marshal FullDenomResponse")
|
||
|
}
|
||
|
|
||
|
return bz, nil
|
||
|
|
||
|
case tokenQuery.Admin != nil:
|
||
|
res, err := qp.GetDenomAdmin(ctx, tokenQuery.Admin.Denom)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
bz, err := json.Marshal(res)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("failed to JSON marshal AdminResponse: %w", err)
|
||
|
}
|
||
|
|
||
|
return bz, nil
|
||
|
|
||
|
case tokenQuery.Metadata != nil:
|
||
|
res, err := qp.GetMetadata(ctx, tokenQuery.Metadata.Denom)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
bz, err := json.Marshal(res)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("failed to JSON marshal MetadataResponse: %w", err)
|
||
|
}
|
||
|
|
||
|
return bz, nil
|
||
|
|
||
|
case tokenQuery.DenomsByCreator != nil:
|
||
|
res, err := qp.GetDenomsByCreator(ctx, tokenQuery.DenomsByCreator.Creator)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
bz, err := json.Marshal(res)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("failed to JSON marshal DenomsByCreatorResponse: %w", err)
|
||
|
}
|
||
|
|
||
|
return bz, nil
|
||
|
|
||
|
case tokenQuery.Params != nil:
|
||
|
res, err := qp.GetParams(ctx)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
bz, err := json.Marshal(res)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("failed to JSON marshal ParamsResponse: %w", err)
|
||
|
}
|
||
|
|
||
|
return bz, nil
|
||
|
|
||
|
default:
|
||
|
return nil, wasmvmtypes.UnsupportedRequest{Kind: "unknown token query variant"}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ConvertSdkCoinsToWasmCoins converts sdk type coins to wasm vm type coins
|
||
|
func ConvertSdkCoinsToWasmCoins(coins []sdk.Coin) wasmvmtypes.Coins {
|
||
|
var toSend wasmvmtypes.Coins
|
||
|
for _, coin := range coins {
|
||
|
c := ConvertSdkCoinToWasmCoin(coin)
|
||
|
toSend = append(toSend, c)
|
||
|
}
|
||
|
return toSend
|
||
|
}
|
||
|
|
||
|
// ConvertSdkCoinToWasmCoin converts a sdk type coin to a wasm vm type coin
|
||
|
func ConvertSdkCoinToWasmCoin(coin sdk.Coin) wasmvmtypes.Coin {
|
||
|
return wasmvmtypes.Coin{
|
||
|
Denom: coin.Denom,
|
||
|
// Note: tokenfactory tokens have 18 decimal places, so 10^22 is common, no longer in u64 range
|
||
|
Amount: coin.Amount.String(),
|
||
|
}
|
||
|
}
|