diff --git a/go.mod b/go.mod index ab6bae6c2..95b090d43 100644 --- a/go.mod +++ b/go.mod @@ -13,18 +13,18 @@ require ( github.com/gosuri/uilive v0.0.4 github.com/logrusorgru/aurora/v4 v4.0.0 github.com/onflow/cadence v1.8.3 - github.com/onflow/cadence-tools/languageserver v1.7.2 - github.com/onflow/cadence-tools/lint v1.6.1 - github.com/onflow/cadence-tools/test v1.8.1 + github.com/onflow/cadence-tools/languageserver v1.7.3 + github.com/onflow/cadence-tools/lint v1.6.2 + github.com/onflow/cadence-tools/test v1.9.1 github.com/onflow/fcl-dev-wallet v0.8.0 - github.com/onflow/flixkit-go/v2 v2.6.1 + github.com/onflow/flixkit-go/v2 v2.6.2 github.com/onflow/flow-core-contracts/lib/go/templates v1.9.2 - github.com/onflow/flow-emulator v1.12.0 - github.com/onflow/flow-evm-gateway v1.3.6 - github.com/onflow/flow-go v0.44.0-experimental-cadence-v1.8.3.0.20251107135716-b259c922f498 - github.com/onflow/flow-go-sdk v1.9.2 + github.com/onflow/flow-emulator v1.13.0 + github.com/onflow/flow-evm-gateway v1.4.0 + github.com/onflow/flow-go v0.44.0-experimental-cadence-v1.8.3.0.20251117184523-ab0655178589 + github.com/onflow/flow-go-sdk v1.9.3 github.com/onflow/flow/protobuf/go/flow v0.4.18 - github.com/onflow/flowkit/v2 v2.7.2 + github.com/onflow/flowkit/v2 v2.8.0 github.com/onflowser/flowser/v3 v3.2.1-0.20240131200229-7d4d22715f48 github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c github.com/pkg/errors v0.9.1 @@ -42,13 +42,13 @@ require ( ) require ( - cloud.google.com/go v0.120.0 // indirect + cloud.google.com/go v0.121.6 // indirect cloud.google.com/go/auth v0.16.4 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.8.0 // indirect - cloud.google.com/go/iam v1.5.2 // indirect - cloud.google.com/go/kms v1.23.1 // indirect - cloud.google.com/go/longrunning v0.6.7 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/kms v1.23.2 // indirect + cloud.google.com/go/longrunning v0.7.0 // indirect github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect @@ -280,21 +280,21 @@ require ( go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.41.0 // indirect - golang.org/x/net v0.43.0 // indirect + golang.org/x/crypto v0.42.0 // indirect + golang.org/x/net v0.44.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.16.0 // indirect + golang.org/x/sync v0.17.0 // indirect golang.org/x/sys v0.37.0 // indirect - golang.org/x/text v0.28.0 // indirect + golang.org/x/text v0.29.0 // indirect golang.org/x/time v0.12.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.16.0 // indirect google.golang.org/api v0.247.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a // indirect - google.golang.org/protobuf v1.36.9 // indirect + google.golang.org/genproto v0.0.0-20251111163417-95abcf5c77ba // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251103181224-f26f9409b101 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.4.1 // indirect diff --git a/go.sum b/go.sum index 381ba58b8..9164e135c 100644 --- a/go.sum +++ b/go.sum @@ -2,24 +2,24 @@ cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= -cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= +cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c= +cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI= cloud.google.com/go/auth v0.16.4 h1:fXOAIQmkApVvcIn7Pc2+5J8QTMVbUGLscnSVNl11su8= cloud.google.com/go/auth v0.16.4/go.mod h1:j10ncYwjX/g3cdX7GpEzsdM+d+ZNsXAbb6qXA7p1Y5M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA= cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= -cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= -cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= -cloud.google.com/go/kms v1.23.1 h1:Mesyv84WoP3tPjUC0O5LRqPWICO0ufdpWf9jtBCEz64= -cloud.google.com/go/kms v1.23.1/go.mod h1:rZ5kK0I7Kn9W4erhYVoIRPtpizjunlrfU4fUkumUp8g= -cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= -cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= -cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= -cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= -cloud.google.com/go/storage v1.50.0 h1:3TbVkzTooBvnZsk7WaAQfOsNrdoM8QHusXA1cpk6QJs= -cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/kms v1.23.2 h1:4IYDQL5hG4L+HzJBhzejUySoUOheh3Lk5YT4PCyyW6k= +cloud.google.com/go/kms v1.23.2/go.mod h1:rZ5kK0I7Kn9W4erhYVoIRPtpizjunlrfU4fUkumUp8g= +cloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E= +cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/storage v1.56.0 h1:iixmq2Fse2tqxMbWhLWC9HfBj1qdxqAmiK8/eqtsLxI= +cloud.google.com/go/storage v1.56.0/go.mod h1:Tpuj6t4NweCLzlNbw9Z9iwxEkrSem20AetIeH/shgVU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -31,10 +31,10 @@ github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69m github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 h1:5IT7xOdq17MtcdtL/vtl6mGfzhaq4m4vpollPRmlsBQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 h1:ig/FpDD2JofP/NExKQUbn7uOSZzJAQqogfqluZK4ed4= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 h1:Ron4zCA/yk6U7WOBXhTJcDpsUBG9npumK6xw2auFltQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= @@ -74,20 +74,20 @@ github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.39.3 h1:h7xSsanJ4EQJXG5iuW4UqgP7qBopLpj84mpkNx3wPjM= -github.com/aws/aws-sdk-go-v2 v1.39.3/go.mod h1:yWSxrnioGUZ4WVv9TgMrNUeLV3PFESn/v+6T/Su8gnM= +github.com/aws/aws-sdk-go-v2 v1.39.6 h1:2JrPCVgWJm7bm83BDwY5z8ietmeJUbh3O2ACnn+Xsqk= +github.com/aws/aws-sdk-go-v2 v1.39.6/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.5.1 h1:VGkV9KmhGqOQWnHyi4gLG98kE6OecT42fdrCGFWxJsc= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.5.1/go.mod h1:PLlnMiki//sGnCJiW+aVpvP/C8Kcm8mEj/IVm9+9qk4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 h1:xtuxji5CS0JknaXoACOunXOYOQzgfTvGAc9s2QdCJA4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2/go.mod h1:zxwi0DIR0rcRcgdbl7E2MSOvxDyyXGBlScvBkARFaLQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.10 h1:DRND0dkCKtJzCj4Xl4OpVbXZgfttY5q712H9Zj7qc/0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.10/go.mod h1:tGGNmJKOTernmR2+VJ0fCzQRurcPZj9ut60Zu5Fi6us= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 h1:x2Ibm/Af8Fi+BH+Hsn9TXGdT+hKbDd5XOTZxTMxDk7o= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3/go.mod h1:IW1jwyrQgMdhisceG8fQLmQIydcT/jWY21rFhzgaKwo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 h1:kDqdFvMY4AtKoACfzIGD8A0+hbT41KTKF//gq7jITfM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13/go.mod h1:lmKuogqSU3HzQCwZ9ZtcqOc5XGMqtDK7OIc2+DxiUEg= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.0 h1:HWsM0YQWX76V6MOp07YuTYacm8k7h69ObJuw7Nck+og= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.0/go.mod h1:LKb3cKNQIMh+itGnEpKGcnL/6OIjPZqrtYah1w5f+3o= github.com/aws/aws-sdk-go-v2/service/s3 v1.15.0 h1:nPLfLPfglacc29Y949sDxpr3X/blaY40s3B85WT2yZU= github.com/aws/aws-sdk-go-v2/service/s3 v1.15.0/go.mod h1:Iv2aJVtVSm/D22rFoX99cLG4q4uB7tppuCsulGe98k4= -github.com/aws/smithy-go v1.23.1 h1:sLvcH6dfAFwGkHLZ7dGiYF7aK6mg4CgKA/iDKjLDt9M= -github.com/aws/smithy-go v1.23.1/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= +github.com/aws/smithy-go v1.23.2 h1:Crv0eatJUQhaManss33hS5r40CG3ZFH+21XSkqMrIUM= +github.com/aws/smithy-go v1.23.2/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= @@ -776,46 +776,46 @@ github.com/onflow/atree v0.11.0 h1:NrGHb7l3pKvFPFAdYfEyezg6D7xBNcMSwQHliOHtZug= github.com/onflow/atree v0.11.0/go.mod h1:uZE/bzDfMLXJH9BYL8HxNisw9pHZGyc+mDLuSMeUAVY= github.com/onflow/cadence v1.8.3 h1:rYPYa7wbstmX9BpMLC0eMx6r8y1qnVBHNw+k8baLRqg= github.com/onflow/cadence v1.8.3/go.mod h1:08FmLMsBjhRTgE9tmiSJjFNJrjcuTUawQFFUQq8J1Y4= -github.com/onflow/cadence-tools/languageserver v1.7.2 h1:QXEoLZ7OtXtWdByjZaQ4RmPEy0+TGJdSV4I0v+U6alU= -github.com/onflow/cadence-tools/languageserver v1.7.2/go.mod h1:PCSG29+3y/o19T3cs0AV4LUo96xbaBVnq48vSQM4/wc= -github.com/onflow/cadence-tools/lint v1.6.1 h1:sPs95TJg9EhNCTrfMi91zBq8EJTiGuAlKGn93si0si4= -github.com/onflow/cadence-tools/lint v1.6.1/go.mod h1:rkOcY5JaMFiExdcyUdrampYiJW60d7HCUvXofJ9RBjs= -github.com/onflow/cadence-tools/test v1.8.1 h1:8KdHBJeigQjfczd2T4Oz5GV++UbiEmGEglWsvVUQjdA= -github.com/onflow/cadence-tools/test v1.8.1/go.mod h1:UrCjvxdFEi4oFxfUNl4Zo3iB0kU01PF2lN/mxNIcBz4= +github.com/onflow/cadence-tools/languageserver v1.7.3 h1:oxQb6xgp8mu7FfR1mnjRR15TlCAXLGEWnsifVitJZgM= +github.com/onflow/cadence-tools/languageserver v1.7.3/go.mod h1:6ObZ+TYpSRc4/2QQ9d3nnhBJUW6uYkEFGiNOSpu8isQ= +github.com/onflow/cadence-tools/lint v1.6.2 h1:OchxTNYDweXOz+jXC6jwlait6A+q+bi2qbGuAwxG0zs= +github.com/onflow/cadence-tools/lint v1.6.2/go.mod h1:PhWogxo1yxtwUiW228+G7+7x4TwPgdapVbeLG/137ok= +github.com/onflow/cadence-tools/test v1.9.1 h1:hyR37++F6qoyBO5jxKdmAffGgnVGBdWyhJkBZu+C6rQ= +github.com/onflow/cadence-tools/test v1.9.1/go.mod h1:G4CJUVUPWVw1G+El6RIO2bxgJ+KdMbwIfKtyssOQuwQ= github.com/onflow/crypto v0.25.3 h1:XQ3HtLsw8h1+pBN+NQ1JYM9mS2mVXTyg55OldaAIF7U= github.com/onflow/crypto v0.25.3/go.mod h1:+1igaXiK6Tjm9wQOBD1EGwW7bYWMUGKtwKJ/2QL/OWs= github.com/onflow/fcl-dev-wallet v0.8.0 h1:8TWHhJBWrzS6RCZI3eVjRT+SaUBqO6eygUNDaJV/B7s= github.com/onflow/fcl-dev-wallet v0.8.0/go.mod h1:kc42jkiuoPJmxMRFjfbRO9XvnR/3XLheaOerxVMDTiw= github.com/onflow/fixed-point v0.1.1 h1:j0jYZVO8VGyk1476alGudEg7XqCkeTVxb5ElRJRKS90= github.com/onflow/fixed-point v0.1.1/go.mod h1:gJdoHqKtToKdOZbvryJvDZfcpzC7d2fyWuo3ZmLtcGY= -github.com/onflow/flixkit-go/v2 v2.6.1 h1:faVs3JjEkYiKSFhiZXKSY0F7QAiy4tFBtfa6Jy03xHc= -github.com/onflow/flixkit-go/v2 v2.6.1/go.mod h1:ln5woebIbjgGE35BWnXfrexn2sJT7jsW/GK6MR6kPP8= +github.com/onflow/flixkit-go/v2 v2.6.2 h1:zCE0z7h0t3QB1i0suj71h3yPfSCsasAbZGw7LzYC/T0= +github.com/onflow/flixkit-go/v2 v2.6.2/go.mod h1:4PlH0RJrwWKXnk7kvIET9QRIQOko4d1YTlKAw30EGHk= github.com/onflow/flow-core-contracts/lib/go/contracts v1.9.2 h1:mkd1NSv74+OnCHwrFqI2c5VETS1j06xf0ZuOto7gMio= github.com/onflow/flow-core-contracts/lib/go/contracts v1.9.2/go.mod h1:jBDqVep0ICzhXky56YlyO4aiV2Jl/5r7wnqUPpvi7zE= github.com/onflow/flow-core-contracts/lib/go/templates v1.9.2 h1:semxeVLwC6xFG1G/7egUmaf7F1C8eBnc7NxNTVfBHTs= github.com/onflow/flow-core-contracts/lib/go/templates v1.9.2/go.mod h1:twSVyUt3rNrgzAmxtBX+1Gw64QlPemy17cyvnXYy1Ug= -github.com/onflow/flow-emulator v1.12.0 h1:MEko7tm4eYeO0D2MYtB6ebtx8JSOWI3nF+jVTAlY/fs= -github.com/onflow/flow-emulator v1.12.0/go.mod h1:d8LWGVVKAdNpQX0yuF7MzDv12QX0Bikj0T53X48mJ84= +github.com/onflow/flow-emulator v1.13.0 h1:L7BUrOLwZbkQKLz9RpIW+x+LRcsgQWtnVdBi7urR8mk= +github.com/onflow/flow-emulator v1.13.0/go.mod h1:SeDEuIxCNb7zB3fInjtCzirps3BoLxPrsYCZOzWGK2A= github.com/onflow/flow-evm-bridge v0.1.0 h1:7X2osvo4NnQgHj8aERUmbYtv9FateX8liotoLnPL9nM= github.com/onflow/flow-evm-bridge v0.1.0/go.mod h1:5UYwsnu6WcBNrwitGFxphCl5yq7fbWYGYuiCSTVF6pk= -github.com/onflow/flow-evm-gateway v1.3.6 h1:eSAg3PS3S56d9MDe8oFhw3Dt8dJLQSldYJb2pq3043k= -github.com/onflow/flow-evm-gateway v1.3.6/go.mod h1:b5A4WrwvMfojzdHZ/lr65GJ3nUhKQu2uaDJKP0i71hM= +github.com/onflow/flow-evm-gateway v1.4.0 h1:NsCNPbFq9N77HsXTp9nyj4OwmLJAQ3FqqkxqwuhB69M= +github.com/onflow/flow-evm-gateway v1.4.0/go.mod h1:EM+JTh4m8547pa9rjp1H2AZK2N8U/nYsl+cvPwM72nc= github.com/onflow/flow-ft/lib/go/contracts v1.0.1 h1:Ts5ob+CoCY2EjEd0W6vdLJ7hLL3SsEftzXG2JlmSe24= github.com/onflow/flow-ft/lib/go/contracts v1.0.1/go.mod h1:PwsL8fC81cjnUnTfmyL/HOIyHnyaw/JA474Wfj2tl6A= github.com/onflow/flow-ft/lib/go/templates v1.0.1 h1:FDYKAiGowABtoMNusLuRCILIZDtVqJ/5tYI4VkF5zfM= github.com/onflow/flow-ft/lib/go/templates v1.0.1/go.mod h1:uQ8XFqmMK2jxyBSVrmyuwdWjTEb+6zGjRYotfDJ5pAE= -github.com/onflow/flow-go v0.44.0-experimental-cadence-v1.8.3.0.20251107135716-b259c922f498 h1:CRNu7G4DxkylyJSzN5lp5AwTkNYvNETBxsOn5Hea4ME= -github.com/onflow/flow-go v0.44.0-experimental-cadence-v1.8.3.0.20251107135716-b259c922f498/go.mod h1:4A34mlMMd7usjw7e0r4VrltFpZRjhYkV+T+iecTbzO0= -github.com/onflow/flow-go-sdk v1.9.2 h1:kMw3qShgLNIASHGMgoY+faTBQ+1MnzsNLAH+oxy9eiY= -github.com/onflow/flow-go-sdk v1.9.2/go.mod h1:qVuzMGXNJBMktKnIDKLjV0/k21P2XD39dOfMW+X5Bsc= +github.com/onflow/flow-go v0.44.0-experimental-cadence-v1.8.3.0.20251117184523-ab0655178589 h1:EqsUfh8MW4vOdWfXc1D8kKr4VBhRKsqeNCBeEWbw5Ew= +github.com/onflow/flow-go v0.44.0-experimental-cadence-v1.8.3.0.20251117184523-ab0655178589/go.mod h1:4A34mlMMd7usjw7e0r4VrltFpZRjhYkV+T+iecTbzO0= +github.com/onflow/flow-go-sdk v1.9.3 h1:VaJaZUJdcjdBBdRV0GmzzCBzgt9EUCJfqnVffdwaY0w= +github.com/onflow/flow-go-sdk v1.9.3/go.mod h1:HJRNJAMN+EkrdvJHB4cek2SwMFF5g66bKu071kZ1rIE= github.com/onflow/flow-nft/lib/go/contracts v1.3.0 h1:DmNop+O0EMyicZvhgdWboFG57xz5t9Qp81FKlfKyqJc= github.com/onflow/flow-nft/lib/go/contracts v1.3.0/go.mod h1:eZ9VMMNfCq0ho6kV25xJn1kXeCfxnkhj3MwF3ed08gY= github.com/onflow/flow-nft/lib/go/templates v1.3.0 h1:uGIBy4GEY6Z9hKP7sm5nA5kwvbvLWW4nWx5NN9Wg0II= github.com/onflow/flow-nft/lib/go/templates v1.3.0/go.mod h1:gVbb5fElaOwKhV5UEUjM+JQTjlsguHg2jwRupfM/nng= github.com/onflow/flow/protobuf/go/flow v0.4.18 h1:KOujA6lg9kTXCV6oK0eErD1rwRnM9taKZss3Szi+T3Q= github.com/onflow/flow/protobuf/go/flow v0.4.18/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= -github.com/onflow/flowkit/v2 v2.7.2 h1:64Vikm3jSPTFE8W9uRMJHWF40DxYa1xiYYbN28/t8Es= -github.com/onflow/flowkit/v2 v2.7.2/go.mod h1:WHwzxuFaPU3mO+iGegAdHQH06KOCZ47EvM+bh2wq5Qs= +github.com/onflow/flowkit/v2 v2.8.0 h1:9UJ3puPhu6RM6Fm1pvJorP9H1SNrAcN8W2fW1XYQLD4= +github.com/onflow/flowkit/v2 v2.8.0/go.mod h1:y+TCVk5wwIwvqgtdy4KZiVUPT878Vl2qAhG018gd+KM= github.com/onflow/go-ethereum v1.15.10 h1:blZBeOLJDOVWqKuhkkMh6S2PKQAJvdgbvOL9ZNggFcU= github.com/onflow/go-ethereum v1.15.10/go.mod h1:t2nZJtwruVjA5u5yEK8InFzjImFLHrF7ak2bw3E4LDM= github.com/onflow/nft-storefront/lib/go/contracts v1.0.0 h1:sxyWLqGm/p4EKT6DUlQESDG1ZNMN9GjPCm1gTq7NGfc= @@ -1222,8 +1222,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= +golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= @@ -1280,8 +1280,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= +golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= @@ -1296,8 +1296,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1378,8 +1378,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1432,14 +1432,14 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= -google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= -google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c h1:AtEkQdl5b6zsybXcbz00j1LwNodDuH6hVifIaNqk7NQ= -google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c/go.mod h1:ea2MjsO70ssTfCjiwHgI0ZFqcw45Ksuk2ckf9G468GA= +google.golang.org/genproto v0.0.0-20251111163417-95abcf5c77ba h1:Ze6qXW0j37YCqZdCD2LkzVSxgEWez0cO4NUyd44DiDY= +google.golang.org/genproto v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:4FLPzLA8eGAktPOTemJGDgDYRpLYwrNu4u2JtWINhnI= +google.golang.org/genproto/googleapis/api v0.0.0-20251103181224-f26f9409b101 h1:vk5TfqZHNn0obhPIYeS+cxIFKFQgser/M2jnI+9c6MM= +google.golang.org/genproto/googleapis/api v0.0.0-20251103181224-f26f9409b101/go.mod h1:E17fc4PDhkr22dE3RgnH2hEubUaky6ZwW4VhANxyspg= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250804133106-a7a43d27e69b h1:YzmLjVBzUKrr0zPM1KkGPEicd3WHSccw1k9RivnvngU= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a h1:tPE/Kp+x9dMSwUm/uM0JKK0IfdiJkwAbSMSeZBXXJXc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 h1:tRPGkdGHuewF4UisLzzHHr1spKw92qLM98nIzxbC0wY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1467,8 +1467,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/super/generator/templates/README_defi_actions.md.tmpl b/internal/super/generator/templates/README_defi_actions.md.tmpl index d7e692572..bbaa9d844 100644 --- a/internal/super/generator/templates/README_defi_actions.md.tmpl +++ b/internal/super/generator/templates/README_defi_actions.md.tmpl @@ -55,7 +55,6 @@ flow project deploy --network emulator ``` This deploys all required contracts to the emulator: -- `DeFiActionsMathUtils` - Math utilities for DeFi Actions - `DeFiActionsUtils` - Helper utilities for DeFi Actions - `DeFiActions` - Core DeFi Actions framework - `ExampleConnectors` - Your TokenSink connector @@ -75,19 +74,42 @@ This sends `1.0` FLOW from the emulator account to itself (`0xf8d6e0586b0a20c7`) ## Testing -Run the test suite to verify the connector works correctly: +This project includes two types of tests to demonstrate different testing approaches: + +### Unit Tests + +Run the test suite: ```bash -flow test +flow test cadence/tests/ExampleConnectors_test.cdc ``` -The tests run in an isolated environment and automatically: -1. Deploy all DeFi Actions dependencies (`DeFiActionsMathUtils`, `DeFiActionsUtils`, `DeFiActions`) -2. Deploy the `ExampleConnectors` contract -3. Execute the `DepositViaSink` transaction -4. Verify tokens are deposited successfully +This test runs in the Cadence Testing Framework and manually: +1. Deploys all DeFi Actions dependencies (`DeFiActionsUtils`, `DeFiActions`) +2. Deploys the `ExampleConnectors` contract +3. Executes the `DepositViaSink` transaction +4. Verifies tokens are deposited successfully + +**Note**: The testing framework manages its own test environment - no emulator needs to be running. + +### Fork Testing + +This project includes a fork test (`test_incrementfi_swap_on_fork.cdc`) that demonstrates testing your contracts against real mainnet state. Fork testing allows you to: + +- Test interactions with production DeFi protocols (like IncrementFi) +- Validate your connectors against real deployed contracts +- Use actual mainnet account data without deploying anything +- Debug issues with historical blockchain state -**Note**: Tests don't require the emulator to be running - they use their own test environment. +Run the fork test against mainnet: + +```bash +flow test cadence/tests/test_incrementfi_swap_on_fork.cdc +``` + +The fork test executes a real swap from FLOW → stFlow using IncrementFi's deployed contracts on mainnet. It uses account impersonation to test transactions as any mainnet account, with all changes happening locally in your test environment. + +**Learn more**: See the [Fork Testing Tutorial](https://developers.flow.com/blockchain-development-tutorials/cadence/fork-testing) and [Testing Strategy Guide](https://developers.flow.com/build/cadence/smart-contracts/testing-strategy) for detailed information on when and how to use fork testing. ## Project Structure @@ -95,8 +117,10 @@ The tests run in an isolated environment and automatically: - `ExampleConnectors.cdc` - TokenSink connector implementation - `cadence/transactions/` - Transaction files - `DepositViaSink.cdc` - Example transaction using TokenSink + - `incrementfi_swap.cdc` - IncrementFi swap transaction - `cadence/tests/` - Test files - `ExampleConnectors_test.cdc` - Integration test for TokenSink + - `test_incrementfi_swap_on_fork.cdc` - Fork test against mainnet IncrementFi - `flow.json` - Flow project configuration with DeFiActions dependencies ## Dependencies @@ -110,11 +134,15 @@ This project includes the following dependencies (already installed): **DeFi Actions Framework:** - `DeFiActions` - Core framework for composable DeFi connectors - `DeFiActionsUtils` - Helper utilities -- `DeFiActionsMathUtils` - Math utilities for DeFi operations + +**DeFi Protocol Dependencies:** +- `stFlowToken` - Liquid staking token (used in fork test example) +- `SwapConfig` - IncrementFi swap configuration utilities +- `IncrementFiSwapConnectors` - IncrementFi swap connectors (used in fork test example) **Network Configuration:** -- **Testnet**: All DeFi Actions contracts available at `0x4c2ff9dd03ab442f` -- **Mainnet**: All DeFi Actions contracts available at `0x92195d814edf9cb0` +- **Testnet**: DeFi Actions contracts at `0x0b11b1848a8aa2c0`, IncrementFi at `0x494536c102537e1e` +- **Mainnet**: DeFi Actions contracts at `0x6d888f175c158410`, IncrementFi at `0xe844c7cf7430a77c` - **Emulator**: Contracts are deployed from source to your emulator account ## Understanding the TokenSink Connector diff --git a/internal/super/generator/templates/contract_example_connectors_test.cdc.tmpl b/internal/super/generator/templates/contract_example_connectors_test.cdc.tmpl index 3bab4e7f7..efe6c35e1 100644 --- a/internal/super/generator/templates/contract_example_connectors_test.cdc.tmpl +++ b/internal/super/generator/templates/contract_example_connectors_test.cdc.tmpl @@ -9,23 +9,18 @@ access(all) let recipient = Test.createAccount() access(all) fun setup() { // Deploy DeFi Actions dependencies first + // Note: The Cadence Test Framework requires manual deployment of dependencies + // unless used in Fork Testing mode. var err = Test.deployContract( - name: "DeFiActionsMathUtils", - path: "../../imports/92195d814edf9cb0/DeFiActionsMathUtils.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - - err = Test.deployContract( name: "DeFiActionsUtils", - path: "../../imports/92195d814edf9cb0/DeFiActionsUtils.cdc", + path: "../../imports/6d888f175c158410/DeFiActionsUtils.cdc", arguments: [] ) Test.expect(err, Test.beNil()) err = Test.deployContract( name: "DeFiActions", - path: "../../imports/92195d814edf9cb0/DeFiActions.cdc", + path: "../../imports/6d888f175c158410/DeFiActions.cdc", arguments: [] ) Test.expect(err, Test.beNil()) diff --git a/internal/super/generator/templates/test_incrementfi_swap_on_fork.cdc.tmpl b/internal/super/generator/templates/test_incrementfi_swap_on_fork.cdc.tmpl new file mode 100644 index 000000000..07254c1f0 --- /dev/null +++ b/internal/super/generator/templates/test_incrementfi_swap_on_fork.cdc.tmpl @@ -0,0 +1,51 @@ +// Fork Testing Example +// +// The #test_fork pragma configures this test to run against a snapshot of mainnet state. +// This allows testing against real deployed contracts and production data without deploying +// anything to a live network. All mutations happen locally in your test environment. +// +// To run this test: flow test cadence/tests/test_incrementfi_swap_on_fork.cdc +// +// Learn more about fork testing in the README.md file or at: +// https://developers.flow.com/blockchain-development-tutorials/cadence/fork-testing +#test_fork(network: "mainnet", height: nil) + +import Test +import "DeFiActions" +import "FlowToken" +import "stFlowToken" + +// Executes a minimal swap from FLOW -> stFlow using IncrementFi on a forked mainnet. +// Withdraws a tiny amount from a known FLOW holder and swaps via IncrementFi router. +access(all) fun testIncrementFi_SwapOnFork() { + // Arbitrary mainnet account that has FLOW balance and vaults already setup + // Fork testing allows impersonating any mainnet account for testing + let HOLDER = Test.getAccount(0x42a06f24a1049154) + let AMOUNT_IN: UFix64 = 0.001 + + let txCode = Test.readFile("../transactions/incrementfi_swap.cdc") + + // Define vault types for FLOW -> stFlow swap + let flowVaultType = Type<@FlowToken.Vault>() + let stFlowVaultType = Type<@stFlowToken.Vault>() + + let res = Test.executeTransaction( + Test.Transaction( + code: txCode, + authorizers: [HOLDER.address], + signers: [HOLDER], + arguments: [AMOUNT_IN, flowVaultType, stFlowVaultType] + ) + ) + + Test.expect(res, Test.beSucceeded()) + + // Log all swap events emitted during the transaction + let swapEvents = Test.eventsOfType(Type()) + log("Swap events:") + for event in swapEvents { + log(event) + } +} + + diff --git a/internal/super/generator/templates/transaction_incrementfi_swap.cdc.tmpl b/internal/super/generator/templates/transaction_incrementfi_swap.cdc.tmpl new file mode 100644 index 000000000..f1f337c31 --- /dev/null +++ b/internal/super/generator/templates/transaction_incrementfi_swap.cdc.tmpl @@ -0,0 +1,42 @@ +// Transaction to swap tokens using IncrementFi's DeFi Actions connector. +// This demonstrates using IncrementFi's Swapper connector to execute a token swap. +// +// Arguments: +// - amountIn: The amount of input tokens to swap +// - inVaultType: The vault type for the input token (e.g., Type<@FlowToken.Vault>()) +// - outVaultType: The vault type for the output token (e.g., Type<@stFlowToken.Vault>()) +// +// This transaction is used by the fork test to demonstrate real DeFi protocol integration. + +import "DeFiActions" +import "FungibleToken" +import "FlowToken" +import "IncrementFiSwapConnectors" +import "SwapConfig" + +transaction(amountIn: UFix64, inVaultType: Type, outVaultType: Type) { + prepare(acct: auth(BorrowValue) &Account) { + let opID = DeFiActions.createUniqueIdentifier() + + // Construct swap path from vault types + let swapPath = [ + SwapConfig.SliceTokenTypeIdentifierFromVaultType(vaultTypeIdentifier: inVaultType.identifier), + SwapConfig.SliceTokenTypeIdentifierFromVaultType(vaultTypeIdentifier: outVaultType.identifier) + ] + + let swapper = IncrementFiSwapConnectors.Swapper( + path: swapPath, + inVault: inVaultType, + outVault: outVaultType, + uniqueID: opID + ) + let flowVaultRef = acct.storage.borrow(from: /storage/flowTokenVault) + ?? panic("Holder missing FlowToken vault") + let payment <- flowVaultRef.withdraw(amount: amountIn) + let out <- swapper.swap(quote: nil, inVault: <-payment) + assert(out.balance > 0.0, message: "Expected positive output") + destroy out + } +} + + diff --git a/internal/super/projecttypes.go b/internal/super/projecttypes.go index 09d2dced4..1dd9137a0 100644 --- a/internal/super/projecttypes.go +++ b/internal/super/projecttypes.go @@ -124,73 +124,72 @@ func getProjectTypeConfigs() map[ProjectType]*ProjectTypeConfig { CoreContracts: []string{"FungibleToken", "FlowToken"}, CustomDependencies: []flowkitConfig.Dependency{ { - Name: "DeFiActionsMathUtils", + Name: "DeFiActionsUtils", Source: flowkitConfig.Source{ NetworkName: flowkitConfig.MainnetNetwork.Name, - Address: flowsdk.HexToAddress("92195d814edf9cb0"), - ContractName: "DeFiActionsMathUtils", + Address: flowsdk.HexToAddress("6d888f175c158410"), + ContractName: "DeFiActionsUtils", }, Aliases: flowkitConfig.Aliases{ - { - Network: "mainnet", - Address: flowsdk.HexToAddress("92195d814edf9cb0"), - }, - { - Network: "testnet", - Address: flowsdk.HexToAddress("4c2ff9dd03ab442f"), - }, - { - Network: "testing", - Address: flowsdk.HexToAddress("0000000000000006"), - }, + {Network: "mainnet", Address: flowsdk.HexToAddress("6d888f175c158410")}, + {Network: "testnet", Address: flowsdk.HexToAddress("0b11b1848a8aa2c0")}, + {Network: "testing", Address: flowsdk.HexToAddress("0000000000000007")}, }, }, { - Name: "DeFiActionsUtils", + Name: "DeFiActions", Source: flowkitConfig.Source{ NetworkName: flowkitConfig.MainnetNetwork.Name, - Address: flowsdk.HexToAddress("92195d814edf9cb0"), - ContractName: "DeFiActionsUtils", + Address: flowsdk.HexToAddress("6d888f175c158410"), + ContractName: "DeFiActions", }, Aliases: flowkitConfig.Aliases{ - { - Network: "mainnet", - Address: flowsdk.HexToAddress("92195d814edf9cb0"), - }, - { - Network: "testnet", - Address: flowsdk.HexToAddress("4c2ff9dd03ab442f"), - }, - { - Network: "testing", - Address: flowsdk.HexToAddress("0000000000000006"), - }, + {Network: "mainnet", Address: flowsdk.HexToAddress("6d888f175c158410")}, + {Network: "testnet", Address: flowsdk.HexToAddress("0b11b1848a8aa2c0")}, + {Network: "testing", Address: flowsdk.HexToAddress("0000000000000007")}, }, }, { - Name: "DeFiActions", + Name: "stFlowToken", Source: flowkitConfig.Source{ NetworkName: flowkitConfig.MainnetNetwork.Name, - Address: flowsdk.HexToAddress("92195d814edf9cb0"), - ContractName: "DeFiActions", + Address: flowsdk.HexToAddress("d6f80565193ad727"), + ContractName: "stFlowToken", }, Aliases: flowkitConfig.Aliases{ - { - Network: "mainnet", - Address: flowsdk.HexToAddress("92195d814edf9cb0"), - }, - { - Network: "testnet", - Address: flowsdk.HexToAddress("4c2ff9dd03ab442f"), - }, - { - Network: "testing", - Address: flowsdk.HexToAddress("0000000000000006"), - }, + {Network: "mainnet", Address: flowsdk.HexToAddress("d6f80565193ad727")}, + {Network: "testnet", Address: flowsdk.HexToAddress("7c11edb826692404")}, + {Network: "testing", Address: flowsdk.HexToAddress("0000000000000008")}, + }, + }, + { + Name: "SwapConfig", + Source: flowkitConfig.Source{ + NetworkName: flowkitConfig.MainnetNetwork.Name, + Address: flowsdk.HexToAddress("b78ef7afa52ff906"), + ContractName: "SwapConfig", + }, + Aliases: flowkitConfig.Aliases{ + {Network: "mainnet", Address: flowsdk.HexToAddress("b78ef7afa52ff906")}, + {Network: "testnet", Address: flowsdk.HexToAddress("b063c16cac85dbd1")}, + {Network: "testing", Address: flowsdk.HexToAddress("0000000000000009")}, + }, + }, + { + Name: "IncrementFiSwapConnectors", + Source: flowkitConfig.Source{ + NetworkName: flowkitConfig.MainnetNetwork.Name, + Address: flowsdk.HexToAddress("e844c7cf7430a77c"), + ContractName: "IncrementFiSwapConnectors", + }, + Aliases: flowkitConfig.Aliases{ + {Network: "mainnet", Address: flowsdk.HexToAddress("e844c7cf7430a77c")}, + {Network: "testnet", Address: flowsdk.HexToAddress("494536c102537e1e")}, + {Network: "testing", Address: flowsdk.HexToAddress("000000000000000a")}, }, }, }, - ContractNames: []string{"DeFiActionsMathUtils", "DeFiActionsUtils", "DeFiActions", "ExampleConnectors"}, + ContractNames: []string{"ExampleConnectors"}, DeploymentAccount: "emulator-account", }, ProjectTypeCustom: { @@ -214,7 +213,7 @@ func getProjectTypeConfig(projectType ProjectType) *ProjectTypeConfig { } // getProjectTemplates returns a slice of templates based on the project type. -// Supported types: ProjectTypeDefault, ProjectTypeScheduledTransactions +// Supported types: ProjectTypeDefault, ProjectTypeScheduledTransactions, ProjectTypeStablecoin, ProjectTypeDeFiActions func getProjectTemplates(projectType ProjectType, targetDir string, state *flowkit.State) []generator.TemplateItem { switch projectType { case ProjectTypeScheduledTransactions: @@ -320,6 +319,14 @@ func getProjectTemplates(projectType ProjectType, targetDir string, state *flowk Name: "DepositViaSink", TemplatePath: "transaction_deposit_via_sink.cdc.tmpl", }, + generator.TransactionTemplate{ + Name: "incrementfi_swap", + TemplatePath: "transaction_incrementfi_swap.cdc.tmpl", + }, + generator.TestTemplate{ + Name: "incrementfi_swap_on_fork", + TemplatePath: "test_incrementfi_swap_on_fork.cdc.tmpl", + }, generator.FileTemplate{ TemplatePath: "README_defi_actions.md.tmpl", TargetPath: getReadmeFileName(targetDir), diff --git a/internal/test/test.go b/internal/test/test.go index c19ed8ed7..2bdebe4a7 100644 --- a/internal/test/test.go +++ b/internal/test/test.go @@ -26,11 +26,13 @@ import ( "os" "path/filepath" "regexp" + goRuntime "runtime" "strings" cdcTests "github.com/onflow/cadence-tools/test" "github.com/onflow/cadence/common" "github.com/onflow/cadence/runtime" + flowGo "github.com/onflow/flow-go/model/flow" "github.com/rs/zerolog" "github.com/spf13/cobra" @@ -40,6 +42,7 @@ import ( "github.com/onflow/flow-cli/common/branding" + "github.com/onflow/flow-cli/build" "github.com/onflow/flow-cli/internal/command" "github.com/onflow/flow-cli/internal/util" ) @@ -183,7 +186,37 @@ func testCode( flags flagsTests, ) (*result, error) { logger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).With().Timestamp().Logger() - runner := cdcTests.NewTestRunner().WithLogger(logger) + + // Track network resolutions per file for pragma-based fork detection + // Map: filename -> resolved network name + fileNetworkResolutions := make(map[string]string) + var currentTestFile string + + // Resolve network labels using flow.json state + resolveNetworkFromState := func(label string) (string, bool) { + network, err := state.Networks().ByName(strings.ToLower(strings.TrimSpace(label))) + if err != nil || network == nil { + return "", false + } + if strings.TrimSpace(network.Host) == "" { + return "", false + } + + // Track network resolution for current test file (indicates pragma-based fork usage) + // Only track if it's not the default "testing" network + normalizedLabel := strings.ToLower(strings.TrimSpace(label)) + if currentTestFile != "" && normalizedLabel != "testing" { + if _, exists := fileNetworkResolutions[currentTestFile]; !exists { + fileNetworkResolutions[currentTestFile] = normalizedLabel + } + } + + return network.Host, true + } + + runner := cdcTests.NewTestRunner(). + WithLogger(logger). + WithNetworkResolver(resolveNetworkFromState) // Configure fork mode if requested var effectiveForkHost string @@ -204,20 +237,42 @@ func testCode( } } + // Determine network label (used by resolver/addresses); default to testing + networkLabel := "testing" + if strings.TrimSpace(flags.Fork) != "" { + networkLabel = strings.ToLower(flags.Fork) + } + // If fork mode is enabled, query the host to get chain ID + var forkCfg *cdcTests.ForkConfig if effectiveForkHost != "" { forkChainID, err := util.GetChainIDFromHost(effectiveForkHost) if err != nil { return nil, fmt.Errorf("failed to get chain ID from fork host %q: %w", effectiveForkHost, err) } - runner = runner.WithFork(cdcTests.ForkConfig{ + cfg := cdcTests.ForkConfig{ ForkHost: effectiveForkHost, ChainID: forkChainID, ForkHeight: flags.ForkHeight, - }) + } + forkCfg = &cfg + runner = runner.WithFork(cfg) + + // Map chain ID to a sensible network label if not provided explicitly + if strings.TrimSpace(flags.Fork) == "" { + switch forkChainID { + case flowGo.Mainnet: + networkLabel = "mainnet" + case flowGo.Testnet: + networkLabel = "testnet" + } + } } + // Apply the network label on the base runner now that it is known + runner = runner.WithNetworkLabel(networkLabel) + var coverageReport *runtime.CoverageReport if flags.Cover { coverageReport = state.CreateCoverageReport("testing") @@ -244,30 +299,43 @@ func testCode( runner = runner.WithRandomSeed(seed) } - contractsConfig := *state.Contracts() - contracts := make(map[string]common.Address, len(contractsConfig)) - // Choose alias network: default to "testing", but in fork mode use selected chain (mainnet/testnet) - aliasNetwork := "testing" - if strings.TrimSpace(flags.Fork) != "" { - aliasNetwork = strings.ToLower(flags.Fork) - } - for _, contract := range contractsConfig { - alias := contract.Aliases.ByNetwork(aliasNetwork) - if alias != nil { - contracts[contract.Name] = common.Address(alias.Address) - } - } - testResults := make(map[string]cdcTests.Results, 0) exitCode := 0 for scriptPath, code := range testFiles { - runner := runner. + // Set current test file for network resolution tracking + currentTestFile = scriptPath + + fileRunner := runner. WithImportResolver(importResolver(scriptPath, state)). WithFileResolver(fileResolver(scriptPath, state)). - WithContracts(contracts) + WithContractAddressResolver(func(network string, contractName string) (common.Address, error) { + // Build name -> contract map once per file run + contractsByName := make(map[string]config.Contract) + for _, c := range *state.Contracts() { + contractsByName[c.Name] = c + } + + contract, exists := contractsByName[contractName] + if !exists { + return common.Address{}, fmt.Errorf("contract not found: %s", contractName) + } + + alias := contract.Aliases.ByNetwork(network) + if alias != nil { + return common.Address(alias.Address), nil + } + + return common.Address{}, fmt.Errorf("no address for contract %s on network %s", contractName, network) + }) + + // Ensure the file runner has the correct network label and fork config + fileRunner = fileRunner.WithNetworkLabel(networkLabel) + if forkCfg != nil { + fileRunner = fileRunner.WithFork(*forkCfg) + } if flags.Name != "" { - testFunctions, err := runner.GetTests(string(code)) + testFunctions, err := fileRunner.GetTests(string(code)) if err != nil { return nil, err } @@ -277,14 +345,14 @@ func testCode( continue } - result, err := runner.RunTest(string(code), flags.Name) + result, err := fileRunner.RunTest(string(code), flags.Name) if err != nil { return nil, err } testResults[scriptPath] = []cdcTests.Result{*result} } } else { - results, err := runner.RunTests(string(code)) + results, err := fileRunner.RunTests(string(code)) if err != nil { return nil, err } @@ -297,6 +365,61 @@ func testCode( break } } + + // Clear current test file after processing + currentTestFile = "" + } + + // Track fork test usage metrics - aggregate into single event + hasPragmaFiles := len(fileNetworkResolutions) > 0 + hasStaticFork := forkCfg != nil + + if hasPragmaFiles || hasStaticFork { + // Determine primary fork source + forkSource := "none" + var primaryNetwork string + var chainID string + hasHeight := false + + if hasPragmaFiles { + // Pragma takes priority - collect unique networks + forkSource = "pragma" + networkSet := make(map[string]bool) + for _, network := range fileNetworkResolutions { + networkSet[network] = true + } + // Use first resolved network as primary (for single-value tracking) + for _, network := range fileNetworkResolutions { + primaryNetwork = network + break + } + // If multiple networks, note that in source + if len(networkSet) > 1 { + forkSource = "pragma-mixed" + } + } else if hasStaticFork { + // Static flags + if flags.ForkHost != "" { + forkSource = "fork-host-flag" + } else if flags.Fork != "" { + forkSource = "fork-flag" + } + primaryNetwork = networkLabel + chainID = forkCfg.ChainID.String() + hasHeight = forkCfg.ForkHeight > 0 + } + + command.TrackEvent("test-fork", map[string]any{ + "fork_source": forkSource, + "network": primaryNetwork, + "chain_id": chainID, + "has_height": hasHeight, + "pragma_files": len(fileNetworkResolutions), + "total_files": len(testFiles), + "version": build.Semver(), + "os": goRuntime.GOOS, + "ci": os.Getenv("CI") != "", + }) } return &result{ @@ -313,7 +436,7 @@ func importResolver(scriptPath string, state *flowkit.State) cdcTests.ImportReso contracts[contract.Name] = contract } - return func(location common.Location) (string, error) { + return func(network string, location common.Location) (string, error) { contract := config.Contract{} switch location := location.(type) { diff --git a/internal/test/test_test.go b/internal/test/test_test.go index 9084d0478..af85a1d37 100644 --- a/internal/test/test_test.go +++ b/internal/test/test_test.go @@ -211,7 +211,7 @@ func TestExecutingTests(t *testing.T) { assert.ErrorContains( t, err, - "could not find the address of contract: Hello", + "could not resolve address of contract Hello", ) }) @@ -376,7 +376,7 @@ func TestExecutingTests(t *testing.T) { coverageReport.ExcludedLocationIDs(), ) - expected := "Coverage: 93.7% of statements" + expected := "Coverage: 90.4% of statements" assert.Equal( t,