Skip to content

FmtCalldata

Formats calldata based on the account's Cairo version.

Method Signature

func (account *Account) FmtCalldata(fnCalls []rpc.FunctionCall) ([]*felt.Felt, error)

Parameters

  • fnCalls - Slice of function calls to format

Returns

  • []*felt.Felt - Formatted calldata
  • error - Error if Cairo version unsupported

Usage Example

Prerequisites: This example assumes you have account instances already created for both Cairo v0 and v2. To learn how to create an account, see NewAccount.

package main
 
import (
	"fmt"
	"log"
 
	"github.com/NethermindEth/juno/core/felt"
	"github.com/NethermindEth/starknet.go/account"
	"github.com/NethermindEth/starknet.go/rpc"
)
 
func main() {
	// Assuming 'acc2' is Cairo v2 Account and 'acc0' is Cairo v0 Account
	var acc2, acc0 *account.Account
	// acc2 = ... (already initialized with CairoV2)
	// acc0 = ... (already initialized with CairoV0)
 
	// Create function calls
	contractAddress, _ := new(felt.Felt).SetString("0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7")
	entryPointSelector, _ := new(felt.Felt).SetString("0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e")
	recipient, _ := new(felt.Felt).SetString("0x1234567890abcdef")
 
	functionCalls := []rpc.FunctionCall{
		{
			ContractAddress:    contractAddress,
			EntryPointSelector: entryPointSelector,
			Calldata: []*felt.Felt{
				recipient,
				new(felt.Felt).SetUint64(100),
				new(felt.Felt).SetUint64(0),
			},
		},
	}
 
	// Format calldata for Cairo v2
	calldata2, err := acc2.FmtCalldata(functionCalls)
	if err != nil {
		log.Fatalf("Error formatting Cairo v2 calldata: %v", err)
	}
 
	fmt.Println("Cairo v2 formatted calldata:")
	for i, data := range calldata2 {
		fmt.Printf("  [%d]: %s\n", i, data)
	}
	fmt.Printf("Total elements: %d\n\n", len(calldata2))
 
	// Format calldata for Cairo v0
	calldata0, err := acc0.FmtCalldata(functionCalls)
	if err != nil {
		log.Fatalf("Error formatting Cairo v0 calldata: %v", err)
	}
 
	fmt.Println("Cairo v0 formatted calldata:")
	for i, data := range calldata0 {
		fmt.Printf("  [%d]: %s\n", i, data)
	}
	fmt.Printf("Total elements: %d\n", len(calldata0))
}

Expected Output

Cairo v2 formatted calldata:
  [0]: 0x1
  [1]: 0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7
  [2]: 0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e
  [3]: 0x3
  [4]: 0x1234567890abcdef
  [5]: 0x64
  [6]: 0x0
Total elements: 7
 
Cairo v0 formatted calldata:
  [0]: 0x1
  [1]: 0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7
  [2]: 0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e
  [3]: 0x0
  [4]: 0x3
  [5]: 0x3
  [6]: 0x1234567890abcdef
  [7]: 0x64
  [8]: 0x0
Total elements: 9

Description

FmtCalldata formats function calls based on the account's Cairo version:

  • Cairo v0: Uses the legacy format with 9 elements total
  • Cairo v2: Uses the newer format with 7 elements total

The formatting differences are handled internally based on the account's Cairo version.

Error Handling

formatted, err := acc.FmtCalldata(functionCalls)
if err != nil {
	// Handle errors like:
	// - Unsupported Cairo version (v1)
	return err
}

Related Methods