Skip to content

Conversation

@turbolent
Copy link
Member

@turbolent turbolent commented Oct 22, 2024

Work towards #3637

Description

Add a new built-in contract CCF, which allows encoding an exportable value to .

The parameter of encode is a reference, so it can accept both structs and resources, and supports move-semantics of resources (i.e. does not consume the passed resource-kinded value)

For now this is a PoC showing how this could be done.

TODO

  • Determine interest and use-cases
  • Should the function have a format (version) parameter?
  • Add more tests
  • Add decode function?
  • Handle unexportable values

  • Targeted PR against master branch
  • Linked to Github issue with discussion and accepted design OR link to spec that describes this work
  • Code follows the standards mentioned here
  • Updated relevant documentation
  • Re-reviewed Files changed in the Github PR explorer
  • Added appropriate labels

@turbolent turbolent changed the title Add built-in CCF contract with encode function PoC: Add built-in CCF contract with encode function Oct 22, 2024
@github-actions
Copy link

Cadence Benchstat comparison

This branch with compared with the base branch onflow:master commit 85f46f7
The command for i in {1..N}; do go test ./... -run=XXX -bench=. -benchmem -shuffle=on; done was used.
Bench tests were run a total of 7 times on each branch.

Collapsed results for better readability

@turbolent
Copy link
Member Author

Unfortunately there's currently a cyclic import between encoding/ccf and stdlib at the moment, which we'll need to resolve

@github-actions
Copy link

github-actions bot commented Oct 9, 2025

Benchstat comparison

  • Base branch: onflow:master
  • Base commit: 7510d75
Results

old.txtnew.txt
time/opdelta
pkg:github.com/onflow/cadence/runtime goos:linux goarch:amd64
ContractFunctionInvocation-4394µs ± 0%398µs ± 0%~(p=1.000 n=1+1)
pkg:github.com/onflow/cadence/encoding/ccf goos:linux goarch:amd64
DecodeBatchEventsCCF-4131ms ± 0%131ms ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsJSON-4384ms ± 0%383ms ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.FeesDeducted-42.91µs ± 0%2.92µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.TokensWithdrawn-42.33µs ± 0%2.18µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-42.86µs ± 0%2.87µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-43.21µs ± 0%3.25µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.NewWeeklyPayout-42.18µs ± 0%2.18µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowIDTableStaking.RewardsPaid-42.54µs ± 0%2.55µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensDeposited-42.65µs ± 0%2.62µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensDeposited_with_nil_receiver-42.57µs ± 0%2.55µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensMinted-42.18µs ± 0%2.19µs ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowToken.TokensWithdrawn-42.65µs ± 0%2.62µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowFees.FeesDeducted-49.46µs ± 0%9.46µs ± 0%~(all equal)
DecodeJSON/FlowFees.TokensWithdrawn-45.42µs ± 0%5.45µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-48.59µs ± 0%8.59µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-411.7µs ± 0%11.8µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.NewWeeklyPayout-45.55µs ± 0%5.60µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowIDTableStaking.RewardsPaid-47.21µs ± 0%7.22µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensDeposited-47.57µs ± 0%7.60µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensDeposited_with_nil_receiver-46.86µs ± 0%6.87µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensMinted-45.59µs ± 0%5.53µs ± 0%~(p=1.000 n=1+1)
DecodeJSON/FlowToken.TokensWithdrawn-47.53µs ± 0%7.57µs ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsCCF-487.7ms ± 0%87.0ms ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsJSON-496.5ms ± 0%97.3ms ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.FeesDeducted-41.93µs ± 0%2.04µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.TokensWithdrawn-41.55µs ± 0%1.55µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-41.89µs ± 0%1.87µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-42.16µs ± 0%2.15µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.NewWeeklyPayout-41.62µs ± 0%1.60µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowIDTableStaking.RewardsPaid-41.74µs ± 0%1.72µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensDeposited-41.76µs ± 0%1.74µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensDeposited_with_nil_receiver-41.74µs ± 0%1.75µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensMinted-41.56µs ± 0%1.55µs ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowToken.TokensWithdrawn-41.77µs ± 0%1.76µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowFees.FeesDeducted-42.23µs ± 0%2.23µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowFees.TokensWithdrawn-41.31µs ± 0%1.32µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-42.04µs ± 0%2.04µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-42.77µs ± 0%2.77µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.NewWeeklyPayout-41.33µs ± 0%1.35µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowIDTableStaking.RewardsPaid-41.72µs ± 0%1.73µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensDeposited-41.98µs ± 0%1.99µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensDeposited_with_nil_receiver-41.55µs ± 0%1.56µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensMinted-41.31µs ± 0%1.32µs ± 0%~(p=1.000 n=1+1)
EncodeJSON/FlowToken.TokensWithdrawn-41.96µs ± 0%1.97µs ± 0%~(p=1.000 n=1+1)
pkg:github.com/onflow/cadence/runtime goos:linux goarch:amd64
ExportType/composite_type-4287ns ± 0%288ns ± 0%~(p=1.000 n=1+1)
ExportType/simple_type-478.1ns ± 0%77.9ns ± 0%~(p=1.000 n=1+1)
pkg:github.com/onflow/cadence/interpreter goos:linux goarch:amd64
ImperativeFib-421.0µs ± 0%21.4µs ± 0%~(p=1.000 n=1+1)
InterpretRecursionFib-42.06ms ± 0%2.15ms ± 0%~(p=1.000 n=1+1)
NewInterpreter/new_interpreter-41.02µs ± 0%1.10µs ± 0%~(p=1.000 n=1+1)
NewInterpreter/new_sub-interpreter-4321ns ± 0%327ns ± 0%~(p=1.000 n=1+1)
pkg:github.com/onflow/cadence/runtime goos:linux goarch:amd64
RuntimeFungibleTokenTransferInterpreter-4569µs ± 0%574µs ± 0%~(p=1.000 n=1+1)
RuntimeFungibleTokenTransferVM-4626µs ± 0%624µs ± 0%~(p=1.000 n=1+1)
RuntimeResourceDictionaryValues-42.64ms ± 0%2.62ms ± 0%~(p=1.000 n=1+1)
RuntimeResourceTracking-411.6ms ± 0%11.9ms ± 0%~(p=1.000 n=1+1)
RuntimeScriptNoop-414.8µs ± 0%14.6µs ± 0%~(p=1.000 n=1+1)
RuntimeVMInvokeContractImperativeFib-428.3µs ± 0%28.6µs ± 0%~(p=1.000 n=1+1)
pkg:github.com/onflow/cadence/interpreter goos:linux goarch:amd64
ValueIsSubtypeOfSemaType-477.9ns ± 0%65.0ns ± 0%~(p=1.000 n=1+1)
 
