contrib/promexporter/internal/decoders/gettokenbyid.go
package decoders
import (
"fmt"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/lmittmann/w3"
"github.com/lmittmann/w3/w3types"
"github.com/synapsecns/sanguine/ethergo/parser/abiutil"
"github.com/synapsecns/sanguine/services/explorer/contracts/bridgeconfig"
)
// TokenConfigGetToken returns the token config get token function.
// Must return into bridgeconfig.BridgeConfigV3Token.
func TokenConfigGetToken() w3types.Func {
return tokenConfigGetToken
}
var tokenConfigGetToken w3types.Func
type customDecodedFunc struct {
*w3.Func
}
func (c *customDecodedFunc) DecodeReturns(output []byte, returns ...any) (err error) {
err = returnChecks(c.Func, output, returns...)
if err != nil {
return fmt.Errorf("could not decode returns: %w", err)
}
raw, err := bridgeConfigV3ABI.Unpack("getTokenByID", output)
if err != nil {
return fmt.Errorf("could not unpack returns: %w", err)
}
abi.ConvertType(raw[0], returns[0])
return nil
}
var bridgeConfigV3ABI *abi.ABI
func init() {
// create the token config selector
underlying := w3.MustNewFunc("getTokenByID(string,uint256)", "uint256,string,uint8,uint256,uint256,uint256,uint256,uint256,bool,bool")
tokenConfigGetToken = &customDecodedFunc{underlying}
// make sure it matches expected (we didn't mess up anything). this is a sanity check at boot time
tokenIDSelector, err := abiutil.GetSelectorByName("getTokenByID", bridgeconfig.BridgeConfigV3MetaData)
if err != nil {
panic("could not get token id selector")
}
if underlying.Selector != tokenIDSelector {
panic("incorrect token selector")
}
bridgeConfigV3ABI, err = bridgeconfig.BridgeConfigV3MetaData.GetAbi()
if err != nil {
panic("could not get bridge config v3 abi")
}
}