FlixKit is a Go package that provides functionalities for interacting with Flow Interaction Templates (aka FLIX). This package supports generating v1.1 FLIX template json, creating binding files for v1.0 and v1.1 and replacing import for v1.0 and v1.1. More information about FLIX FLIX FLIP
The flixkit package is a Go module designed to interact with Flow Interaction Templates (FLIX). It allows users to fetch, parse, generate and create binding files for Flow interaction templates aka FLIX, aka Verified Interactions.
See FLIP that describes json structure, Here current version is v1.1.0
This package provides three functionalities.
- Getting network specific Cadence from FLIX
- Generate FLIX from Cadence
- Create binding files based on FLIX (javascript, typescript)
The package also defines the following interfaces:
FlixService: This interface defines methods to fetch templates using template name or template id (from flix service), URL or local file path.
// GetTemplate returns the raw flix template
GetTemplate(ctx context.Context, templateName string) (string, string, error)
// GetAndReplaceImports returns the raw flix template with cadence imports replaced
GetTemplateAndReplaceImports(ctx context.Context, templateName string, network string) (*FlowInteractionTemplateExecution, error)
// GenerateBinding returns the generated binding given the language
GetTemplateAndCreateBinding(ctx context.Context, templateName string, lang string, destFile string) (string, error)
// GenerateTemplate returns the generated raw template
CreateTemplate(ctx context.Context, contractInfos ContractInfos, code string, preFill string) (string, error)The package provides a FlixService interface with a constructor function NewFlixService(config *FlixServiceConfig). FlixServiceConfig
contains
FlixServerURLwhich is defaulted to"https://flix.flow.com/v1/templates". User can provide their own service url endpointFileReaderwhich is used to read local FLIX json template filesLoggerwhich is used in creatingflowkit.NewFlowkitfor FLIX template generation
The FlixService interface provides the following methods:
-
GetTemplate: Fetches template and returns as a string. -
GetTemplateAndReplaceImportsreturnsFlowInteractionTemplateExecution: Fetches and parses a Flix template and provides the cadence for the network provided. There are two helper methods to assist in determining if the Cadence is a transaction or a script. -
Note:
templateNameparameter can be the id or name of a template from the interactive template service. A local file or url to the FLIX json file or the template string itself.
Result form GetAndReplaceCadenceImports is a FlowInteractionTemplateExecution instance also provides the following methods:
IsScript() bool: Checks if the template is of type "script".IsTransaction() bool: Checks if the template is of type "transaction".Cadence: Replaced cadence with respective network addresses.Network: Name of network used to get import addresses
Here is a simple example of creating a new FlixService and fetching a template:
flixService := flixkit.NewFlixService(&flixkit.Config{})
template, err := flixService.GetTemplate(context.Background(), "transfer-flow")
if err != nil {
log.Fatal(err)
}
fmt.Println(template)Note: Remember to replace "transfer-flow" with the actual name of the template you wish to fetch.
To read more about Flow Interaction Templates, see the docs.
Binding files are client code files used to call Cadence contracts using the scripts or transactions in a FLIX. These client files can be created given a FLIX, currently TypeScript and JavaScript are supported.
The bindings module has two public methods Generate and NewFclJSGenerator. FclJSGenerator takes a template directory. bindings has fcl-js templates.
flixService := flixkit.NewFlixService(&flixkit.Config{
FileReader: myFileReader
})
binding, err := flixService.GetTemplateAndCreateBinding(context.Background(), "transfer-flow", "js", "./bindingFiles/transferFlow.js")
if err != nil {
log.Fatal(err)
}
fmt.Println(binding)GetTemplateAndCreateBinding(ctx context.Context, templateName string, lang string, destFile string) (string, error)templateNamevalue can be template name, template id, url or local file.langvalues supported are "js", "javascript", "ts", "typescript"destFileis the location of the destination binding file, this is used to create the relative path if the template is local. If the template is a template name, template id or urldestFileisn't used
CreateTemplate creates the newest ratified version of FLIX, as of this update, see link to FLIP Flip above for more information.
CreateTemplate(ctx context.Context, contractInfos ContractInfos, code string, preFill string) (string, error)flixService := flixkit.NewFlixService(&flixkit.Config{
FileReader: myFileReader,
Logger: myLogger,
})
prettyJSON, err := flixService.CreateTemplate(ctx, depContracts, string(code), preFilled)
fmt.Println(prettyJSON)contractInfosis an array of v1_1.Contract struct. This provides the network information about the deployed contracts that are dependencies in the FLIX Cadence code.codeis the actual Cadence code the template is based onpreFilledis a partially filled out FLIX template. This can be a template name, template id, url or local file. Alternatively to using a prefilled template, the Cadence itself can provide metadata using a FLIX specific Cadence pragma, more on that below, See Cadence Doc Flip
Using Cadence pragma the metadata can exist along with the Cadence code. Therefore a prefilled template isn't necessary
#interaction(
version: "1.1.0",
title: "Transfer Flow",
description: "Transfer Flow to account",
language: "en-US",
)
import "FlowToken"
transaction(amount: UFix64, to: Address) {
let vault: @FlowToken.Vault
prepare(signer: &Account) {
...
}
}
`A pragma gives special instruction or processors, in this case FLIX specific information that describes the transaction or script.
Notice: Nested structures in Cadence pragma will be supported in future, this will allow describing parameters
...
#interaction(
version: "1.1.0",
title: "Transfer Flow",
description: "Transfer Flow to account",
language: "en-US",
parameters: [
Parameter(
name: "amount",
title: "Amount",
description: "Amount of Flow to transfer"
),
Parameter(
name: "to",
title: "Reciever",
description: "Destination address to receive Flow Tokens"
)
],
)
...