alloc/opdelta
pkg:github.com/onflow/cadence/runtime goos:linux goarch:amd64
ContractFunctionInvocation-4152kB ± 0%153kB ± 0%~(p=1.000 n=1+1)
pkg:github.com/onflow/cadence/encoding/ccf goos:linux goarch:amd64
DecodeBatchEventsCCF-471.5MB ± 0%71.5MB ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsJSON-4243MB ± 0%243MB ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.FeesDeducted-41.50kB ± 0%1.50kB ± 0%~(all equal)
DecodeCCF/FlowFees.TokensWithdrawn-41.31kB ± 0%1.31kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-41.58kB ± 0%1.58kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-41.60kB ± 0%1.60kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.NewWeeklyPayout-41.36kB ± 0%1.36kB ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.RewardsPaid-41.48kB ± 0%1.48kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited-41.42kB ± 0%1.42kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited_with_nil_receiver-41.41kB ± 0%1.41kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensMinted-41.31kB ± 0%1.31kB ± 0%~(all equal)
DecodeCCF/FlowToken.TokensWithdrawn-41.43kB ± 0%1.43kB ± 0%~(all equal)
DecodeJSON/FlowFees.FeesDeducted-45.95kB ± 0%5.95kB ± 0%~(all equal)
DecodeJSON/FlowFees.TokensWithdrawn-43.55kB ± 0%3.55kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-45.40kB ± 0%5.40kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-47.32kB ± 0%7.32kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.NewWeeklyPayout-43.61kB ± 0%3.61kB ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.RewardsPaid-44.50kB ± 0%4.50kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited-44.85kB ± 0%4.85kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited_with_nil_receiver-44.42kB ± 0%4.42kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensMinted-43.57kB ± 0%3.57kB ± 0%~(all equal)
DecodeJSON/FlowToken.TokensWithdrawn-44.85kB ± 0%4.85kB ± 0%~(all equal)
EncodeBatchEventsCCF-465.8MB ± 0%65.8MB ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsJSON-440.7MB ± 0%40.7MB ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.FeesDeducted-41.29kB ± 0%1.29kB ± 0%~(all equal)
EncodeCCF/FlowFees.TokensWithdrawn-41.24kB ± 0%1.24kB ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-41.51kB ± 0%1.51kB ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-41.48kB ± 0%1.48kB ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.NewWeeklyPayout-41.42kB ± 0%1.42kB ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.RewardsPaid-41.50kB ± 0%1.50kB ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited-41.29kB ± 0%1.29kB ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited_with_nil_receiver-41.27kB ± 0%1.27kB ± 0%~(all equal)
EncodeCCF/FlowToken.TokensMinted-41.24kB ± 0%1.24kB ± 0%~(all equal)
EncodeCCF/FlowToken.TokensWithdrawn-41.29kB ± 0%1.29kB ± 0%~(all equal)
EncodeJSON/FlowFees.FeesDeducted-4896B ± 0%896B ± 0%~(all equal)
EncodeJSON/FlowFees.TokensWithdrawn-4536B ± 0%536B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-4920B ± 0%920B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-41.11kB ± 0%1.11kB ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.NewWeeklyPayout-4584B ± 0%584B ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.RewardsPaid-4784B ± 0%784B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited-4808B ± 0%808B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited_with_nil_receiver-4672B ± 0%672B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensMinted-4544B ± 0%544B ± 0%~(all equal)
EncodeJSON/FlowToken.TokensWithdrawn-4800B ± 0%800B ± 0%~(all equal)
pkg:github.com/onflow/cadence/runtime goos:linux goarch:amd64
ExportType/composite_type-4120B ± 0%120B ± 0%~(all equal)
ExportType/simple_type-40.00B 0.00B ~(all equal)
pkg:github.com/onflow/cadence/interpreter goos:linux goarch:amd64
ImperativeFib-48.30kB ± 0%8.30kB ± 0%~(all equal)
InterpretRecursionFib-41.19MB ± 0%1.19MB ± 0%~(p=1.000 n=1+1)
NewInterpreter/new_interpreter-4976B ± 0%976B ± 0%~(all equal)
NewInterpreter/new_sub-interpreter-4232B ± 0%232B ± 0%~(all equal)
pkg:github.com/onflow/cadence/runtime goos:linux goarch:amd64
RuntimeFungibleTokenTransferInterpreter-4155kB ± 0%155kB ± 0%~(p=1.000 n=1+1)
RuntimeFungibleTokenTransferVM-4170kB ± 0%170kB ± 0%~(p=1.000 n=1+1)
RuntimeResourceDictionaryValues-41.76MB ± 0%1.76MB ± 0%~(p=1.000 n=1+1)
RuntimeResourceTracking-49.27MB ± 0%9.26MB ± 0%~(p=1.000 n=1+1)
RuntimeScriptNoop-47.99kB ± 0%7.99kB ± 0%~(p=1.000 n=1+1)
RuntimeVMInvokeContractImperativeFib-410.3kB ± 0%10.3kB ± 0%~(all equal)
pkg:github.com/onflow/cadence/interpreter goos:linux goarch:amd64
ValueIsSubtypeOfSemaType-448.0B ± 0%48.0B ± 0%~(all equal)
 
allocs/opdelta
pkg:github.com/onflow/cadence/runtime goos:linux goarch:amd64
ContractFunctionInvocation-42.47k ± 0%2.49k ± 0%~(p=1.000 n=1+1)
pkg:github.com/onflow/cadence/encoding/ccf goos:linux goarch:amd64
DecodeBatchEventsCCF-41.53M ± 0%1.53M ± 0%~(p=1.000 n=1+1)
DecodeBatchEventsJSON-44.68M ± 0%4.68M ± 0%~(p=1.000 n=1+1)
DecodeCCF/FlowFees.FeesDeducted-431.0 ± 0%31.0 ± 0%~(all equal)
DecodeCCF/FlowFees.TokensWithdrawn-427.0 ± 0%27.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-431.0 ± 0%31.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-433.0 ± 0%33.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.NewWeeklyPayout-427.0 ± 0%27.0 ± 0%~(all equal)
DecodeCCF/FlowIDTableStaking.RewardsPaid-430.0 ± 0%30.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited-432.0 ± 0%32.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensDeposited_with_nil_receiver-430.0 ± 0%30.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensMinted-427.0 ± 0%27.0 ± 0%~(all equal)
DecodeCCF/FlowToken.TokensWithdrawn-432.0 ± 0%32.0 ± 0%~(all equal)
DecodeJSON/FlowFees.FeesDeducted-4125 ± 0%125 ± 0%~(all equal)
DecodeJSON/FlowFees.TokensWithdrawn-470.0 ± 0%70.0 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-4101 ± 0%101 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-4158 ± 0%158 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.NewWeeklyPayout-469.0 ± 0%69.0 ± 0%~(all equal)
DecodeJSON/FlowIDTableStaking.RewardsPaid-486.0 ± 0%86.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited-495.0 ± 0%95.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensDeposited_with_nil_receiver-485.0 ± 0%85.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensMinted-470.0 ± 0%70.0 ± 0%~(all equal)
DecodeJSON/FlowToken.TokensWithdrawn-495.0 ± 0%95.0 ± 0%~(all equal)
EncodeBatchEventsCCF-41.00M ± 0%1.00M ± 0%~(p=1.000 n=1+1)
EncodeBatchEventsJSON-4902k ± 0%902k ± 0%~(p=1.000 n=1+1)
EncodeCCF/FlowFees.FeesDeducted-420.0 ± 0%20.0 ± 0%~(all equal)
EncodeCCF/FlowFees.TokensWithdrawn-420.0 ± 0%20.0 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.DelegatorRewardsPaid-420.0 ± 0%20.0 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.EpochTotalRewardsPaid-420.0 ± 0%20.0 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.NewWeeklyPayout-420.0 ± 0%20.0 ± 0%~(all equal)
EncodeCCF/FlowIDTableStaking.RewardsPaid-420.0 ± 0%20.0 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited-421.0 ± 0%21.0 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensDeposited_with_nil_receiver-421.0 ± 0%21.0 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensMinted-420.0 ± 0%20.0 ± 0%~(all equal)
EncodeCCF/FlowToken.TokensWithdrawn-421.0 ± 0%21.0 ± 0%~(all equal)
EncodeJSON/FlowFees.FeesDeducted-420.0 ± 0%20.0 ± 0%~(all equal)
EncodeJSON/FlowFees.TokensWithdrawn-413.0 ± 0%13.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.DelegatorRewardsPaid-417.0 ± 0%17.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.EpochTotalRewardsPaid-426.0 ± 0%26.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.NewWeeklyPayout-413.0 ± 0%13.0 ± 0%~(all equal)
EncodeJSON/FlowIDTableStaking.RewardsPaid-416.0 ± 0%16.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited-420.0 ± 0%20.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensDeposited_with_nil_receiver-415.0 ± 0%15.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensMinted-414.0 ± 0%14.0 ± 0%~(all equal)
EncodeJSON/FlowToken.TokensWithdrawn-419.0 ± 0%19.0 ± 0%~(all equal)
pkg:github.com/onflow/cadence/runtime goos:linux goarch:amd64
ExportType/composite_type-43.00 ± 0%3.00 ± 0%~(all equal)
ExportType/simple_type-40.00 0.00 ~(all equal)
pkg:github.com/onflow/cadence/interpreter goos:linux goarch:amd64
ImperativeFib-4176 ± 0%176 ± 0%~(all equal)
InterpretRecursionFib-417.7k ± 0%17.7k ± 0%~(all equal)
NewInterpreter/new_interpreter-415.0 ± 0%15.0 ± 0%~(all equal)
NewInterpreter/new_sub-interpreter-44.00 ± 0%4.00 ± 0%~(all equal)
pkg:github.com/onflow/cadence/runtime goos:linux goarch:amd64
RuntimeFungibleTokenTransferInterpreter-42.93k ± 0%2.93k ± 0%~(all equal)
RuntimeFungibleTokenTransferVM-43.03k ± 0%3.03k ± 0%~(all equal)
RuntimeResourceDictionaryValues-436.7k ± 0%36.7k ± 0%~(p=1.000 n=1+1)
RuntimeResourceTracking-4159k ± 0%159k ± 0%~(p=1.000 n=1+1)
RuntimeScriptNoop-4113 ± 0%113 ± 0%~(all equal)
RuntimeVMInvokeContractImperativeFib-4213 ± 0%213 ± 0%~(all equal)
pkg:github.com/onflow/cadence/interpreter goos:linux goarch:amd64
ValueIsSubtypeOfSemaType-41.00 ± 0%1.00 ± 0%~(all equal)
 

@turbolent turbolent changed the title PoC: Add built-in CCF contract with encode function Add built-in CCF contract with encode function Oct 9, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants